{"version":3,"file":"8968.4835f085.js","mappings":"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","sources":["webpack://@finviz/website/../config/colors.js","webpack://@finviz/website/../charts/app/lib/shims.ts","webpack://@finviz/website/../charts/app/logger.js","webpack://@finviz/website/../charts/app/models/chart-event-element.ts","webpack://@finviz/website/../charts/app/models/indicator.ts","webpack://@finviz/website/../charts/app/models/overlay.ts","webpack://@finviz/website/../charts/app/models/relationships.ts","webpack://@finviz/website/../charts/app/index.ts","webpack://@finviz/website/../charts/app/controllers/header/fullscreen_button.tsx","webpack://@finviz/website/../charts/app/controllers/header/layout_dropdown.tsx","webpack://@finviz/website/../charts/app/helpers/sorter.ts","webpack://@finviz/website/../charts/app/controllers/header/theme_toggle_button.tsx","webpack://@finviz/website/../charts/app/controllers/header/index.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/stock-detail-timeframe-bar.tsx","webpack://@finviz/website/../charts/app/utils/convert_ta.ts","webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/quote/create-alert/async-modules.ts","webpack://@finviz/website/./js/app/quote/save-to-portfolio/async-modules.ts","webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/portfolio/async-modules.ts","webpack://@finviz/website/./js/charts_lib_entry_do_not_directly_use_in_website.ts","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/modules/portfolio/types.tsx","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/arrow.ts","webpack://@finviz/website/../charts/app/canvas/brush/brush_v1.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_utils.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_v1.ts","webpack://@finviz/website/../charts/app/canvas/curve.ts","webpack://@finviz/website/../charts/app/canvas/ellipse.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle.ts","webpack://@finviz/website/../charts/app/canvas/symbol.ts","webpack://@finviz/website/../charts/app/canvas/drawingTools.ts","webpack://@finviz/website/../charts/app/canvas/element.ts","webpack://@finviz/website/../charts/app/canvas/elliott_waves/elliott_waves.ts","webpack://@finviz/website/../charts/app/canvas/ellipse/ellipse_v1.ts","webpack://@finviz/website/../charts/app/canvas/fibonacci_retracements.ts","webpack://@finviz/website/../charts/app/canvas/horizontal_line.ts","webpack://@finviz/website/../charts/app/canvas/line.ts","webpack://@finviz/website/../charts/app/canvas/measure.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_utils.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_v1.ts","webpack://@finviz/website/../charts/app/canvas/polygon.ts","webpack://@finviz/website/../charts/app/canvas/position.ts","webpack://@finviz/website/../charts/app/canvas/rectangle.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://@finviz/website/../charts/app/canvas/scaled_line.ts","webpack://@finviz/website/../charts/app/canvas/scaled_text.ts","webpack://@finviz/website/../charts/app/canvas/text.ts","webpack://@finviz/website/../charts/app/canvas/thumb.ts","webpack://@finviz/website/../charts/app/canvas/triangle.ts","webpack://@finviz/website/../charts/app/canvas/vertical_line.ts","webpack://@finviz/website/../charts/app/canvas/xabcd.ts","webpack://@finviz/website/../charts/app/canvas/cache.js","webpack://@finviz/website/../charts/app/models/chart_settings/interfaces.ts","webpack://@finviz/website/../charts/app/charts/utils.ts","webpack://@finviz/website/../charts/app/charts/base_chart.ts","webpack://@finviz/website/../charts/app/charts/candle_stick.ts","webpack://@finviz/website/../charts/app/charts/candle_stick_hollow.ts","webpack://@finviz/website/../charts/app/charts/heikin_ashi.ts","webpack://@finviz/website/../charts/app/charts/line_chart.ts","webpack://@finviz/website/../charts/app/charts/market_sentiment.ts","webpack://@finviz/website/../charts/app/charts/multi_line_chart.ts","webpack://@finviz/website/../charts/app/charts/ohlc_chart.ts","webpack://@finviz/website/../charts/app/charts/perf_chart.ts","webpack://@finviz/website/../charts/app/charts/charts.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/controllers/autosave/utils.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/settings-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-controls.ts","webpack://@finviz/website/../charts/app/model-hooks/useModelRef.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-model-custom-date-range-values.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-charts-path-location.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/utils.ts","webpack://@finviz/website/../charts/app/controllers/chart-events/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/chart-settings/async-modules.ts","webpack://@finviz/website/../charts/app/modals/background.tsx","webpack://@finviz/website/../charts/app/modals/color_range_row.tsx","webpack://@finviz/website/../charts/app/modals/border.tsx","webpack://@finviz/website/../charts/app/modals/checkbox.tsx","webpack://@finviz/website/../charts/app/modals/font.tsx","webpack://@finviz/website/../charts/app/modals/line.tsx","webpack://@finviz/website/../charts/app/modals/multiline_string.tsx","webpack://@finviz/website/../charts/app/modals/number.tsx","webpack://@finviz/website/../charts/app/modals/string.tsx","webpack://@finviz/website/../charts/app/modals/trend.tsx","webpack://@finviz/website/../charts/app/modals/visibility/visibility-input.tsx","webpack://@finviz/website/../charts/app/modals/visibility/index.tsx","webpack://@finviz/website/../charts/app/modals/element_style.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/constants.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-autosave-api.tsx","webpack://@finviz/website/../charts/app/utils/string-byte-length.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-is-auto-save-active.ts","webpack://@finviz/website/../charts/app/controllers/autosave/with-auto-save.tsx","webpack://@finviz/website/../charts/app/utils/use-prev-state.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/chart-type-select.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-types.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/daily-change-display.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/draw-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/fullscreen-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/search.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/chart-controls.tsx","webpack://@finviz/website/../charts/app/models/context_menu.ts","webpack://@finviz/website/../charts/app/controllers/context_menu.tsx","webpack://@finviz/website/../charts/app/controllers/pane/chart-event-popover-with-state.tsx","webpack://@finviz/website/../charts/app/utils/use-click-away.ts","webpack://@finviz/website/../charts/app/controllers/pane/load-latest-data-button.tsx","webpack://@finviz/website/../charts/app/utils/use-is-mounted.ts","webpack://@finviz/website/../charts/app/controllers/pane/zoom_controls.tsx","webpack://@finviz/website/../charts/app/controllers/pane/pane.tsx","webpack://@finviz/website/../charts/app/controllers/pane/with-pane-model.tsx","webpack://@finviz/website/../charts/app/controllers/chart/chart-spinner-overlay.tsx","webpack://@finviz/website/../charts/app/controllers/chart/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart/chart.tsx","webpack://@finviz/website/../charts/app/controllers/chart/with-chart-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart/with-watched-panes-on-chart-model.tsx","webpack://@finviz/website/../charts/app/creators/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingActions.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingSettings.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingTools.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/toolbar.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/index.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/auto-save-notes/auto-save-notes.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/auto-save-notes/auto-save-notes-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/confirmation_dialog.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/mobile/tool-button.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/mobile/toolbar-mobile.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/idea-leave-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-route-change.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout_component.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://@finviz/website/../charts/app/controllers/with_dialog_state_hook.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-page-title.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-idea-model-state.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-polling.tsx","webpack://@finviz/website/../charts/app/modals/ideas/utils.ts","webpack://@finviz/website/../charts/app/modals/ideas/IdeaItem.tsx","webpack://@finviz/website/../charts/app/modals/ideas/IdeasTabs.tsx","webpack://@finviz/website/../charts/app/modals/ideas/Ideas.tsx","webpack://@finviz/website/../charts/app/controllers/header/ideas_dropdown.tsx","webpack://@finviz/website/../charts/app/controllers/header/publish.tsx","webpack://@finviz/website/../charts/app/controllers/header/tour_button.tsx","webpack://@finviz/website/../charts/app/utils/chart-date-range-utils.ts","webpack://@finviz/website/../charts/app/controllers/renderUtils.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/constants.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/module-load-failed.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-tabs.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-content.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/interfaces.ts","webpack://@finviz/website/../charts/app/controllers/utils.ts","webpack://@finviz/website/../charts/app/helpers/atr.ts","webpack://@finviz/website/../charts/app/chart-events/chart-event.ts","webpack://@finviz/website/../charts/app/chart-events/dividends.ts","webpack://@finviz/website/../charts/app/chart-events/earnings.ts","webpack://@finviz/website/../charts/app/chart-events/split.ts","webpack://@finviz/website/../charts/app/chart-events/index.ts","webpack://@finviz/website/../charts/app/helpers/get-canvas-element-by-type.ts","webpack://@finviz/website/../charts/app/helpers/math.ts","webpack://@finviz/website/../charts/app/indicator-calculation/ema.ts","webpack://@finviz/website/../charts/app/indicator-calculation/main.ts","webpack://@finviz/website/../charts/app/indicators/indicator.ts","webpack://@finviz/website/../charts/app/utils/canvas-render.ts","webpack://@finviz/website/../charts/app/indicators/adx.ts","webpack://@finviz/website/../charts/app/indicator-calculation/aroon.ts","webpack://@finviz/website/../charts/app/indicators/aro.ts","webpack://@finviz/website/../charts/app/indicators/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/atr.ts","webpack://@finviz/website/../charts/app/indicators/cci.ts","webpack://@finviz/website/../charts/app/indicators/cot.ts","webpack://@finviz/website/../charts/app/indicator-calculation/fi.ts","webpack://@finviz/website/../charts/app/indicators/fi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/macd.ts","webpack://@finviz/website/../charts/app/indicators/macd.ts","webpack://@finviz/website/../charts/app/indicators/mfi.ts","webpack://@finviz/website/../charts/app/indicators/none.ts","webpack://@finviz/website/../charts/app/indicators/obv.ts","webpack://@finviz/website/../charts/app/indicators/perf.ts","webpack://@finviz/website/../charts/app/indicators/rmi.ts","webpack://@finviz/website/../charts/app/indicators/roc.ts","webpack://@finviz/website/../charts/app/indicator-calculation/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rvol.ts","webpack://@finviz/website/../charts/app/indicators/rwi.ts","webpack://@finviz/website/../charts/app/indicators/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofa.ts","webpack://@finviz/website/../charts/app/indicators/stosl.ts","webpack://@finviz/website/../charts/app/indicator-calculation/trix.ts","webpack://@finviz/website/../charts/app/indicators/trix.ts","webpack://@finviz/website/../charts/app/indicators/ult.ts","webpack://@finviz/website/../charts/app/indicators/vol.ts","webpack://@finviz/website/../charts/app/indicators/wr.ts","webpack://@finviz/website/../charts/app/indicators/indicators.ts","webpack://@finviz/website/../charts/app/modals/publish/async-modules.ts","webpack://@finviz/website/../charts/app/model-hooks/use-model-state.ts","webpack://@finviz/website/../charts/app/models/chart.ts","webpack://@finviz/website/../charts/app/models/chart/contstants.ts","webpack://@finviz/website/../charts/app/models/chart_layout.ts","webpack://@finviz/website/../charts/app/models/chart_settings/index.ts","webpack://@finviz/website/../charts/app/models/constants.ts","webpack://@finviz/website/../charts/app/models/drawings-internal-store.ts","webpack://@finviz/website/../charts/app/models/element.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse-utils.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse.ts","webpack://@finviz/website/../charts/app/models/pane.ts","webpack://@finviz/website/../charts/app/models/quoteCache.ts","webpack://@finviz/website/../charts/app/models/quote.ts","webpack://@finviz/website/../charts/app/models/quote/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/interactive_chart_settings.ts","webpack://@finviz/website/../charts/app/models/settings.ts","webpack://@finviz/website/../charts/app/models/utils.ts","webpack://@finviz/website/../charts/app/indicator-calculation/bb.ts","webpack://@finviz/website/../charts/app/overlays/overlay.ts","webpack://@finviz/website/../charts/app/overlays/bb.ts","webpack://@finviz/website/../charts/app/overlays/dch.ts","webpack://@finviz/website/../charts/app/overlays/ema.ts","webpack://@finviz/website/../charts/app/overlays/ema2.ts","webpack://@finviz/website/../charts/app/overlays/hilo.ts","webpack://@finviz/website/../charts/app/overlays/hline.ts","webpack://@finviz/website/../charts/app/overlays/ic.ts","webpack://@finviz/website/../charts/app/overlays/icf.ts","webpack://@finviz/website/../charts/app/overlays/kch.ts","webpack://@finviz/website/../charts/app/overlays/none.ts","webpack://@finviz/website/../charts/app/overlays/patterns.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/sar.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma2.ts","webpack://@finviz/website/../charts/app/overlays/str.ts","webpack://@finviz/website/../charts/app/overlays/vp.ts","webpack://@finviz/website/../charts/app/indicator-calculation/vwap.ts","webpack://@finviz/website/../charts/app/overlays/vwap.ts","webpack://@finviz/website/../charts/app/overlays/overlays.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/abort_controller.ts","webpack://@finviz/website/../charts/app/utils/async-modules-utils.ts","webpack://@finviz/website/../charts/app/utils/canvas.ts","webpack://@finviz/website/../charts/app/utils/chart-events-utils.ts","webpack://@finviz/website/../charts/app/utils/chart.ts","webpack://@finviz/website/../charts/app/utils/colors.ts","webpack://@finviz/website/../charts/app/utils/cursor.ts","webpack://@finviz/website/../charts/app/utils/draw_in_visible_area.ts","webpack://@finviz/website/../charts/app/utils/fetch_api.ts","webpack://@finviz/website/../charts/app/utils/force-update.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../charts/app/utils/hlc.ts","webpack://@finviz/website/../charts/app/utils/useChartLayoutGlobalModelAsync.ts","webpack://@finviz/website/../charts/types/shared.ts"],"sourcesContent":["// Keep in sync with charts repository colors.js file in: app/constants/colors.js\r\n\r\nmodule.exports = {\r\n white: '#fff',\r\n black: '#000',\r\n inherit: 'inherit',\r\n transparent: 'transparent',\r\n current: 'currentColor',\r\n finviz: {\r\n 'blue-gray': '#262931',\r\n blue: '#4fa4f4',\r\n },\r\n gray: {\r\n 50: '#f3f3f5',\r\n 100: '#dedfe5',\r\n 200: '#c3c6d0',\r\n 300: '#a3a8b9',\r\n 400: '#868ea5',\r\n 500: '#676f85',\r\n 600: '#4c5263',\r\n 700: '#353945',\r\n 750: '#2c303b',\r\n 800: '#22262f',\r\n 900: '#14161d',\r\n },\r\n red: {\r\n 50: '#fef0f0',\r\n 100: '#fcd6d6',\r\n 200: '#fbb4b4',\r\n 300: '#fd8487',\r\n 400: '#fb5057',\r\n 500: '#d91e2b',\r\n 600: '#9f1f2a',\r\n 700: '#691f24',\r\n 800: '#45171a',\r\n 900: '#280e0f',\r\n },\r\n orange: {\r\n 50: '#fef2eb',\r\n 100: '#fdd9c5',\r\n 200: '#fab889',\r\n 300: '#ef9323',\r\n 400: '#ca7b14',\r\n 500: '#a0600e',\r\n 600: '#79460a',\r\n 700: '#583006',\r\n 800: '#3d1e03',\r\n 900: '#261101',\r\n },\r\n amber: {\r\n 50: '#fef2e7',\r\n 100: '#fedab5',\r\n 200: '#fbba56',\r\n 300: '#de9c1a',\r\n 400: '#bb830f',\r\n 500: '#956600',\r\n 600: '#704b00',\r\n 700: '#4f3400',\r\n 800: '#372200',\r\n 900: '#211300',\r\n },\r\n yellow: {\r\n 50: '#fdf2df',\r\n 100: '#fcdc86',\r\n 200: '#f3c736',\r\n 300: '#cda30b',\r\n 400: '#b08900',\r\n 500: '#8b6a00',\r\n 600: '#664e21',\r\n 700: '#46371e',\r\n 800: '#2f2516',\r\n 900: '#1b150d',\r\n },\r\n brightYellow: {\r\n 50: '#fff699',\r\n 100: '#fff200',\r\n },\r\n lime: {\r\n 50: '#ebfad6',\r\n 100: '#caec90',\r\n 200: '#aad547',\r\n 300: '#8db61e',\r\n 400: '#769913',\r\n 500: '#5b7800',\r\n 600: '#435900',\r\n 700: '#2e3e00',\r\n 800: '#1e2a00',\r\n 900: '#111900',\r\n },\r\n green: {\r\n 50: '#e7f7e8',\r\n 100: '#beeac1',\r\n 200: '#86d895',\r\n 300: '#34c062',\r\n 400: '#00a449',\r\n 500: '#19803d',\r\n 600: '#265d35',\r\n 700: '#1e4027',\r\n 800: '#162b1b',\r\n 900: '#0d1810',\r\n },\r\n emerald: {\r\n 50: '#ddfaee',\r\n 100: '#a2f0d2',\r\n 200: '#4dddaf',\r\n 300: '#25be93',\r\n 400: '#1d9f7b',\r\n 500: '#157e60',\r\n 600: '#035d47',\r\n 700: '#004139',\r\n 800: '#002c22',\r\n 900: '#001a13',\r\n },\r\n teal: {\r\n 50: '#e0f8fc',\r\n 100: '#9beef7',\r\n 200: '#4fd8e5',\r\n 300: '#27b9c4',\r\n 400: '#109ba5',\r\n 500: '#007c83',\r\n 600: '#005b62',\r\n 700: '#004045',\r\n 800: '#002b2e',\r\n 900: '#00191b',\r\n },\r\n blue: {\r\n 50: '#ebf4fe',\r\n 100: '#cae2fc',\r\n 200: '#9bcbfa',\r\n 300: '#57aefb',\r\n 400: '#2f91ef',\r\n 500: '#306dca',\r\n 600: '#2f5091',\r\n 700: '#263766',\r\n 800: '#1b2542',\r\n 900: '#101527',\r\n },\r\n violet: {\r\n 50: '#f4f2fe',\r\n 100: '#e1dbfd',\r\n 200: '#c9befc',\r\n 300: '#ad9bfb',\r\n 400: '#9978f9',\r\n 500: '#7c51e7',\r\n 600: '#5e36b8',\r\n 700: '#402979',\r\n 800: '#2a1e4e',\r\n 900: '#18122c',\r\n },\r\n purple: {\r\n 50: '#f9f1fe',\r\n 100: '#eed8fd',\r\n 200: '#e1b6fc',\r\n 300: '#d38bfb',\r\n 400: '#c85bf9',\r\n 500: '#ae27e0',\r\n 600: '#8514ac',\r\n 700: '#60077e',\r\n 800: '#44005a',\r\n 900: '#2a003a',\r\n },\r\n pink: {\r\n 50: '#fef1f4',\r\n 100: '#fdd6e1',\r\n 200: '#fcb2c7',\r\n 300: '#f984aa',\r\n 400: '#f25090',\r\n 500: '#cd2a74',\r\n 600: '#9d1658',\r\n 700: '#700c42',\r\n 800: '#4e052b',\r\n 900: '#32011a',\r\n },\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\n// eslint-disable-next-line no-extend-native\r\nArray.prototype.last = function () {\r\n return this[this.length - 1]\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.padLeft = function (paddingValue) {\r\n return String(paddingValue + this).slice(-paddingValue.length)\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.startsWith = function (str) {\r\n return this.indexOf(str) === 0\r\n}\r\n\r\ninterface CallbackCacheItem {\r\n newCb: (...args: any[]) => any\r\n origCb: (...args: any[]) => any\r\n}\r\n\r\nconst _callbackCache: CallbackCacheItem[] = []\r\nSpine.Collection.prototype.bind = function (ev, callback) {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this\r\n const cb = (record: Spine.Model, ...rest: any[]) => {\r\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\r\n return callback(record, ...rest)\r\n }\r\n }\r\n _callbackCache.push({ newCb: cb, origCb: callback })\r\n this.model.bind(ev, cb)\r\n return this\r\n}\r\n\r\nSpine.Collection.prototype.unbind = function (ev, callback) {\r\n let cb\r\n for (const item of _callbackCache) {\r\n if (item.origCb === callback) {\r\n cb = item.newCb\r\n break\r\n }\r\n }\r\n return this.model.unbind(ev, cb)\r\n}\r\n\r\nSpine.Model.findIndex = function (element) {\r\n const iterable = this.all()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const el = iterable[index]\r\n if (element.eql(el)) {\r\n return index\r\n }\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nexport const defaults = {\r\n enabled: false,\r\n collapsed: true,\r\n duration: false,\r\n timestamp: true,\r\n logErrors: true,\r\n withStackTrace: false,\r\n level: 'log',\r\n logger: console,\r\n filterChanges: (model, attrs) => {\r\n const props = Object.keys(attrs)\r\n return (\r\n model.constructor.name === 'Mouse' ||\r\n model.constructor.name === 'Quote' ||\r\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\r\n )\r\n },\r\n errorTransformer: (error) => error,\r\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\r\n const parts = ['model']\r\n parts.push(`%c${String(title)}`)\r\n if (timestamp) {\r\n parts.push(`%c@ ${time}`)\r\n }\r\n if (duration) {\r\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\r\n }\r\n return parts.join(' ')\r\n },\r\n colors: {\r\n title: () => 'inherit',\r\n prevState: () => '#9E9E9E',\r\n action: () => '#03A9F4',\r\n nextState: () => '#4CAF50',\r\n error: () => '#F20404',\r\n },\r\n}\r\n\r\nconst repeat = (str, times) => new Array(times + 1).join(str)\r\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\r\nconst formatTime = (time) =>\r\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\r\n\r\nexport const printLogEntry = (logEntry, options = {}) => {\r\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\r\n ...defaults,\r\n ...options,\r\n }\r\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\r\n\r\n const formattedTime = formatTime(startedTime)\r\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\r\n const headerCSS = ['color: gray; font-weight: lighter;']\r\n headerCSS.push(titleCSS)\r\n if (timestamp) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n if (duration) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\r\n\r\n try {\r\n if (collapsed) {\r\n if (colors.title) {\r\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.groupCollapsed(formattedTitle)\r\n }\r\n } else if (colors.title) {\r\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.group(formattedTitle)\r\n }\r\n } catch (e) {\r\n logger.log(formattedTitle)\r\n }\r\n\r\n if (colors.prevState) {\r\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\r\n logger[level]('%c prev state', styles, prevState)\r\n } else {\r\n logger[level]('prev state', prevState)\r\n }\r\n\r\n if (colors.action) {\r\n const styles = `color: ${colors.action(data)}; font-weight: bold`\r\n logger[level]('%c arguments ', styles, data)\r\n } else {\r\n logger[level]('arguments ', data)\r\n }\r\n\r\n if (error && logErrors) {\r\n if (colors.error) {\r\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\r\n logger['error']('%c error ', styles, error)\r\n } else {\r\n logger['error']('error ', error)\r\n }\r\n }\r\n\r\n if (colors.nextState) {\r\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\r\n logger[level]('%c next state', styles, nextState)\r\n } else {\r\n logger[level]('next state', nextState)\r\n }\r\n\r\n if (withStackTrace) {\r\n logger.groupCollapsed('TRACE')\r\n logger.trace()\r\n logger.groupEnd()\r\n }\r\n\r\n try {\r\n logger.groupEnd()\r\n } catch (e) {\r\n logger.log('—— log end ——')\r\n }\r\n}\r\n\r\nexport const initialize = () => {\r\n window['logger'] = defaults\r\n\r\n const protoModelLoad = Spine.Model.prototype.load\r\n Spine.Model.prototype.load = function (attrs) {\r\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\r\n const started = Date.now()\r\n const logEntry = {\r\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\r\n started: started,\r\n startedTime: new Date(started),\r\n prevState: this.attributes(),\r\n data: attrs,\r\n }\r\n\r\n let returnedValue\r\n try {\r\n returnedValue = protoModelLoad.apply(this, arguments)\r\n } catch (e) {\r\n logEntry.error = e\r\n }\r\n\r\n logEntry.nextState = this.attributes()\r\n logEntry.took = Date.now() - logEntry.started\r\n\r\n printLogEntry(logEntry)\r\n return returnedValue\r\n } else {\r\n return protoModelLoad.apply(this, arguments)\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { Theme } from '../../types/shared'\r\nimport ChartEvent from '../chart-events/chart-event'\r\nimport { ChartEventBadgeType } from '../constants/common'\r\nimport { chartEventsAsyncModule } from '../controllers/chart-events/async-modules'\r\nimport ElementModel from '../models/element'\r\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils/chart-events-utils'\r\nimport { captureException } from '../utils/helpers'\r\nimport { CHART_EVENT_BADGE_SIZE } from './constants'\r\nimport Pane from './pane'\r\n\r\nconst badgeImages = {} as ObjectHash<{ image: HTMLImageElement; isLoaded?: boolean }, string>\r\n\r\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\r\n\r\nfunction getSvgImageCacheKey(props: Pick) {\r\n return `${props.badgeType}-${props.theme}-${props.state}`\r\n}\r\n\r\nasync function fetchAndCacheChartEventBadges({ onBadgeInitLoad }: { onBadgeInitLoad: () => void }) {\r\n // Currently node charts don't render badges and if the code below is executed on server it will crash because of missing file which is not transpiled\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n // Temp workaround to prevent node charts from crashing\r\n const { importWithRetry } = await import('@finviz/website')\r\n const { chartBadgeSvgByType } = await importWithRetry(chartEventsAsyncModule.importFn)\r\n\r\n const handleImageResolve = () => {\r\n const hasSomeUnresolvedImages = Object.values(badgeImages).some(({ isLoaded }) => isLoaded === undefined)\r\n if (!hasSomeUnresolvedImages) {\r\n onBadgeInitLoad()\r\n }\r\n }\r\n\r\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\r\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\r\n Object.values(Theme).forEach((theme) => {\r\n const cacheKey = getSvgImageCacheKey({\r\n badgeType,\r\n state: badgeState,\r\n theme,\r\n })\r\n const svgHTML = chartBadgeSvgByType[badgeType]({\r\n state: badgeState,\r\n theme,\r\n width: CHART_EVENT_BADGE_SIZE,\r\n })\r\n const img = new Image()\r\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\r\n img.onload = () => {\r\n badgeImages[cacheKey].isLoaded = true\r\n handleImageResolve()\r\n }\r\n img.onerror = () => {\r\n badgeImages[cacheKey].isLoaded = false\r\n handleImageResolve()\r\n captureException(new Error(`Image with cache key ${cacheKey} is invalid`), { extra: { src: img.src } })\r\n }\r\n badgeImages[cacheKey] = {\r\n image: img,\r\n }\r\n })\r\n })\r\n })\r\n}\r\n\r\nclass ChartEventElement extends ElementModel {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: ChartEvent\r\n yIndex = 0\r\n\r\n getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\r\n const cacheKey = getSvgImageCacheKey(props)\r\n const badgeImage = badgeImages[cacheKey]\r\n if (badgeImage) {\r\n // Possible fix for https://finvizcom.sentry.io/issues/4737062163\r\n if (badgeImage.isLoaded && badgeImage.image.width > 0 && badgeImage.image.height > 0) {\r\n return badgeImage.image\r\n }\r\n return undefined\r\n }\r\n\r\n void fetchAndCacheChartEventBadges({\r\n onBadgeInitLoad: () => this.trigger('change', this),\r\n })\r\n }\r\n\r\n getChartEventData() {\r\n return this.instance.model\r\n .chart()\r\n .quote()\r\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...super.toObject(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...super.toConfig(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n}\r\n\r\nexport default ChartEventElement\r\n","import Spine 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 {\r\n Button,\r\n Dropdown,\r\n DropdownItem,\r\n DropdownSeparator,\r\n Icon,\r\n IconNameType,\r\n Paragraph,\r\n useDropdownState,\r\n} from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { LAYOUTS } from '../../constants/common'\r\nimport { sortObjects } from '../../helpers/sorter'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncableParts } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString } from '../../utils/query_string'\r\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\r\n\r\nconst SORTED_LAYOUT_KEYS = sortObjects(\r\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\r\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\r\n).map(({ key }) => key)\r\n\r\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const parsedQuery = decodeQueryString(location.search)\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\r\n const state = useDropdownState({ placement: 'bottom', orientation: 'horizontal' })\r\n\r\n return (\r\n \r\n Layout\r\n \r\n }\r\n >\r\n
\r\n
\r\n {SORTED_LAYOUT_KEYS.map((layout) => (\r\n {\r\n navigate(getChartsToPath({ layout }))\r\n }}\r\n >\r\n \r\n \r\n ))}\r\n
\r\n \r\n
\r\n
\r\n Sync:\r\n
\r\n {ChartSyncableParts.map(({ value, label }) => {\r\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\r\n return (\r\n {\r\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\r\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n \r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { SORT_DIRECTION } from '../constants/common'\r\n\r\nexport function sortObjects(\r\n arr: ObjectHash[],\r\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\r\n) {\r\n return arr.sort((a, b) =>\r\n options.reduce((acc, option) => {\r\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\r\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\r\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\r\n }, 0)\r\n )\r\n}\r\n","import { Button, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { updateSettings } from '../../models/settings'\r\n\r\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\r\n const isDarkMode = model.theme === 'dark'\r\n\r\n const onClick = () => {\r\n const theme = isDarkMode ? 'light' : 'dark'\r\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\r\n chartLayoutModel.trigger('theme', chartLayoutModel)\r\n setCookieRequest('chartsTheme', theme).catch(() => {})\r\n\r\n if (isDarkMode) {\r\n document.documentElement.classList.remove('dark')\r\n } else {\r\n document.documentElement.classList.add('dark')\r\n }\r\n }\r\n\r\n if (!chartLayoutModel) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, Time, TimeBreakpoint } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { FullscreenButton } from './fullscreen_button'\r\nimport { IdeasDropdown } from './ideas_dropdown'\r\nimport { ChartLayoutDropdown } from './layout_dropdown'\r\nimport { Publish } from './publish'\r\nimport { ThemeToggleButton } from './theme_toggle_button'\r\nimport { TourButton } from './tour_button'\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\ninterface ChartLayoutHeaderProps {\r\n model: ChartLayout\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\r\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\r\n\r\n return (\r\n <>\r\n
\r\n \r\n Ideas\r\n \r\n
\r\n
\r\n \r\n Chart tour\r\n \r\n \r\n \r\n {hasPublish && (\r\n \r\n Share\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutHeader = React.memo(\r\n ChartLayoutHeaderComponent,\r\n (prevProps, nextProps) =>\r\n prevProps.model === nextProps.model &&\r\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\r\n prevProps.hasPublish === nextProps.hasPublish\r\n)\r\n","import {\r\n ButtonSizeType,\r\n CustomDateRange,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n withSuspense,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\nfunction StockDetailTimeframeBarRaw({\r\n size = 'regular',\r\n className = '!m-0 space-x-2',\r\n isDateRangeAvailable,\r\n isPremium,\r\n isLoadingOverride,\r\n isScrollIntoViewEnabled = false,\r\n onTimeframeSelect = () => {},\r\n onDateRangeSelect = () => {},\r\n}: {\r\n size?: ButtonSizeType\r\n className?: string\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n onTimeframeSelect?: (timeframe: any) => void\r\n onDateRangeSelect?: (timeframe: any) => void\r\n}) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\r\n const chartModel = useModelState(chartModelUnwatched, {\r\n watchProperties: ['timeframe', 'dateRange'],\r\n })\r\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: isDateRangeAvailable,\r\n })\r\n\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\r\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe, onDateRangeSelect)\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n handleDateRangeSelect(value)\r\n onDateRangeSelect?.(value)\r\n }}\r\n onCustomDateRangeClick={() => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n }}\r\n onTimeframeSelect={onTimeframeSelect}\r\n onFavoriteTimeframeToggle={({ value }: { value: string }) => {\r\n toggleFavoriteTimeframe(value as TIMEFRAME)\r\n }}\r\n isDateRangeAvailable={isDateRangeAvailable}\r\n containerElement={document.body}\r\n className={className}\r\n isFavoritesEnabled={isPremium}\r\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\r\n />\r\n\r\n {chartModel && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\r\n","import { ChartConfigChartPane, Position, RootChartConfigObject } from '../../types/shared'\r\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\r\n\r\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\r\n return panes.some(({ elements }) =>\r\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\r\n )\r\n}\r\nfunction pushIndicators(\r\n panes: ChartConfigChartPane[],\r\n indicator: { name: string; parameters: string },\r\n options?: { COTs?: string[] }\r\n) {\r\n if (indicator.name === 'cot') {\r\n const cotKeys = options?.COTs ?? []\r\n if (cotKeys.length === 0) {\r\n cotKeys.push('')\r\n }\r\n cotKeys.forEach(function (code: string) {\r\n if (!hasPaneWithCOTCode(panes, code)) {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: IndicatorType.Cot,\r\n code,\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n } else {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: ('indicators/' + indicator.name) as IndicatorType,\r\n period: indicator.parameters,\r\n },\r\n ],\r\n })\r\n }\r\n}\r\n\r\nfunction getChartTypeByTaConfigStyle(style: string) {\r\n const chartTypeMap = {\r\n candlestick: ChartElementType.CandleStick,\r\n heikinashi: ChartElementType.HeikinAshi,\r\n hollowcandlestick: ChartElementType.HollowCandleStick,\r\n line: ChartElementType.LineChart,\r\n ohlc: ChartElementType.OhlcChart,\r\n }\r\n return chartTypeMap[style as keyof typeof chartTypeMap]\r\n}\r\n\r\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\r\n const chartScaleMap = {\r\n linear: ScaleType.Linear,\r\n percentage: ScaleType.Percentage,\r\n logarithmic: ScaleType.Logarithmic,\r\n }\r\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\r\n}\r\n\r\n/*\r\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\r\n */\r\nexport const mergeChartAndTAConfig = function convertTA(\r\n chartConfig: RootChartConfigObject,\r\n taConfig: TaConfigObject,\r\n options?: { COTs: string[] }\r\n) {\r\n const panes = chartConfig.charts[0].panes\r\n const chart = chartConfig.charts[0]\r\n\r\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\r\n}\r\n\r\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\r\n const options = {}\r\n const panes: ChartConfigChartPane[] = []\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n return panes\r\n}\r\n","export * from 'finviz-charts/app/lib-export'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","export const createAlertAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"create-alert\" */ './module-entry'),\r\n cacheKey: 'create-alert',\r\n}\r\n","export const saveToPortfolioAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './module-entry'),\r\n cacheKey: 'save-to-portfolio',\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","export const portfolioWatchlistTableAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist-table\" */ './PortfolioWatchlistTable'),\r\n cacheKey: 'portfolio-watchlist-table',\r\n}\r\n","import logo from './app/shared/assets/logo.png'\r\nimport logo_light from './app/shared/assets/logo_light.png'\r\n\r\nexport * from './main/components'\r\n\r\nexport { getSanitizedTicker } from './app/shared/ticker-sanitizer'\r\nexport * from './app/queryString'\r\nexport * from './main/modules/portfolio/types'\r\n\r\nexport { getFormattedDateString } from './app/header/utils'\r\nexport { decodeQueryString, encodeQueryString } from './app/queryString'\r\nexport { createAlertAsyncModule } from './app/quote/create-alert/async-modules'\r\nexport { saveToPortfolioAsyncModule } from './app/quote/save-to-portfolio/async-modules'\r\nexport { formatDateToStringUS } from './app/shared/utils'\r\nexport { portfolioWatchlistTableAsyncModule } from './main/components/portfolio/async-modules'\r\nexport { useTrackPageView } from './main/hooks/use-track-pageview'\r\nexport {\r\n useAsyncModule,\r\n withSuspense,\r\n type ControlledModuleConfig,\r\n type SuspenseModuleConfig,\r\n} from './main/services/async-modules-utils'\r\nexport { importWithRetry } from './main/services/import-with-retry'\r\nexport * as localStorage from './main/services/local-storage'\r\nexport { waitForPreviousPromise } from './main/services/wait-for-previous-promise'\r\nexport { setCookieRequest } from './main/services/api'\r\n\r\nexport const assets = { logo, logo_light }\r\n\r\n// Re-export Portal so we can use it when we can’t use `modal` components (see chart event popover)\r\nexport { Portal as AriakitPortal } from '@ariakit/react'\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortByShape } from '../../hooks/use-sort-data'\r\nimport { NullableNumbers } from '../../types'\r\n\r\nexport enum PortfolioQuery {\r\n View = 'v',\r\n TableView = 'tv',\r\n PortfolioId = 'pid',\r\n Order = 'o',\r\n Tickers = 't',\r\n Map = 'map',\r\n Size = 'mapSize',\r\n Subtype = 'subtype',\r\n Group = 'group',\r\n}\r\n\r\nexport enum PortfolioMapSizeKey {\r\n MarketValue = 'market',\r\n Gain = 'gain',\r\n}\r\n\r\nexport enum PortfolioView {\r\n View = '1',\r\n Edit = '2',\r\n}\r\n\r\nexport enum PortfolioTableView {\r\n Ticker = '1',\r\n Trade = '2',\r\n}\r\n\r\nexport const PortfolioTableViewLabels = {\r\n [PortfolioTableView.Ticker]: 'Tickers',\r\n [PortfolioTableView.Trade]: 'Trades',\r\n}\r\n\r\nexport enum PortfolioSymbolType {\r\n Stock = 'stock',\r\n Cash = 'cash',\r\n}\r\n\r\nexport enum PortfolioTransaction {\r\n Watch = 0,\r\n\r\n // Stock transactions\r\n Buy = 1,\r\n Short = 2,\r\n\r\n // Cash transactions\r\n CashDeposit = 200,\r\n CashWithdraw = 201,\r\n CashIncome = 202,\r\n CashFee = 203,\r\n}\r\n\r\nexport enum NumberOfShares {\r\n None = 0,\r\n /**\r\n * The usage of this is technically incorrect. The value for `PositiveNumber` is 1.\r\n * But we don’t care in this context, because we only want to differentiate betwen zero/non-zero values,\r\n * which helps us get correct types.\r\n *\r\n * # Don’t compare `entry.shares === NumberOfShares.PositiveNumber`\r\n */\r\n PositiveNumber = 1,\r\n}\r\n\r\nexport interface PortfolioEntryBase {\r\n id: number\r\n ticker: string\r\n date: string\r\n transaction: PortfolioTransaction\r\n shares: number\r\n price: number\r\n type: PortfolioSymbolType\r\n}\r\n\r\n/**\r\n * Base type which lists all common properties\r\n */\r\nexport interface PortfolioEntryComputed {\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketPrev: number\r\n gainMarket: number\r\n gainMarketPct: number\r\n gainMarketUsd: number\r\n gainTodayUsd: number\r\n lastChangePct: number\r\n}\r\n\r\n/**\r\n * Transaction with > 0 shares\r\n */\r\nexport interface PortfolioTransactionStake extends PortfolioEntryBase, PortfolioEntryComputed {\r\n shares: NumberOfShares.PositiveNumber\r\n}\r\n\r\n/**\r\n * Transaction with 0 shares\r\n */\r\nexport interface PortfolioTransactionWatch\r\n extends Omit,\r\n NullableNumbers {\r\n shares: NumberOfShares.None\r\n transaction: PortfolioTransaction\r\n}\r\n\r\nexport type PortfolioEntryTransaction = PortfolioTransactionStake | PortfolioTransactionWatch\r\n\r\nexport type PortfolioActionType = PortfolioEntryTransaction & { isNotification?: boolean; message?: string }\r\n\r\n/**\r\n * Top level portfolio entry\r\n */\r\nexport interface PortfolioGroup extends PortfolioEntryComputed {\r\n ticker: string\r\n shares: number\r\n industry: string\r\n country: string\r\n company: string\r\n marketCap: number\r\n prevClose: number\r\n lastClose: number\r\n lastVolume: number\r\n perfWeek: number\r\n costAvg: number\r\n transactions: PortfolioEntryTransaction[]\r\n order: number\r\n id: number\r\n date: string\r\n type: PortfolioSymbolType\r\n isDelisted?: true\r\n}\r\n\r\nexport type PortfolioTrade = Omit & PortfolioEntryTransaction\r\n\r\nexport type PortfolioMapEntry = Omit & PortfolioTransactionStake\r\n\r\n/**\r\n * Summary row for the whole portfolio\r\n */\r\nexport interface PortfolioSummary {\r\n tickers: number\r\n transactions: number\r\n shares: number\r\n lastChangePct: number\r\n valuePaid: number\r\n valueMarket: number\r\n valueMarketStocks: number\r\n valueMarketStocksPrev: number\r\n gainMarketUsd: number\r\n gainMarketPct: number\r\n gainTodayUsd: number\r\n}\r\n\r\nexport interface PortfolioDefinition {\r\n id: number\r\n name: string\r\n order: number\r\n}\r\n\r\nexport interface PortfolioInitData {\r\n limit: number\r\n limitTransactions: number\r\n selectedPortfolio: number\r\n portfolios: PortfolioDefinition[]\r\n portfolio: PortfolioGroup[]\r\n news: string[]\r\n version?: number\r\n}\r\n\r\nexport interface PortfolioFormEntry\r\n extends Pick,\r\n Partial> {\r\n uuid: string\r\n}\r\n\r\nexport interface PortfolioFormGroup extends Pick {\r\n id: string\r\n transactions: PortfolioFormEntry[]\r\n}\r\n\r\nexport enum ColumnId {\r\n Spacer = 'spacer',\r\n Ticker = 'ticker',\r\n Company = 'company',\r\n LastClose = 'lastClose',\r\n CostAvg = 'costAvg',\r\n LastChange = 'lastChange',\r\n LastChangePct = 'lastChangePct',\r\n LastVolume = 'lastVolume',\r\n Transaction = 'transaction',\r\n Date = 'date',\r\n Shares = 'shares',\r\n Price = 'price',\r\n ValuePaid = 'valuePaid',\r\n Amount = 'amount',\r\n ValueMarket = 'valueMarket',\r\n GainMarketUsd = 'gainMarketUsd',\r\n GainMarketPct = 'gainMarketPct',\r\n GainMarketCombined = 'gainMarketCombined',\r\n GainTodayUsd = 'gainTodayUsd',\r\n GainTodayCombined = 'gainTodayCombined',\r\n Order = 'order',\r\n}\r\n\r\nexport enum RowKind {\r\n Group, // A group of transactions\r\n Transaction, // A transaction made inside ticker\r\n Summary, // Portfolio summary\r\n Watchlist, // Charts portfolio watchlist table\r\n Trade,\r\n}\r\n\r\ninterface GroupProps {\r\n kind: RowKind.Group\r\n row: PortfolioGroup\r\n}\r\ninterface TradeProps {\r\n kind: RowKind.Trade\r\n row: PortfolioTrade\r\n}\r\n\r\ninterface TransactionProps {\r\n kind: RowKind.Transaction\r\n row: PortfolioEntryTransaction\r\n}\r\n\r\ninterface SummaryProps {\r\n kind: RowKind.Summary\r\n row: PortfolioSummary\r\n}\r\n\r\ninterface WatchlistProps {\r\n index: number\r\n kind: RowKind.Watchlist\r\n row: PortfolioGroup\r\n}\r\n\r\nexport interface TableColumnDefinition<\r\n PropsType = GroupProps | TradeProps | TransactionProps | SummaryProps | WatchlistProps,\r\n> extends SortByShape {\r\n urlSort: string\r\n name: string\r\n align?: TableAlign\r\n\r\n /**\r\n * Get the value of the column and render it\r\n */\r\n renderColumn: (props: PropsType) => React.ReactNode\r\n}\r\n\r\nexport enum ActionKind {\r\n AddTickers,\r\n RemoveTicker,\r\n AddTransaction,\r\n EditTransaction,\r\n RemoveTransaction,\r\n ReorderTickers,\r\n PortfoliosReorder,\r\n}\r\n\r\nexport interface Action {\r\n kind: ActionKind\r\n payload: PayloadType\r\n}\r\n\r\nexport type AddTickersError = {\r\n tickers?: string\r\n}\r\n\r\nexport interface CreatePortfolioErrors extends AddTickersError {\r\n portfolioName?: string\r\n}\r\n\r\nexport interface CreatePortfolioData {\r\n tickers: string\r\n portfolioName: string\r\n}\r\n\r\nexport type FormErrors = Partial>\r\n\r\nexport interface PortfolioBulkEditErrors {\r\n portfolioName: boolean\r\n rows: Record\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(false)\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, loadModule, isError }] as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n}\r\n\r\n/**\r\n * HOC which wraps component in React.Suspense\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\r\n */\r\nexport function withSuspense

>(\r\n Component: React.ComponentType

,\r\n fallback: React.ReactNode = null\r\n) {\r\n return function WrappedComponent(props: P) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n","const NUM_OF_RETRIES = 3\r\n\r\nexport function importWithRetry(importFn: () => Promise, retries = 0) {\r\n const result = importFn().catch(async (err) => {\r\n if (retries > NUM_OF_RETRIES) {\r\n throw err\r\n }\r\n\r\n await new Promise((r) => setTimeout(r, 1000 * retries))\r\n\r\n return importWithRetry(importFn, retries + 1)\r\n }) as Promise\r\n\r\n return result\r\n}\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IArrowAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Arrow extends Element {\r\n static type = CanvasElementType.arrow\r\n\r\n declare scaled: Pick\r\n name = 'Arrow'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 3,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineCap', 'round')\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const angle = Math.PI / 8\r\n const d = 20\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\r\n const h = Math.abs(d / Math.cos(angle))\r\n\r\n const angle1 = lineAngle + angle\r\n const topx = roundedXY.x1 + Math.cos(angle1) * h\r\n const topy = roundedXY.y1 + Math.sin(angle1) * h\r\n const angle2 = lineAngle - angle\r\n const botx = roundedXY.x1 + Math.cos(angle2) * h\r\n const boty = roundedXY.y1 + Math.sin(angle2) * h\r\n\r\n context.beginPath()\r\n context.moveTo(topx, topy)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(botx, boty)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nArrow.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Arrow\r\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element, { EdgeValues } from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport type BrushPoints = Array<[x: number, y: number]>\r\n\r\nexport interface IBrushAttrs {\r\n points: BrushPoints\r\n fill: string\r\n border: DrawingBorder\r\n isPolyLineClosed: boolean\r\n positionPointsTimestamps: BrushPoints\r\n}\r\n\r\nclass Brush extends Element {\r\n static type = CanvasElementType.brushV1\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n\r\n name = 'Brush'\r\n\r\n brushPath: Path2D | null = null\r\n\r\n cachedFill = {\r\n previousFill: '',\r\n shouldRenderFill: false,\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this.setFillCache()\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultTransparentFill,\r\n border: {\r\n width: 3,\r\n color: ElementSettings.Colors.border,\r\n },\r\n isPolyLineClosed: false,\r\n } as Partial\r\n }\r\n\r\n setFillCache() {\r\n this.cachedFill.previousFill = this.attrs.fill\r\n if (this.attrs.fill.length === 9) {\r\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\r\n } else {\r\n this.cachedFill.shouldRenderFill = true\r\n }\r\n }\r\n\r\n getShouldRenderFill() {\r\n if (this.attrs.fill !== this.cachedFill.previousFill) {\r\n this.setFillCache()\r\n }\r\n return this.cachedFill.shouldRenderFill\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (this.attrs.border != null) {\r\n context.set('strokeStyle', this.attrs.border.color)\r\n }\r\n context.set('lineCap', 'round')\r\n context.set('lineJoin', 'round')\r\n\r\n const brushPath = new Path2D()\r\n const { points } = this.attrs\r\n context.beginPath()\r\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\r\n let i\r\n if (points.length > 3) {\r\n for (i = 0; i < points.length - 2; i++) {\r\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\r\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\r\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\r\n }\r\n brushPath.quadraticCurveTo(\r\n this.fx(points[i][0]),\r\n this.fy(points[i][1]),\r\n this.fx(points[i + 1][0]),\r\n this.fy(points[i + 1][1])\r\n )\r\n } else {\r\n for (const point of points) {\r\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\r\n }\r\n }\r\n\r\n if (this.attrs.isPolyLineClosed) {\r\n brushPath.closePath()\r\n }\r\n this.brushPath = brushPath\r\n if (this.attrs.fill && this.getShouldRenderFill()) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.fill(brushPath)\r\n }\r\n if (this.attrs?.border?.width) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.stroke(brushPath)\r\n }\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n const [firstX, firstY] = this.attrs.points[0]\r\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\r\n\r\n return [\r\n new Thumb(\r\n 'first',\r\n () => firstX,\r\n () => firstY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'last',\r\n () => lastX,\r\n () => lastY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n moveByThumb = ({ difX, difY }: RequireByKey) => {\r\n this.moveBy(difX, difY)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n if (this.getIsCreator()) return\r\n for (const point of this.attrs.points) {\r\n point[0] += x\r\n point[1] += y\r\n }\r\n }\r\n\r\n onMouseUp() {\r\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\r\n for (const point of this.attrs.points) {\r\n point[0] = this.roundToFixed(point[0], 2)\r\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\r\n }\r\n super.onMouseUp()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { points } = this.attrs\r\n if (\r\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\r\n this.brushPath &&\r\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\r\n ) {\r\n return true\r\n } else if (points.length > 1) {\r\n for (let i = 0; i < points.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(points[i][0]),\r\n y1: this.fy(points[i][1]),\r\n x2: this.fx(points[i + 1][0]),\r\n y2: this.fy(points[i + 1][1]),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionPointsTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\r\n this.set({ points } as Partial)\r\n }\r\n\r\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\r\n\r\n roundY = (y: number, domainDiff: number) => {\r\n if (domainDiff < 1) {\r\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\r\n if (numberOfLeadingZeros > 0) {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\r\n } else {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\r\n }\r\n } else if (domainDiff < 10) {\r\n return this.roundToFixed(y, 3)\r\n }\r\n return this.roundToFixed(y, 2)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(([x, y]) => {\r\n edgeXYValues.minX = Math.min(x, edgeXYValues.minX ?? x)\r\n edgeXYValues.minY = Math.min(y, edgeXYValues.minY ?? y)\r\n edgeXYValues.maxX = Math.max(x, edgeXYValues.maxX ?? x)\r\n edgeXYValues.maxY = Math.max(y, edgeXYValues.maxY ?? y)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nBrush.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\r\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\r\n ],\r\n}\r\n\r\nexport default Brush\r\n","import math from '../../helpers/math'\r\n\r\ninterface ICoordinates {\r\n x: number\r\n y: number\r\n}\r\nexport interface IRectangleSidesCoordinates {\r\n topLeft: ICoordinates\r\n topRight: ICoordinates\r\n rightTop: ICoordinates\r\n rightBottom: ICoordinates\r\n bottomRight: ICoordinates\r\n bottomLeft: ICoordinates\r\n leftBottom: ICoordinates\r\n leftTop: ICoordinates\r\n}\r\n\r\nexport interface ITailCoordinates {\r\n tailRoot: ICoordinates\r\n tailTip: ICoordinates\r\n}\r\n\r\nexport enum TailDirection {\r\n noTail,\r\n topLeftCorner,\r\n topRightCorner,\r\n bottomLeftCorner,\r\n bottomRightCorner,\r\n topSide,\r\n rightSide,\r\n bottomSide,\r\n leftSide,\r\n}\r\n\r\nexport const getRectangleSidesCoordinates = ({\r\n padding,\r\n radius,\r\n x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n}: {\r\n padding: number\r\n radius: number\r\n x2: number\r\n y2: number\r\n textWidth: number\r\n measuredHeight: number\r\n}): IRectangleSidesCoordinates => ({\r\n topLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 - padding,\r\n },\r\n topRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 - padding,\r\n },\r\n rightTop: {\r\n x: x2 + textWidth + padding,\r\n y: y2 - padding + radius,\r\n },\r\n rightBottom: {\r\n x: x2 + textWidth + padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n bottomRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n bottomLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n leftBottom: {\r\n x: x2 - padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n leftTop: {\r\n x: x2 - padding,\r\n y: y2 - padding + radius,\r\n },\r\n})\r\n\r\nexport const getTailCoordinates = ({\r\n rectangleSides,\r\n x1,\r\n y1,\r\n}: {\r\n rectangleSides: IRectangleSidesCoordinates\r\n x1: number\r\n y1: number\r\n}): ITailCoordinates => ({\r\n tailRoot: {\r\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\r\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\r\n },\r\n tailTip: {\r\n x: x1,\r\n y: y1,\r\n },\r\n})\r\n\r\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\r\n const dist = math.distance(p1, p2)\r\n if (dist < halfWidth * 2) {\r\n return dist / 2\r\n } else {\r\n return halfWidth\r\n }\r\n}\r\n\r\nexport const getTailToSideIntersection = ({\r\n tail,\r\n rectangleSides,\r\n}: {\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n}): TailDirection => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\r\n return TailDirection.topLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\r\n return TailDirection.topRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\r\n return TailDirection.bottomLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\r\n return TailDirection.bottomRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\r\n return TailDirection.topSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\r\n return TailDirection.rightSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\r\n return TailDirection.bottomSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\r\n return TailDirection.leftSide\r\n } else {\r\n return TailDirection.noTail\r\n }\r\n}\r\n\r\ninterface IRenderCallout {\r\n context: any\r\n radius: number\r\n requiredTailHalfWidth: number\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n tailDirection: TailDirection\r\n}\r\n\r\nexport const renderCallout = ({\r\n context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n}: IRenderCallout): void => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n\r\n // draw rounded rectangle from top left corner clockwise\r\n // !!! ORDER OF RENDER MATTERS !!!\r\n\r\n // renderTopLeftCorner\r\n if (tailDirection === TailDirection.topLeftCorner) {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x, topLeft.y)\r\n } else {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\r\n }\r\n\r\n // renderTopLine\r\n if (tailDirection === TailDirection.topSide) {\r\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\r\n if (!tailLineToTopLineIntersection) {\r\n context.lineTo(topRight.x, topRight.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\r\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\r\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n } else {\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n\r\n // renderTopRightCorner\r\n if (tailDirection === TailDirection.topRightCorner) {\r\n context.lineTo(topRight.x, topRight.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y)\r\n } else {\r\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\r\n }\r\n\r\n // renderRightLine\r\n if (tailDirection === TailDirection.rightSide) {\r\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\r\n if (!tailLineToRightLineIntersection) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\r\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\r\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\r\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n } else {\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n } else {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n\r\n // renderBottomRightCorner\r\n if (tailDirection === TailDirection.bottomRightCorner) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x, bottomRight.y)\r\n } else {\r\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\r\n }\r\n\r\n // renderBottomLine\r\n if (tailDirection === TailDirection.bottomSide) {\r\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\r\n tailTip,\r\n tailRoot,\r\n bottomLeft,\r\n bottomRight\r\n )\r\n if (!tailLineToBottomLineIntersection) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\r\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\r\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n } else {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n\r\n // renderBottomLeftCorner\r\n if (tailDirection === TailDirection.bottomLeftCorner) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y)\r\n } else {\r\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\r\n }\r\n\r\n // renderLeftLine\r\n if (tailDirection === TailDirection.leftSide) {\r\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\r\n if (!tailLineToLeftLineIntersection) {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\r\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\r\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\r\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n } else {\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n } else {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n}\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\r\nimport { PADDING } from '../../constants/common'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\nimport {\r\n getRectangleSidesCoordinates,\r\n getTailCoordinates,\r\n getTailToSideIntersection,\r\n renderCallout,\r\n} from './callout_utils'\r\n\r\nexport interface ICalloutAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\r\n\r\nclass Callout extends Text {\r\n static type = CanvasElementType.calloutV1\r\n\r\n name = 'Callout'\r\n\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare isActualBoundingBoxAvailable: boolean\r\n declare lastAttrs: Attrs\r\n declare scaled: Pick\r\n declare measuredHeight: number\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tail',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n },\r\n ],\r\n }\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n text: '',\r\n font: {\r\n size: 15,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n fillStyle: ElementSettings.Colors.textWithoutBackground,\r\n lineHeight: 15,\r\n // left | right | center | start | end\r\n textAlign: 'left',\r\n // top | middle | alphabetic | bottom\r\n textBaseline: 'alphabetic',\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n background: ElementSettings.defaultFill,\r\n border: { color: ElementSettings.Colors.line, width: 1 },\r\n } as Partial\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y2 + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\r\n this.context.fillText(this.lines[i].text, this.scaled.x2 + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n getCalloutProperties() {\r\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\r\n const requiredTailHalfWidth = this.attrs.font.size * 0.5\r\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\r\n const radius = textWidth < requiredTailHalfWidth ? textWidth / 2 : requiredTailHalfWidth\r\n\r\n const measuredHeight = this.measuredHeight < requiredTailHalfWidth ? radius * 2 : this.measuredHeight\r\n const y2 = this.scaled.y2 - (this.lines?.[0]?.metrics.actualBoundingBoxAscent || measuredHeight)\r\n\r\n // Points diagram\r\n //.......X-----------------X.......\r\n //.................................\r\n //...X.........................X...\r\n //...|.........................|...\r\n //...|.........................|...\r\n //...X.........................X...\r\n //.................................\r\n //.......X-----------------X.......\r\n\r\n const rectangleSides = getRectangleSidesCoordinates({\r\n padding,\r\n radius,\r\n x2: this.scaled.x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n })\r\n const tail = getTailCoordinates({ rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\r\n const tailDirection = getTailToSideIntersection({ tail, rectangleSides })\r\n\r\n return {\r\n radius,\r\n requiredTailHalfWidth,\r\n rectangleSides,\r\n tail,\r\n tailDirection,\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { radius, requiredTailHalfWidth, tail, tailDirection, rectangleSides } = this.getCalloutProperties()\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.lineJoin = 'round'\r\n renderCallout({\r\n context: this.context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n })\r\n this.context.closePath()\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // is in rectangle\r\n const { tail, rectangleSides, requiredTailHalfWidth } = this.getCalloutProperties()\r\n if (\r\n this.lines &&\r\n rectangleSides &&\r\n rectangleSides.leftTop.x < area.scaled.x &&\r\n rectangleSides.topLeft.y < area.scaled.y &&\r\n rectangleSides.rightBottom.x > area.scaled.x &&\r\n rectangleSides.bottomRight.y > area.scaled.y\r\n ) {\r\n return true\r\n }\r\n // is in tail\r\n if (tail) {\r\n const tailP1 = math.perpendicularPointToLine({\r\n distance: requiredTailHalfWidth,\r\n line: { x1: tail.tailTip.x, y1: tail.tailTip.y, x2: tail.tailRoot.x, y2: tail.tailRoot.y },\r\n })\r\n const pointOffsetX = tailP1.x - tail.tailRoot.x\r\n const pointOffsetY = tailP1.y - tail.tailRoot.y\r\n const tailP2 = { x: tail.tailRoot.x + -1 * pointOffsetX, y: tail.tailRoot.y + -1 * pointOffsetY }\r\n const polygon = [tail.tailTip, tailP1, tailP2]\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tail') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n }\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator() || !this.lines) {\r\n return true\r\n }\r\n\r\n const { tail, rectangleSides } = this.getCalloutProperties()\r\n\r\n return [...Object.values(rectangleSides), tail.tailRoot, tail.tailTip].some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n )\r\n }\r\n}\r\n\r\nexport default Callout\r\n","import { Bezier } from 'bezier-js'\r\n\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ICurveAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Curve extends Element {\r\n static type = CanvasElementType.curve\r\n\r\n name = 'Curve'\r\n declare scaled: Pick\r\n declare curve: Bezier\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3 || this.attrs.x2,\r\n () => this.attrs.y3 || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\r\n const { points } = curve\r\n context.beginPath()\r\n context.moveTo(points[0].x, points[0].y)\r\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\r\n context.stroke()\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if (!x3 || !y3) {\r\n context.beginPath()\r\n context.moveTo(x1, y1)\r\n context.lineTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n context.stroke()\r\n } else {\r\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\r\n this.drawQuadraticCurve(context, this.curve)\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.x3 += x\r\n this.attrs.cp1x += x\r\n this.attrs.cp2x += x\r\n\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n this.attrs.y3 += y\r\n this.attrs.cp1y += y\r\n this.attrs.cp2y += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n if (!x3 || !y3) {\r\n return true\r\n }\r\n const isInView =\r\n Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5).points.some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n ) ?? true\r\n\r\n return isInView\r\n }\r\n}\r\n\r\nCurve.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Curve\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n width: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface ICoordinates {\r\n topCenterX: number\r\n topCenterY: number\r\n topRightX: number\r\n topRightY: number\r\n topLeftX: number\r\n topLeftY: number\r\n centerLeftX: number\r\n centerLeftY: number\r\n centerRightX: number\r\n centerRightY: number\r\n bottomCenterX: number\r\n bottomCenterY: number\r\n bottomLeftX: number\r\n bottomLeftY: number\r\n bottomRightX: number\r\n bottomRightY: number\r\n}\r\n\r\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current Ellipse tool located in ellipse folder\r\nclass Ellipse extends Element {\r\n static type = CanvasElementType.ellipse\r\n\r\n name = 'Ellipse'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'x1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'x2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'lw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const c = this.getCoordinates()\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\r\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\r\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\r\n context.closePath()\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'x1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'x2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'lw':\r\n this.attrs.width += difX\r\n break\r\n case 'rw':\r\n this.attrs.width -= difX\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getCoordinates(): ICoordinates {\r\n // TODO cache?\r\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\r\n const rotationAngle =\r\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\r\n\r\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\r\n const radiusX = this.scaled.width / 2\r\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\r\n if (this.scaled.y1 === this.scaled.y2) {\r\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\r\n }\r\n\r\n const width_two_thirds = (radiusX * 4) / 3\r\n\r\n const dx1 = Math.sin(rotationAngle) * radiusY\r\n const dy1 = Math.cos(rotationAngle) * radiusY\r\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\r\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\r\n\r\n const x = this.scaled.x1 + dx1\r\n const y = this.scaled.y1 - dy1\r\n\r\n const topCenterX = x - dx1\r\n const topCenterY = y + dy1\r\n const topRightX = topCenterX + dx2\r\n const topRightY = topCenterY + dy2\r\n const topLeftX = topCenterX - dx2\r\n const topLeftY = topCenterY - dy2\r\n\r\n const bottomCenterX = x + dx1\r\n const bottomCenterY = y - dy1\r\n const bottomRightX = bottomCenterX + dx2\r\n const bottomRightY = bottomCenterY + dy2\r\n const bottomLeftX = bottomCenterX - dx2\r\n const bottomLeftY = bottomCenterY - dy2\r\n\r\n const centerRightX = x + dx2\r\n const centerRightY = y + dy2\r\n const centerLeftX = x - dx2\r\n const centerLeftY = y - dy2\r\n\r\n return {\r\n topCenterX,\r\n topCenterY,\r\n topRightX,\r\n topRightY,\r\n topLeftX,\r\n topLeftY,\r\n centerLeftX,\r\n centerLeftY,\r\n centerRightX,\r\n centerRightY,\r\n bottomCenterX,\r\n bottomCenterY,\r\n bottomLeftX,\r\n bottomLeftY,\r\n bottomRightX,\r\n bottomRightY,\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const c = this.getCoordinates()\r\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\r\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\r\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\r\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipse.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Ellipse\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\r\n\r\nexport interface IRotatedRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n height: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current RotatedRectangle tool located in rotated_rectangle folder\r\nclass RotatedRectangle extends Element {\r\n static type = CanvasElementType.rotatedRectangle\r\n\r\n name = 'Rotated rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n const x = this.model.scale.x.invert\r\n const y = this.model.scale.y.invert\r\n this._thumbs = [\r\n new Thumb(\r\n 'ml',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'mr',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => x(this.getRectCoordinates()[0][0]),\r\n () => y(this.getRectCoordinates()[0][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tr',\r\n () => x(this.getRectCoordinates()[1][0]),\r\n () => y(this.getRectCoordinates()[1][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bl',\r\n () => x(this.getRectCoordinates()[2][0]),\r\n () => y(this.getRectCoordinates()[2][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => x(this.getRectCoordinates()[3][0]),\r\n () => y(this.getRectCoordinates()[3][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n const coords = this.getRectCoordinates()\r\n for (const point of coords) {\r\n context.lineTo(point[0], point[1])\r\n }\r\n context.lineTo(coords[0][0], coords[0][1])\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(): RotatedRectangleCoordiantes {\r\n const mx1 = this.scaled.x1\r\n const mx2 = this.scaled.x2\r\n const my1 = this.scaled.y1\r\n const my2 = this.scaled.y2\r\n const { height } = this.scaled\r\n\r\n const k = (my2 - my1) / (mx2 - mx1)\r\n const nk = -1 / k\r\n\r\n const sign = my1 > my2 ? 1 : -1\r\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\r\n const dy = nk * dx\r\n\r\n let x1 = mx1 - dx\r\n let y1 = my1 - dy\r\n let x2 = mx2 - dx\r\n let y2 = my2 - dy\r\n\r\n let x3 = mx2 + dx\r\n let y3 = my2 + dy\r\n let x4 = mx1 + dx\r\n let y4 = my1 + dy\r\n\r\n if (my1 === my2) {\r\n x1 = mx1\r\n y1 = my1 - height / 2\r\n x2 = mx2\r\n y2 = my2 - height / 2\r\n\r\n x3 = mx2\r\n y3 = my2 + height / 2\r\n x4 = mx1\r\n y4 = my1 + height / 2\r\n }\r\n\r\n return [\r\n [x1, y1],\r\n [x2, y2],\r\n [x3, y3],\r\n [x4, y4],\r\n ]\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'ml':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'mr':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'tl':\r\n case 'tr':\r\n this.attrs.height += difY\r\n break\r\n case 'bl':\r\n case 'br':\r\n this.attrs.height -= difY\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coords = this.getRectCoordinates()\r\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangle\r\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ISymbolAttrs {\r\n x1: number\r\n scaleX: number\r\n y1: number\r\n scaleY: number\r\n angle: number\r\n fill: string\r\n symbol: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass SymbolElement extends Element {\r\n static type = CanvasElementType.symbol\r\n\r\n name = 'Symbol'\r\n\r\n declare textWidth: number\r\n declare textHeight: number\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n const sx = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\r\n const sy = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\r\n this._thumbs = [\r\n new Thumb(\r\n 'xr',\r\n () => this.model.scale.x.invert(sx(+1).x),\r\n () => this.model.scale.y.invert(sx(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'xl',\r\n () => this.model.scale.x.invert(sx(-1).x),\r\n () => this.model.scale.y.invert(sx(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yt',\r\n () => this.model.scale.x.invert(sy(+1).x),\r\n () => this.model.scale.y.invert(sy(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yb',\r\n () => this.model.scale.x.invert(sy(-1).x),\r\n () => this.model.scale.y.invert(sy(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.attrs.angle = this.attrs.angle || 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('font', '36px FontAwesome')\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('textAlign', 'left')\r\n context.set('textBaseline', 'top')\r\n\r\n this.textWidth = context.measureText(this.attrs.symbol).width\r\n this.textHeight = 36\r\n const xScale = this.attrs.scaleX\r\n const yScale = this.attrs.scaleY\r\n\r\n const xOffset = this.textWidth / -2\r\n const yOffset = this.textHeight / -2\r\n\r\n context.save()\r\n context.translate(this.scaled.x1, this.scaled.y1)\r\n context.rotate(this.attrs.angle)\r\n context.scale(xScale, yScale)\r\n context.fillText(this.attrs.symbol, xOffset, yOffset)\r\n context.restore()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRotatedCoordinates(x: number, y: number) {\r\n const cx = this.scaled.x1\r\n const cy = this.scaled.y1\r\n const dx = x - cx\r\n const dy = y - cy\r\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\r\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\r\n return { x: cx + rx, y: cy + ry }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n return (this.attrs.y1 += y)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'xl':\r\n this.attrs.scaleX -= difX\r\n break\r\n case 'xr':\r\n this.attrs.scaleX += difX\r\n break\r\n case 'yt':\r\n this.attrs.scaleY -= difY\r\n break\r\n case 'yb':\r\n this.attrs.scaleY += difY\r\n break\r\n case 'c':\r\n this.attrs.angle += difX / 5\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\r\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\r\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\r\n\r\nSymbolElement.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\r\n}\r\n\r\nexport default SymbolElement\r\n","import { CanvasElementType } from '../constants/common'\r\nimport arrow from './arrow'\r\nimport brush_v1 from './brush/brush_v1'\r\nimport callout_v1 from './callout/callout_v1'\r\nimport curve from './curve'\r\nimport element from './element'\r\nimport elliottWaves from './elliott_waves/elliott_waves'\r\nimport ellipse from './ellipse'\r\nimport ellipse_v1 from './ellipse/ellipse_v1'\r\nimport fibonacci from './fibonacci_retracements'\r\nimport horizontalLine from './horizontal_line'\r\nimport line from './line'\r\nimport measure from './measure'\r\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\r\nimport polygon from './polygon'\r\nimport position from './position'\r\nimport rectangle from './rectangle'\r\nimport rotatedRectangle from './rotated_rectangle'\r\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\r\nimport scaledLine from './scaled_line'\r\nimport scaledText from './scaled_text'\r\nimport symbolElement from './symbol'\r\nimport text from './text'\r\nimport triangle from './triangle'\r\nimport verticalLine from './vertical_line'\r\nimport xabcd from './xabcd'\r\n\r\nexport const drawingToolsByType = Object.freeze({\r\n [CanvasElementType.element]: element,\r\n [CanvasElementType.arrow]: arrow,\r\n [CanvasElementType.brushV1]: brush_v1,\r\n [CanvasElementType.calloutV1]: callout_v1,\r\n [CanvasElementType.curve]: curve,\r\n [CanvasElementType.elliottWaves]: elliottWaves,\r\n [CanvasElementType.ellipse]: ellipse,\r\n [CanvasElementType.ellipseV1]: ellipse_v1,\r\n [CanvasElementType.fibonacciRetracements]: fibonacci,\r\n [CanvasElementType.horizontalLine]: horizontalLine,\r\n [CanvasElementType.line]: line,\r\n [CanvasElementType.measure]: measure,\r\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\r\n [CanvasElementType.polygon]: polygon,\r\n [CanvasElementType.position]: position,\r\n [CanvasElementType.rectangle]: rectangle,\r\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\r\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\r\n [CanvasElementType.scaledLine]: scaledLine,\r\n [CanvasElementType.scaledText]: scaledText,\r\n [CanvasElementType.symbol]: symbolElement,\r\n [CanvasElementType.text]: text,\r\n [CanvasElementType.triangle]: triangle,\r\n [CanvasElementType.verticalLine]: verticalLine,\r\n [CanvasElementType.xabcd]: xabcd,\r\n})\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\nimport mergewith from 'lodash.mergewith'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport Thumb from '../canvas/thumb'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IVisibility,\r\n IndicatorType,\r\n MacroTimeframe,\r\n MicroMacroTimeframe,\r\n OverlayType,\r\n SetVisibilityTo,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isInRange } from '../utils/helpers'\r\n\r\nexport type TodoModalConfig = TodoObjectHashAnyType\r\ntype TodoPositionTimestamps = TodoObjectHashAnyType\r\n\r\nexport interface DefaultAttrs extends ObjectHash {\r\n positionTimestamps?: TodoPositionTimestamps\r\n visibility?: IVisibility\r\n}\r\n\r\nexport type EdgeValues = { minX?: number; maxX?: number; minY?: number; maxY?: number }\r\n\r\nclass Element extends Spine.Module {\r\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\r\n CanvasElementType.element\r\n\r\n static fromObject(obj: T['attrs'], model: T['model']) {\r\n return new this(obj, model) as T\r\n }\r\n\r\n static getNumOfBarsBuffer(\r\n _?: RequireByKey | RequireByKey\r\n ) {\r\n return 0\r\n }\r\n\r\n isCreator = false\r\n isCreatorDialogOpen = false\r\n attrs: Attrs = {} as Attrs\r\n\r\n model: any\r\n _thumbs: Thumb[]\r\n\r\n getDefaults?(): Partial\r\n renderCross?(ctx: RenderingContext2DType): void\r\n renderCrossText?(\r\n ctx: RenderingContext2DType,\r\n crossIndex: number,\r\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\r\n ): void\r\n\r\n renderContent?(ctx: RenderingContext2DType): void\r\n renderGrid?(ctx: RenderingContext2DType): void\r\n renderLabels?(ctx: RenderingContext2DType): void\r\n declare defaults?: Partial\r\n getModalConfigBase?(): TodoModalConfig\r\n declare modalConfig?: TodoModalConfig\r\n getMinMax?(): { min: number; max: number }\r\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\r\n\r\n activeThumb: Thumb | null = null\r\n isMouseDown = false\r\n isSelected = false\r\n isHovered = false\r\n isEditInProgress = false\r\n edgeXYValues: EdgeValues | null = null\r\n declare scaled?: ObjectHash | Partial\r\n\r\n declare toolsCallback: () => void\r\n\r\n constructor(values: Partial, model: Model) {\r\n super(values, model)\r\n this.model = model\r\n if (this.getDefaults) {\r\n this.set(this.getDefaults() || {})\r\n } else {\r\n this.set(this.defaults || {})\r\n }\r\n this.set(values)\r\n this._thumbs = []\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this)\r\n this.onMouseMove = this.onMouseMove.bind(this)\r\n this.onMouseUp = this.onMouseUp.bind(this)\r\n this.bind('mousedown', this.onMouseDown)\r\n this.bind('mousemove', this.onMouseMove)\r\n this.bind('mouseup', this.onMouseUp)\r\n this.bind('change', () => {\r\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\r\n const element = this.getIsChartEvent()\r\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\r\n : this.model.elements?.()?.findByAttribute('instance', this)\r\n\r\n element?.trigger('change', element)\r\n })\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Element).type\r\n }\r\n\r\n getThumbs() {\r\n return this._thumbs\r\n }\r\n\r\n moveBy(_: number, __: number) {}\r\n\r\n setIsSelected(isSelected: boolean) {\r\n this.isSelected = isSelected\r\n this.trigger('change')\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n this.isHovered = isHovered\r\n this.trigger('change')\r\n }\r\n\r\n getShouldRenderThumbs() {\r\n return this.isSelected || this.isHovered\r\n }\r\n\r\n getIsPaneSelection(): boolean {\r\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\r\n return paneModel?.selection === this\r\n }\r\n\r\n set(obj: Partial) {\r\n const attrsSubset = Object.keys(obj).reduce(\r\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\r\n {} as Partial\r\n )\r\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\r\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\r\n if (this.getIsDrawing() && key === 'visibility') {\r\n return srcValue ?? {}\r\n }\r\n }\r\n mergewith(this.attrs, obj, customizer)\r\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n this.edgeXYValues = null\r\n return this\r\n }\r\n\r\n get(key: T) {\r\n return this.attrs[key]\r\n }\r\n\r\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\r\n\r\n fx = (x: number) => this.model.scale.x(x)\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n scale({ x, y }: { x: string[]; y: string[] }) {\r\n this.scaled = {}\r\n x.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fx(this.attrs[el]),\r\n })\r\n })\r\n\r\n y.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fy(this.attrs[el]),\r\n })\r\n })\r\n }\r\n\r\n render(_: RenderingContext2DType) {}\r\n\r\n renderThumbs(context: CanvasRenderingContext2D) {\r\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\r\n if (isHoveredThumbStyle) {\r\n context.globalAlpha = 0.5\r\n }\r\n this.getThumbs().map((thumb) => thumb.render(context))\r\n context.globalAlpha = 1\r\n }\r\n\r\n onMouseDown(area: PaneArea) {\r\n this.isMouseDown = true\r\n this.isEditInProgress = true\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n this.activeThumb = thumb\r\n this.activeThumb.startEditing(area)\r\n return\r\n }\r\n }\r\n }\r\n\r\n onMouseMove(area: PaneArea) {\r\n if (!area.mouseDown) {\r\n return\r\n }\r\n if (this.activeThumb != null) {\r\n this.activeThumb.moveTo(area)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n onMouseUp(_?: PaneArea) {\r\n this.isMouseDown = false\r\n this.isEditInProgress = false\r\n this.activeThumb = null\r\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const { x: xPointKeys } = this.getBoundingPointKeys()!\r\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\r\n const positionX = this.attrs[key]\r\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\r\n return {\r\n ...acc,\r\n [key]: timeStamp,\r\n }\r\n }, {}) as TodoPositionTimestamps\r\n this.set({ positionTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionTimestamps } = this.attrs\r\n if (!quote || !positionTimestamps) {\r\n // positionTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\r\n (acc, [key, timestamp]) => ({\r\n ...acc,\r\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\r\n }),\r\n {}\r\n )\r\n this.set(pointPoitionsFromTimestamp)\r\n }\r\n\r\n thumbsAreInArea(area: PaneArea) {\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n isDrawingElementLockedOrInvisible() {\r\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\r\n }\r\n\r\n getModalConfig() {\r\n let config\r\n if (this.getModalConfigBase) {\r\n config = merge({}, this.getModalConfigBase())\r\n } else {\r\n config = merge({}, this.modalConfig)\r\n }\r\n if (this.getIsDrawing()) {\r\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\r\n }\r\n if (config.title == null) {\r\n config.title = this.name\r\n }\r\n for (const input of config.inputs) {\r\n if (input.default != null) {\r\n input.value = input.default\r\n }\r\n if (this.attrs[input.name] != null) {\r\n input.value = this.attrs[input.name]\r\n }\r\n }\r\n return config\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return this.toObject()\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\r\n }\r\n\r\n toAutosaveConfig() {\r\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\r\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\r\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\r\n }\r\n\r\n replaceMyself(element: Element) {\r\n setTimeout(() => {\r\n element.cachePointPositionTimestamp()\r\n const el = this.model.elements().findByAttribute('instance', this)\r\n if (!el) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('element.ts replaceMyself', {\r\n extra: {\r\n oldElement: {\r\n type: this?.type,\r\n isCreator: this?.isCreator,\r\n isMouseDown: this?.isMouseDown,\r\n isSelected: this?.isSelected,\r\n isHovered: this?.isHovered,\r\n isEditInProgress: this?.isEditInProgress,\r\n },\r\n newElement: {\r\n type: element?.type,\r\n isCreator: element?.isCreator,\r\n isMouseDown: element?.isMouseDown,\r\n isSelected: element?.isSelected,\r\n isHovered: element?.isHovered,\r\n isEditInProgress: element?.isEditInProgress,\r\n },\r\n },\r\n })\r\n } else {\r\n el.replace(element)\r\n }\r\n })\r\n }\r\n\r\n toString() {\r\n return this.name\r\n }\r\n\r\n getIsCreator() {\r\n return this.isCreator\r\n }\r\n\r\n getIsCreatorDialogOpen() {\r\n return this.isCreatorDialogOpen\r\n }\r\n\r\n release() {\r\n this.cachePointPositionTimestamp()\r\n this.unbind()\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n getIsDrawing() {\r\n return !!this.type.startsWith('canvas/')\r\n }\r\n\r\n getIsChartEvent() {\r\n return !!this?.type.startsWith('chartEvent/')\r\n }\r\n\r\n getIsVisible() {\r\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const visibility = this.attrs.visibility?.[macro]\r\n\r\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\r\n if (visibility === undefined) return true\r\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\r\n if (Object.keys(visibility).length === 0) return false\r\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\r\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\r\n }\r\n\r\n setVisibilityTo(setTo: SetVisibilityTo) {\r\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\r\n\r\n let timeframesToSet: string[] = []\r\n let attrsToSet: { from?: number; to?: number } = {}\r\n\r\n switch (setTo) {\r\n case SetVisibilityTo.currentAndAbove: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\r\n attrsToSet = { from: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentAndBelow: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\r\n attrsToSet = { to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentOnly: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\r\n attrsToSet = { from: micro, to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.all:\r\n default: {\r\n this.set({ visibility: {} } as Partial)\r\n return\r\n }\r\n }\r\n\r\n this.set({\r\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\r\n } as Partial)\r\n }\r\n\r\n getEdgeXYValues() {\r\n const { x: xPoints, y: yPoints } = this.getBoundingPointKeys() ?? {}\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n xPoints?.forEach((key) => {\r\n const positionX = this.attrs[key]\r\n if (positionX !== undefined) {\r\n edgeXYValues.minX = Math.min(positionX, edgeXYValues.minX ?? positionX)\r\n edgeXYValues.maxX = Math.max(positionX, edgeXYValues.maxX ?? positionX)\r\n }\r\n })\r\n yPoints?.forEach((key) => {\r\n const positionY = this.attrs[key]\r\n if (positionY !== undefined) {\r\n edgeXYValues.minY = Math.min(positionY, edgeXYValues.minY ?? positionY)\r\n edgeXYValues.maxY = Math.max(positionY, edgeXYValues.maxY ?? positionY)\r\n }\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n\r\n getIsInChartView(chart: Chart, options?: { omitX?: boolean; omitY?: boolean }) {\r\n const { minX, maxX, minY, maxY } = this.getEdgeXYValues()\r\n\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!options?.omitX) {\r\n const isMaxXInvalid = maxX === undefined || isNaN(maxX)\r\n const isMinXInvalid = minX === undefined || isNaN(minX)\r\n if (\r\n !isMaxXInvalid &&\r\n !isMinXInvalid &&\r\n !(this.fx(maxX) >= -chart.leftOffset && this.fx(minX) <= -chart.leftOffset + chart.width)\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (!options?.omitY) {\r\n if (minY === undefined || maxY === undefined) {\r\n return true\r\n }\r\n\r\n const topBound = this.model.scale.y.invert(0)\r\n const bottomBound = this.model.scale.y.invert(this.model.height)\r\n return topBound >= minY && bottomBound <= maxY\r\n }\r\n\r\n // If all checks fall through, render element\r\n return true\r\n }\r\n}\r\n\r\nexport default Element\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IElliottWavesAttrs {\r\n waves: Array<{ x: number; y: number }>\r\n positionWavesTimestamps?: Array<{ x: number; y: number }>\r\n border: DrawingBorder\r\n}\r\n\r\nclass ElliottWaves extends Element {\r\n static type = CanvasElementType.elliottWaves\r\n\r\n name = 'Elliott Wave'\r\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 2,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\r\n for (const p of this.attrs.waves.slice(1)) {\r\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\r\n }\r\n context.stroke()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.center,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n this.model\r\n )\r\n for (let i = 0; i < this.attrs.waves.length; i++) {\r\n let y\r\n const p = this.attrs.waves[i]\r\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\r\n y = this.fy(p.y) + 8\r\n } else {\r\n y = this.fy(p.y) - 8\r\n }\r\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.waves.map(\r\n (wave, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => wave.x,\r\n () => wave.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\r\n ...wave,\r\n x: quote.getTimestampFomPositionX(wave.x),\r\n }))\r\n\r\n this.set({ positionWavesTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionWavesTimestamps } = this.attrs\r\n if (!quote || !positionWavesTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const waves = positionWavesTimestamps.map((wave) => ({\r\n ...wave,\r\n x: quote.getPositionXFromTimestamp(wave.x),\r\n }))\r\n this.set({ waves } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.waves) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs.waves[+type].x += difX\r\n this.attrs.waves[+type].y += difY\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const waves = this.attrs.waves\r\n for (let i = 0; i < waves.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(waves[i].x),\r\n y1: this.fy(waves[i].y),\r\n x2: this.fx(waves[i + 1].x),\r\n y2: this.fy(waves[i + 1].y),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['waves']\r\n }\r\n}\r\n\r\nElliottWaves.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ElliottWaves\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface Coordinates {\r\n P1: Point\r\n P2: Point\r\n P3: Point\r\n P4: Point\r\n CP1: Point\r\n CP2: Point\r\n CP3: Point\r\n CP4: Point\r\n}\r\n\r\nclass EllipseV1 extends Element {\r\n static type = CanvasElementType.ellipseV1\r\n\r\n name = 'Ellipse'\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n declare ellipsePath: Path2D\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this._thumbs = [\r\n new Thumb(\r\n 'left',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'right',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'top',\r\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\r\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottom',\r\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\r\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const coordinates = this.getEllipsePoints() as Coordinates\r\n const ellipse = new Path2D()\r\n context.set('fillStyle', this.attrs.fill)\r\n context.beginPath()\r\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\r\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\r\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\r\n } else {\r\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\r\n ellipse.bezierCurveTo(\r\n coordinates.CP4.x,\r\n coordinates.CP4.y,\r\n coordinates.CP1.x,\r\n coordinates.CP1.y,\r\n coordinates.P2.x,\r\n coordinates.P2.y\r\n )\r\n ellipse.bezierCurveTo(\r\n coordinates.CP2.x,\r\n coordinates.CP2.y,\r\n coordinates.CP3.x,\r\n coordinates.CP3.y,\r\n coordinates.P4.x,\r\n coordinates.P4.y\r\n )\r\n ellipse.closePath()\r\n this.ellipsePath = ellipse\r\n context.fill(ellipse)\r\n }\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke(ellipse)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getEllipsePoints(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n\r\n const P1 = { x: x2, y: y2 }\r\n const P3 = { x: x1, y: y1 }\r\n\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: P3,\r\n P2: P1,\r\n P3: P1,\r\n P4: P3,\r\n }\r\n }\r\n\r\n const lineCenterX = (P1.x + P3.x) / 2\r\n const lineCenterY = (P1.y + P3.y) / 2\r\n const pointOffsetX = perpendicularPoint.x - P1.x\r\n const pointOffsetY = perpendicularPoint.y - P1.y\r\n\r\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\r\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n\r\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\r\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\r\n\r\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\r\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\r\n\r\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\r\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\r\n\r\n const CP1 = {\r\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\r\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\r\n }\r\n const controlPointOffsetX = CP1.x - P1WithOffsetX\r\n const controlPointOffsetY = CP1.y - P1WithOffsetY\r\n\r\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\r\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\r\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\r\n\r\n return {\r\n P1,\r\n P2,\r\n P3,\r\n P4,\r\n CP1,\r\n CP2,\r\n CP3,\r\n CP4,\r\n }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: { x: number; y: number }\r\n pointToRotate: { x: number; y: number }\r\n oldLinePoint: { x: number; y: number }\r\n newLinePoint: { x: number; y: number }\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'left':\r\n const newLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newLeftPoint.x,\r\n y1: newLeftPoint.y,\r\n cursorTargetX: leftRotatedCursorPoint.x,\r\n cursorTargetY: leftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'right':\r\n const newRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newRightPoint.x,\r\n y2: newRightPoint.y,\r\n cursorTargetX: rightRotatedCursorPoint.x,\r\n cursorTargetY: rightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'top':\r\n case 'bottom':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipseV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default EllipseV1\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ntype Coefficients = string\r\n\r\nexport interface IFibonacciRetracementsAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n coefficients: Coefficients\r\n border: DrawingBorder\r\n}\r\n\r\nclass FibonacciRetracements<\r\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\r\n> extends Element {\r\n static type = CanvasElementType.fibonacciRetracements\r\n\r\n name = 'Fibonacci Retracements'\r\n declare coefficients: { default: string; parsed: number[]; max: number; 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 const heightScaled = roundedXY.y2 - roundedXY.y1\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n for (const p of this.coefficients.parsed) {\r\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\r\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\r\n }\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n const text = new Text(\r\n {\r\n x: roundedXY.x1,\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.bottom,\r\n fillStyle: this.attrs.border.color,\r\n textAlign: TextAlign.left,\r\n },\r\n this.model\r\n )\r\n if (roundedXY.x1 > roundedXY.x2) {\r\n text.set({ textAlign: TextAlign.right })\r\n }\r\n\r\n for (const p of this.coefficients.parsed) {\r\n const y = this.attrs.y2 - p * height\r\n text.set({\r\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\r\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\r\n } as Partial)\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n if (this.coefficients.max > 1 && !this._thumbs.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'maxCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'maxCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.max <= 1 && this._thumbs.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('maxCoefficient'))\r\n }\r\n\r\n if (this.coefficients.min < 0 && !this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'minCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'minCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.min >= 0 && this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('minCoefficient'))\r\n }\r\n\r\n return this._thumbs\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'oneCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'oneCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'zeroCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'zeroCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'maxCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'maxCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'minCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n case 'minCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\r\n const minCoefficientY = this.coefficients.min < 0 && this.getMinCoefficientUnscaledY()\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const allYValues = [this.attrs.y1, this.attrs.y2, maxCoefficientY, minCoefficientY].filter((item) => item !== false)\r\n const top = Math.min(...allYValues)\r\n const bottom = Math.max(...allYValues)\r\n\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getEdgeXYValues() {\r\n this.edgeXYValues = super.getEdgeXYValues()\r\n\r\n // Because minY, maxY can go outside of control points boundaries [0,1] we need to compensate\r\n // for that in getEdgeXYValues(), otherwise getIsInChartView() hide drawings sooner than it should\r\n const min = this.getMinCoefficientUnscaledY()\r\n const max = this.getMaxCoefficientUnscaledY()\r\n\r\n if (!isNaN(min) && !isNaN(max)) {\r\n this.edgeXYValues.minY = Math.min(min, max)\r\n this.edgeXYValues.maxY = Math.max(min, max)\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nFibonacciRetracements.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\r\n ],\r\n}\r\n\r\nexport default FibonacciRetracements\r\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\nimport Text from './text'\r\n\r\nconst DEFAULT_DECIMAL_PLACES = 2\r\n\r\nclass HorizontalLine extends ScaledLine {\r\n static type = CanvasElementType.horizontalLine\r\n\r\n name = 'Horizontal line'\r\n decimalPlaces = DEFAULT_DECIMAL_PLACES\r\n declare scaled: Pick\r\n declare model: PaneModel\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.updateDecimalPlaces()\r\n\r\n if (this.attrs.y1) {\r\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\r\n }\r\n if (this.modalConfig) {\r\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\r\n this.modalConfig.inputs[1] = {\r\n ...this.modalConfig.inputs[1],\r\n step,\r\n min: Number(step),\r\n }\r\n }\r\n this.renderContent = this.renderContent.bind(this)\r\n this._thumbs = []\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n updateDecimalPlaces() {\r\n const quote = this.model.chart().quote()\r\n this.decimalPlaces = quote\r\n ? math.getInstrumentDecimalPlaces({\r\n instrument: quote.instrument,\r\n value: quote.lastClose,\r\n })\r\n : DEFAULT_DECIMAL_PLACES\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n this.attrs.y2 = this.attrs.y1\r\n // mixing scaled and unscaled values, do not copy paste as solution\r\n this.attrs.x1 = ChartSettings.left.width * -1\r\n this.attrs.x2 =\r\n this.model\r\n .chart()\r\n .quote()\r\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\r\n super.renderContent(context)\r\n }\r\n\r\n renderLabels(context: CanvasRenderingContext2D) {\r\n if (this.attrs.y1) {\r\n this.updateDecimalPlaces()\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const isIndicatorPane = this.model\r\n .elements()\r\n .all()\r\n .some((element) => element.isIndicator())\r\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\r\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\r\n new Text(\r\n {\r\n x: 6,\r\n y: this.scaled.y1,\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n fillStyle: '#fff',\r\n background: '#000',\r\n textBaseline: TextBaseline.middle,\r\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n }\r\n\r\n moveBy(x: Maybe, y: number) {\r\n this.attrs.y1 += y\r\n }\r\n\r\n resize({ difY }: RequireByKey) {\r\n this.moveBy(0, difY)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitX: true })\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\r\n ],\r\n}\r\n\r\nexport default HorizontalLine\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ninterface ILineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n}\r\n\r\nclass Line extends Element {\r\n static type = CanvasElementType.line\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n lineWidth: 1,\r\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { x1, y1, x2, y2, lineWidth } = this.attrs\r\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.lineWidth)\r\n context.set('strokeStyle', this.attrs.strokeStyle)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([])\r\n }\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area, this.attrs) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nexport default Line\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport { numberToStringWithUnitsSuffix } from '../utils'\r\nimport { getRoundedString } from '../utils/helpers'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IMeasureAttrs extends Coordinates {\r\n fill: string\r\n}\r\n\r\nclass Measure extends Element {\r\n static type = CanvasElementType.measure\r\n\r\n name = 'Measure'\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n startingX1: number\r\n startingX2: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getVolumeSumString = () => {\r\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\r\n const roundedX1 = Math.round(this.attrs.x1)\r\n const roundedX2 = Math.round(this.attrs.x2)\r\n // min/max values are offset by 1 so there's no value on such index\r\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\r\n const minIndexLimit = barIndex[0] - 1\r\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\r\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n\r\n let volumeSum = 0\r\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\r\n const volumeIndex = barIndex.indexOf(i)\r\n if (volumeIndex >= 0) {\r\n volumeSum += volume[volumeIndex]\r\n }\r\n }\r\n\r\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n context.fillRect(x1, roundedXY.y1, width, height)\r\n\r\n const priceDif = this.attrs.y2 - this.attrs.y1\r\n const percentage = (100 / this.attrs.y1) * priceDif\r\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\r\n\r\n const text = new Text(\r\n {\r\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\r\n fillStyle: '#333',\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n const baseX = x1 + width / 2\r\n const baseY = roundedXY.y1 + height / 2\r\n let textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY - text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: heightStr })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY,\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: this.getVolumeSumString() })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY + text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n this.attrs.y1 += difs.y1 || 0\r\n this.attrs.y2 += difs.y2 || 0\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n\r\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\r\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x1 - newX1 !== 0) {\r\n this.attrs.x1 = newX1\r\n }\r\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x2 - newX2 !== 0) {\r\n this.attrs.x2 = newX2\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n y1: y,\r\n x2: x,\r\n y2: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.addToCoordinates({ x1: difX, y1: difY })\r\n } else {\r\n this.addToCoordinates({ x2: difX, y2: difY })\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n onMouseDown(paneArea: PaneArea) {\r\n super.onMouseDown(paneArea)\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n onMouseUp(paneArea?: PaneArea) {\r\n super.onMouseUp(paneArea)\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n}\r\n\r\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\r\n\r\nMeasure.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Measure\r\n","import { Point } from '../../../types/shared'\r\nimport { getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { ITrendAttrs } from './pitchfork_v1'\r\n\r\ninterface IGetEdgeIntersectionPointArguments {\r\n sides: { x: number; y: number }[][]\r\n rayOrigin: Point\r\n rayDirection: Point\r\n}\r\n\r\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\r\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\r\n\r\n let intersection = rayDirection\r\n let intersectionDistance = 0\r\n for (let index = 0; index < sides.length; index++) {\r\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\r\n rayOrigin,\r\n rayDirection,\r\n sides[index][0],\r\n sides[index][1]\r\n )\r\n if (rayToLineIntersection) {\r\n const distance = math.distance(rayToLineIntersection, rayOrigin)\r\n if (distance > intersectionDistance && isInRange({ value: distance })) {\r\n intersectionDistance = distance\r\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\r\n }\r\n }\r\n }\r\n\r\n return intersection\r\n}\r\n\r\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\r\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\r\n const { leftOffset, width } = paneModel.chart()\r\n\r\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\r\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\r\n const chartVisibleAreaTopY = 0\r\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\r\n\r\n const chartVisibleAreaTopLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaTopRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaBottomLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const chartVisibleAreaBottomRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\r\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\r\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\r\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\r\n\r\n const sides = [topSide, rightSide, bottomSide, leftSide]\r\n\r\n return sides\r\n}\r\n\r\ninterface IGetPitchforkCoordinates {\r\n paneModel: PaneModel\r\n rayOrigin: Point\r\n rayDirectionControlPoint1: Point\r\n rayDirectionControlPoint2?: Point\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\ninterface ILineSegment {\r\n P1: Point\r\n P2: Point\r\n}\r\n\r\ninterface ICoordinates {\r\n medianRay: ILineSegment\r\n trend1Ray1: ILineSegment | undefined\r\n trend1Ray2: ILineSegment | undefined\r\n trend2Ray1: ILineSegment | undefined\r\n trend2Ray2: ILineSegment | undefined\r\n}\r\n\r\nexport const getPitchforkCoordinates = ({\r\n paneModel,\r\n rayOrigin,\r\n rayDirectionControlPoint1,\r\n rayDirectionControlPoint2,\r\n trend1,\r\n trend2,\r\n}: IGetPitchforkCoordinates) => {\r\n const sides = getChartVisibleAreaBoundaries(paneModel)\r\n\r\n const coordinates: ICoordinates = {\r\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\r\n trend1Ray1: undefined,\r\n trend2Ray1: undefined,\r\n trend1Ray2: undefined,\r\n trend2Ray2: undefined,\r\n }\r\n\r\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\r\n if (!rayDirectionControlPoint2) {\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: rayDirectionControlPoint1,\r\n })\r\n ),\r\n }\r\n return coordinates\r\n }\r\n\r\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\r\n const rayOriginToRayDirectionVector = {\r\n x: medianRayDirectionPoint.x - rayOrigin.x,\r\n y: medianRayDirectionPoint.y - rayOrigin.y,\r\n }\r\n\r\n const rayDirectionControlPoint1ToPoint2Vector = {\r\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\r\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\r\n }\r\n\r\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\r\n rayDirectionControlPoint1ToPoint2Vector\r\n )\r\n\r\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\r\n medianRayDirectionPoint,\r\n rayDirectionControlPoint1\r\n )\r\n\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: medianRayDirectionPoint,\r\n })\r\n ),\r\n }\r\n if (trend1.active) {\r\n const trend1Ray = getTrendRayCoordinates({\r\n trend: trend1.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend1Ray1 = trend1Ray.trendRay1\r\n coordinates.trend1Ray2 = trend1Ray.trendRay2\r\n }\r\n if (trend2.active) {\r\n const trend2Ray = getTrendRayCoordinates({\r\n trend: trend2.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend2Ray1 = trend2Ray.trendRay1\r\n coordinates.trend2Ray2 = trend2Ray.trendRay2\r\n }\r\n\r\n return coordinates\r\n}\r\n\r\ninterface IGetTrendRayCoordinates {\r\n trend: number\r\n medianToControlPointDistance: number\r\n normalizedControlToControlPointVector: Point\r\n rayOriginToRayDirectionVector: Point\r\n medianRayDirectionPoint: Point\r\n sides: Point[][]\r\n}\r\n\r\nconst getTrendRayCoordinates = ({\r\n trend,\r\n medianToControlPointDistance,\r\n normalizedControlToControlPointVector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n}: IGetTrendRayCoordinates) => {\r\n const medianToTrendLineDistance = medianToControlPointDistance * trend\r\n\r\n const trendRayPoint1Origin = math.addPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n\r\n const trendRayPoint1DirectionPoint = {\r\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\r\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\r\n }\r\n const trendPoint2RayDirectionPoint = {\r\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\r\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\r\n }\r\n\r\n return {\r\n trendRay1: {\r\n P1: getRoundedObject(trendRayPoint1Origin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendRayPoint1Origin,\r\n rayDirection: trendRayPoint1DirectionPoint,\r\n })\r\n ),\r\n },\r\n trendRay2: {\r\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendPoint2RayOriginPoint2,\r\n rayDirection: trendPoint2RayDirectionPoint,\r\n })\r\n ),\r\n },\r\n }\r\n}\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\nimport { getPitchforkCoordinates } from './pitchfork_utils'\r\n\r\nexport interface ITrendAttrs {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\nexport interface IPitchforkAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n x3: number\r\n y3: number\r\n median: { color: string; width: number }\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\nclass Pitchfork extends Element {\r\n static type = CanvasElementType.pitchforkV1\r\n\r\n declare scaled: Pick\r\n name = 'Pitchfork'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'medianRayOrigin',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint1',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint2',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n median: { color: '#e72f2f', width: 1 },\r\n trend1: {\r\n color: '#004ad31c',\r\n active: true,\r\n trend: 1,\r\n },\r\n trend2: {\r\n color: '#00ca4e1f',\r\n active: true,\r\n trend: 0.5,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\r\n context.translate(offset, offset)\r\n\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n\r\n context.set('lineWidth', this.attrs.median.width)\r\n\r\n const trendLines = [\r\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\r\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\r\n ].sort((a, b) => {\r\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\r\n return -1\r\n }\r\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n\r\n // Draw trend lines and fill\r\n trendLines.forEach((trendLine, trendLineIndex) => {\r\n if (trendLine.line1 && trendLine.line2) {\r\n const { line1, line2 } = trendLine\r\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\r\n const nextTrendLine = trendLines[trendLineIndex + 1]\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\r\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\r\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\r\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\r\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\r\n }\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.lineTo(line2.P1.x, line2.P1.y)\r\n context.closePath()\r\n context.set('fillStyle', trendLine.trend.color)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n context.moveTo(line2.P1.x, line2.P1.y)\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.set('strokeStyle', solidTrendColor)\r\n context.stroke()\r\n }\r\n })\r\n\r\n // Draw median ray line\r\n context.beginPath()\r\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\r\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\r\n\r\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\r\n const outerTrendLines =\r\n trendLines.filter(\r\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\r\n )[0] ?? {}\r\n\r\n if (outerTrendLines.line1 && outerTrendLines.line2) {\r\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\r\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\r\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\r\n context.moveTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n }\r\n\r\n context.set('strokeStyle', this.attrs.median.color)\r\n context.stroke()\r\n\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'medianRayOrigin':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'rayDirectionControlPoint1':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'rayDirectionControlPoint2':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n const outerTrendLines =\r\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\r\n ? { line1: trend1Ray1, line2: trend1Ray2 }\r\n : { line1: trend2Ray1, line2: trend2Ray2 }\r\n\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: medianRay.P1.x,\r\n y1: medianRay.P1.y,\r\n x2: medianRay.P2.x,\r\n y2: medianRay.P2.y,\r\n }) <= 10\r\n ) {\r\n // cursor is near median ray\r\n return true\r\n } else if (\r\n !Number.isNaN(x3) &&\r\n !Number.isNaN(y3) &&\r\n math.distanceToSegment(area.scaled, {\r\n x1: x2,\r\n y1: y2,\r\n x2: x3,\r\n y2: y3,\r\n }) <= 10\r\n ) {\r\n // cursor is near line connecting direction control points\r\n return true\r\n } else if (\r\n outerTrendLines.line1 &&\r\n outerTrendLines.line2 &&\r\n math.pointInPolygon(area.scaled, [\r\n outerTrendLines.line1.P1,\r\n outerTrendLines.line1.P2,\r\n outerTrendLines.line2.P2,\r\n outerTrendLines.line2.P1,\r\n ])\r\n ) {\r\n // cursor is on polygon created by outer trend lines\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n}\r\n\r\nPitchfork.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'median' },\r\n { type: 'trend', name: 'trend1' },\r\n { type: 'trend', name: 'trend2' },\r\n ],\r\n}\r\n\r\nexport default Pitchfork\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element, { EdgeValues } from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype Points = Array<{ x: number; y: number }>\r\n\r\nexport interface IPolygonAttrs {\r\n points: Points\r\n fill: string\r\n border: DrawingBorder\r\n positionPointsTimestamps?: Points\r\n}\r\n\r\nclass Polygon extends Element {\r\n static type = CanvasElementType.polygon\r\n\r\n name = 'Polygon'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n const { points } = this.attrs\r\n context.beginPath()\r\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\r\n for (const p of points.slice(1)) {\r\n context.lineTo(this.fx(p.x), this.fy(p.y))\r\n }\r\n\r\n if (this.isPolygon()) {\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.points.map(\r\n (point, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => point.x,\r\n () => point.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\r\n ...point,\r\n x: quote.getTimestampFomPositionX(point.x),\r\n }))\r\n\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map((point) => ({\r\n ...point,\r\n x: quote.getPositionXFromTimestamp(point.x),\r\n }))\r\n this.set({ points } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.points) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const last = this.attrs.points.length - 1\r\n if (this.isPolygon() && (+type === 0 || +type === last)) {\r\n this.attrs.points[0].x += difX\r\n this.attrs.points[0].y += difY\r\n this.attrs.points[last].x += difX\r\n this.attrs.points[last].y += difY\r\n } else {\r\n this.attrs.points[+type].x += difX\r\n this.attrs.points[+type].y += difY\r\n }\r\n }\r\n\r\n isPolygon() {\r\n return (\r\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\r\n )\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const scaledPoints = this.attrs.points.map((p) => ({\r\n x: this.fx(p.x),\r\n y: this.fy(p.y),\r\n }))\r\n if (this.isPolygon()) {\r\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\r\n return true\r\n }\r\n } else {\r\n for (let i = 0; i < scaledPoints.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: scaledPoints[i].x,\r\n y1: scaledPoints[i].y,\r\n x2: scaledPoints[i + 1].x,\r\n y2: scaledPoints[i + 1].y,\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(({ x, y }) => {\r\n const xPoint = x\r\n const yPoint = y\r\n edgeXYValues.minX = Math.min(xPoint, edgeXYValues.minX ?? xPoint)\r\n edgeXYValues.minY = Math.min(yPoint, edgeXYValues.minY ?? yPoint)\r\n edgeXYValues.maxX = Math.max(xPoint, edgeXYValues.maxX ?? xPoint)\r\n edgeXYValues.maxY = Math.max(yPoint, edgeXYValues.maxY ?? yPoint)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nPolygon.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Polygon\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IPositionAttrs extends Coordinates {\r\n targetColor: string\r\n stopColor: string\r\n targetY: number\r\n centerY: number\r\n stopY: number\r\n}\r\n\r\nclass Position extends Element {\r\n static type = CanvasElementType.position\r\n\r\n name = 'Position'\r\n\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 't1',\r\n () => this.attrs.x1,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 't2',\r\n () => this.attrs.x2,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's1',\r\n () => this.attrs.x1,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's2',\r\n () => this.attrs.x2,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c1',\r\n () => this.attrs.x1,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c2',\r\n () => this.attrs.x2,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, targetY, centerY, stopY } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\r\n let sign, stopBaseline, targetBaseline\r\n const width = roundedXY.x2 - roundedXY.x1\r\n\r\n context.set('fillStyle', this.attrs.targetColor)\r\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\r\n\r\n context.set('fillStyle', this.attrs.stopColor)\r\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\r\n\r\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\r\n const targetPerc = (100 / this.attrs.centerY) * targetDif\r\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\r\n\r\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\r\n const stopPerc = (100 / this.attrs.centerY) * stopDif\r\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\r\n\r\n if (this.attrs.targetY > this.attrs.centerY) {\r\n sign = 1\r\n targetBaseline = TextBaseline.bottom\r\n stopBaseline = TextBaseline.top\r\n } else {\r\n sign = -1\r\n targetBaseline = TextBaseline.top\r\n stopBaseline = TextBaseline.bottom\r\n }\r\n\r\n const text = new Text(\r\n {\r\n text: targetStr,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n y: roundedXY.targetY - sign * 4,\r\n textBaseline: targetBaseline,\r\n },\r\n this.model\r\n )\r\n let textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n text.set({\r\n text: stopStr,\r\n y: roundedXY.stopY + sign * 4,\r\n textBaseline: stopBaseline,\r\n })\r\n textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n let middle, middle1, result\r\n if (difs.targetY) {\r\n result = this.attrs.targetY + difs.targetY\r\n if (\r\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.targetY = result\r\n }\r\n\r\n if (difs.stopY) {\r\n result = this.attrs.stopY + difs.stopY\r\n if (\r\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.stopY = result\r\n }\r\n\r\n if (\r\n difs.centerY &&\r\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\r\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\r\n ) {\r\n this.attrs.centerY += difs.centerY\r\n }\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\r\n if (roundDif !== 0) {\r\n if (difs.x1 != null) {\r\n this.attrs.x1 += roundDif\r\n }\r\n if (difs.x2 != null) {\r\n this.attrs.x2 += roundDif\r\n }\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n x2: x,\r\n targetY: y,\r\n centerY: y,\r\n stopY: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const [coordType, coordIndex] = (type as string).split('')\r\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\r\n const obj: Partial = {\r\n [`x${coordIndex}`]: difX,\r\n [yPoints[coordType]]: difY,\r\n }\r\n return this.addToCoordinates(obj)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\r\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nPosition.prototype.defaults = {\r\n targetColor: 'rgba(0,200,0,0.3)',\r\n stopColor: 'rgba(200,0,0,0.3)',\r\n}\r\n\r\nPosition.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'targetColor' },\r\n { type: 'background', name: 'stopColor' },\r\n ],\r\n}\r\n\r\nexport default Position\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass Rectangle extends Element {\r\n static type = CanvasElementType.rectangle\r\n\r\n name = 'Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\r\n\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n\r\n // @todo - Live sync of elements while they are being moved around\r\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\r\n // this.set(this.attrs)\r\n // this.trigger('change', this)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.attrs.x1 += difX\r\n return (this.attrs.y1 += difY)\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Rectangle\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IRotatedRectangleV1Attrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass RotatedRectangleV1 extends Element {\r\n static type = CanvasElementType.rotatedRectangleV1\r\n\r\n name = 'New Rotated Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'middleLeft',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'middleRight',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topRight',\r\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topLeft',\r\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomLeft',\r\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomRight',\r\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\r\n const roundedXY = {\r\n P1: getRoundedObject(P1),\r\n P2: getRoundedObject(P2),\r\n P3: getRoundedObject(P3),\r\n P4: getRoundedObject(P4),\r\n }\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n } else {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\r\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: { x: x2, y: y2 },\r\n P2: { x: x1, y: y1 },\r\n P3: { x: x1, y: y1 },\r\n P4: { x: x2, y: y2 },\r\n }\r\n }\r\n\r\n const pointOffsetX = perpendicularPoint.x - x2\r\n const pointOffsetY = perpendicularPoint.y - y2\r\n\r\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\r\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\r\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\r\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\r\n\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n return { P1, P2, P3, P4 }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: Point\r\n pointToRotate: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'middleLeft':\r\n const newMiddleLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newMiddleLeftPoint.x,\r\n y1: newMiddleLeftPoint.y,\r\n cursorTargetX: middleLeftRotatedCursorPoint.x,\r\n cursorTargetY: middleLeftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'middleRight':\r\n const newMiddleRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newMiddleRightPoint.x,\r\n y2: newMiddleRightPoint.y,\r\n cursorTargetX: middleRightRotatedCursorPoint.x,\r\n cursorTargetY: middleRightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'topRight':\r\n case 'topLeft':\r\n case 'bottomLeft':\r\n case 'bottomRight':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coordinates = this.getRectCoordinates()\r\n const polygon = Object.keys(coordinates).map((point) => ({\r\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\r\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangleV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangleV1\r\n","import { DrawingBorder, PaneArea } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Line from './line'\r\n\r\nexport interface IScaledLineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass ScaledLine extends Line {\r\n static type = CanvasElementType.scaledLine\r\n\r\n name = 'Line'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n}\r\n\r\nScaledLine.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ScaledLine\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea } from '../../types/shared'\r\nimport { PADDING } from '../constants/common'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Text, { ITextAttrs } from './text'\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\nclass ScaledText extends Text {\r\n static type = CanvasElementType.scaledText\r\n\r\n name = 'Text'\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare lastAttrs: Attrs\r\n declare scaled: Partial\r\n declare measuredHeight: number\r\n\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale({ x: ['x'], y: ['y'] })\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n // private\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle!)\r\n context.set('textAlign', this.attrs.textAlign!)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n // private\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y! + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\r\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n // private\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n\r\n this.context.beginPath()\r\n this.context.rect(\r\n this.scaled.x! - padding,\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\r\n this.width + padding * 2,\r\n this.measuredHeight + padding * 2\r\n )\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle!)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // TODO\r\n // if @attrs.textBaseline == 'middle'\r\n // rect.y = @attrs.y - rect.height/2\r\n if (\r\n this.lines &&\r\n this.scaled.x! < area.scaled.x &&\r\n area.scaled.x < this.scaled.x! + this.width &&\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\r\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\r\n ) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!this.lines) {\r\n return true\r\n }\r\n\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n const textBoxX = this.scaled.x! - padding\r\n const textBoxY = this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding\r\n const textBoxWidth = this.width + padding * 2\r\n const textBoxHeight = this.measuredHeight + padding * 2\r\n\r\n if (\r\n textBoxX <= -chart.leftOffset + chart.width &&\r\n textBoxX + textBoxWidth >= -chart.leftOffset &&\r\n textBoxY <= this.model.height &&\r\n textBoxY + textBoxHeight >= 0\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += x\r\n this.attrs.y! += y\r\n }\r\n}\r\n\r\nexport default ScaledText\r\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport Element, { TodoModalConfig } from './element'\r\n\r\nexport interface Area {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type ITextAttrs = RequireByKey & Partial\r\n\r\nconst DEFAULTS: Partial = {\r\n text: '',\r\n font: {\r\n size: 20,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n lineHeight: 20,\r\n // left | right | center | start | end\r\n textAlign: TextAlign.left,\r\n // top | hanging | middle | alphabetic | ideographic | bottom\r\n textBaseline: TextBaseline.alphabetic,\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n}\r\n\r\nclass Text extends Element {\r\n static type = CanvasElementType.text\r\n\r\n static getMergedPropsWithDefaults>(\r\n propKey: T,\r\n props: Partial = {}\r\n ) {\r\n return {\r\n ...DEFAULTS[propKey],\r\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\r\n }\r\n }\r\n\r\n name = 'Anchored text'\r\n declare context?: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare font: string\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\r\n if (this.context) {\r\n this.setupContext(this.context)\r\n }\r\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const count = this.getLines().length\r\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'font', {\r\n get() {\r\n const f = this.attrs.font\r\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\r\n },\r\n })\r\n }\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n default: { color: 'rgba(0,0,0)', width: 0 },\r\n },\r\n ],\r\n } as unknown as TodoModalConfig\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n ...DEFAULTS,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (obj.font?.size && !obj.lineHeight) {\r\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\r\n }\r\n return this\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.setupContext(context)\r\n if (this.attrs.angle && this.context) {\r\n // TODO background & multiline text\r\n this.context.save()\r\n this.context.translate(this.attrs.x!, this.attrs.y!)\r\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\r\n this.context.fillText(this.attrs.text, 0, 0)\r\n this.context.restore()\r\n } else {\r\n this.renderBackground()\r\n this.renderText()\r\n }\r\n }\r\n\r\n measure(context?: CanvasRenderingContext2D) {\r\n if (context) {\r\n this.setupContext(context)\r\n }\r\n const lines = this.getLines()\r\n let max = 0\r\n for (const line of lines) {\r\n max = Math.max(this.context?.measureText(line).width ?? Number.MIN_SAFE_INTEGER, max)\r\n }\r\n return ~~max\r\n }\r\n\r\n isInArea(testArea: PaneArea) {\r\n const area = this.convertArea(testArea)\r\n // TODO iny align\r\n if (\r\n this.attrs.x! < area.x &&\r\n area.x < this.attrs.x! + this.width &&\r\n this.attrs.y! - this.attrs.font.size < area.y &&\r\n area.y < this.attrs.y! - this.attrs.font.size + this.height\r\n ) {\r\n return true\r\n }\r\n return super.isInArea(testArea)\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n }\r\n\r\n getLines() {\r\n return this.attrs.text.toString().split('\\n')\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let { y } = this.attrs // + @attrs.padding.top\r\n for (const line of this.getLines()) {\r\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\r\n y! += this.attrs.lineHeight\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { width } = this\r\n const { height } = this\r\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\r\n const { x } = this.attrs\r\n let y = this.attrs.y! - height\r\n\r\n if (this.attrs.textBaseline === 'middle') {\r\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\r\n } else if (this.attrs.textBaseline === 'alphabetic') {\r\n y = this.attrs.y! - this.attrs.lineHeight\r\n }\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.rect(x!, y, width, height)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n renderBorder() {\r\n const { lineWidth = 0, strokeStyle, border } = this.attrs\r\n const borderWidth = border?.width ?? 0\r\n\r\n if ((lineWidth || this.attrs.strokeStyle || borderWidth > 0) && this.context) {\r\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\r\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n private convertArea(area: PaneArea) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n return {\r\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\r\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += this.model.scale.x(x) + 1\r\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\r\n }\r\n\r\n getHeight() {\r\n return this.height\r\n }\r\n}\r\n\r\nText.initClass()\r\n\r\nexport default Text\r\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\n\r\ntype Area = PaneArea\r\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\r\ntype ScaleFunc = () => number\r\n\r\nclass Thumb {\r\n type: ThumbType\r\n lastX = 0\r\n lastY = 0\r\n fx: ScaleFunc\r\n fy: ScaleFunc\r\n resize: ResizeFunc\r\n model: PaneModel\r\n\r\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\r\n this.type = type\r\n this.fx = fx\r\n this.fy = fy\r\n this.resize = resize\r\n this.model = model\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n context.set('fillStyle', ThumbSettings.color)\r\n context.set('strokeStyle', ThumbSettings.borderColor)\r\n context.set('lineWidth', ThumbSettings.borderWidth)\r\n const x = ~~this.x()\r\n const y = ~~this.y()\r\n const thumbWidth = this.getThumbWidth()\r\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\r\n context.beginPath()\r\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n startEditing(area: Area) {\r\n this.lastX = area.x\r\n return (this.lastY = area.y)\r\n }\r\n\r\n moveTo(area: Area) {\r\n const difX = area.x - this.lastX\r\n const difY = area.y - this.lastY\r\n this.resize({ type: this.type, difX, difY, area })\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n isInArea(area: Area) {\r\n const width = this.model.scale.x.invert(this.getThumbWidth())\r\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\r\n // +- width/2 because we have coordinates of a center\r\n if (\r\n this.fx() + width / 2 >= area.x &&\r\n this.fx() - width / 2 <= area.x &&\r\n this.fy() + height / 2 > area.y &&\r\n this.fy() - height / 2 < area.y\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getThumbWidth() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n }\r\n\r\n x() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\r\n }\r\n\r\n y() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\r\n }\r\n}\r\n\r\nexport default Thumb\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ITriangleAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n fill: string\r\n border: string\r\n}\r\n\r\nclass Triangle extends Element {\r\n static type = CanvasElementType.triangle\r\n\r\n declare scaled: Pick\r\n name = 'Triangle'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.lineTo(roundedXY.x3, roundedXY.y3)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.fill()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n context.set('strokeStyle', this.attrs.border)\r\n context.stroke()\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const polygon = [1, 2, 3].map((i) => ({\r\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\r\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nTriangle.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Triangle\r\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\n\r\nclass VerticalLine extends ScaledLine {\r\n static type = CanvasElementType.verticalLine\r\n\r\n name = 'Vertical line'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.renderContent = this.renderContent.bind(this)\r\n\r\n this.attrs.x2 = this.attrs.x1\r\n this._thumbs = [this._thumbs[0]]\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const domain = this.model.scale.y.domain()\r\n this.attrs.y1 = domain[0]\r\n this.attrs.y2 = domain[1]\r\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\r\n super.renderContent(context)\r\n }\r\n\r\n moveBy(x: number) {\r\n return (this.attrs.x1 = this.attrs.x2 += x)\r\n }\r\n\r\n resize({ difX }: RequireByKey) {\r\n return this.moveBy(difX)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitY: true })\r\n }\r\n}\r\n\r\nexport default VerticalLine\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IXABCDPositionAttrs {\r\n xx: number\r\n xy: number\r\n ax: number\r\n ay: number\r\n bx: number\r\n by: number\r\n cx: number\r\n cy: number\r\n dx: number\r\n dy: number\r\n}\r\n\r\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\r\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\r\n\r\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\r\n fill: string\r\n border: DrawingBorder\r\n lineWidth: number\r\n}\r\n\r\nclass XABCD extends Element {\r\n static type = CanvasElementType.xabcd\r\n\r\n name = 'XABCD pattern'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'x',\r\n () => this.attrs.xx,\r\n () => this.attrs.xy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.ax,\r\n () => this.attrs.ay,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.bx,\r\n () => this.attrs.by,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.cx,\r\n () => this.attrs.cy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'd',\r\n () => this.attrs.dx,\r\n () => this.attrs.dy,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n if (this.attrs.lineWidth == null) {\r\n this.attrs.lineWidth = 1\r\n }\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({\r\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\r\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\r\n })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\r\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.xx, roundedXY.xy)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.stroke()\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.start,\r\n fillStyle: '#ffffff',\r\n background: this.attrs.fill || '#000000',\r\n },\r\n this.model\r\n )\r\n\r\n for (const t of Array.from('xabcd')) {\r\n text\r\n .set({\r\n text: t.toUpperCase(),\r\n x: roundedXY[(t + 'x') as xPoints] - 6,\r\n y: roundedXY[(t + 'y') as yPoints] + 12,\r\n } as Partial)\r\n .render(context)\r\n }\r\n\r\n const retLabel = (y1: string, y2: string, y3: string) => {\r\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\r\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\r\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\r\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\r\n return text\r\n .set({\r\n text: ret.toFixed(3),\r\n x,\r\n y,\r\n })\r\n .render(context)\r\n }\r\n\r\n retLabel('x', 'a', 'b')\r\n retLabel('a', 'b', 'c')\r\n retLabel('b', 'c', 'd')\r\n retLabel('x', 'a', 'd')\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const t of Array.from('xabcd')) {\r\n this.attrs[(t + 'x') as xPoints] += x\r\n this.attrs[(t + 'y') as yPoints] += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs[(type + 'x') as xPoints] += difX\r\n return (this.attrs[(type + 'y') as yPoints] += difY)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n let t\r\n const xab = (() => {\r\n const result = []\r\n for (t of Array.from('xab')) {\r\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result\r\n })()\r\n const bcd = (() => {\r\n const result1 = []\r\n for (t of Array.from('bcd')) {\r\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result1\r\n })()\r\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nXABCD.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1 },\r\n ],\r\n}\r\n\r\nexport default XABCD\r\n","import Utils from '../utils'\r\nimport { getContextWithCache } from '../utils/canvas'\r\nimport { captureException, getIsSSr } from '../utils/helpers'\r\n\r\nclass Cache {\r\n constructor() {\r\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\r\n }\r\n\r\n set(callback, width, height) {\r\n this.callback = callback\r\n this.width = width\r\n this.height = height\r\n this.rendered = false\r\n }\r\n\r\n render(context, x, y) {\r\n if (x == null) {\r\n x = 0\r\n }\r\n if (y == null) {\r\n y = 0\r\n }\r\n if (!this.rendered) {\r\n this.refresh()\r\n }\r\n if (this.width < 1 || this.height < 1) {\r\n return\r\n }\r\n\r\n try {\r\n if (this.ratio >= 1 && this.canvas) {\r\n context.drawImage(\r\n this.canvas,\r\n 0,\r\n 0,\r\n ~~(this.width * this.ratio),\r\n ~~(this.height * this.ratio),\r\n x,\r\n y,\r\n this.width,\r\n this.height\r\n )\r\n } else {\r\n context.save()\r\n context.translate(x, y)\r\n this.callback(context)\r\n context.restore()\r\n }\r\n } catch (e) {\r\n captureException(\r\n e,\r\n this.canvas\r\n ? {\r\n extra: {\r\n width: this.width,\r\n height: this.height,\r\n ratio: this.ratio,\r\n cWidth: this.canvas.width,\r\n cHeight: this.canvas.height,\r\n sWidth: window.screen.width,\r\n sHeight: window.screen.height,\r\n },\r\n }\r\n : {}\r\n )\r\n }\r\n }\r\n\r\n refresh() {\r\n if (getIsSSr()) {\r\n return\r\n }\r\n this.canvas.width = this.width\r\n this.canvas.height = this.height\r\n this.context = getContextWithCache(this.canvas)\r\n this.ratio = Utils.getScaleRatio()\r\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\r\n this.context.scale(this.ratio, this.ratio)\r\n\r\n this.callback(this.context)\r\n this.rendered = true\r\n }\r\n}\r\n\r\nexport default Cache\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { TextAlign, TextBaseline } from '../../constants/common'\r\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\r\n\r\nexport enum OHLCType {\r\n singleLine = 'singleLine',\r\n dateOnly = 'dateOnly',\r\n timeOnly = 'timeOnly',\r\n}\r\n\r\nexport interface IMargin {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IPadding {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IGenericText {\r\n margin: IMargin\r\n font: IFont\r\n}\r\n\r\ninterface IFont {\r\n size?: number\r\n style?: string\r\n weight?: string\r\n family?: string\r\n lineHeight?: number\r\n padding?: IPadding\r\n baseline?: TextBaseline\r\n textAlign?: TextAlign\r\n}\r\n\r\ninterface ISettingsGeneralBase {\r\n Colors: IChartThemeColors\r\n}\r\n\r\nexport interface ISettingsCenterBase {\r\n barWidth: number\r\n barMargin: number\r\n border: number\r\n volumeHeight?: number\r\n}\r\n\r\ninterface ISettingsTopBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsBottomBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsLeftBase {\r\n width: number\r\n}\r\n\r\ninterface ISettingsRightBase {\r\n width: number\r\n}\r\n\r\nexport interface ISettings {\r\n ChartSettings: IChartSettings\r\n IndicatorSettings: IIndicatorSettings\r\n MarketSentimentSettings: IMarketSentimentChartSettings\r\n ColorsSettings: Array\r\n ThumbSettings: IThumbSettings\r\n ElementSettings: IElementSettings\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport interface IChartSettings {\r\n general: IChartGeneral\r\n center: ISettingsCenterBase\r\n top: IChartTop\r\n bottom: IChartBottom\r\n left: IChartLeft\r\n right: IChartRight\r\n}\r\n\r\ninterface IChartGeneral {\r\n settingsHeight: number\r\n tickerTimeframeChangeHeight: number\r\n Colors: IChartThemeColors & ObjectHash\r\n}\r\n\r\ninterface IChartTop extends ISettingsTopBase {\r\n baseline: TextBaseline\r\n ticker: IGenericText\r\n ohlc: IOHLC\r\n change: IGenericText\r\n}\r\n\r\ninterface IOHLC extends IGenericText {\r\n type?: OHLCType\r\n}\r\n\r\ninterface IChartBottom extends ISettingsBottomBase {\r\n baseline: TextBaseline\r\n axis: IGenericText\r\n}\r\n\r\ninterface IChartLeft extends ISettingsLeftBase {\r\n overlayLabel: IOverlayLabel\r\n timeframe: IGenericText\r\n volumeAxis: IGenericText\r\n}\r\n\r\ninterface IOverlayLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IChartRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\nexport interface IIndicatorSettings {\r\n general: IIndicatorGeneral\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: IIndicatorLeft\r\n right: IIndicatorRight\r\n}\r\n\r\ninterface IIndicatorRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\ninterface IIndicatorLeft extends ISettingsLeftBase {\r\n indicatorLabel: IIndicatorLabel\r\n}\r\n\r\ninterface IIndicatorLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IIndicatorGeneral {\r\n Colors: IIndicatorThemeColors\r\n height: number\r\n}\r\n\r\ninterface IMarketSentimentChartSettings {\r\n general: ISettingsGeneralBase\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: ISettingsLeftBase\r\n right: ISettingsRightBase\r\n}\r\n\r\ninterface IThumbSettings {\r\n size: number\r\n touchSize: number\r\n color: string\r\n borderWidth: number\r\n borderColor: string\r\n}\r\n\r\ninterface IElementSettings {\r\n Colors: IElementThemeColors\r\n defaultFill: string\r\n defaultTransparentFill: string\r\n}\r\n","export enum ChartMinWidthBreakpoints {\r\n xs = 0,\r\n s = 480,\r\n m = 768,\r\n l = 1024,\r\n}\r\n\r\nexport function getChartBreakpoints(chartWidthInPx: number) {\r\n return {\r\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\r\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\r\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\r\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n Instrument,\r\n Maybe,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Cache from '../canvas/cache'\r\nimport Element from '../canvas/element'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n CHART_MARGIN,\r\n ChartElementType,\r\n FONT_SIZE,\r\n IndicatorType,\r\n IntradayTimeframeInterval,\r\n LINE_HEIGHT,\r\n MONTHS,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAMES_WITH_PRE_MARKET,\r\n TextAlign,\r\n TextBaseline,\r\n getTimeframeLabel,\r\n} from '../constants/common'\r\nimport {\r\n getIsSmallIndexChart,\r\n getPercentageFromValue,\r\n getTranslate,\r\n getValueFromPercentage,\r\n} from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport { getColorOverwrites } from '../models/chart_settings'\r\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\r\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\r\nimport mouseModel from '../models/mouse'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Overlay from '../overlays/overlay'\r\nimport { overlaysByType } from '../overlays/overlays'\r\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\r\nimport {\r\n ITickerChange,\r\n getBarWidthWithMargin,\r\n getBarWithoutMarginWidth,\r\n getChangeColor,\r\n getHalfBarWidth,\r\n getShouldUseDarkerWickColors,\r\n getTickerChange,\r\n getTickerChangeFromCloseValues,\r\n getVirtualTimeframeTradedDates,\r\n renderCross,\r\n round,\r\n unmountCanvas,\r\n} from '../utils/chart'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\r\nimport { setElementCursor } from '../utils/cursor'\r\nimport { drawInVisibleArea, getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getChartBreakpoints } from './utils'\r\n\r\nexport interface BaseChartAttrs {\r\n overlays: Required['overlays']\r\n}\r\n\r\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\r\n\r\ninterface LastOHLCAttrs {\r\n text: string\r\n x: number\r\n y: number\r\n width: number\r\n textBaseline: TextBaseline\r\n textAlign: TextAlign\r\n}\r\n\r\ninterface IRenderOHLCParameters {\r\n context: CanvasRenderingContext2D\r\n date: Maybe\r\n open?: Maybe\r\n high?: Maybe\r\n low?: Maybe\r\n close?: Maybe\r\n volume?: Maybe\r\n afterHour?: string\r\n isSmallIndexChart?: boolean\r\n isNewestOHLC?: boolean\r\n directRender?: boolean\r\n time?: string\r\n changePercentage?: Maybe\r\n}\r\n\r\ninterface XAxisLabel {\r\n x: number\r\n text: string\r\n textWidth: number\r\n hasPriority?: boolean\r\n allowedOverflow?: number\r\n}\r\n\r\ninterface IRenderXAxisProps {\r\n textRenderer: Text\r\n startBarIndex: number\r\n endBarIndex: number\r\n}\r\n\r\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n const t =\r\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\r\n ':' +\r\n date.getMinutes().toString().padLeft('00') +\r\n (date.getHours() < 12 ? 'AM' : 'PM')\r\n dateString = `${MONTHS[month]} ${day} ${t}`\r\n break\r\n case TIMEFRAME.d:\r\n case TIMEFRAME.w:\r\n dateString = `${MONTHS[month]} ${day}`\r\n break\r\n case TIMEFRAME.m:\r\n dateString = `${MONTHS[month]} ${year}`\r\n break\r\n default:\r\n break\r\n }\r\n\r\n return dateString\r\n}\r\n\r\nconst getIsOverlapping = ({\r\n x,\r\n textWidth,\r\n renderedLabelRanges,\r\n}: {\r\n x: number\r\n textWidth: number\r\n renderedLabelRanges: Array<{ from: number; to: number }>\r\n}) =>\r\n renderedLabelRanges.some(({ from, to }) => {\r\n const minX = x - textWidth / 2\r\n const maxX = x + textWidth / 2\r\n return (from < maxX && maxX < to) || (from < minX && minX < to)\r\n })\r\n\r\nfunction getClosestDifferentMinMaxValueIndices(\r\n currentMinIndex: number,\r\n currentMaxIndex: number,\r\n high: number[],\r\n low: number[]\r\n): { minIndex: number; maxIndex: number } {\r\n const hasPreviousIndex = currentMinIndex > 0\r\n const hasNextIndex = currentMaxIndex < high.length - 1\r\n let minIndex = currentMinIndex\r\n let maxIndex = currentMaxIndex\r\n if (hasPreviousIndex) {\r\n minIndex -= 1\r\n }\r\n if (hasNextIndex) {\r\n maxIndex += 1\r\n }\r\n\r\n if (low[minIndex] === high[maxIndex] && (hasPreviousIndex || hasNextIndex)) {\r\n return getClosestDifferentMinMaxValueIndices(minIndex, maxIndex, high, low)\r\n }\r\n\r\n return low[minIndex] < high[maxIndex] ? { minIndex, maxIndex } : { minIndex: maxIndex, maxIndex: minIndex }\r\n}\r\n\r\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\r\n\r\nconst gray300 = tailwindColors.gray[300]\r\n\r\nclass BaseChart extends Element {\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\r\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\r\n }\r\n\r\n static label = 'Chart'\r\n static iconName = ''\r\n\r\n paneModel: PaneModel\r\n model: Chart\r\n data: Quote\r\n specificChartFunctionality: SpecificChartFunctionality\r\n tickerWidth = 0\r\n changeWidth = 0\r\n lastOhlc: Array> = []\r\n overlays: Overlay[] = []\r\n isLargeChart?: boolean\r\n shouldRenderVolume = true\r\n afterChange: {\r\n x: number\r\n y: number\r\n width: number\r\n } | null = null\r\n\r\n declare setupAxisTimeFrame: string\r\n declare volumeFY: d3.ScaleLinear\r\n declare tickerText: Text\r\n declare baseCache: Cache\r\n declare leftOffset: number\r\n declare context: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare isMobile: boolean\r\n\r\n constructor(values: Partial, paneModel: PaneModel) {\r\n super(values, paneModel)\r\n\r\n this.paneModel = paneModel\r\n this.model = this.paneModel.chart()\r\n this.data = this.model.quote()\r\n const chartLayoutModel = this.model.chart_layout()\r\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\r\n this.isLargeChart = chartLayoutModel.isLargeChart\r\n this.isMobile = utils.isMobile(true)\r\n\r\n this.overlays = []\r\n if (values.overlays) {\r\n for (const overlayDefinition of values.overlays) {\r\n // overlayDefinition.color coming from DB is always string however overlays\r\n // internaly didn't use format as in db (type, color, period) but rather\r\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\r\n // thus overlayDefinition.color might be undefined\r\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\r\n // but for now (!overlayDefinition.color) check solve issue as well\r\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\r\n {\r\n ...overlayDefinition,\r\n color:\r\n !overlayDefinition.color || overlayDefinition.color.includes('|')\r\n ? ''\r\n : convertColorToHEX(overlayDefinition.color),\r\n },\r\n this.paneModel\r\n )\r\n this.addOverlay(overlay)\r\n }\r\n delete values.overlays\r\n }\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n\r\n // this.paneModel.bind('update', this.setupAxis.bind(this))\r\n this.paneModel.bind('update', this.setupCache)\r\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\r\n this.model = this.paneModel.chart()\r\n // this.model.bind('change', this.setupAxis.bind(this))\r\n this.model.bind('change', this.setupCache)\r\n this.model.bind('change', this.trigger.bind(this, 'change'))\r\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n this.model.unbind('change', this.setupCache)\r\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n unmountCanvas(this.baseCache.canvas)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart_layout().bind('theme', this.setupCache)\r\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\r\n\r\n this.setupCache()\r\n }\r\n\r\n renderChart() {\r\n throw Error('Implement renderChart')\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n\r\n if (this.data.close.length === 0) {\r\n this.renderChartNotAvailable()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n return\r\n }\r\n\r\n this.context.save()\r\n this.clip()\r\n this.renderVolume()\r\n this.renderChart()\r\n this.renderOverlays()\r\n this.renderPrevClose()\r\n this.renderFadeExtendedHours()\r\n this.context.restore()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n }\r\n\r\n renderGrid(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n // text, xAxis, volumeAxis\r\n this.renderXAxis()\r\n this.baseCache.render(context)\r\n }\r\n\r\n renderTicker(context: CanvasRenderingContext2D) {\r\n if (this.tickerText) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.translate(ChartSettings.left.width, 0)\r\n this.tickerText.render(context)\r\n\r\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\r\n const { Colors } = ChartSettings.general\r\n new Text(\r\n {\r\n text: 'ETF',\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\r\n font: { size: FONT_SIZE.XXS },\r\n fillStyle: Colors.text,\r\n textBaseline: ChartSettings.top.baseline,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n context.translate(-ChartSettings.left.width, 0)\r\n }\r\n }\r\n\r\n renderTimeframe(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const quote = this.model.quote()\r\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\r\n\r\n return new Text(\r\n {\r\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\r\n x: ChartSettings.left.timeframe.margin.left,\r\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\r\n angle: -90,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n } else {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: { size: FONT_SIZE.L, style: 'bold' },\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n this.tickerWidth = this.tickerText.measure(context)\r\n\r\n // render watermark on backend chart\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n let yOffset = 0\r\n if (!isOurSiteRequest) {\r\n yOffset = this.isLargeChart ? -2 : -3\r\n }\r\n new Text(\r\n {\r\n text: '© finviz.com',\r\n x: this.width + ChartSettings.right.width - 2,\r\n y: 1 + yOffset,\r\n font: { size: isOurSiteRequest ? FONT_SIZE.XS : FONT_SIZE.M },\r\n textAlign: TextAlign.right,\r\n textBaseline: TextBaseline.top,\r\n fillStyle: isOurSiteRequest ? 'rgb(136, 193, 233)' : tailwindColors.finviz.blue,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderChange({ context })\r\n if (!this.lastOhlc[0]) {\r\n this.getOHLC({ context, directRender: false })\r\n }\r\n this.getOHLC({ context })\r\n }\r\n\r\n context.restore()\r\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderTimeframe(context)\r\n }\r\n }\r\n\r\n getOHLC({\r\n context,\r\n directRender = true,\r\n data,\r\n date,\r\n dateString = null,\r\n changePercentage = null,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n directRender?: boolean\r\n data?: {\r\n open?: string\r\n high?: string\r\n low?: string\r\n close?: string\r\n volume?: string\r\n }\r\n date?: Date\r\n dateString?: string | null\r\n changePercentage?: ITickerChange | null\r\n }) {\r\n if (!this.data.lastDate) return\r\n\r\n // modulo \"parsing\" is 100% faster than with str.slice()\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n isSmallIndexChart: true,\r\n isNewestOHLC: true,\r\n directRender,\r\n })\r\n } else if (data && date) {\r\n this.renderOHLC({\r\n context,\r\n date: getDateString({ date, timeframe: this.data.timeframe }),\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\r\n directRender,\r\n changePercentage,\r\n })\r\n } else if (dateString !== null) {\r\n this.renderOHLC({\r\n context,\r\n date: dateString,\r\n open: null,\r\n high: null,\r\n low: null,\r\n close: null,\r\n volume: null,\r\n directRender,\r\n })\r\n } else {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n afterHour:\r\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\r\n ? this.roundOhlc(this.data.afterClose)\r\n : undefined,\r\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\r\n isNewestOHLC: true,\r\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n }),\r\n directRender,\r\n ...this.getRoundedLastData(),\r\n })\r\n }\r\n }\r\n\r\n getRoundedLastData() {\r\n return {\r\n open: this.roundOhlc(this.data.lastOpen),\r\n high: this.roundOhlc(this.data.lastHigh),\r\n low: this.roundOhlc(this.data.lastLow),\r\n close: this.roundOhlc(this.data.lastClose),\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabelsQuotePage(context)\r\n } else if (this.data.close.length !== 0) {\r\n this.renderOverlaysLabelsChartsPage(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.overlayLabel.margin.left,\r\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n text\r\n .set({\r\n text: overlay.toString(),\r\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\r\n fillStyle: overlay.getLabelColor(),\r\n })\r\n .render(context)\r\n }\r\n }\r\n\r\n getYAxisLeftMargin() {\r\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\r\n return 3\r\n }\r\n return 8\r\n }\r\n\r\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\r\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\r\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\r\n }\r\n return this.round(lastClose)\r\n }\r\n\r\n renderYAxis(\r\n context: CanvasRenderingContext2D,\r\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\r\n renderLabels = true\r\n ) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y, lineTicks, textTicks, lastCloseLabel\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n translate.do()\r\n const tickCount = Math.floor(this.paneModel.height / 35)\r\n const minMax = this.getMinMax()\r\n const { firstVisibleClose } = minMax\r\n const height = this.height\r\n let stepPrice = 0\r\n let placesAxis\r\n\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n\r\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\r\n\r\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\r\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\r\n\r\n const percScale = d3.scaleLinear().range([0, this.height]).domain([maxPerc, minPerc]).nice(10)\r\n textTicks = percScale.ticks(Math.min(tickCount, 9))\r\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n break\r\n }\r\n case ScaleType.Logarithmic: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n lineTicks = [Math.floor(min)]\r\n const pixelGap = 30\r\n\r\n const negativeScale = []\r\n if (min < 0) {\r\n let previousNegativeTick = Math.min(0, max)\r\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\r\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\r\n if (previousNegativeTick === tick) {\r\n break\r\n }\r\n const range = d3.nice(-previousNegativeTick, -tick, 2)\r\n previousNegativeTick = -range[range.length - 1]\r\n negativeScale.unshift(previousNegativeTick)\r\n }\r\n }\r\n\r\n const positiveScale = []\r\n if (max > 0) {\r\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\r\n }\r\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\r\n const previousTick = positiveScale[positiveScale.length - 1]\r\n const positiveScaleY = this.paneModel.scale.y(positiveScale[positiveScale.length - 1])\r\n const tick = this.paneModel.scale.y.invert(positiveScaleY - pixelGap)\r\n if (previousTick === tick) {\r\n break\r\n }\r\n\r\n const range = d3.nice(previousTick, tick, 2)\r\n positiveScale.push(range[range.length - 1])\r\n }\r\n lineTicks = [...negativeScale, ...positiveScale]\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n break\r\n }\r\n default:\r\n // default to linear scale type\r\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n }\r\n\r\n if (textTicks.length >= 2) {\r\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\r\n }\r\n if (\r\n stepPrice > 10 ||\r\n (getIsSmallIndexChart(this.specificChartFunctionality) && Math.round(textTicks[0]).toString().length > 3) // if small index chart max tick is less than 999 (3 digits) allow for decimals in axis labels\r\n ) {\r\n placesAxis = 0\r\n }\r\n\r\n const getYLineText = (val: number, places?: number) => {\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage:\r\n return `${val}%`\r\n default:\r\n return this.round(val, places)\r\n }\r\n }\r\n\r\n const yTickText = new Text(\r\n {\r\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n\r\n let yTickLine = this.getYLine()\r\n const resetYTicksStyles = () => {\r\n yTickText.set({\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n })\r\n yTickLine = this.getYLine()\r\n }\r\n for (let i = 0; i < lineTicks.length; i++) {\r\n y = Math.round(this.fy(lineTicks[i]))\r\n if (y < 0 || y > height) continue\r\n yTickLine.set({ y1: y, y2: y })\r\n yTickText.set({\r\n text: getYLineText(textTicks[i], placesAxis),\r\n y,\r\n })\r\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\r\n yTickLine.set({ strokeStyle: Colors.text })\r\n yTickText.set({\r\n font: { weight: 'bold', size: yTickText.attrs.font.size },\r\n fillStyle: Colors.percentageZeroLineText,\r\n })\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n resetYTicksStyles()\r\n } else {\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n }\r\n }\r\n translate.undo()\r\n\r\n if (renderLabels) {\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\r\n // if (typeof this.data.afterClose === 'number') {\r\n // this.renderYAxisLabel({\r\n // context,\r\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n // mainLabelValue: lastClose,\r\n // secondaryLabelValue: this.data.afterClose,\r\n // }),\r\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\r\n // background: this.getSecondaryLabelBackgroundColor(),\r\n // })\r\n // }\r\n }\r\n }\r\n\r\n getSecondaryLabelBackgroundColor() {\r\n return stringifyHSVAColor(\r\n {\r\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\r\n s: 0.3,\r\n },\r\n 'hex'\r\n )\r\n }\r\n\r\n getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue,\r\n secondaryLabelValue,\r\n }: {\r\n mainLabelValue: number\r\n secondaryLabelValue: number\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\r\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\r\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\r\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\r\n const offsetedY = mainLabelValuePosition + offset * direction\r\n\r\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\r\n ? secondaryLabelValuePosition\r\n : offsetedY\r\n }\r\n\r\n renderYAxisLabel({\r\n context,\r\n yCoordinate,\r\n label,\r\n background,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n yCoordinate: number\r\n label: string\r\n background?: string\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n const { Colors } = ChartSettings.general\r\n const { size, lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n translate.do()\r\n new Text(\r\n {\r\n text: label,\r\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\r\n y: yCoordinate,\r\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\r\n lineHeight,\r\n padding,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle:\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\r\n background: background || Colors.currentBackground,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { leftOffset, width } = this\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n this.context.save()\r\n if (\r\n this.data.getDrawDays() !== 1 &&\r\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\r\n this.data.instrument !== Instrument.MarketSentiment\r\n ) {\r\n this.clip(true)\r\n }\r\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\r\n const textRenderer = new Text(\r\n {\r\n y: this.height + ChartSettings.bottom.axis.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n\r\n // Ticks are placed at the start of each timeframe period (hour/day/month/year).\r\n // The \"-1\" in the code ensures we start searching from one bar outside the visible area,\r\n // avoiding a tick on the first visible index unless it marks the start of a new timeframe period.\r\n // For example, if the start of December is on December 3rd and the first visible bar is on December 14th,\r\n // we won't display a tick.\r\n const startBarIndex = Math.max(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n }).index - 1,\r\n 0\r\n )\r\n\r\n const endBarIndex = Math.min(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n chartWidth: width,\r\n }).index + 1,\r\n this.data.close.length - 1\r\n )\r\n\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n if (this.data.instrument === Instrument.Stock) {\r\n if (\r\n this.type === ChartElementType.LineChart &&\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\r\n this.data.timeframe === 'i5'\r\n ) {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n } else {\r\n this.renderIntradayXAxis(textRenderer)\r\n }\r\n } else {\r\n this.renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i10:\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderIntradayXAxis(textRenderer)\r\n } else {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.d:\r\n this.renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.w:\r\n this.renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.m:\r\n this.renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n default:\r\n break\r\n }\r\n this.context.restore()\r\n }\r\n\r\n isXPointVisible(x: number, buffer = 0) {\r\n return x >= 0 - buffer && x <= this.width + buffer\r\n }\r\n\r\n renderXAxisLabels({\r\n labels,\r\n textRenderer,\r\n allowedOverflow = 0,\r\n }: {\r\n labels: Omit[]\r\n textRenderer: Text\r\n allowedOverflow?: number\r\n }) {\r\n const sortedLabels: XAxisLabel[] = []\r\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\r\n labels.reverse().forEach((label) => {\r\n textRenderer.set({ text: label.text })\r\n const textWidth = Math.floor(textRenderer.measure(this.context))\r\n const newLabel = { ...label, textWidth }\r\n if (label.hasPriority) {\r\n sortedLabels.unshift(newLabel)\r\n } else {\r\n sortedLabels.push(newLabel)\r\n }\r\n })\r\n\r\n sortedLabels.forEach(({ x, text, textWidth }) => {\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n return\r\n }\r\n const halfOfTextWidth = textWidth / 2\r\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\r\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\r\n let labelX = x\r\n if (overflowLeft < 0) {\r\n labelX = Math.round(x - overflowLeft)\r\n } else if (overflowRight < 0) {\r\n labelX = Math.round(x + overflowRight)\r\n }\r\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\r\n return\r\n }\r\n renderedLabelRanges.push({\r\n from: labelX - halfOfTextWidth - OFFSET.M,\r\n to: labelX + halfOfTextWidth + OFFSET.M,\r\n })\r\n textRenderer.set({ text, x: labelX })\r\n textRenderer.render(this.context)\r\n })\r\n }\r\n\r\n renderIntradayXAxis(textRenderer: Text) {\r\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\r\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\r\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\r\n const labels = []\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n marketEndHour = 16\r\n }\r\n\r\n const xLine = this.getXLine()\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n\r\n const dayToOffset = this.data.getDayToOffset()\r\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\r\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\r\n for (const day in dayToOffset) {\r\n const dayIndex = dayToOffset[day]\r\n const date = dateFromDateString(day)\r\n\r\n for (let i = marketStartHour; i <= marketEndHour; i++) {\r\n let x =\r\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\r\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\r\n this.leftOffset\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n continue\r\n }\r\n let roundedX = Math.round(x)\r\n\r\n if (i === marketStartHour) {\r\n if (isSmallIndexChart) {\r\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\r\n // ~9:30AM\r\n xLine\r\n .set({\r\n x1: roundedX,\r\n x2: roundedX,\r\n })\r\n .render(this.context)\r\n continue\r\n }\r\n if (this.data.premarketLengthMinutes === 0) {\r\n // If there is no premarket, day starts at 9:30 AM\r\n x += (30 / interval) * barWidth\r\n }\r\n roundedX = Math.round(x)\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n hasPriority: true,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x: roundedX,\r\n })\r\n } else {\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\r\n x: roundedX,\r\n })\r\n }\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer, allowedOverflow })\r\n }\r\n\r\n renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let lastHours = NaN\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n const hours = date.getHours()\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n\r\n if (day !== lastDay) {\r\n lastDay = day\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n x,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n })\r\n } else if (hours % 2 === 0 && hours !== lastHours) {\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n render15MinXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let x = 0\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n if (day !== lastDay) {\r\n lastDay = day\r\n if (this.data.instrument === Instrument.Stock) {\r\n const barAtMinute = date.getMinutes() + date.getHours() * 60\r\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\r\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\r\n } else {\r\n x = Math.round(this.fx(i) + this.leftOffset)\r\n }\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n // Offscreen only - if lastDate !== lastBarDate add tick\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\r\n .toString()\r\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\r\n\r\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\r\n const barsInDay = this.data.getBarsInDay()!\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n const dayWidth = barsInDay * barWidth\r\n x += dayWidth\r\n labels.push({\r\n text: lastDate,\r\n x,\r\n })\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n }\r\n }\r\n\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n hasPriority: date.getMonth() === 0,\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n if (date.getMonth() % 3 === 0) {\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n } else {\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: Colors.gridSecondary,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n const isYearLabel = date.getMonth() === 0\r\n labels.push({\r\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\r\n hasPriority: isYearLabel,\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastYear = null\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const year = date.getFullYear()\r\n const isJanuary = date.getMonth() === 0\r\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\r\n lastYear = year\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: date.getFullYear().toString(),\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n handleIndicatorsChange() {\r\n this.updateShouldRenderVolume()\r\n this.setupCache()\r\n this.trigger('change')\r\n }\r\n\r\n updateShouldRenderVolume() {\r\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\r\n }\r\n\r\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\r\n const maxCount = 5\r\n const minCount = 1\r\n if (count > maxCount) {\r\n count = maxCount\r\n }\r\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\r\n if (count <= minCount) {\r\n return [ticks[ticks.length - 1]]\r\n }\r\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\r\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\r\n // dynamically, we add 3px of space per tick gap\r\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\r\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\r\n }\r\n return ticks\r\n }\r\n\r\n renderVolumeAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n context.save()\r\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\r\n\r\n const x = 20\r\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\r\n const height = this.height * (0.5 * relativeVolume)\r\n\r\n const label = new Text(\r\n {\r\n x: 15,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n for (let i = 0.5; i <= 2; i += 0.5) {\r\n const y = Math.round(fy(i))\r\n label\r\n .set({\r\n text: i.toFixed(1),\r\n y: y,\r\n })\r\n .render(context)\r\n\r\n context.set('strokeStyle', 'rgb(130, 130, 130)')\r\n context.beginPath()\r\n context.setLineDash([2, 3])\r\n context.translate(0, 0.5)\r\n context.moveTo(x, y)\r\n context.lineTo(x + 7, y)\r\n context.translate(0, -0.5)\r\n context.stroke()\r\n }\r\n\r\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', Colors.grid)\r\n context.setLineDash([])\r\n\r\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\r\n context.translate(0.5, 0.5)\r\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\r\n context.translate(-0.5, -0.5)\r\n\r\n new Text(\r\n {\r\n text: 'RELATIVE\\nVOLUME',\r\n x: 33,\r\n y: ChartSettings.top.height + this.height + 6,\r\n font: { size: FONT_SIZE.XXS },\r\n lineHeight: LINE_HEIGHT.XS,\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n context.restore()\r\n return\r\n }\r\n const rangeMax = this.volumeFY.range()[1]\r\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\r\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\r\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\r\n const format = this.volumeFY.tickFormat(4, 's')\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.volumeAxis.margin.left,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n ticks.forEach((tick) =>\r\n text\r\n .set({\r\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\r\n })\r\n .render(context)\r\n )\r\n }\r\n\r\n renderVolume() {\r\n if (!this.shouldRenderVolume) return\r\n\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n // Return if the domain bounds are equal, this would put any value in the middle\r\n const [domainFrom, domainTo] = this.volumeFY.domain()\r\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height + this.height - 59,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n const barWidthWithoutMargin = getBarWithoutMarginWidth(this.model)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n // Skip render if the value is <= 0\r\n if (this.data.volume[i] <= 0) {\r\n return\r\n }\r\n\r\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.volumeFY(this.data.volume[i]))\r\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n renderOverlays() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n for (const overlay of this.overlays) {\r\n overlay.renderContent(this.context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n const isRendered = renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.paneModel,\r\n contentWidth: this.width,\r\n contentHeight: this.height,\r\n quote: this.data,\r\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\r\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\r\n })\r\n if (this.getIsRedesignedChart()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\r\n }\r\n\r\n if (isRendered !== undefined) {\r\n setElementCursor({\r\n elementId: this.model.chart_layout().getHTMLElementId(),\r\n cursor: isRendered ? 'crosshair' : 'default',\r\n conditionalCursor: 'grabbing',\r\n })\r\n }\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const n = this.data.getDataByBarIndex(key, crossIndex)\r\n if (n !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const crossClose = this.data.close[crossDataIndex] ?? null\r\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n if (Number.isNaN(crossIndex)) {\r\n this.getOHLC({ context })\r\n context.restore()\r\n return\r\n }\r\n }\r\n\r\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\r\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\r\n\r\n if (date === null) {\r\n const virtualTradedDates =\r\n this.data.date.length > 0\r\n ? getVirtualTimeframeTradedDates({\r\n dateStart: this.data.date[0],\r\n dateEnd: this.data.date[this.data.date.length - 1],\r\n quote: this.data,\r\n })\r\n : []\r\n this.getOHLC({\r\n context,\r\n dateString: virtualTradedDates[crossIndex]\r\n ? getDateString({\r\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\r\n timeframe: this.data.timeframe,\r\n })\r\n : null,\r\n })\r\n context.restore()\r\n return\r\n }\r\n\r\n this.getOHLC({\r\n context,\r\n date,\r\n data: {\r\n open: this.getDataByCrossIndex(crossIndex, 'open'),\r\n high: this.getDataByCrossIndex(crossIndex, 'high'),\r\n low: this.getDataByCrossIndex(crossIndex, 'low'),\r\n close: this.getDataByCrossIndex(crossIndex, 'close'),\r\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\r\n },\r\n changePercentage: this.getCrossIndexChange(crossIndex),\r\n })\r\n\r\n context.restore()\r\n }\r\n\r\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\r\n const CHANGE_SPACER = 10\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { ticker, change, ohlc } = ChartSettings.top\r\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\r\n\r\n if (!tickerChange) {\r\n return\r\n }\r\n\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n const finvizWatermarkOffset = !isOffscreen || isOurSiteRequest || this.isLargeChart ? 0 : 15\r\n const changeText = new Text(\r\n {\r\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\r\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\r\n ? this.width - ChartSettings.top.change.margin.right! - finvizWatermarkOffset\r\n : this.width,\r\n y: ChartSettings.top.change.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n this.changeWidth = changeText.measure(context)\r\n changeText.render(context)\r\n\r\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\r\n return\r\n }\r\n if (tickerAfterChange) {\r\n const afterChangeText = new Text(\r\n {\r\n text: tickerAfterChange?.string,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n const afterChangeTextWidth = afterChangeText.measure(context)\r\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\r\n\r\n if (\r\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\r\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\r\n y: ChartSettings.top.change.margin.top,\r\n })\r\n .render(context)\r\n this.afterChange = null\r\n this.changeWidth = oneLineAHChangeWidth\r\n } else if (\r\n this.lastOhlc[0] &&\r\n ChartSettings.left.width +\r\n this.tickerWidth +\r\n ticker.margin.left! +\r\n this.lastOhlc[0].width! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! <\r\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n })\r\n .render(context)\r\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\r\n this.afterChange = {\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n width: afterChangeTextWidth,\r\n }\r\n }\r\n }\r\n }\r\n\r\n renderOHLC(parameters: IRenderOHLCParameters) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOHLCQuotePage(parameters)\r\n } else {\r\n this.renderOHLCChartsPage(parameters)\r\n }\r\n }\r\n\r\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const OhlcText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n },\r\n this.paneModel\r\n )\r\n\r\n const dateElements = date ? [{ text: date, color: gray300 }] : []\r\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\r\n const oElements = open\r\n ? [\r\n { text: 'O', color: gray300 },\r\n { text: open, color: trendColor },\r\n ]\r\n : []\r\n const hElements = high\r\n ? [\r\n { text: 'H', color: gray300 },\r\n { text: high, color: trendColor },\r\n ]\r\n : []\r\n const lElements = low\r\n ? [\r\n { text: 'L', color: gray300 },\r\n { text: low, color: trendColor },\r\n ]\r\n : []\r\n const cElements = close\r\n ? [\r\n { text: 'C', color: gray300 },\r\n { text: close, color: trendColor },\r\n ]\r\n : []\r\n const volElements = volume\r\n ? [\r\n { text: 'Vol', color: gray300 },\r\n { text: volume, color: trendColor },\r\n ]\r\n : []\r\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\r\n\r\n const lines: OhlcLineElements[] = []\r\n\r\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\r\n lineElements.flatMap((elements, index) =>\r\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\r\n )\r\n if (chartBreakpoints.isM) {\r\n lines.push(\r\n getFlatLineArrayWithSpaces([\r\n dateElements,\r\n oElements,\r\n hElements,\r\n lElements,\r\n cElements,\r\n volElements,\r\n changeElements,\r\n ])\r\n )\r\n } else if (chartBreakpoints.isS) {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\r\n } else {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\r\n }\r\n\r\n const startX = OFFSET.M - ChartSettings.left.width\r\n let x = startX\r\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\r\n\r\n lines.forEach((line) => {\r\n x = startX\r\n line.forEach((lineElement, index, lineElements) => {\r\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\r\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\r\n if (index === 0) {\r\n padding.left = 5\r\n } else if (index === lineElements.length - 1) {\r\n padding.right = 5\r\n } else if (lineElement === 'space') {\r\n padding.left = 7\r\n padding.right = 7\r\n if (!chartBreakpoints.isS) {\r\n padding.left = 5\r\n padding.right = 5\r\n }\r\n }\r\n OhlcText.set({ text, fillStyle: color, x, y, padding })\r\n OhlcText.render(context)\r\n x += OhlcText.width\r\n })\r\n y += OhlcText.attrs.lineHeight\r\n })\r\n }\r\n\r\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const LabelsText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\r\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\r\n x: OFFSET.M - ChartSettings.left.width,\r\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\r\n },\r\n this.paneModel\r\n )\r\n\r\n let numberOfNewOhlcLines = 2\r\n if (chartBreakpoints.isM) {\r\n numberOfNewOhlcLines = 1\r\n } else if (chartBreakpoints.isS) {\r\n numberOfNewOhlcLines = 2\r\n }\r\n\r\n // We assume lineheight is the same as OHLC text\r\n const { lineHeight } = LabelsText.attrs\r\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\r\n\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n LabelsText.set({\r\n text: overlay.toString(),\r\n y,\r\n fillStyle: overlay.getLabelColor(),\r\n }).render(context)\r\n y += lineHeight\r\n }\r\n }\r\n\r\n renderOHLCQuotePage({\r\n context,\r\n date,\r\n open,\r\n high,\r\n low,\r\n close,\r\n volume,\r\n afterHour,\r\n isSmallIndexChart = false,\r\n isNewestOHLC = false,\r\n time,\r\n directRender = false,\r\n changePercentage,\r\n }: IRenderOHLCParameters) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { ohlc } = ChartSettings.top\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n if (isOffscreen && isGroupInstrument) {\r\n ohlc.type = OHLCType.dateOnly\r\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\r\n ohlc.type = OHLCType.timeOnly\r\n }\r\n\r\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\r\n const OHLCFontSize = ohlc.font.size!\r\n const centerXOffset =\r\n this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n (this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n this.changeWidth +\r\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\r\n 2\r\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\r\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\r\n const OHLC = hasOhlc\r\n ? {\r\n date: [date ?? ''],\r\n singleLine: [\r\n `${date} O:${open} H:${high} L:${low} C:${close}${\r\n afterHour ? ` AH:${afterHour}` : ''\r\n } Vol:${volume} `,\r\n /*\r\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\r\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\r\n * */\r\n changePercentage ? changePercentage.string : undefined,\r\n ].filter((value) => value !== undefined),\r\n }\r\n : {\r\n date: [date ?? ''],\r\n singleLine: [`${date ?? ''}`],\r\n }\r\n\r\n const OHLC_TEXT = new Text(\r\n {\r\n font: { size: OHLCFontSize },\r\n },\r\n this.paneModel\r\n )\r\n\r\n const getOHLCType = () => {\r\n if (!isSmallIndexChart) {\r\n return OHLCType.singleLine\r\n }\r\n return OHLCType.dateOnly\r\n }\r\n\r\n const getOHLCSettings = () => {\r\n switch (ohlc.type || getOHLCType()) {\r\n case OHLCType.singleLine:\r\n return {\r\n text: OHLC.singleLine,\r\n x: [leftXOffset, leftXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n case OHLCType.dateOnly:\r\n if (isOffscreen && isGroupInstrument) {\r\n const text = `${OHLC.date} Volume: ${volume}`\r\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\r\n return {\r\n text: [text],\r\n x: [\r\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\r\n ],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else if (isSmallIndexChart) {\r\n return {\r\n text: OHLC.date,\r\n x: [centerXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else {\r\n const isEnoughSpace =\r\n this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! +\r\n this.changeWidth +\r\n ChartSettings.top.change.margin.right!) >\r\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\r\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\r\n return {\r\n text: OHLC.date,\r\n x: [leftXOffset],\r\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\r\n }\r\n }\r\n case OHLCType.timeOnly:\r\n return {\r\n text: [time],\r\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\r\n y: [lineTopY],\r\n textAlign: TextAlign.center,\r\n textBaseline: [ohlc.font.baseline],\r\n }\r\n default:\r\n return\r\n }\r\n }\r\n\r\n if (!isNewestOHLC) {\r\n context.fillStyle = Colors.canvasFill\r\n this.lastOhlc.forEach((line) => {\r\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\r\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\r\n context.fillRect(\r\n x - PADDING.XXS,\r\n y - PADDING.XXS,\r\n PADDING.XXS + line.width! + PADDING.XXS,\r\n PADDING.XXS + OHLCFontSize + PADDING.XXS\r\n )\r\n })\r\n\r\n if (this.afterChange) {\r\n context.fillRect(\r\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\r\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\r\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\r\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\r\n )\r\n }\r\n } else {\r\n this.lastOhlc = []\r\n }\r\n\r\n const ohlcSettings = getOHLCSettings()\r\n\r\n const renderOHLCToCanvas = ({\r\n ohlcSet,\r\n render = true,\r\n }: {\r\n ohlcSet?: {\r\n text: (string | undefined)[]\r\n x: number[]\r\n y: (number | undefined)[]\r\n textAlign: TextAlign\r\n textBaseline: (TextBaseline | undefined)[]\r\n }\r\n render?: boolean\r\n }) => {\r\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\r\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\r\n let i = index\r\n let leftOffset = 0\r\n let fillStyle = Colors.text\r\n let text = line\r\n if (index > 0 && isSingleLineWithChange) {\r\n i -= 1\r\n leftOffset = OHLC_TEXT.measure(context)\r\n text = line\r\n\r\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\r\n }\r\n const options = {\r\n text,\r\n x: ohlcSet.x[i] + leftOffset,\r\n y: ohlcSet.y[i],\r\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\r\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\r\n fillStyle,\r\n }\r\n OHLC_TEXT.set(options)\r\n if (isNewestOHLC) {\r\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\r\n }\r\n if (render) {\r\n OHLC_TEXT.render(context)\r\n }\r\n })\r\n }\r\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\r\n\r\n return {\r\n ohlcSettings,\r\n renderOHLCToCanvas,\r\n }\r\n }\r\n\r\n // only for stocks on i1/i3/i5 and one day view\r\n renderFadeExtendedHours() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = this.model.quote().timeframe\r\n if (this.data.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\r\n return\r\n }\r\n\r\n const interval = parseInt(period.substring(1), 10)\r\n const dayToOffset = this.data.getDayToOffset()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n for (const day in dayToOffset) {\r\n // todo aftermarket\r\n const dayIndex = dayToOffset[day]\r\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\r\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\r\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n this.context.set('fillStyle', Colors.premarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n\r\n if (this.data.aftermarketLengthMinutes > 0) {\r\n n0 =\r\n (this.data.drawMinutesPerDay / interval) * dayIndex +\r\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\r\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\r\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n\r\n this.context.set('fillStyle', Colors.aftermarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n }\r\n }\r\n translate.undo()\r\n }\r\n\r\n shouldShowPrevClose() {\r\n const quote = this.model.quote()\r\n const isStock = quote.instrument === Instrument.Stock\r\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\r\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\n return isStock && (isIntradayWithPreMarket || isIndexChart)\r\n }\r\n\r\n renderPrevClose() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.shouldShowPrevClose()) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n let y = Math.round(this.fy(this.model.quote().prevClose))\r\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n\r\n new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.prevClose,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n translate.undo()\r\n }\r\n\r\n renderChartNotAvailable() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\r\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\r\n new Text(\r\n {\r\n text: 'Chart not available',\r\n x,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n\r\n // private\r\n setupCache() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n /*\r\n * Don't create new Cache instances, because Safari takes too long to free up memory\r\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n *\r\n * To further improve performance, cache.set shouldn't be called when unnecessary,\r\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\r\n */\r\n this.baseCache = this.baseCache || new Cache()\r\n\r\n this.baseCache.set(\r\n (context: CanvasRenderingContext2D) => {\r\n if (this.data.close.length === 0) {\r\n this.renderText(context)\r\n return\r\n }\r\n this.renderYAxis(context)\r\n this.renderText(context)\r\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\r\n this.renderVolumeAxis(context)\r\n }\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n }\r\n },\r\n this.width + ChartSettings.left.width + ChartSettings.right.width,\r\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\r\n )\r\n }\r\n\r\n // called by controllers/pane on recountScale\r\n setupAxis(fx: ScaleAxis) {\r\n this.data = this.model.quote()\r\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\r\n\r\n if (typeof fx !== 'function') {\r\n return\r\n }\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n const volumes = []\r\n if (areNoBarsVisible) {\r\n volumes.push(\r\n this.data.volume[firstBarToRenderIndex.index],\r\n Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)\r\n )\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n volumes.push(this.data.volume[i])\r\n }\r\n }\r\n\r\n const max = utils.max(volumes) ?? 0\r\n const rangeMax = volumeHeight || 60\r\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\r\n this.setupAxisTimeFrame = this.data.timeframe\r\n }\r\n\r\n // private\r\n clip(addMarginBottom?: boolean) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n if (addMarginBottom == null) {\r\n addMarginBottom = false\r\n }\r\n this.context.beginPath()\r\n let marginBottom = 0\r\n if (addMarginBottom) {\r\n marginBottom = ChartSettings.bottom.height\r\n }\r\n // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate,\r\n // to compensate for this we clip canvas 1px taller than chart height\r\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom + 1)\r\n this.context.clip()\r\n }\r\n\r\n addOverlay(overlay: Overlay) {\r\n overlay.chart = this\r\n this.overlays.push(overlay)\r\n return this.trigger('change')\r\n }\r\n\r\n setOverlays(overlays: Overlay[]) {\r\n this.overlays = overlays\r\n return this.trigger('change')\r\n }\r\n\r\n removeOverlay(overlay: Overlay) {\r\n for (let index = 0; index < this.overlays.length; index++) {\r\n const el = this.overlays[index]\r\n if (el === overlay) {\r\n this.attrs.overlays.splice(index, 1)\r\n this.overlays.splice(index, 1)\r\n this.trigger('change')\r\n break\r\n }\r\n }\r\n }\r\n\r\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\r\n this.data = this.model.quote()\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n let minIndex = -1\r\n let maxIndex = -1\r\n let firstVisibleClose = null\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n // If no bars are visible min/max are first available bar before visible and first after\r\n if (areNoBarsVisible) {\r\n min = this.data.low[firstBarToRenderIndex.index]\r\n max = this.data.high[Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)]\r\n if (min > max) {\r\n const prevMin = min\r\n min = max\r\n max = prevMin\r\n }\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (minIndex === -1 || this.data.low[minIndex] > this.data.low[i]) {\r\n minIndex = i\r\n }\r\n if (maxIndex === -1 || this.data.high[maxIndex] < this.data.high[i]) {\r\n maxIndex = i\r\n }\r\n }\r\n\r\n // If only a single bar is visible get min/max index range from closes values outside of visible area\r\n if (this.data.low[minIndex] === this.data.high[maxIndex]) {\r\n const closestMinMaxIndices = getClosestDifferentMinMaxValueIndices(\r\n minIndex,\r\n maxIndex,\r\n this.data.high,\r\n this.data.low\r\n )\r\n minIndex = closestMinMaxIndices.minIndex\r\n maxIndex = closestMinMaxIndices.maxIndex\r\n }\r\n\r\n min = this.data.low[minIndex]\r\n max = this.data.high[maxIndex]\r\n\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n }\r\n\r\n // Apply scale min & max buffer if min/max is the same\r\n if (min === max) {\r\n min *= 0.99\r\n max *= 1.01\r\n }\r\n\r\n // Update min/max so prevClose is in range and can be rendered if it should\r\n if (this.shouldShowPrevClose() && this.data.prevClose !== null) {\r\n min = Math.min(min, this.data.prevClose)\r\n max = Math.max(max, this.data.prevClose)\r\n }\r\n\r\n // Update min/max so lastClose is in range and can be rendered if it should\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\r\n min = Math.min(min, this.data.lastClose)\r\n max = Math.max(max, this.data.lastClose)\r\n }\r\n\r\n return { min, max, firstVisibleClose }\r\n }\r\n\r\n moveBy() {}\r\n\r\n isInArea() {\r\n return false\r\n }\r\n\r\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.paneModel.scale.y(y)\r\n\r\n round(n: number, overridePlaces?: number) {\r\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\r\n }\r\n\r\n roundOhlc(n: number) {\r\n const placesLastClose = this.getPlacesLastClose()\r\n return round({\r\n data: this.data,\r\n num: n,\r\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\r\n })\r\n }\r\n\r\n toObject() {\r\n const overlays = this.overlays.map((overlay) => overlay.toObject())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n toConfig() {\r\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n getPlacesLastClose(price?: number) {\r\n const { lastClose, instrument } = this.data\r\n const priceAbs = price && Math.abs(price)\r\n if (lastClose >= 100000) {\r\n return 0\r\n } else if (lastClose >= 10000) {\r\n return 1\r\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\r\n return 4\r\n } else if (lastClose === undefined) {\r\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n return 2\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n hasOverlay(type: string) {\r\n return this.overlays.some((x) => x.type === 'overlays/' + type)\r\n }\r\n\r\n getXLine(): Line {\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getYLine(): Line {\r\n return new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart_layout())\r\n }\r\n\r\n getIsMobileChartPage() {\r\n return (\r\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n )\r\n }\r\n\r\n getCandleLikeChartsRenderingColors() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { theme, specificChartFunctionality } = this.model.chart_layout()\r\n let colors = Colors\r\n const overwrittenColors = getColorOverwrites({\r\n colors,\r\n theme,\r\n })\r\n const overwrittenColorKeys = Object.keys(overwrittenColors)\r\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\r\n (colorKey) => overwrittenColorKeys.includes(colorKey)\r\n )\r\n\r\n const shouldUseDarkerColors =\r\n theme === Theme.light &&\r\n getShouldUseDarkerWickColors({\r\n specificChartFunctionality: specificChartFunctionality,\r\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\r\n })\r\n\r\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...darkerWickColors }\r\n }\r\n const isNodeChartWithThinBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\r\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\r\n }\r\n\r\n return colors\r\n }\r\n\r\n getIsRedesignedChart() {\r\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\r\n }\r\n}\r\n\r\nBaseChart.initClass()\r\n\r\nexport default BaseChart\r\n","import { RendererChartBarProps } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport utils from '../utils'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './base_chart'\r\n\r\nconst WICK_WIDTH = 1\r\n\r\nclass CandleStick extends Chart {\r\n static type = ChartElementType.CandleStick\r\n static label = 'Candle'\r\n static iconName = 'candleBarBasic'\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\r\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const trendColor = close < open ? trendDown : trendUp\r\n const wickColor = close < open ? wickDown : wickUp\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n barFillColor: trendColor,\r\n borderColor: close < open ? borderDown : borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n renderChart() {\r\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\r\n return\r\n }\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: this.model.chart_layout(),\r\n zoomFactor: this.model.zoomFactor,\r\n })\r\n const shouldRenderFillAndBorder =\r\n barFillWidth + barBorderWidth * 2 >= 2 &&\r\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n const translateForWick = getTranslate({\r\n context: this.context,\r\n xOffset: WICK_WIDTH / 2,\r\n yOffset: 0,\r\n })\r\n\r\n translate.do()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, center: number) => {\r\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\r\n index: i,\r\n chartSettingsColors: Colors,\r\n hasFillAndBorder: shouldRenderFillAndBorder,\r\n })\r\n\r\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\r\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\r\n const candleWickHigh = Math.round(this.fy(high))\r\n const candleWickLow = Math.round(this.fy(low))\r\n\r\n const candleBodyHeight = candleBodyLow - candleBodyHigh\r\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\r\n const halfBorderWidth = barBorderWidth / 2\r\n\r\n // TODO: revisit for better approach, this solve issue with candlesticks\r\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\r\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\r\n return\r\n }\r\n\r\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\r\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\r\n\r\n translateForWick.do()\r\n this.context.set('strokeStyle', wickColor)\r\n this.context.beginPath()\r\n this.context.moveTo(center, candleWickHigh)\r\n if (shouldRenderFillAndBorder) {\r\n this.context.lineTo(center, candleBodyHigh)\r\n this.context.moveTo(\r\n center,\r\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\r\n )\r\n }\r\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\r\n this.context.stroke()\r\n translateForWick.undo()\r\n\r\n if (shouldRenderFillAndBorder) {\r\n const hasBorder = barBorderWidth > 0\r\n if (hasBorder) {\r\n this.context.set('strokeStyle', borderColor)\r\n if (isBodyHeightGreaterOrEqualBorders) {\r\n this.context.set('lineWidth', barBorderWidth)\r\n this.context.strokeRect(\r\n candleBodyLeftX + halfBorderWidth,\r\n candleBodyHigh + halfBorderWidth,\r\n barFillWidth + 2 * halfBorderWidth,\r\n candleBodyHeight - 2 * halfBorderWidth\r\n )\r\n this.context.set('lineWidth', WICK_WIDTH)\r\n } else {\r\n this.context.beginPath()\r\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\r\n const hasFill = fillHeight > 0\r\n if (hasFill || !hasBorder) {\r\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\r\n this.context.fillRect(\r\n candleBodyLeftX + barBorderWidth,\r\n candleBodyHigh + barBorderWidth,\r\n barFillWidth,\r\n hasFill ? fillHeight : WICK_WIDTH\r\n )\r\n }\r\n }\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default CandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport CandleStick from './candle_stick'\r\n\r\nclass HollowCandleStick extends CandleStick {\r\n static type = ChartElementType.HollowCandleStick\r\n static label = 'Hollow Candle'\r\n static iconName = 'candleBarHollow'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const isHollow = close > open\r\n const generalTrendColor =\r\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\r\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n // hollow candles have transparend bodies that's why rgba is here\r\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\r\n borderColor: trendColor,\r\n wickColor: trendColor,\r\n }\r\n }\r\n\r\n toString() {\r\n return `Hollow Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HollowCandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType, ScaleType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\r\nimport CandleStick from './candle_stick'\r\n\r\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\r\n\r\nclass HeikinAshi extends CandleStick {\r\n static type = ChartElementType.HeikinAshi\r\n static label = 'Heikin Ashi'\r\n static iconName = 'candleBarHeikinAshi'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\r\n const haData = this.data.getHeikinAshiData()\r\n\r\n const open = haData.open[index]\r\n const close = haData.close[index]\r\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\r\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\r\n return {\r\n open,\r\n close,\r\n high: Math.max(this.data.high[index], open, close),\r\n low: Math.min(open, close, this.data.low[index]),\r\n barFillColor: trendColor,\r\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n getLastValues = () => {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const {\r\n open: lastOpen,\r\n close: lastClose,\r\n high: lastHigh,\r\n low: lastLow,\r\n } = this.getRenderChartBarProps({\r\n index: this.data.date.length - 1,\r\n chartSettingsColors: Colors,\r\n })\r\n\r\n return { lastOpen, lastClose, lastHigh, lastLow }\r\n }\r\n\r\n getRoundedLastData() {\r\n const lastOhlc = this.getLastValues()\r\n return {\r\n open: this.roundOhlc(lastOhlc.lastOpen),\r\n high: this.roundOhlc(lastOhlc.lastHigh),\r\n low: this.roundOhlc(lastOhlc.lastLow),\r\n close: this.roundOhlc(lastOhlc.lastClose),\r\n }\r\n }\r\n\r\n renderYAxis = (context: CanvasRenderingContext2D) => {\r\n const { lastClose } = this.getLastValues()\r\n super.renderYAxis(context, { lastClose }, false)\r\n\r\n const { firstVisibleClose } = this.getMinMax()\r\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\r\n\r\n const originalLatestClose = this.data.close[this.data.close.length - 1]\r\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\r\n\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\r\n\r\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\r\n\r\n this.renderYAxisLabel({\r\n context,\r\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue: lastClose,\r\n secondaryLabelValue: originalLatestClose,\r\n }),\r\n label: originalLatestCloseLabel,\r\n background: this.getSecondaryLabelBackgroundColor(),\r\n })\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n if (barIndex > -1) {\r\n let value = null\r\n if (['high', 'low', 'open', 'close'].includes(key)) {\r\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\r\n value = data[key as OhlcKeys]\r\n }\r\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\r\n if (value !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\r\n }\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const haData = this.data.getHeikinAshiData()\r\n const crossClose = haData.close[barIndex] ?? null\r\n const previousClose = haData.close[barIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n toString() {\r\n return `HA Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HeikinAshi\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass LineChart extends Chart {\r\n static type = ChartElementType.LineChart\r\n static label = 'Line'\r\n static iconName = 'lineChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let first: number | undefined, last: number | undefined\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n this.context.set('strokeStyle', Colors.line)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const y = Math.round(this.fy(this.data.close[i]))\r\n this.context.lineTo(x, y)\r\n last = x\r\n if (first === undefined) {\r\n first = x\r\n }\r\n },\r\n })\r\n if (first !== undefined && last !== undefined) {\r\n this.context.stroke()\r\n this.context.set('fillStyle', Colors.background)\r\n this.context.lineTo(last!, this.height)\r\n this.context.lineTo(first!, this.height)\r\n this.context.fill()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default LineChart\r\n","import Text from '../canvas/text'\r\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst interval = 3\r\nconst domainMin = -1\r\nconst domainMax = 1\r\nconst red = 'rgba(200, 0, 0, 0.392)'\r\nconst redLine = 'rgb(120, 0, 0)'\r\nconst green = 'rgba(0, 180, 0, 0.392)'\r\nconst greenLine = 'rgb(0, 100, 0)'\r\n\r\nclass MarketSentiment extends Chart {\r\n static type = ChartElementType.MarketSentiment\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n declare _data: number[]\r\n declare _dataLastIndex: number | null\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n }\r\n\r\n setupCache() {\r\n super.setupCache()\r\n if (!this.data) {\r\n return\r\n }\r\n const arr: number[] = []\r\n this.data.close.forEach((sum, i) => {\r\n arr[i] = sum / this.data.volume[i]\r\n })\r\n this._data = arr\r\n\r\n let lastIndex = null\r\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\r\n if (this.data.volume[i] !== 0) {\r\n lastIndex = i\r\n break\r\n }\r\n }\r\n this._dataLastIndex =\r\n lastIndex === null\r\n ? null\r\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\r\n }\r\n\r\n renderChart() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\r\n yOffset: MarketSentimentSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\r\n translate.undo()\r\n }\r\n\r\n renderLineBullBear(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n overbought: number\r\n ) {\r\n if (this._dataLastIndex === null) {\r\n return\r\n }\r\n const isRedesign = isRedesignEnabled()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const domain = [domainMax, domainMin]\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[1]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', red)\r\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[0]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(overbought)) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', green)\r\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n renderXAxis() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const { Colors } = MarketSentimentSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const xLine = this.getXLine()\r\n const text = new Text(\r\n {\r\n y: this.height + 12,\r\n font: { size: 7 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n let x\r\n\r\n x = this.fx(0)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10) + 2 /* remove overflow */\r\n text.set({ text: '10AM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 20)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 40)\r\n text.set({ text: '12PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 60)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 80)\r\n text.set({ text: '2PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 100)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 120 - 1)\r\n text.set({ text: '4PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText() {}\r\n\r\n renderCrossText() {}\r\n\r\n renderOverlaysLabels() {}\r\n\r\n _compute() {\r\n return { min: domainMin, max: domainMax }\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const isRedesign = isRedesignEnabled()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const yLine = this.getYLine()\r\n for (const tick of [domainMin, 0, domainMax]) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n }\r\n\r\n const text = new Text(\r\n {\r\n x: this.width + 27,\r\n font: { size: 8 },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n\r\n const fillUp = isRedesign ? Colors.marketUp : greenLine\r\n const fillDown = isRedesign ? Colors.marketDown : redLine\r\n const last = this._data[this._dataLastIndex!]\r\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\r\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\r\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\r\n\r\n translate.undo()\r\n }\r\n\r\n clip() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n this.context.beginPath()\r\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\r\n this.context.clip()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n toString() {\r\n return `Market sentiment chart`\r\n }\r\n}\r\nMarketSentiment.initClass()\r\n\r\nexport default MarketSentiment\r\n","import { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\ninterface MultiLineChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nclass MultiLineChart extends Chart {\r\n static type = ChartElementType.MultiLineChart\r\n tickersDimensions: number[] = []\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.set('lineWidth', 1)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n\r\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\r\n const ticker = this.attrs.tickers[index]\r\n const quote = quotes[ticker]\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\r\n // margin?\r\n continue\r\n }\r\n const y = Math.round(this.fy(quote.close[i]))\r\n this.context.lineTo(x, y)\r\n }\r\n this.context.stroke()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const text = this.attrs.label || ''\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n return this.renderCrossText(context, this.data.close.length - 1)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\r\n\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n const isLastDate = crossIndex === this.data.close.length - 1\r\n\r\n new Text(\r\n {\r\n text: `${months[month]} ${day} ${year} `,\r\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\r\n if (this.tickersDimensions[index]) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n y - PADDING.XXXS,\r\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n }\r\n const ticker = this.attrs.tickers[index]\r\n const closeValue = quotes[ticker].close[crossIndex]\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\r\n x: ChartSettings.left.width,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n lineHeight: LINE_HEIGHT.M,\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n if (isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n text.render(context)\r\n }\r\n }\r\n\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n getMinMax() {\r\n const quotes = this.getQuotes()\r\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\r\n if (typeof this.attrs.min !== 'undefined') {\r\n min = this.attrs.min\r\n }\r\n if (typeof this.attrs.max !== 'undefined') {\r\n max = this.attrs.max\r\n }\r\n return { min, max }\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default MultiLineChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { getBarWithoutMarginWidth } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass OHLCChart extends Chart {\r\n static type = ChartElementType.OhlcChart\r\n static label = 'OHLC'\r\n static iconName = 'ohlcChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const barWithoutMarginWidth = getBarWithoutMarginWidth(this.model)\r\n\r\n let lineWidth = 1\r\n if (barWithoutMarginWidth >= 40) {\r\n lineWidth = 4\r\n } else if (barWithoutMarginWidth >= 30) {\r\n lineWidth = 3\r\n } else if (barWithoutMarginWidth >= 15) {\r\n lineWidth = 2\r\n }\r\n const lineThickness = lineWidth / 2\r\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\r\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\r\n this.context.set('lineWidth', lineWidth)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const barX = ~~(x - 1) + lineOffset // move 1px to left so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\r\n\r\n this.context.beginPath()\r\n this.context.set(\r\n 'strokeStyle',\r\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\r\n )\r\n\r\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\r\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\r\n\r\n if (handleLengthFromWick >= 1) {\r\n const open = Math.round(this.fy(this.data.open[i]))\r\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\r\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\r\n\r\n const close = Math.round(this.fy(this.data.close[i]))\r\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\r\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\r\n }\r\n\r\n this.context.stroke()\r\n },\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `OHLC ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default OHLCChart\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\ninterface PerfChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n fromDate: string\r\n toDate: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nclass PerfChart extends Chart {\r\n static type = ChartElementType.PerfChart\r\n\r\n overlayLabelWidth: ObjectHash\r\n perf: ObjectHash = {}\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.overlayLabelWidth = {}\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\r\n }\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = (() => {\r\n switch (this.model.quote().timeframe) {\r\n case 'd':\r\n return 'DAILY'\r\n case 'w':\r\n return 'WEEKLY'\r\n case 'm':\r\n return 'MONTHLY'\r\n default:\r\n return\r\n }\r\n })()\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text: period,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (this.data.timeframe) {\r\n case 'd':\r\n case 'w':\r\n dateString = `${months[month]} ${day}`\r\n break\r\n case 'm':\r\n dateString = `${months[month]} ${year}`\r\n break\r\n default:\r\n return\r\n }\r\n\r\n let shouldRenderDate = false\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\r\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n const hasData = Number.isFinite(tickerData[crossIndex])\r\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\r\n shouldRenderDate = shouldRenderDate || hasData\r\n new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n if (shouldRenderDate) {\r\n new Text(\r\n {\r\n text: `${dateString} `,\r\n x: ChartSettings.left.width + 132,\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n super.renderOverlaysLabels(context)\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n const lastCrossIndex = this.perf[ticker].length - 1\r\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\r\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\r\n text.render(context)\r\n }\r\n }\r\n }\r\n\r\n _compute() {\r\n this.perf = {}\r\n const quotes = this.getQuotes()\r\n\r\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\r\n const toDate = new Date(this.attrs.toDate + ' 23:59')\r\n const filteredQuotes = []\r\n for (const quote of quotes) {\r\n const closes = []\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n if (fromDate <= date && date <= toDate) {\r\n closes.push(quote.close[i])\r\n }\r\n }\r\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\r\n }\r\n\r\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\r\n for (const quote of filteredQuotes) {\r\n this.perf[quote.ticker] = []\r\n const first = quote.close[0]\r\n let offset = 0\r\n if (daysCount > quote.close.length) {\r\n offset = daysCount - quote.close.length\r\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\r\n this.perf[quote.ticker][i] = NaN\r\n }\r\n }\r\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\r\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\r\n }\r\n }\r\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\r\n return { min, max }\r\n }\r\n\r\n // TODO refactor into ?utils\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.paneModel.scale.y.ticks(10)\r\n const yLine = this.getYLine()\r\n const text = new Text(\r\n {\r\n x: this.width + 8,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n for (const tick of ticks) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n text.set({ text: tick.toFixed(2), y }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n y: this.height + 18,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n const textWidth = text.set({ text: '2020' }).measure(this.context)\r\n\r\n let date = new Date(this.data.date[0] * 1000)\r\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n let monthsInData = 0\r\n this.data.date.forEach((d, index) => {\r\n if (index < 1) {\r\n return\r\n }\r\n\r\n const date = new Date(d * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n monthsInData++\r\n }\r\n lastMonth = month\r\n })\r\n\r\n const availableTickSpots = ~~(this.width / textWidth)\r\n const monthsToAvail = monthsInData / availableTickSpots\r\n let renderMonth\r\n if (monthsToAvail <= 1) {\r\n renderMonth = () => true\r\n } else if (monthsToAvail <= 2) {\r\n renderMonth = (x: number) => x % 2 === 0\r\n } else if (monthsToAvail <= 3) {\r\n renderMonth = (x: number) => x % 3 === 0\r\n } else if (monthsToAvail <= 4) {\r\n renderMonth = (x: number) => x % 4 === 0\r\n } else if (monthsToAvail <= 6) {\r\n renderMonth = (x: number) => x % 6 === 0\r\n } else {\r\n renderMonth = (x: number) => x === 0\r\n }\r\n\r\n date = new Date(this.data.date[0] * 1000)\r\n lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n const xLine = this.getXLine()\r\n\r\n for (let i = 0; i < this.data.date.length; i++) {\r\n date = new Date(this.data.date[i] * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n if (!renderMonth(date.getMonth())) {\r\n continue\r\n }\r\n\r\n text\r\n .set({\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\r\n x: x,\r\n })\r\n .render(this.context)\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Perf chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default PerfChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport candleStick from './candle_stick'\r\nimport hollowCandleStick from './candle_stick_hollow'\r\nimport heikinAshi from './heikin_ashi'\r\nimport lineChart from './line_chart'\r\nimport marketSentiment from './market_sentiment'\r\nimport multiLineCharts from './multi_line_chart'\r\nimport ohlcChart from './ohlc_chart'\r\nimport perfChart from './perf_chart'\r\n\r\nexport const chartsByType = Object.freeze({\r\n [ChartElementType.CandleStick]: candleStick,\r\n [ChartElementType.HeikinAshi]: heikinAshi,\r\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\r\n [ChartElementType.LineChart]: lineChart,\r\n [ChartElementType.MarketSentiment]: marketSentiment,\r\n [ChartElementType.MultiLineChart]: multiLineCharts,\r\n [ChartElementType.OhlcChart]: ohlcChart,\r\n [ChartElementType.PerfChart]: perfChart,\r\n})\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 180000,\r\n Elite = Default,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n","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 {\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 usePopoverState,\r\n} from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { CHART_ELEMENT_ID, SpecificChartFunctionality } from '../../constants/common'\r\nimport { chartSettingsAsyncModule } from '../../controllers/chart-settings/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\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 Discard changes\r\n \r\n \r\n }\r\n >\r\n Are you sure you want to discard changes?\r\n \r\n \r\n )\r\n})\r\n\r\ninterface ChartSettingsButtonProps extends ButtonComponentProps {\r\n isPremium: boolean\r\n placement?: PopoverPlacement\r\n model: ChartLayout\r\n}\r\n\r\nexport function ChartSettingsButton({\r\n isPremium,\r\n model,\r\n placement,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom' })\r\n const isOpen = settingsPopoverState.useState('open')\r\n\r\n const buttonProps = React.useMemo(() => {\r\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\r\n return {\r\n as: 'a',\r\n href: `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[model.specificChartFunctionality],\r\n })}`,\r\n } as ButtonComponentProps<'a'>\r\n }\r\n\r\n return {\r\n as: PopoverTrigger,\r\n state: settingsPopoverState,\r\n active: isOpen,\r\n } as ButtonComponentProps\r\n }, [model.specificChartFunctionality, isPremium, settingsPopoverState, isOpen])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { useModelRef } from '../../model-hooks/useModelRef'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport { getLeftOffset } from '../renderUtils'\r\n\r\nconst getQuoteRequestKey = (chartModel: Chart) =>\r\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\r\n\r\nexport function useChartControls({\r\n chartModel: unwatchedChartModel,\r\n isInteractive,\r\n}: {\r\n chartModel: Chart | null\r\n isInteractive: boolean\r\n}) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\r\n })\r\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\r\n watchProperties: ['idea', 'settings'],\r\n })\r\n const chartModelRef = useModelRef(chartModel)\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const abortControllerKeyRef = React.useRef('')\r\n const isIdeaChart = !!chartLayoutModel?.idea?.id\r\n\r\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\r\n const chart = chartModelRef.current\r\n if (!chart) {\r\n return\r\n }\r\n\r\n const chartLayoutModel = chart.chart_layout()\r\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\r\n\r\n chart.getAllPanes().forEach((pane) => {\r\n if (!!pane.getChartOrIndicatorElement()) {\r\n pane.updateAttribute('scaleRange', null)\r\n }\r\n })\r\n\r\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\r\n\r\n // Refetch all other chart quotes as the main one is already refetched so we can filter it out but other quotes (from perf for example) should be refetched as well\r\n chart\r\n .getAllQuotes()\r\n .filter((chartQuote) => !chartQuote.eql(quote))\r\n .forEach((quote) => {\r\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\r\n })\r\n\r\n const chartPane = chart.getChartPane()\r\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\r\n\r\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\r\n for (const element of elements) {\r\n const isDrawing = element.isDrawing()\r\n const isChartEvent = element.isChartEvent()\r\n if (isDrawing || isChartEvent) {\r\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\r\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\r\n element.instance.updateScales()\r\n } else {\r\n element.destroyCascade()\r\n }\r\n }\r\n }\r\n\r\n chart.setChartEvents(quote.chartEvents, true)\r\n\r\n chartPane?.updateChartEventsZIndexes()\r\n\r\n // The only dependency here is a ref , so no need to add it to dependencies\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const fetchQuote = React.useCallback(async () => {\r\n if (!isInteractive || !chartModel || isIdeaChart) {\r\n return\r\n }\r\n setIsLoading(true)\r\n\r\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\r\n const { premarket, aftermarket } = Quote.first()\r\n const patterns = chartModel.getHasPatterns()\r\n const currentQuote = chartModel.quote()\r\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\r\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\r\n const abortController = createRequestAbortController({\r\n key: abortControllerKeyRef.current,\r\n shouldAbortRunningRequest: !Quote.select(\r\n (quote) =>\r\n quote.ticker === ticker &&\r\n quote.timeframe === timeframe &&\r\n quote.isFetching &&\r\n chartModel.chart_layout().isIdeaId(quote.ideaID)\r\n ),\r\n })\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n abortController,\r\n })\r\n\r\n if (quote.wasFetchAborted) {\r\n // Check if the quote is also used in other chars, as the quote may be reused if we already have a quote with the same options\r\n const isQuoteUsedInOtherCharts = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .filter((chart) => !chartModel.eql(chart))\r\n .some((chart) => quote.eql(chart.quote()))\r\n\r\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\r\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\r\n quote.destroy()\r\n }\r\n\r\n return\r\n }\r\n\r\n removeFromAbortCache(abortControllerKeyRef.current)\r\n\r\n updateChartModelWithNewQuote(quote)\r\n }\r\n\r\n setIsLoading(false)\r\n\r\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n chartModel?.id,\r\n chartModel?.ticker,\r\n chartModel?.timeframe,\r\n chartModel?.instrument,\r\n isIdeaChart,\r\n updateChartModelWithNewQuote,\r\n isInteractive,\r\n ])\r\n\r\n React.useEffect(() => {\r\n fetchQuote()\r\n }, [fetchQuote])\r\n\r\n // There are several ways how to turn off dateRange, e.g. moving the charts\r\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\r\n // Consider refactoring this part so we only update chart models on route changes not the other way around\r\n React.useEffect(() => {\r\n if (chartModel) {\r\n const decodedQueryString = decodeQueryString(location.search)\r\n const rangesArray = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .map((chart) => chart.dateRange)\r\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\r\n\r\n if (decodedQueryString.r !== ranges) {\r\n navigate({\r\n search: `?${encodeQueryString({\r\n ...decodedQueryString,\r\n r: ranges,\r\n })}`,\r\n })\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.dateRange])\r\n\r\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\r\n // React.useEffect(\r\n // () => () => {\r\n // if (isInteractive && abortControllerKeyRef.current !== '') {\r\n // abortRequest(abortControllerKeyRef.current)\r\n // }\r\n // },\r\n // [isInteractive]\r\n // )\r\n\r\n React.useEffect(() => {\r\n const chart = chartModelRef.current\r\n const quote = chart?.quote()\r\n\r\n let shouldRecalculateOnCharts = false\r\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\r\n const settings = chartLayoutModel?.settings\r\n const barWidth = 3\r\n const barMargin = 1\r\n if (settings) {\r\n const hasSameBarWidth = [\r\n settings.ChartSettings.center.barWidth,\r\n settings.IndicatorSettings.center.barWidth,\r\n ].every((value) => value === barWidth)\r\n const hasSameBarMargin = [\r\n settings.ChartSettings.center.barMargin,\r\n settings.IndicatorSettings.center.barMargin,\r\n ].every((value) => value === barMargin)\r\n\r\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\r\n if (shouldRecalculateOnCharts) {\r\n settings.ChartSettings.center.barWidth = barWidth\r\n settings.IndicatorSettings.center.barWidth = barWidth\r\n settings.ChartSettings.center.barMargin = barMargin\r\n settings.IndicatorSettings.center.barMargin = barMargin\r\n\r\n chartLayoutModel.updateAttributes({ settings })\r\n }\r\n }\r\n }\r\n\r\n if (\r\n chart &&\r\n quote &&\r\n (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage ||\r\n shouldRecalculateOnCharts) &&\r\n !isIdeaChart\r\n ) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\r\n chart.updateAttributes({ leftOffset })\r\n }\r\n // This effect should run only on timeframe change & idea change\r\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\r\n\r\n return { isLoading }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nexport function useModelRef(model: Model | null) {\r\n const modelRef = React.useRef(model)\r\n\r\n React.useEffect(() => {\r\n modelRef.current = model\r\n }, [model])\r\n\r\n return modelRef\r\n}\r\n","import {\r\n 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) => {\r\n const value = ev.currentTarget.value\r\n onChange(colorValue, value)\r\n },\r\n [onChange, colorValue]\r\n )\r\n const handleColorChange = useCallback(\r\n (color) => {\r\n onChange(color, rangeValue)\r\n },\r\n [onChange, rangeValue]\r\n )\r\n return (\r\n

\r\n
\r\n \r\n
\r\n
\r\n \r\n {rangeValue}\r\n \r\n }\r\n onChange={handleRangeChange}\r\n value={Number(rangeValue)}\r\n data-testid={rangeTestId}\r\n />\r\n
\r\n
\r\n )\r\n}\r\n","import { convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { ColorRangeRowInput } from './color_range_row'\r\n\r\ninterface Value {\r\n color: string\r\n width: string\r\n}\r\n\r\ninterface BorderInputProps {\r\n label: string\r\n value: Value\r\n min: number\r\n max: number\r\n onChange: (value: Value) => void\r\n}\r\n\r\nexport function BorderInput({ label = 'Border', value, onChange, min, max }: BorderInputProps) {\r\n return (\r\n onChange({ color, width })}\r\n />\r\n )\r\n}\r\n","import { Checkbox } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface CheckBoxProps {\r\n label: string\r\n value: boolean\r\n onChange: (isChecked: boolean) => void\r\n}\r\n\r\nexport function CheckBox({ label, value, onChange }: CheckBoxProps) {\r\n return (\r\n ) => onChange(ev.currentTarget.checked)}\r\n data-testid=\"chart-modal-checkbox\"\r\n >\r\n {label}\r\n \r\n )\r\n}\r\n","import { Checkbox, Input, Label, Select } from '@finviz/website'\r\nimport React, { useCallback, useState } from 'react'\r\n\r\nconst FONT_VALUES = [\r\n { value: 'Arial', label: 'Arial' },\r\n { value: 'Verdana', label: 'Verdana' },\r\n]\r\n\r\ninterface InputProps {\r\n family: string\r\n size: string\r\n style: string\r\n weight: string\r\n}\r\n\r\ninterface FontInputProps {\r\n value: InputProps\r\n onChange: (values: InputProps) => void\r\n}\r\n\r\nexport function FontInput({ value, onChange }: FontInputProps) {\r\n const [family, setFamily] = useState(value.family)\r\n const [size, setSize] = useState(value.size)\r\n const [style, setStyle] = useState(value.style)\r\n const [weight, setWeight] = useState(value.weight)\r\n\r\n const setValue = useCallback(\r\n (key, valueSetter, value) => {\r\n valueSetter(value)\r\n onChange({ family, size, style, weight, [key]: value })\r\n },\r\n [family, size, style, weight, onChange]\r\n )\r\n\r\n return (\r\n
\r\n
\r\n \r\n ) => setValue('size', setSize, ev.currentTarget.value)}\r\n value={size}\r\n data-testid=\"chart-modal-font-size\"\r\n />\r\n\r\n ) =>\r\n setValue('weight', setWeight, ev.currentTarget.checked ? 'bold' : 'normal')\r\n }\r\n data-testid=\"chart-modal-font-weight\"\r\n >\r\n Bold\r\n \r\n ) =>\r\n setValue('style', setStyle, ev.currentTarget.checked ? 'italic' : 'normal')\r\n }\r\n data-testid=\"chart-modal-font-style\"\r\n >\r\n Italic\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import { convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { ColorRangeRowInput } from './color_range_row'\r\n\r\ninterface LineInputValue {\r\n color: string\r\n width: string\r\n}\r\n\r\ninterface LineInputProps {\r\n label: string\r\n value: LineInputValue\r\n onChange: (value: LineInputValue) => void\r\n}\r\n\r\nexport function LineInput({ label = 'Line', value, onChange }: LineInputProps) {\r\n return (\r\n onChange({ color, width })}\r\n />\r\n )\r\n}\r\n","import { Textarea } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface MultilineStringInputProps {\r\n label: string\r\n value: string\r\n required: boolean\r\n onChange: (value: string) => void\r\n}\r\n\r\nexport function MultilineStringInput({ label, value, required, onChange }: MultilineStringInputProps) {\r\n return (\r\n ) => onChange(e.target.value)}\r\n value={value}\r\n autoFocus\r\n data-testid=\"chart-modal-multiline-string-textarea\"\r\n />\r\n )\r\n}\r\n","import { Input } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface NumberInputProps {\r\n label: string\r\n name: string\r\n value: number\r\n required: boolean\r\n min?: number\r\n max?: number\r\n allowDecimal?: boolean\r\n step?: number\r\n onChange: (value: number) => void\r\n}\r\n\r\nexport function NumberInput(props: NumberInputProps) {\r\n const { label, name, value, required, min, max, step, allowDecimal = false } = props\r\n\r\n return (\r\n ) =>\r\n props.onChange(allowDecimal ? parseFloat(e.target.value) : parseInt(e.target.value, 10))\r\n }\r\n data-testid=\"chart-modal-number-input\"\r\n />\r\n )\r\n}\r\n","import { Input } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface StringInputProps {\r\n label: string\r\n name: string\r\n value: string\r\n required: boolean\r\n onChange: (value: string) => void\r\n}\r\n\r\nexport function StringInput(props: StringInputProps) {\r\n const { label, name, value, required } = props\r\n\r\n return (\r\n ) => props.onChange(e.target.value)}\r\n data-testid=\"chart-modal-string-textinput\"\r\n />\r\n )\r\n}\r\n","import { Checkbox, Input, InputColorPicker, convertColorToHEX } from '@finviz/website'\r\nimport React from 'react'\r\n\r\ninterface InputProps {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\ninterface trendInputProps {\r\n value: InputProps\r\n onChange: (values: InputProps) => void\r\n}\r\n\r\nexport function Trend({ value, onChange }: trendInputProps) {\r\n return (\r\n
\r\n ) => onChange({ ...value, active: ev.currentTarget.checked })}\r\n data-testid=\"chart-modal-trend-active\"\r\n />\r\n ) =>\r\n onChange({ ...value, trend: ev.currentTarget.valueAsNumber })\r\n }\r\n value={value.trend}\r\n data-testid=\"chart-modal-trend-value\"\r\n />\r\n onChange({ ...value, color: color })}\r\n inputDataTestId=\"chart-modal-trend-color\"\r\n />\r\n
\r\n )\r\n}\r\n","import { Checkbox, Input, Paragraph } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { MacroTimeframe } from '../../constants/common'\r\nimport { DEFAULTS } from './index'\r\n\r\nexport interface InputProps {\r\n macroKey: MacroTimeframe\r\n isOff: boolean\r\n from: number\r\n to: number\r\n}\r\n\r\ninterface VisibilityInputProps {\r\n value: InputProps\r\n onChange: (value: InputProps) => void\r\n isCheckboxOnly: boolean\r\n}\r\n\r\nexport function VisibilityInput({ value, onChange, isCheckboxOnly }: VisibilityInputProps) {\r\n const [isOff, setIsOff] = React.useState(value.isOff)\r\n const [from, setFrom] = React.useState(value.from)\r\n const [to, setTo] = React.useState(value.to)\r\n const { macroKey } = value\r\n const macroLabel = macroKey.charAt(0).toUpperCase() + macroKey.slice(1)\r\n\r\n const setValue = React.useCallback(\r\n (key, valueSetter, value) => {\r\n valueSetter(value)\r\n onChange({ macroKey, isOff, from, to, [key]: value })\r\n },\r\n [macroKey, isOff, from, to, onChange]\r\n )\r\n return (\r\n
\r\n
\r\n ) => setValue('isOff', setIsOff, !e.target.checked)}\r\n >\r\n {isCheckboxOnly && macroLabel}\r\n \r\n {!isCheckboxOnly && (\r\n <>\r\n ) =>\r\n setValue('from', setFrom, Number(ev.currentTarget.value))\r\n }\r\n data-testid={`visibility-input-${macroKey}-from`}\r\n />\r\n -\r\n ) =>\r\n setValue('to', setTo, Number(ev.currentTarget.value))\r\n }\r\n data-testid={`visibility-input-${macroKey}-to`}\r\n />\r\n {macroLabel}\r\n \r\n )}\r\n
\r\n
\r\n )\r\n}\r\n","import merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { IVisibility, MacroTimeframe, MicroTimeframeRange } from '../../constants/common'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { InputProps, VisibilityInput } from './visibility-input'\r\n\r\ninterface VisibilityProps {\r\n label: string\r\n name: string\r\n value: IVisibility\r\n onChange: (value: IVisibility) => void\r\n handleDisableSubmit: (value: string | false) => void\r\n}\r\n\r\ntype Micro = { isOff: boolean; from: number; to: number }\r\nexport type DEFAULTS_TYPE = { [key in MacroTimeframe]: Micro }\r\n\r\nexport const DEFAULTS: DEFAULTS_TYPE = {\r\n // [MacroTimeframe.seconds]: { isOff: false, from: 1, to: 59 },\r\n [MacroTimeframe.minutes]: { isOff: false, from: 1, to: 59 },\r\n [MacroTimeframe.hours]: { isOff: false, from: 1, to: 24 },\r\n [MacroTimeframe.days]: { isOff: false, from: 1, to: 366 },\r\n [MacroTimeframe.weeks]: { isOff: false, from: 1, to: 52 },\r\n [MacroTimeframe.months]: { isOff: false, from: 1, to: 12 },\r\n}\r\n\r\nconst INPUTS_AVAILABLE = [MacroTimeframe.minutes, MacroTimeframe.hours]\r\n\r\nconst getInitialState = (value: IVisibility) => {\r\n const visibilities = merge({}, DEFAULTS)\r\n for (const visibility in visibilities) {\r\n const macroTimeframe = visibility as MacroTimeframe\r\n const valueMacroTimeframe = value?.[macroTimeframe]\r\n if (!valueMacroTimeframe) continue\r\n if (Object.keys(valueMacroTimeframe).length === 0) {\r\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], isOff: true }\r\n } else {\r\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], ...valueMacroTimeframe }\r\n }\r\n }\r\n return visibilities\r\n}\r\n\r\nconst getIsVisibilityOutsideAvailableTimeframes = (value: IVisibility) => {\r\n const result = Object.keys(MacroTimeframe).every((macrotimeframe) => {\r\n const macroRange = value[macrotimeframe as MacroTimeframe]\r\n\r\n return (\r\n macroRange &&\r\n (Object.keys(macroRange).length === 0 ||\r\n !MicroTimeframeRange[macrotimeframe as MacroTimeframe].some((item) =>\r\n isInRange({\r\n value: item,\r\n min: macroRange?.from ?? DEFAULTS[macrotimeframe as MacroTimeframe].from,\r\n max: macroRange?.to ?? DEFAULTS[macrotimeframe as MacroTimeframe].to,\r\n })\r\n ))\r\n )\r\n })\r\n return result\r\n}\r\n\r\nexport function Visibility(props: VisibilityProps) {\r\n const initialVisibilityRef = React.useRef(getInitialState(props.value))\r\n\r\n const handleChange = (value: InputProps) => {\r\n const result: IVisibility = props.value ? merge({}, props.value) : {}\r\n result[value.macroKey] = {}\r\n\r\n if (value.isOff) {\r\n props.onChange(result)\r\n } else if (value.from === DEFAULTS[value.macroKey].from && value.to === DEFAULTS[value.macroKey].to) {\r\n delete result[value.macroKey]\r\n props.onChange(result)\r\n } else {\r\n if (value.from !== DEFAULTS[value.macroKey].from) {\r\n result[value.macroKey]!.from = value.from\r\n }\r\n if (value.to !== DEFAULTS[value.macroKey].to) {\r\n result[value.macroKey]!.to = value.to\r\n }\r\n props.onChange(result)\r\n }\r\n\r\n props.handleDisableSubmit(\r\n getIsVisibilityOutsideAvailableTimeframes(result)\r\n ? 'The chosen timeframes would make the drawing invisible on all supported timeframes.'\r\n : false\r\n )\r\n }\r\n\r\n return Object.keys(initialVisibilityRef.current).map((macroKey) => (\r\n \r\n ))\r\n}\r\n","import {\r\n Button,\r\n ButtonGroup,\r\n Dialog,\r\n DialogBody,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogStateReturn,\r\n useDialogState,\r\n} from '@finviz/website'\r\nimport debounce from 'lodash.debounce'\r\nimport * as React from 'react'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { BackgroundInput } from './background'\r\nimport { BorderInput } from './border'\r\nimport { CheckBox } from './checkbox'\r\nimport { FontInput } from './font'\r\nimport { LineInput } from './line'\r\nimport { MultilineStringInput } from './multiline_string'\r\nimport { NumberInput } from './number'\r\nimport { StringInput } from './string'\r\nimport { Trend } from './trend'\r\nimport { Visibility } from './visibility'\r\n\r\nfunction getInputForType(type: string) {\r\n switch (type) {\r\n case 'number':\r\n return NumberInput\r\n case 'string':\r\n return StringInput\r\n case 'text':\r\n return StringInput\r\n case 'background':\r\n return BackgroundInput\r\n case 'border':\r\n return BorderInput\r\n case 'line':\r\n return LineInput\r\n case 'multiline_string':\r\n return MultilineStringInput\r\n case 'font':\r\n return FontInput\r\n case 'checkbox':\r\n return CheckBox\r\n case 'trend':\r\n return Trend\r\n case 'visibility':\r\n return Visibility\r\n default:\r\n return () =>
ERROR: Unknown input type
\r\n }\r\n}\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button' as const, className: 'flex-1', contentClass: 'text-center' }\r\n\r\ntype OnSubmitType = ((value: ObjectHash) => void) | null\r\ntype OnDismissType = (() => void) | null\r\n\r\nexport interface ElementStyleDialogProps {\r\n state: DialogStateReturn\r\n element: ElementType\r\n onSubmit: ((values: ElementType['attrs']) => void) | null\r\n onDismiss: (() => void) | null\r\n onHide: () => void\r\n}\r\n\r\nexport type StyleDialogOpener = (\r\n element: ElementType,\r\n onSubmit: ElementStyleDialogProps['onSubmit'],\r\n onDismiss: ElementStyleDialogProps['onDismiss']\r\n) => void\r\n\r\nfunction getValuesFromFormState(formState: ObjectHash) {\r\n return formState.reduce((acc: ObjectHash, cur: ObjectHash) => {\r\n acc[cur.name] = cur.value\r\n return acc\r\n }, {} as ObjectHash)\r\n}\r\n\r\nenum DialogTabs {\r\n Style,\r\n Visibility,\r\n}\r\n\r\nexport function ElementStyleDialog(props: ElementStyleDialogProps) {\r\n const config = props.element.getModalConfig()\r\n const initialFormStateRef = React.useRef[]>(JSON.parse(JSON.stringify(config.inputs)))\r\n const [formState, setFormState] = React.useState[]>(config.inputs)\r\n const [selectedTab, setSelectedTab] = React.useState(DialogTabs.Style)\r\n const [isSubmitDisabled, setIsSubmitDisabled] = React.useState(false) // If string, the value is used as title for disabled button.\r\n\r\n const isDrawingElement = props.element.getIsDrawing()\r\n\r\n React.useEffect(() => {\r\n props.element.isEditInProgress = true\r\n return () => {\r\n props.element.isEditInProgress = false\r\n props.element.trigger('change', props.element)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleValuesChange = React.useCallback(\r\n ({\r\n values,\r\n shouldSubmit = false,\r\n shouldDismiss = false,\r\n }: {\r\n values: ObjectHash\r\n shouldSubmit?: boolean\r\n shouldDismiss?: boolean\r\n }) => {\r\n const hasOnSubmit = typeof props.onSubmit === 'function'\r\n const hasOnDismiss = typeof props.onDismiss === 'function'\r\n\r\n props.element.set(values)\r\n if (shouldSubmit && hasOnSubmit) {\r\n props.onSubmit!(values)\r\n } else if (shouldDismiss && hasOnDismiss) {\r\n props.onDismiss!()\r\n }\r\n\r\n if (shouldSubmit || shouldDismiss) {\r\n props.state.hide()\r\n }\r\n },\r\n [props]\r\n )\r\n\r\n const handleValuesChangeDebounceRef = React.useRef(\r\n debounce(\r\n (newFormState) => {\r\n const values = getValuesFromFormState(newFormState)\r\n handleValuesChange({ values })\r\n },\r\n 50,\r\n { maxWait: 100 }\r\n )\r\n )\r\n\r\n React.useEffect(\r\n () => () => {\r\n handleValuesChangeDebounceRef.current.cancel()\r\n },\r\n []\r\n )\r\n\r\n const onSubmit: React.FormEventHandler = React.useCallback(\r\n (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n if (ev.currentTarget.checkValidity()) {\r\n const values = getValuesFromFormState(formState)\r\n handleValuesChange({ values, shouldSubmit: true })\r\n }\r\n },\r\n [formState, handleValuesChange]\r\n )\r\n\r\n const handleCloseDialog = React.useCallback(() => {\r\n const values = getValuesFromFormState(initialFormStateRef.current)\r\n handleValuesChange({ values, shouldDismiss: true })\r\n }, [handleValuesChange])\r\n\r\n const getShouldRenderInputForTab = (inputType: string) => {\r\n if (selectedTab === DialogTabs.Visibility && inputType === 'visibility') return true\r\n if (selectedTab !== DialogTabs.Visibility && inputType !== 'visibility') return true\r\n return false\r\n }\r\n\r\n return (\r\n }\r\n onFullyClosed={props.onHide}\r\n >\r\n {config.title}\r\n
\r\n \r\n {isDrawingElement && (\r\n \r\n setSelectedTab(DialogTabs.Style)}\r\n data-testid=\"dialog-tab-button-style\"\r\n >\r\n Style\r\n \r\n setSelectedTab(DialogTabs.Visibility)}\r\n data-testid=\"dialog-tab-button-visibility\"\r\n >\r\n Visibility\r\n \r\n \r\n )}\r\n\r\n {formState.map((input) => {\r\n const InputComponent = getInputForType(input.type) as React.FC<{\r\n onChange: (value: string) => void\r\n handleDisableSubmit?: typeof setIsSubmitDisabled\r\n }>\r\n return (\r\n getShouldRenderInputForTab(input.type) && (\r\n {\r\n setFormState((prevState) => {\r\n const newFormState = prevState.map((stateInput) => {\r\n if (stateInput.name === input.name) {\r\n return { ...stateInput, value }\r\n }\r\n return stateInput\r\n })\r\n handleValuesChangeDebounceRef.current(newFormState)\r\n return newFormState\r\n })\r\n }}\r\n handleDisableSubmit={setIsSubmitDisabled}\r\n />\r\n )\r\n )\r\n })}\r\n \r\n \r\n \r\n \r\n Save\r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ElementStyleDialogContext = React.createContext>(() => {})\r\n\r\nexport function withElementStyleDialogState

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const context = React.useContext(ElementStyleDialogContext)\r\n\r\n return \r\n }\r\n}\r\n\r\nexport function ElementStyleDialogWrapper(props: { children: React.ReactNode }) {\r\n const [element, setElement] = React.useState(null)\r\n const [onSubmit, setOnSubmit] = React.useState(null)\r\n const [onDismiss, setOnDismiss] = React.useState(null)\r\n const dialog = useDialogState()\r\n\r\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\r\n if (onSubmit) {\r\n setOnSubmit(() => onSubmit)\r\n }\r\n if (onDismiss) {\r\n setOnDismiss(() => onDismiss)\r\n }\r\n\r\n setElement(element)\r\n dialog.show()\r\n }\r\n\r\n const onHide = () => {\r\n setElement(null)\r\n setOnSubmit(null)\r\n setOnDismiss(null)\r\n }\r\n\r\n return (\r\n \r\n {props.children}\r\n {element && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { HLC } from '../../utils/hlc'\r\n\r\nexport type DrawingChangeTimestamp = HLC\r\nexport type DrawingContainerType = IndicatorType | 'chart' | 'note' | null\r\nexport type AutoSaveChangeType = 'update' | 'destroy'\r\n\r\nexport interface AutoSaveElement {\r\n elementId: string\r\n ticker: string\r\n zIndex: number\r\n lastChange: DrawingChangeTimestamp\r\n changeType: AutoSaveChangeType\r\n containerType: DrawingContainerType\r\n elementAttrs: string\r\n}\r\n\r\nexport type AutoSaveElementDBRecord = Omit & { lastChange: string } & {\r\n lastChangeTimestamp: number\r\n lastChangeCounter: number\r\n lastChangeNodeUUID: string\r\n}\r\n\r\nexport const DRAWINGS_UPDATE_INTERVAL_MS = process.env.IS_E2E_TESTING ? 3000 : 15000\r\nexport const DRAWINGS_SAVE_INTERVAL_MS = 250\r\n","import { Notification, Paragraph, useNotification } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport fetchApi, {\r\n ContentType,\r\n ForbiddenError,\r\n GenericStatusCodeError,\r\n GoneError,\r\n InternalServerError,\r\n} from '../../utils/fetch_api'\r\nimport { HLC, compareHlc, incrementHlc } from '../../utils/hlc'\r\nimport { getByteLengthOfString } from '../../utils/string-byte-length'\r\nimport { AutoSaveElement, AutoSaveElementDBRecord, DrawingContainerType } from './constants'\r\nimport { getAutosaveElementFromDBRecord, getDBRecordFromAutosaveElement } from './utils'\r\n\r\nconst RETRY_LIMIT = 5\r\n\r\nexport function useDrawingAutoSaveApi() {\r\n const postRetryCountRef = React.useRef(0)\r\n const deleteRetryCountRef = React.useRef(0)\r\n const notificationContext = useNotification()\r\n\r\n const fetchDrawings = React.useCallback(\r\n async ({\r\n tickers,\r\n containerTypes,\r\n lastChange,\r\n }: {\r\n tickers: string[]\r\n containerTypes: DrawingContainerType[]\r\n lastChange: HLC\r\n }) => {\r\n try {\r\n const data = await fetchApi<{\r\n drawings: AutoSaveElementDBRecord[]\r\n }>({\r\n location: '/api/auto_save.ashx',\r\n queryParameters: {\r\n ticker: tickers.join(','),\r\n containerTypes: containerTypes.join(',') || undefined,\r\n lastChangeTimestamp: lastChange.ts,\r\n lastChangeCounter: lastChange.count,\r\n lastChangeNodeUUID: lastChange.uuid,\r\n },\r\n throwOnStatusCodes: [403, 404],\r\n })\r\n return data.drawings.map((drawing) => getAutosaveElementFromDBRecord(drawing))\r\n } catch {\r\n // ignore error\r\n }\r\n\r\n return []\r\n },\r\n []\r\n )\r\n\r\n const saveDrawings = React.useCallback(\r\n async (drawings: AutoSaveElement[]): Promise => {\r\n if (drawings.length === 0) {\r\n return undefined\r\n }\r\n\r\n try {\r\n const bodyJsonString = JSON.stringify(drawings.map((item) => getDBRecordFromAutosaveElement(item)))\r\n let keepalive = false\r\n try {\r\n keepalive = getByteLengthOfString(bodyJsonString) < 64000\r\n } catch (error: any) {\r\n window.Sentry?.captureException(error)\r\n }\r\n await fetchApi({\r\n location: '/api/auto_save.ashx',\r\n method: 'POST',\r\n throwOnStatusCodes: [400, 403, 404, 410, 500],\r\n contentType: ContentType.ApplicationJson,\r\n body: bodyJsonString,\r\n keepalive,\r\n })\r\n const [latestChangeHlc] = [...drawings].sort((a, b) => compareHlc(b.lastChange, a.lastChange))\r\n postRetryCountRef.current = 0\r\n return latestChangeHlc.lastChange\r\n } catch (error) {\r\n if (error instanceof InternalServerError) {\r\n // try again\r\n if (postRetryCountRef.current < RETRY_LIMIT) {\r\n postRetryCountRef.current = postRetryCountRef.current + 1\r\n await new Promise((r) => setTimeout(r, 1000))\r\n return saveDrawings(drawings)\r\n } else {\r\n // continue to report to Sentry\r\n postRetryCountRef.current = 0\r\n }\r\n } else if (error instanceof ForbiddenError) {\r\n // ignore error\r\n return undefined\r\n } else if (error instanceof GoneError) {\r\n const newTicker = (error.response as ObjectHash).newTicker\r\n const message = newTicker\r\n ? `Ticker \"${drawings[0].ticker}\" was renamed to \"${newTicker}\"`\r\n : `Ticker \"${drawings[0].ticker}\" no longer exists.`\r\n notificationContext.show(\r\n } timeoutInMs={6000}>\r\n {message}\r\n \r\n )\r\n return undefined\r\n }\r\n\r\n // report error to Sentry\r\n window.Sentry?.captureException(error, {\r\n extra: (error instanceof GenericStatusCodeError\r\n ? (error.response as ObjectHash).invalidItems\r\n : drawings\r\n ).reduce(\r\n (acc: ObjectHash, cur: ObjectHash, index: number) => ({ ...acc, [`item-${index}`]: JSON.stringify(cur) }),\r\n {} as ObjectHash\r\n ),\r\n })\r\n\r\n return undefined\r\n }\r\n },\r\n [notificationContext]\r\n )\r\n\r\n const deleteAllDrawings = React.useCallback(\r\n async ({ tickers, lastLocalChange }: { tickers: string[]; lastLocalChange: HLC }): Promise => {\r\n try {\r\n const newHlc = incrementHlc(lastLocalChange, Date.now())\r\n await fetchApi({\r\n location: `/api/auto_save.ashx?ticker=${tickers.join(',')}&lastChangeTimestamp=${\r\n newHlc.ts\r\n }&lastChangeCounter=${newHlc.count}&lastChangeNodeUUID=${newHlc.uuid}`,\r\n method: 'DELETE',\r\n throwOnStatusCodes: [403, 404, 500],\r\n keepalive: true,\r\n })\r\n deleteRetryCountRef.current = 0\r\n } catch (error) {\r\n if (error instanceof InternalServerError) {\r\n // try again\r\n if (deleteRetryCountRef.current < RETRY_LIMIT) {\r\n deleteRetryCountRef.current = deleteRetryCountRef.current + 1\r\n await new Promise((r) => setTimeout(r, 1000))\r\n return deleteAllDrawings({ tickers, lastLocalChange })\r\n } else {\r\n // continue to report to Sentry\r\n deleteRetryCountRef.current = 0\r\n }\r\n } else if (error instanceof ForbiddenError) {\r\n // ignore error\r\n return\r\n }\r\n\r\n // report error to Sentry\r\n window.Sentry?.captureException(error)\r\n }\r\n },\r\n []\r\n )\r\n\r\n return { fetchDrawings, saveDrawings, deleteAllDrawings }\r\n}\r\n","// byteLengthCharCode2 from https://stackoverflow.com/a/63893237\r\n\r\nexport function getByteLengthOfString(s: string) {\r\n //assuming the String is UCS-2(aka UTF-16) encoded\r\n let n = 0\r\n for (let i = 0, l = s.length; i < l; i++) {\r\n const hi = s.charCodeAt(i)\r\n if (hi < 0x0080) {\r\n n += 1\r\n } else if (hi < 0x0800) {\r\n n += 2\r\n } else if (hi < 0xd800) {\r\n n += 3\r\n } else if (hi < 0xdc00) {\r\n const lo = s.charCodeAt(++i)\r\n if (i < l && lo >= 0xdc00 && lo <= 0xdfff) {\r\n n += 4\r\n } else {\r\n throw new Error('UCS-2 String malformed')\r\n }\r\n } else if (hi < 0xe000) {\r\n throw new Error('UCS-2 String malformed')\r\n } else {\r\n n += 3\r\n }\r\n }\r\n return n\r\n}\r\n","import React from 'react'\r\n\r\nimport { DrawingSpineOptions, DrawingSpineOptionsEvent } from '../../../types/shared'\r\nimport ElementCanvas from '../../canvas/element'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getCanvasElementByType } from '../../helpers/get-canvas-element-by-type'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport Element from '../../models/element'\r\nimport { compareHlc, incrementHlc, initHlc, receiveHlc } from '../../utils/hlc'\r\nimport { AutoSaveChangeType, AutoSaveElement, DRAWINGS_SAVE_INTERVAL_MS } from './constants'\r\nimport { useDrawingAutoSaveApi } from './use-drawing-autosave-api'\r\nimport { useIsAutoSaveActive } from './use-is-auto-save-active'\r\nimport {\r\n getContainerType,\r\n getNoteElementId,\r\n getTickerNoteText,\r\n getTickersAndContainerTypesInLayoutModel,\r\n mergeUpdatedDrawingsToInternalStore,\r\n updateInternalStoreWithChangedElement,\r\n} from './utils'\r\n\r\nexport function useDrawingAutoSaveControls(chartLayout: ChartLayout) {\r\n const { fetchDrawings, saveDrawings, deleteAllDrawings } = useDrawingAutoSaveApi()\r\n const isAutoSaveActive = useIsAutoSaveActive(chartLayout)\r\n const drawingsInternalStore = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\r\n const saveTimeoutRef = React.useRef()\r\n\r\n React.useEffect(\r\n () => () => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current)\r\n }\r\n },\r\n []\r\n )\r\n\r\n const saveLatestChanges = React.useCallback(\r\n (\r\n withDelayInMs = DRAWINGS_SAVE_INTERVAL_MS,\r\n saveQueueExtraFilterCallback: ((item: AutoSaveElement) => boolean) | null = null\r\n ) => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current)\r\n }\r\n const saveQueue = drawingsInternalStore.elements.filter(\r\n (item) =>\r\n compareHlc(item.lastChange, drawingsInternalStore.latestLocalUpdateTimestamp) > 0 &&\r\n item.lastChange.uuid === drawingsInternalStore.instanceUUID &&\r\n (saveQueueExtraFilterCallback === null || saveQueueExtraFilterCallback(item))\r\n )\r\n if (saveQueue.length === 0) {\r\n return\r\n }\r\n\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Unsaved)\r\n\r\n const save = async () => {\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saving)\r\n const result = await saveDrawings(saveQueue)\r\n if (result) {\r\n drawingsInternalStore.updateAttributes({\r\n latestLocalUpdateTimestamp: receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, result),\r\n })\r\n }\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saved)\r\n\r\n return result\r\n }\r\n\r\n if (withDelayInMs === 0) {\r\n return save()\r\n }\r\n\r\n saveTimeoutRef.current = window.setTimeout(save, withDelayInMs)\r\n },\r\n [saveDrawings, drawingsInternalStore]\r\n )\r\n\r\n const syncChartLayoutDrawings = React.useCallback(\r\n (drawing: AutoSaveElement) => {\r\n if (drawing.containerType === 'note') {\r\n return\r\n }\r\n const isRemove = drawing.changeType === 'destroy'\r\n\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const paneContainerType = getContainerType(paneModel)\r\n if (!paneContainerType || drawing.ticker !== ticker) {\r\n return\r\n }\r\n const paneInternalStoreElements = drawingsInternalStore.elements.filter(\r\n (autoSaveElement) => autoSaveElement.ticker === ticker && autoSaveElement.containerType === paneContainerType\r\n )\r\n const paneElements = paneModel.getAllElements()\r\n let element: Element | undefined\r\n paneElements.forEach((paneElement) => {\r\n if (paneElement.isDrawing() && !paneElement.instance.isCreator) {\r\n const paneDrawing = paneInternalStoreElements.find(({ elementId }) => elementId === paneElement.elementId)\r\n if (!paneDrawing || paneDrawing.changeType === 'destroy') {\r\n paneElement.destroyCascade()\r\n } else if (paneElement.elementId && paneElement.elementId === drawing.elementId) {\r\n element = paneElement\r\n }\r\n }\r\n })\r\n\r\n const parsedElementAttrs = JSON.parse(drawing.elementAttrs)\r\n if (element) {\r\n if (drawing.elementAttrs !== JSON.stringify(element.instance.toAutosaveConfig())) {\r\n if (element.pane().selection !== element.instance && !element.hasOngoingInteraction()) {\r\n element.instance.set(parsedElementAttrs)\r\n element.instance.updateScales()\r\n }\r\n }\r\n if (drawing.zIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: drawing.zIndex })\r\n }\r\n if (isRemove || paneContainerType !== drawing.containerType) {\r\n element.destroyCascade()\r\n }\r\n } else if (!isRemove && paneContainerType === drawing.containerType) {\r\n const instance = getCanvasElementByType(parsedElementAttrs.type).fromObject(\r\n parsedElementAttrs,\r\n paneModel\r\n ) as ElementCanvas\r\n paneModel.elements().create({ elementId: drawing.elementId, instance, zIndex: drawing.zIndex })\r\n instance.updateScales()\r\n }\r\n })\r\n },\r\n [chartLayout, drawingsInternalStore]\r\n )\r\n\r\n const handleAutoSaveNoteChange = React.useCallback(\r\n (note: string, ticker?: string) => {\r\n if (ticker) {\r\n const newNoteElement: AutoSaveElement = {\r\n elementId: getNoteElementId(ticker),\r\n zIndex: 0,\r\n ticker: ticker,\r\n lastChange: incrementHlc(drawingsInternalStore.latestLocalUpdateTimestamp, Date.now()),\r\n changeType: 'update',\r\n containerType: 'note',\r\n elementAttrs: JSON.stringify({ text: note }),\r\n }\r\n\r\n drawingsInternalStore.updateAttributes({\r\n elements: [\r\n ...drawingsInternalStore.elements.filter(({ elementId }) => elementId !== newNoteElement.elementId),\r\n newNoteElement,\r\n ],\r\n })\r\n }\r\n },\r\n [drawingsInternalStore]\r\n )\r\n\r\n const handleIdeaNoteChange = React.useCallback(\r\n (note: string) => {\r\n if (chartLayout.idea?.note !== note && (chartLayout.idea || note)) {\r\n chartLayout.updateAttribute('idea', { ...chartLayout.idea, note })\r\n handleAutoSaveNoteChange(note, chartLayout.activeChart?.getQuoteRawTicker() ?? undefined)\r\n }\r\n },\r\n [chartLayout, handleAutoSaveNoteChange]\r\n )\r\n\r\n const checkDrawingUpdate = React.useCallback(\r\n async (isRefetchAll = false) => {\r\n const { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n if (isRefetchAll) {\r\n drawingsInternalStore.updateAttributes({\r\n latestRemoteUpdateTimestamp: initHlc(drawingsInternalStore.instanceUUID, 0),\r\n })\r\n }\r\n\r\n const updatedDrawings = await fetchDrawings({\r\n tickers,\r\n containerTypes,\r\n lastChange: drawingsInternalStore.latestRemoteUpdateTimestamp,\r\n })\r\n const { newLastUpdateTimestamp, updatedElementIds, newInternalStore } = mergeUpdatedDrawingsToInternalStore({\r\n updatedDrawings,\r\n currentInternalStore: drawingsInternalStore.elements,\r\n lastUpdateTimestamp: drawingsInternalStore.latestRemoteUpdateTimestamp,\r\n isRefetchAll,\r\n })\r\n\r\n drawingsInternalStore.updateAttributes({\r\n // Even if there are no changes in elements, newInternalStore is new array with the same content which may cause unnecessary rerenders\r\n ...(updatedElementIds.length > 0 ? { elements: newInternalStore } : {}),\r\n latestRemoteUpdateTimestamp: newLastUpdateTimestamp,\r\n latestLocalUpdateTimestamp:\r\n isRefetchAll && newInternalStore.length > 0\r\n ? receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, newLastUpdateTimestamp)\r\n : drawingsInternalStore.latestLocalUpdateTimestamp,\r\n })\r\n\r\n if (updatedElementIds.length > 0 || isRefetchAll) {\r\n saveLatestChanges(0)\r\n const allElements = chartLayout.getAllElements()\r\n updatedElementIds.forEach((elementId) => {\r\n const element = allElements.find((element) => element.elementId === elementId)\r\n\r\n if (element && element.isDrawing() && !element.hasOngoingInteraction()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n\r\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n paneModel.normalizeZIndexes()\r\n })\r\n\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage) {\r\n const activeTicker = chartLayout.activeChart?.getQuoteRawTicker() ?? ''\r\n handleIdeaNoteChange(getTickerNoteText({ ticker: activeTicker, elements: newInternalStore }))\r\n }\r\n }\r\n },\r\n [\r\n chartLayout,\r\n drawingsInternalStore,\r\n syncChartLayoutDrawings,\r\n fetchDrawings,\r\n handleIdeaNoteChange,\r\n saveLatestChanges,\r\n ]\r\n )\r\n\r\n const updateInternalStoreWithElement = React.useCallback(\r\n (element: Element, changeType: AutoSaveChangeType) => {\r\n const updateResult = updateInternalStoreWithChangedElement({\r\n element,\r\n changeType,\r\n currentInternalStore: drawingsInternalStore.elements,\r\n lastUpdateTimestamp: incrementHlc(\r\n receiveHlc(\r\n drawingsInternalStore.latestLocalUpdateTimestamp,\r\n drawingsInternalStore.latestRemoteUpdateTimestamp\r\n ),\r\n Date.now()\r\n ),\r\n })\r\n\r\n if (updateResult) {\r\n const { shouldSyncAndSave, newInternalStore, newDrawing } = updateResult\r\n if (shouldSyncAndSave) {\r\n drawingsInternalStore.updateAttributes({ elements: newInternalStore })\r\n syncChartLayoutDrawings(newDrawing)\r\n }\r\n }\r\n },\r\n [syncChartLayoutDrawings, drawingsInternalStore]\r\n )\r\n\r\n const deleteAllAutoSavedElements = React.useCallback(async () => {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n\r\n await deleteAllDrawings({ tickers, lastLocalChange: drawingsInternalStore.latestLocalUpdateTimestamp })\r\n await checkDrawingUpdate()\r\n }, [chartLayout, deleteAllDrawings, drawingsInternalStore, checkDrawingUpdate])\r\n\r\n const onElementChange = React.useCallback(\r\n (element: Element, _?: any, options?: DrawingSpineOptions) => {\r\n const elementPane = element.pane()\r\n // This may happen if pane had been removed already, in most cases \"element.destroyed\" should be true,\r\n // but we would need to check if it was destroyed by delete drawing action or not, and checking if pane exists covers all cases\r\n if (!element.isDrawing() || element.instance.isCreator || !elementPane) {\r\n return\r\n }\r\n const elementContainerType = getContainerType(elementPane)\r\n const elementPaneTicker = elementPane.getQuoteRawTicker()\r\n const isElementInCurrentChartLayout = chartLayout\r\n .getAllPanes()\r\n .some(\r\n (model) => getContainerType(model) === elementContainerType && model.getQuoteRawTicker() === elementPaneTicker\r\n )\r\n if (isElementInCurrentChartLayout) {\r\n const isRemove = options?.eventType === DrawingSpineOptionsEvent.Remove\r\n updateInternalStoreWithElement(element, isRemove ? 'destroy' : 'update')\r\n }\r\n },\r\n [updateInternalStoreWithElement, chartLayout]\r\n )\r\n\r\n return {\r\n drawingsInternalStore,\r\n onElementChange,\r\n handleIdeaNoteChange,\r\n deleteAllAutoSavedElements,\r\n isAutoSaveActive,\r\n handleAutoSaveNoteChange,\r\n syncChartLayoutDrawings,\r\n saveLatestChanges,\r\n checkDrawingUpdate,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\r\n\r\nexport function useIsAutoSaveActive(chartLayout: ChartLayout) {\r\n const chartLayoutModel = useModelState(chartLayout, {\r\n watchProperties: ['isInit', 'isPreserveDrawingsActive', 'idea'],\r\n })\r\n const { idea, isInit, isPreserveDrawingsActive } = chartLayoutModel\r\n return React.useMemo(\r\n () =>\r\n getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel) && isPreserveDrawingsActive && !!isInit && !idea?.id,\r\n [isPreserveDrawingsActive, isInit, idea?.id, chartLayoutModel]\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { CustomSpineEvents } from '../../../types/shared'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport Element from '../../models/element'\r\nimport { usePrevious } from '../../utils/use-prev-state'\r\nimport { DRAWINGS_UPDATE_INTERVAL_MS } from './constants'\r\nimport { useDrawingAutoSaveControls } from './use-drawing-auto-save-controls'\r\nimport { getTickersAndContainerTypesInLayoutModel } from './utils'\r\n\r\nfunction useDrawingAutoSave(chartLayout: ChartLayout) {\r\n const {\r\n onElementChange,\r\n deleteAllAutoSavedElements,\r\n checkDrawingUpdate,\r\n syncChartLayoutDrawings,\r\n saveLatestChanges,\r\n isAutoSaveActive,\r\n } = useDrawingAutoSaveControls(chartLayout)\r\n\r\n const drawingsInternalStoreUnwatched = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\r\n const drawingsInternalStore = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['elements'] })\r\n const prevIsAutoSaveActive = usePrevious(isAutoSaveActive)\r\n\r\n const runInitialSaveAndRefetchUpdate = React.useCallback(async () => {\r\n chartLayout.getAllElements().forEach((element) => {\r\n // Adds drawings to internal store if isAutoSaveActive and they are not in the store yet\r\n if (!drawingsInternalStore.elements.some((drawing) => drawing.elementId === element.elementId)) {\r\n onElementChange(element)\r\n }\r\n })\r\n\r\n // We want to save everything except notes because saving notes can overwrite those already saved in db. Each drawing has different id but there is only one note per ticker\r\n // Notes are merged in checkDrawingUpdate fn\r\n await saveLatestChanges(0, (item) => item.containerType !== 'note')\r\n\r\n checkDrawingUpdate(true)\r\n }, [checkDrawingUpdate, chartLayout, onElementChange, drawingsInternalStore.elements, saveLatestChanges])\r\n\r\n React.useEffect(() => {\r\n if (isAutoSaveActive) {\r\n saveLatestChanges()\r\n }\r\n }, [saveLatestChanges, drawingsInternalStore.elements, isAutoSaveActive])\r\n\r\n React.useEffect(() => {\r\n if (!isAutoSaveActive) {\r\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Off)\r\n return\r\n }\r\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Saved)\r\n if (!prevIsAutoSaveActive && isAutoSaveActive) {\r\n runInitialSaveAndRefetchUpdate()\r\n }\r\n\r\n let { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n\r\n const onChartOrIndicatorChange = () => {\r\n const { tickers: newTickers, containerTypes: newContainerTypes } =\r\n getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n if (\r\n JSON.stringify(tickers) !== JSON.stringify(newTickers) ||\r\n JSON.stringify(containerTypes) !== JSON.stringify(newContainerTypes)\r\n ) {\r\n tickers = newTickers\r\n containerTypes = newContainerTypes\r\n checkDrawingUpdate(true)\r\n }\r\n }\r\n\r\n ChartModel.bind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\r\n Element.bind('change', onElementChange)\r\n\r\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\r\n const checkDrawingUpdateInterval = setInterval(checkDrawingUpdate, DRAWINGS_UPDATE_INTERVAL_MS)\r\n\r\n const unregisterListeners = () => {\r\n clearInterval(checkDrawingUpdateInterval)\r\n ChartModel.unbind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\r\n Element.unbind('change', onElementChange)\r\n }\r\n\r\n ChartLayout.bind('change', (model: ChartLayout) => {\r\n if (model.willDestroy) {\r\n unregisterListeners()\r\n }\r\n })\r\n\r\n return unregisterListeners\r\n }, [\r\n chartLayout,\r\n drawingsInternalStore,\r\n checkDrawingUpdate,\r\n onElementChange,\r\n syncChartLayoutDrawings,\r\n isAutoSaveActive,\r\n prevIsAutoSaveActive,\r\n runInitialSaveAndRefetchUpdate,\r\n ])\r\n\r\n return { deleteAllAutoSavedElements, isAutoSaveActive }\r\n}\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport const withDrawingsAutoSave = (Component: any) => (props: Props) => {\r\n const { deleteAllAutoSavedElements, isAutoSaveActive } = useDrawingAutoSave(props.chartLayoutModel)\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nexport function usePrevious(value: any) {\r\n const ref = React.useRef()\r\n React.useEffect(() => {\r\n ref.current = value\r\n }, [value])\r\n return ref.current\r\n}\r\n","import { ButtonComponentProps, Icon, Select, SelectListProps } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useChartTypes } from './use-chart-types'\r\n\r\ninterface Props extends Pick {\r\n isPremium: boolean\r\n model: ChartLayout\r\n rounding: SelectListProps['rounding']\r\n}\r\n\r\nexport function ChartTypesSelect({ isPremium, model, ...props }: Props) {\r\n const { chartTypes, getCurrentType } = useChartTypes({ isPremium, model })\r\n const currentType = getCurrentType()\r\n const [selectedType, setSelectedType] = React.useState(currentType)\r\n const icon = chartTypes.find((item) => item.value === selectedType)?.icon\r\n\r\n React.useEffect(() => {\r\n setSelectedType(currentType)\r\n }, [currentType])\r\n\r\n return (\r\n item.value === selectedType)?.icon} className=\"text-gray-300\" />\r\n )\r\n }\r\n nativeSelect=\"mobile\"\r\n onChange={(item) => setSelectedType(item.value)}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport {\r\n DEFAULT_TYPES,\r\n FREE_TYPES_QUOTE,\r\n FREE_TYPES_QUOTE_VALUES,\r\n QuoteLongToShortType,\r\n QuoteNodeChartTypes,\r\n QuoteShortToLongType,\r\n QuoteUrlChartTypes,\r\n TypeBaseOption,\r\n} from './utils'\r\n\r\nexport function useChartTypes({ isPremium, model }: { isPremium: boolean; model: ChartLayout }) {\r\n const location = useLocation()\r\n const { b, t, ta, ty, p = 'd', r } = decodeQueryString(location.search)\r\n const taInt = ta ? Number.parseInt(ta) : 1\r\n const isQuotePage = model.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n\r\n const getCurrentType = React.useCallback(() => {\r\n const defaultType =\r\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\r\n (window.FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\r\n\r\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\r\n ? QuoteNodeChartTypes.candlesticksimple\r\n : defaultType\r\n }, [isPremium, taInt, ty])\r\n\r\n const generateRouterPath = React.useCallback(\r\n (type: QuoteNodeChartTypes) => {\r\n if (isPremium || FREE_TYPES_QUOTE_VALUES.includes(type)) {\r\n return `${location.pathname}?${encodeQueryString({\r\n b,\r\n t,\r\n r,\r\n ty:\r\n type === QuoteNodeChartTypes.candlesticksimple\r\n ? QuoteLongToShortType.candlestick\r\n : QuoteLongToShortType[type],\r\n ta: type === QuoteNodeChartTypes.candlestick ? '1' : '0',\r\n p,\r\n })}`\r\n }\r\n return `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: 'quote-chart-type-select',\r\n })}`\r\n },\r\n [isPremium, location.pathname, b, t, r, p]\r\n )\r\n\r\n const chartTypes = React.useMemo(() => {\r\n const options = isPremium || !isQuotePage ? DEFAULT_TYPES : FREE_TYPES_QUOTE\r\n\r\n return options.map((item) => ({\r\n ...item,\r\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\r\n reloadDocument: !isPremium,\r\n })) as TypeBaseOption[]\r\n }, [generateRouterPath, isPremium, isQuotePage])\r\n\r\n return { getCurrentType, chartTypes }\r\n}\r\n","import { Paragraph, withSuspense } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport math from '../../helpers/math'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { getTickerChange } from '../../utils/chart'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\n\r\ninterface Props {\r\n chartIndex: number\r\n}\r\n\r\ninterface ChangeLabelProps {\r\n children: React.ReactNode\r\n changePoints: number\r\n isTiny: boolean\r\n}\r\n\r\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\r\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, ...Object.values(QuoteFetchType)]\r\n\r\nfunction ChangeLabel({ children, changePoints, isTiny }: ChangeLabelProps) {\r\n return (\r\n 0,\r\n 'text-red-400': changePoints < 0,\r\n })}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport function DailyChangeDisplayComponent({ chartIndex }: Props) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModel = useModelState(chartLayoutModel?.getAllCharts()[chartIndex] ?? null, {\r\n watchProperties: ['quote'],\r\n listenOnEvents: CHANGE_UPATE_EVENTS,\r\n })\r\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\r\n watchProperties: ['lastClose', 'prevClose', 'afterClose'],\r\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\r\n })\r\n\r\n const tickerChange = quoteModel && getTickerChange({ data: quoteModel })\r\n const isTiny =\r\n !!tickerChange?.tickerChange &&\r\n math.getInstrumentDecimalPlaces({\r\n instrument: quoteModel!.instrument,\r\n value: quoteModel!.lastClose,\r\n }) >= 6\r\n\r\n return (\r\n

\r\n {tickerChange?.tickerChange && (\r\n <>\r\n {tickerChange.tickerAfterChange && (\r\n \r\n {tickerChange.tickerAfterChange.string}\r\n \r\n )}\r\n \r\n {tickerChange.tickerChange.string}\r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport const DailyChangeDisplay = React.memo(\r\n withSuspense(DailyChangeDisplayComponent),\r\n (prevProps, nextProps) => prevProps.chartIndex === nextProps.chartIndex\r\n)\r\n","import { Button, ButtonComponentProps, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport utils from '../../utils'\r\nimport { DRAWING_COOKIE_NAME, getIsDrawingEnabled } from '../../utils/chart'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-draw-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive-chart',\r\n [SpecificChartFunctionality.forexPage]: 'forex-interactive-chart',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive-chart',\r\n}\r\n\r\nconst testId: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-toggle-draw-btn',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive',\r\n [SpecificChartFunctionality.forexPage]: 'forex-interactive',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive',\r\n}\r\n\r\ninterface DrawButtonProps extends Pick {\r\n isPremium: boolean\r\n specificChartFunctionality: SpecificChartFunctionality\r\n active?: boolean\r\n}\r\n\r\nexport function DrawButton({\r\n isPremium,\r\n specificChartFunctionality,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const buttonProps = React.useMemo(() => {\r\n if (!isPremium) {\r\n return {\r\n as: 'a' as const,\r\n href: `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[specificChartFunctionality],\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n const newValue = getIsDrawingEnabled() ? 'off' : 'on'\r\n\r\n setCookieRequest(DRAWING_COOKIE_NAME, newValue)\r\n .catch(() => {\r\n // fallback to JS otherwise draw toggle won't work if API don't work\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n utils.setCookie(DRAWING_COOKIE_NAME, newValue, expires)\r\n })\r\n .finally(() => {\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n },\r\n }\r\n }, [isPremium, specificChartFunctionality])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, ButtonComponentProps } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nfunction getTickersString(tickers: string[], tickersCount: number) {\r\n return Array.from({ length: Math.min(tickersCount, 6) })\r\n .map((_, index) => tickers[index] ?? tickers[tickers.length - 1])\r\n .join(',')\r\n}\r\n\r\nfunction getLayoutType(tickersCount: number) {\r\n switch (tickersCount) {\r\n case 0: // shouldn't happen\r\n case 1:\r\n return '1h1v'\r\n case 2:\r\n return '2h1v'\r\n case 3:\r\n return '3h1v'\r\n case 4:\r\n return '2h2v'\r\n case 5:\r\n default:\r\n // 6 and more\r\n return '3h2v'\r\n }\r\n}\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-fullscreen-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-fullscreen-button',\r\n [SpecificChartFunctionality.forexPage]: 'forex-fullscreen-button',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-fullscreen-button',\r\n}\r\n\r\ninterface FullscreenButtonProps extends Pick {\r\n model: ChartLayout\r\n isPremium: boolean\r\n title?: string\r\n}\r\n\r\nexport function FullscreenButton({ model, isPremium, ...props }: React.PropsWithChildren) {\r\n const location = useLocation()\r\n const { i, p = 'd', r } = decodeQueryString(location.search)\r\n const urlTickers = model\r\n .charts()\r\n .all()\r\n .map((chart) => chart.quote().getRawTicker())\r\n\r\n return (\r\n p).join(','),\r\n l: getLayoutType(urlTickers.length),\r\n r,\r\n })}`\r\n : `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[model.specificChartFunctionality],\r\n })}`\r\n }\r\n />\r\n )\r\n}\r\n","import {\r\n Button,\r\n Dialog,\r\n Dropdown,\r\n DropdownItem,\r\n Icon,\r\n Spinner,\r\n Search as WebsiteSearchComponent,\r\n createAlertAsyncModule,\r\n saveToPortfolioAsyncModule,\r\n useDialogState,\r\n useDropdownState,\r\n} from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface SearchProps {\r\n ticker: string\r\n instrument: Instrument\r\n onTickerSelected: (ticker: string) => void\r\n chartIndex: number\r\n}\r\n\r\nexport default function Search({ ticker, instrument, onTickerSelected, chartIndex }: SearchProps) {\r\n const dropdownState = useDropdownState({ placement: 'bottom-end' })\r\n const saveToPortfolioDialogState = useDialogState()\r\n const isSaveToPortfolioVisible = saveToPortfolioDialogState.useState('open')\r\n const createAlertDialogState = useDialogState()\r\n const isCreateAlertVisible = createAlertDialogState.useState('open')\r\n const [saveToPortfolioModule, { isLoading: isLoadingSaveToPortfolio }] = useAsyncModule({\r\n ...saveToPortfolioAsyncModule,\r\n shouldLoadModule: isSaveToPortfolioVisible,\r\n onError: () => saveToPortfolioDialogState.hide(),\r\n })\r\n const [createAlertModule, { isLoading: isLoadingCreateAlert }] = useAsyncModule({\r\n ...createAlertAsyncModule,\r\n shouldLoadModule: isCreateAlertVisible,\r\n onError: () => createAlertDialogState.hide(),\r\n })\r\n const SaveToPortfolio = saveToPortfolioModule?.SaveToPortfolio\r\n const CreateAlert = createAlertModule?.CreateAlert\r\n\r\n const detailLink = React.useMemo(() => {\r\n const formattedTicker = ticker.replace('@', '')\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return `/quote.ashx?t=${formattedTicker}`\r\n case Instrument.Futures:\r\n return `/futures_charts.ashx?t=${formattedTicker}`\r\n case Instrument.Forex:\r\n return `/forex_charts.ashx?t=${formattedTicker}`\r\n case Instrument.Crypto:\r\n return `/crypto_charts.ashx?t=${formattedTicker}`\r\n }\r\n }, [ticker, instrument])\r\n\r\n return (\r\n
\r\n }\r\n />\r\n }\r\n >\r\n {\r\n window.gtag?.('event', 'click', { event_category: 'open-stock-detail' })\r\n }}\r\n >\r\n {instrument === Instrument.Stock ? 'Open Stock Detail' : 'Open Detail'}\r\n \r\n {instrument === Instrument.Stock && (\r\n {\r\n saveToPortfolioDialogState.show()\r\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\r\n }}\r\n >\r\n Save to Portfolio\r\n \r\n )}\r\n {instrument === Instrument.Stock && (\r\n {\r\n createAlertDialogState.show()\r\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\r\n }}\r\n >\r\n Create Alert\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n {isLoadingSaveToPortfolio && (\r\n
\r\n \r\n
\r\n )}\r\n {SaveToPortfolio && }\r\n
\r\n \r\n {isLoadingCreateAlert && (\r\n
\r\n \r\n
\r\n )}\r\n {CreateAlert && }\r\n
\r\n
\r\n )\r\n}\r\n","import {\r\n ButtonRoundingType,\r\n ButtonSizeType,\r\n CustomDateRange,\r\n Heading,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { IdeasDropdown } from '../header/ideas_dropdown'\r\nimport { Publish } from '../header/publish'\r\nimport { TourButton } from '../header/tour_button'\r\nimport { ChartTypesSelect } from './chart-type-select'\r\nimport { DailyChangeDisplay } from './daily-change-display'\r\nimport { DrawButton } from './draw-button'\r\nimport { FullscreenButton } from './fullscreen-button'\r\nimport Search from './search'\r\nimport { ChartSettingsButton } from './settings-button'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\ninterface SettingsComponentProps {\r\n chartModel: Chart\r\n chartIndex: number\r\n}\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\r\n\r\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\r\n const rounding: ButtonRoundingType | undefined = hasRedesignEnabled ? undefined : 'none'\r\n // This memo is required for publish, otherwise it ends up in a loop\r\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'quote', 'dateRange'],\r\n })\r\n const { instrument } = chartModel?.quote() || {}\r\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n\r\n const navigate = useNavigate()\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: true,\r\n })\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const handleTickerSelect = React.useCallback(\r\n (ticker: string) => {\r\n const upperCaseTicker = ticker.toUpperCase()\r\n\r\n navigate(\r\n generateChartLayoutRouterPath({\r\n ticker: upperCaseTicker,\r\n timeframe: chartModel.timeframe,\r\n dateRange: chartModel.dateRange,\r\n })\r\n )\r\n },\r\n [chartModel, generateChartLayoutRouterPath, navigate]\r\n )\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n const timeframeBarProps = React.useMemo(\r\n () => ({\r\n size: 'medium' as ButtonSizeType,\r\n chartIndex: chartIndex,\r\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\r\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\r\n selectedTimeframe: chartModel.timeframe,\r\n onTimeframeSelect: () => {},\r\n selectedDateRange: chartModel.dateRange,\r\n favoriteTimeframes: favoriteTimeframes,\r\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\r\n onDateRangeSelect: handleDateRangeSelect,\r\n onCustomDateRangeClick: () => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n },\r\n isFavoritesEnabled: isPremium,\r\n onFavoriteTimeframeToggle: ({ value }: { value: TIMEFRAME | 'intraday' }) => {\r\n toggleFavoriteTimeframe(value)\r\n },\r\n }),\r\n [\r\n chartIndex,\r\n chartModel.dateRange,\r\n chartModel.timeframe,\r\n customDateRangeDialogState,\r\n dateRangeGroupsWithHref,\r\n favoriteTimeframes,\r\n handleDateRangeSelect,\r\n instrument,\r\n isLoading,\r\n timeframeGroupsWithHref,\r\n toggleFavoriteTimeframe,\r\n ]\r\n )\r\n\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n return (\r\n
\r\n {chartModel.chart_layout().canChangeTicker && (\r\n \r\n )}\r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n )\r\n }\r\n\r\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\r\n\r\n return (\r\n \r\n
\r\n {!isQuotePage && (\r\n \r\n {chartModel.quote().name ?? chartModel.ticker}\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.tools) && (\r\n \r\n Draw\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.ideas) && (\r\n \r\n Ideas\r\n \r\n )}\r\n {!hasTimeframe && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n\r\n {hasTimeframe && (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )}\r\n\r\n
\r\n {chartLayout.editors.includes(ChartEditorEnum.publish) && (\r\n \r\n Share\r\n \r\n )}\r\n {isQuotePage && (\r\n \r\n )}\r\n \r\n {!isQuotePage && 'Fullscreen'}\r\n \r\n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\r\n \r\n {!isQuotePage && 'Settings'}\r\n \r\n )}\r\n {!isQuotePage && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { ContextMenuItem } from '@finviz/website'\r\n\r\nclass ContextMenu extends Spine.Model {\r\n static initClass() {\r\n this.configure('ContextMenu', 'shown', 'config', 'top', 'left')\r\n }\r\n\r\n declare shown: boolean\r\n declare config: ContextMenuItem[]\r\n declare top: number\r\n declare left: number\r\n}\r\n\r\nContextMenu.initClass()\r\n\r\nconst contextMenu = ContextMenu.create() as ContextMenu\r\ncontextMenu.save()\r\n\r\nexport default contextMenu\r\n","import { ContextMenu as ContextMenuComponent } from '@finviz/website'\r\nimport React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport model from '../models/context_menu'\r\nimport { ready } from '../utils'\r\n\r\nconst selector = '.context-menu'\r\n\r\nclass ContextMenu extends React.Component {\r\n componentDidMount() {\r\n model.bind('update', this.update)\r\n }\r\n\r\n componentWillUnmount() {\r\n model.unbind('update', this.update)\r\n }\r\n\r\n update = () => {\r\n this.forceUpdate()\r\n }\r\n\r\n render() {\r\n if (model.shown) {\r\n document.querySelector(selector)?.classList.remove('hidden')\r\n } else {\r\n document.querySelector(selector)?.classList.add('hidden')\r\n return null\r\n }\r\n\r\n return (\r\n <>\r\n this.hide()}\r\n onContextMenu={(e) => e.preventDefault()}\r\n data-testid=\"charts-context-menu-overlay\"\r\n >\r\n \r\n \r\n )\r\n }\r\n\r\n hide() {\r\n model.updateAttribute('shown', false)\r\n }\r\n}\r\nready(() => {\r\n const el = document.querySelector(selector)\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n})\r\n\r\nconst contextMenuControl = {\r\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash) => {\r\n model.updateAttributes({\r\n shown: true,\r\n config: config,\r\n top: event.clientY + window.pageYOffset,\r\n left: event.clientX,\r\n })\r\n },\r\n}\r\n\r\nexport default contextMenuControl\r\n","import {\r\n AriakitPortal,\r\n Delayed,\r\n DialogBody,\r\n Popover,\r\n PopoverAnchor,\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 { chartEventsAsyncModule } from '../../controllers/chart-events/async-modules'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { useClickAway } from '../../utils/use-click-away'\r\n\r\ninterface ChartEventPopoverWithStateProps {\r\n chartModel: ChartModel\r\n}\r\n\r\nexport function ChartEventPopoverWithState({ chartModel }: ChartEventPopoverWithStateProps) {\r\n const unwatchedChartLayout = React.useMemo(() => chartModel.chart_layout() ?? null, [chartModel])\r\n const { activeChartEvent, theme } = useModelState(unwatchedChartLayout, { watchProperties: ['activeChartEvent'] })\r\n const popoverState = usePopoverState({ placement: 'top' })\r\n const 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 }, !!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 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 \r\n \r\n {chartEventsModule ? (\r\n \r\n ) : (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport Utils from '../utils'\r\n\r\nexport function useClickAway(callback: (event: MouseEvent | TouchEvent) => void, isListening = true) {\r\n const ref = React.useRef(null)\r\n const refCallback = React.useRef(callback)\r\n\r\n React.useLayoutEffect(() => {\r\n refCallback.current = callback\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isListening) {\r\n return\r\n }\r\n const isMobile = Utils.isMobile()\r\n const handler = (e: MouseEvent | TouchEvent) => {\r\n const element = ref.current\r\n if (element && e.target && !element.contains(e.target as HTMLElement)) {\r\n refCallback.current(e)\r\n }\r\n }\r\n\r\n document.addEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\r\n\r\n return () => {\r\n document.removeEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\r\n }\r\n }, [callback, isListening])\r\n\r\n return ref\r\n}\r\n","import { Button, ButtonGroup, Delayed, Icon, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { useIsMounted } from '../../utils/use-is-mounted'\r\n\r\ninterface LoadLatestDataButtonProps {\r\n chartModel: Chart\r\n}\r\n\r\nexport function LoadLatestDataButton({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\r\n const getIsMounted = useIsMounted()\r\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\r\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['isFetching'] })\r\n const [hasNewDataAvailable, setHasNewDataAvailable] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!chartModel.getRefreshInterval()) {\r\n // We will do a check here if we have correct new data\r\n chartModel\r\n .quote()\r\n .isPossibleToFetchSequentialData()\r\n .then((hasNewData) => {\r\n if (getIsMounted()) {\r\n setHasNewDataAvailable(hasNewData)\r\n }\r\n })\r\n }\r\n // We need to run it only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleLoadLatestData = async () => {\r\n const promises = chartModel\r\n .getAllQuotes()\r\n .map(async (quote) => quote.fetchData({ fetchType: QuoteFetchType.NewerData }))\r\n chartModel.updateAttributes({ refreshData: true })\r\n await Promise.all(promises)\r\n if (getIsMounted()) {\r\n setHasNewDataAvailable(false)\r\n window.gtag?.('event', 'load-latest-data', { event_category: 'ideas' })\r\n }\r\n }\r\n\r\n if (!hasNewDataAvailable) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n }>\r\n \r\n \r\n ) : (\r\n 'refresh'\r\n )\r\n }\r\n disabled={quoteModel?.isFetching}\r\n title=\"Load latest data\"\r\n onClick={handleLoadLatestData}\r\n data-testid=\"load-latest-data-button\"\r\n >\r\n Load latest data\r\n \r\n \r\n )\r\n}\r\n","// Copy if this file is in Website repo in Website/js/main/hooks/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import { Button, ButtonGroup, ButtonSizeType, Icon } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport Utils from '../../utils'\r\nimport { getLeftOffset } from '../renderUtils'\r\nimport { LoadLatestDataButton } from './load-latest-data-button'\r\n\r\nexport const ZOOM_CONTROLS_ACTIVE_CLASS = 'is-active'\r\nexport const ZOOM_CONTROLS_IS_IN_AREA_CLASS = 'is-in-area'\r\n\r\nconst buttonCommonProps: { size: ButtonSizeType; className: string; contentClass: string } = {\r\n size: 'none',\r\n className: 'w-7 h-6',\r\n contentClass: 'flex justify-center',\r\n}\r\n\r\nconst isMobile = Utils.isMobile()\r\n\r\ninterface ZoomControlsProps {\r\n zoomControlsRef: React.RefObject\r\n isVisible: boolean\r\n chartModel: Chart\r\n onZoomIn: () => void\r\n onZoomOut: () => void\r\n onZoomReset: () => void\r\n}\r\n\r\nconst getDefaultLeftOffset = (chartModel: Chart) =>\r\n getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel,\r\n config: {},\r\n })\r\n\r\nexport function ZoomControls({\r\n zoomControlsRef,\r\n chartModel,\r\n isVisible,\r\n onZoomIn,\r\n onZoomOut,\r\n onZoomReset,\r\n}: ZoomControlsProps) {\r\n const chartLayoutModel = useModelState(chartModel.chart_layout(), { watchProperties: ['idea'] })\r\n const [isGoToRecentVisible, setIsGoToRecentVisible] = React.useState(false)\r\n const { defaultZoomFactor } = chartLayoutModel\r\n const [isZoomResetVisible, setIsZoomResetVisible] = React.useState(chartModel.zoomFactor !== defaultZoomFactor)\r\n const handleGoToMostRecent = React.useCallback(() => {\r\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\r\n }, [chartModel])\r\n\r\n React.useEffect(() => {\r\n const handleChartModelChangeDebounced = debounce(\r\n () => {\r\n setIsZoomResetVisible(chartModel.zoomFactor !== defaultZoomFactor)\r\n setIsGoToRecentVisible(chartModel.leftOffset !== getDefaultLeftOffset(chartModel))\r\n },\r\n 100,\r\n { maxWait: 333 }\r\n )\r\n chartModel.bind('change', handleChartModelChangeDebounced)\r\n return () => {\r\n handleChartModelChangeDebounced.cancel()\r\n chartModel.unbind('change', handleChartModelChangeDebounced)\r\n }\r\n }, [defaultZoomFactor, chartModel])\r\n\r\n return (\r\n \r\n {!isMobile && (\r\n
\r\n {isZoomResetVisible && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n )}\r\n\r\n
\r\n {!!chartLayoutModel.idea?.id && }\r\n\r\n {isGoToRecentVisible && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { Button, Notification, NotificationContextType, Paragraph, withNotificationContext } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { CustomSpineEvents, DrawingSpineOptionsEvent, EmptyObject, ObjectHash, PaneArea } from '../../../types/shared'\r\nimport CanvasElement from '../../canvas/element'\r\nimport ChartEvent from '../../chart-events/chart-event'\r\nimport { IndicatorType, ScaleType, SetVisibilityTo, SpecificChartFunctionality } from '../../constants/common'\r\nimport IndicatorElement from '../../indicators/indicator'\r\nimport { withElementStyleDialogState } from '../../modals/element_style'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartEventElement from '../../models/chart-event-element'\r\nimport ElementModel from '../../models/element'\r\nimport MouseModel from '../../models/mouse'\r\nimport PaneModel from '../../models/pane'\r\nimport Quote from '../../models/quote'\r\nimport { handleRemoveIndicatorPane } from '../../models/utils'\r\nimport Utils, { isRedesignedPage } from '../../utils'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport { getBarWidthWithMargin, unmountCanvas } from '../../utils/chart'\r\nimport { setElementCursor } from '../../utils/cursor'\r\nimport { getValueInRange, isPrimaryClick } from '../../utils/helpers'\r\nimport { getInitialStoreDrawings } from '../autosave/utils'\r\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from '../chart_layout/constants'\r\nimport ContextMenu from '../context_menu'\r\nimport { getMinMaxLeftOffset, getSettings, recountScale, renderPane } from '../renderUtils'\r\nimport { DrawingTool } from '../toolbar/interfaces'\r\nimport { getChartAlt } from '../utils'\r\nimport { ChartEventPopoverWithState } from './chart-event-popover-with-state'\r\nimport { withPaneModel } from './with-pane-model'\r\nimport { ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS, ZoomControls } from './zoom_controls'\r\n\r\n// Indicates how many time lower/higher can new scale be compared to original one\r\nconst ALLOWED_MIN_MAX_ZOOM = 10000\r\n\r\ninterface PaneProps {\r\n model: PaneModel\r\n chartModel: ChartModel\r\n activeTool: DrawingTool\r\n activeChartInteraction: string | null\r\n chartIndex: number\r\n paneIndex: number\r\n touchEventsDisabled: boolean\r\n onPaneClick?: (model: PaneModel) => void\r\n onZoomerReset: () => void\r\n onZoomerMouseDown: React.MouseEventHandler\r\n onZoomerTouchStart: React.TouchEventHandler\r\n onAddToZoomFactor: (data: { diff: number; shouldCalculateRightAlign: boolean }) => void\r\n onResizerMouseDown: (e: React.MouseEvent, model: PaneModel) => void\r\n onPaneDestroy: (paneId: string) => void\r\n setActiveChartInteraction: (value: string | null) => void\r\n openElementStyleDialog?: (element: CanvasElement | IndicatorElement) => void\r\n notificationContext: NotificationContextType\r\n}\r\n\r\ninterface PaneState {\r\n hasSeenCrossNotification: boolean\r\n}\r\n\r\nfunction toggleE2eRenderInProgress({ id, isInProgress }: { id: number; isInProgress: boolean }) {\r\n if (process.env.IS_E2E_TESTING) {\r\n window.rendersInProgress = window.rendersInProgress ?? []\r\n\r\n if (isInProgress) {\r\n window.isRenderInProgress = true\r\n window.rendersInProgress.push(id)\r\n } else {\r\n window.rendersInProgress = window.rendersInProgress.filter((progressId) => id !== progressId)\r\n\r\n if (window.rendersInProgress.length === 0) {\r\n window.isRenderInProgress = Date.now()\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass Pane extends React.Component {\r\n rafId?: number | null = null\r\n crossRafId?: number | null = null\r\n quoteModel: Quote\r\n paneRef = React.createRef()\r\n scalerRef = React.createRef()\r\n zoomerRef = React.createRef()\r\n zoomControlsRef = React.createRef()\r\n canvasWrapperRef = React.createRef()\r\n canvasRef = React.createRef()\r\n crossCanvasRef = React.createRef()\r\n chartLayoutModel = this.props.chartModel.chart_layout()\r\n paneHammer!: HammerManager\r\n scalerHammer!: HammerManager\r\n zoomerHammer!: HammerManager\r\n canvasWrapperHammer!: HammerManager\r\n mouseDown = false\r\n lastClientX?: number\r\n lastClientY?: number\r\n currentViewRange: { min: number; max: number } | null = null\r\n lastX!: number\r\n lastY!: number\r\n lastActiveTool: DrawingTool\r\n scalerLastY: number | null = null\r\n isElementHovered = false\r\n hoveredElement: CanvasElement | null = null\r\n isMobile: boolean\r\n isDisableTouchCrossAvailable = true\r\n\r\n canvas: HTMLCanvasElement | null = null\r\n canvasCtx: CanvasRenderingContext2D | null = null\r\n crossCanvas: HTMLCanvasElement | null = null\r\n crossCanvasCtx: CanvasRenderingContext2D | null = null\r\n isIndicatorPane = false\r\n\r\n state: PaneState = {\r\n hasSeenCrossNotification: !!window.localStorage?.getItem('hasSeenCrossNotification'),\r\n }\r\n\r\n // expects chartModel, model, onResizerMouseDown, onPaneDestroy\r\n constructor(props: PaneProps) {\r\n super(props)\r\n\r\n this.quoteModel = this.props.chartModel.quote()\r\n props.model.updateAttribute('instance', this)\r\n props.model.bind('update', this.onModelUpdate)\r\n props.model\r\n .elements()\r\n .bind('create', this.onElementCreate)\r\n .bind('destroy', this.onElementDestroy)\r\n .bind('replace', this.onElementReplace)\r\n .bind('select', this.onElementSelect)\r\n .bind('makeClone', this.onElementClone)\r\n .bind('change', this.immediateRecountScaleOnChartIndicatorChange)\r\n .bind('change', debounce(this.recountScale, 50))\r\n props.model.bind(CustomSpineEvents.ManualChange, this.recountScale)\r\n\r\n props.model.chartEvents().bind('create', this.onElementCreate).bind('change', debounce(this.recountScale, 50))\r\n\r\n this.props.chartModel.bind('update', this.onChartUpdate)\r\n this.props.chartModel.bind(`change ${CustomSpineEvents.IndicatorsChange}`, this.recountScale)\r\n this.quoteModel.bind('change', this.recountScale)\r\n this.isMobile = !!Utils.isMobile()\r\n this.lastActiveTool = props.activeTool\r\n if (!MouseModel.pane()) {\r\n MouseModel.updateAttribute('pane', props.model)\r\n }\r\n this.isIndicatorPane = props.model.getIsIndicatorPane()\r\n this.recountScale()\r\n }\r\n\r\n componentDidMount() {\r\n const { model } = this.props\r\n this.chartLayoutModel.bind('theme', this.renderAll)\r\n this.chartLayoutModel.bind('theme', this.renderCross)\r\n\r\n const initialStoreDrawings = getInitialStoreDrawings() ?? []\r\n const elements = [...model.getAllElements(), ...model.getAllChartEvents(false)]\r\n elements.forEach((element) => {\r\n this.onElementCreate(element)\r\n if (element.isDrawing()) {\r\n const hasDrawingInInitialCache = initialStoreDrawings.some(({ elementId }) => element.elementId === elementId)\r\n if (hasDrawingInInitialCache) {\r\n element.instance?.updateScales()\r\n }\r\n element.instance.cachePointPositionTimestamp()\r\n } else if (element.isChartEvent()) {\r\n element.instance?.updateScales()\r\n }\r\n })\r\n\r\n model?.updateChartEventsZIndexes()\r\n\r\n this.canvas = this.canvasRef.current\r\n this.canvasCtx = getContextWithCache(this.canvasRef.current)\r\n this.crossCanvas = this.crossCanvasRef.current\r\n this.crossCanvasCtx = getContextWithCache(this.crossCanvasRef.current)\r\n\r\n this.paneHammer = new Hammer.Manager(this.paneRef.current!, { touchAction: 'none' })\r\n this.paneHammer.add(new Hammer.Press({ threshold: 5, time: 500 })) // chrome simulator \"long touch\" -> \"oncontextmenu\" is 680ms +- 2ms\r\n this.paneHammer.on('press', this.onPress)\r\n this.canvasWrapperHammer = new Hammer(this.canvasWrapperRef.current!, { touchAction: 'none' })\r\n this.canvasWrapperHammer.on('tap', this.onClick)\r\n this.canvasWrapperRef.current?.addEventListener('touchmove', this.onTouchMove, { passive: false })\r\n\r\n if (this.chartLayoutModel.scrollable || !this.isMobile) {\r\n if (this.scalerRef.current) {\r\n this.scalerHammer = new Hammer(this.scalerRef.current, { touchAction: 'none' })\r\n this.scalerHammer.on('doubletap', this.onScalerReset)\r\n }\r\n if (this.zoomerRef.current) {\r\n this.zoomerHammer = new Hammer(this.zoomerRef.current, { touchAction: 'none' })\r\n this.zoomerHammer.on('doubletap', this.props.onZoomerReset)\r\n }\r\n this.canvasWrapperHammer.on('doubletap', this.onDoubleClick)\r\n }\r\n\r\n this.onChartUpdate({ width: this.props.chartModel.width })\r\n this.onModelUpdate({ height: model.height })\r\n this.forceUpdate()\r\n this.chartLayoutModel.trigger(CHART_LAYOUT_CHILD_CHANGE_EVENT)\r\n }\r\n\r\n componentWillUnmount() {\r\n this.canvasWrapperRef.current?.removeEventListener('touchmove', this.onTouchMove)\r\n unmountCanvas(this.canvas)\r\n unmountCanvas(this.crossCanvas)\r\n this.props.chartModel.unbind('update', this.onChartUpdate)\r\n this.props.chartModel.unbind('change', this.recountScale)\r\n this.quoteModel.unbind('change', this.recountScale)\r\n }\r\n\r\n render() {\r\n const { activeTool, touchEventsDisabled, onPaneClick, paneIndex, chartIndex, model, chartModel } = this.props\r\n if (touchEventsDisabled) {\r\n this.paneHammer?.set({ touchAction: 'auto' })\r\n this.scalerHammer?.set({ touchAction: 'auto' })\r\n this.zoomerHammer?.set({ touchAction: 'auto' })\r\n this.canvasWrapperHammer?.set({ touchAction: 'auto' })\r\n } else {\r\n const touchAction = this.getIsHammerAllowScrollActive() ? 'auto' : 'none'\r\n this.scalerHammer?.set({ touchAction: 'none' })\r\n this.zoomerHammer?.set({ touchAction: 'none' })\r\n this.paneHammer?.set({ touchAction })\r\n this.canvasWrapperHammer?.set({ touchAction })\r\n }\r\n\r\n const isChartPane = model.getIsChartPane()\r\n\r\n return (\r\n onPaneClick?.(model)}\r\n onTouchStart={() => onPaneClick?.(model)}\r\n onContextMenu={this.onContextMenu}\r\n data-testid={`chart-${chartIndex}-pane-${paneIndex}`}\r\n >\r\n {isChartPane && }\r\n {paneIndex !== 0 && (\r\n this.props.onResizerMouseDown(e, model)}\r\n data-testid={`chart-${chartIndex}-pane-${paneIndex}-resizer`}\r\n />\r\n )}\r\n {this.chartLayoutModel.initialScrollable && (\r\n \r\n )}\r\n\r\n {this.chartLayoutModel.initialScrollable && isChartPane && (\r\n <>\r\n \r\n {\r\n this.props.onAddToZoomFactor({ diff: 0.1, shouldCalculateRightAlign: true })\r\n }}\r\n onZoomOut={() => {\r\n this.props.onAddToZoomFactor({ diff: -0.1, shouldCalculateRightAlign: true })\r\n }}\r\n onZoomReset={this.props.onZoomerReset}\r\n />\r\n \r\n )}\r\n \r\n {getChartAlt(this.quoteModel)}\r\n {this.chartLayoutModel.cross && }\r\n \r\n \r\n )\r\n }\r\n\r\n getIsHammerAllowScrollActive = () =>\r\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage &&\r\n !this.chartLayoutModel.isTouchCrossActive &&\r\n !this.chartLayoutModel.scrollable\r\n\r\n onElementCreate = (el: ElementModel | ChartEventElement) => {\r\n el.instance.bind('change', this.renderAll)\r\n this.renderAll()\r\n }\r\n\r\n onElementReplace = (el: ElementModel, oldElementInstance: CanvasElement) => {\r\n oldElementInstance.unbind('change', this.renderAll)\r\n el.instance.bind('change', this.renderAll)\r\n if (oldElementInstance === this.props.model.selection && !this.chartLayoutModel.isDrawingModeContinuousActive) {\r\n this.setSelection(el.instance)\r\n } else {\r\n this.setSelection(null)\r\n }\r\n this.renderAll()\r\n }\r\n\r\n onElementDestroy = (el: ElementModel) => {\r\n const { type } = el.instance\r\n el.instance.unbind('change', this.renderAll)\r\n if (el.instance === this.props.model.selection) {\r\n this.setSelection(null)\r\n }\r\n if (type.startsWith('charts/') || type.startsWith('indicators/')) {\r\n this.props.onPaneDestroy(el['pane_id'])\r\n }\r\n this.renderAll()\r\n }\r\n\r\n onElementSelect = (el: ElementModel) => {\r\n this.setSelectedElement(el.instance)\r\n }\r\n\r\n onElementClone = (_: unknown, clonedElementInstance: CanvasElement) => {\r\n this.setSelectedElement(clonedElementInstance)\r\n }\r\n\r\n onModelUpdate = ({ height }: { height: number }) => {\r\n this.setCanvasSize({\r\n width: this.props.chartModel.width,\r\n height,\r\n })\r\n }\r\n\r\n onChartUpdate = ({ width }: { width: number }) => {\r\n const { model, chartModel } = this.props\r\n this.setCanvasSize({\r\n width,\r\n height: model.height,\r\n })\r\n const quote = chartModel.quote()\r\n if (!this.quoteModel.eql(quote)) {\r\n this.quoteModel.unbind('change', this.recountScale)\r\n if (quote) {\r\n this.quoteModel = quote\r\n this.quoteModel.bind('change', this.recountScale)\r\n }\r\n }\r\n }\r\n\r\n onZoomerMouseMove: React.MouseEventHandler = (e) => {\r\n if (!this.chartLayoutModel.scrollable || (this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) return\r\n const area = this.getArea(e)\r\n MouseModel.updateAttributes({\r\n position: { x: area.x, y: null },\r\n pane: this.props.model,\r\n })\r\n }\r\n\r\n onMouseMoveOnScrolling = (event: TouchEvent | MouseEvent) => {\r\n if (this.props.activeChartInteraction) {\r\n return\r\n }\r\n\r\n let { clientX, clientY } = event as MouseEvent\r\n const { model } = this.props\r\n\r\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\r\n if (isTouch && event.targetTouches?.length > 0) {\r\n clientX = event.targetTouches[0].clientX\r\n clientY = event.targetTouches[0].clientY\r\n }\r\n if (!model.selection && !this.chartLayoutModel.activeChartEvent) {\r\n if (this.lastClientX != null) {\r\n const dif = this.lastClientX - clientX\r\n this.addToLeftOffset(-dif)\r\n }\r\n if (model.scaleRange && this.lastClientY != null) {\r\n let { min, max } = model.scaleRange\r\n let difY\r\n switch (this.props.chartModel.scale) {\r\n case ScaleType.Logarithmic: {\r\n difY = this.lastClientY - clientY\r\n min = model.scale.y.invert(model.scale.y(min) + difY)\r\n max = model.scale.y.invert(model.scale.y(max) + difY)\r\n break\r\n }\r\n default: {\r\n difY = (this.lastClientY - clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\r\n min -= difY\r\n max -= difY\r\n break\r\n }\r\n }\r\n\r\n model.updateAttribute('scaleRange', { min, max })\r\n this.recountScale()\r\n this.currentViewRange = this.props.model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\r\n }\r\n }\r\n this.lastClientX = clientX\r\n this.lastClientY = clientY\r\n }\r\n\r\n onScalerTouchStart: React.TouchEventHandler = (e) => {\r\n if (!this.chartLayoutModel.scrollable || this.props.touchEventsDisabled) return\r\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\r\n this.onScalerMouseDown(e.targetTouches[0])\r\n }\r\n }\r\n\r\n onScalerTouchMove = (e: TouchEvent) => {\r\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\r\n this.onScalerMouseMove(e.targetTouches[0])\r\n }\r\n }\r\n\r\n onScalerTouchEnd = () => {\r\n if (this.chartLayoutModel.scrollable) {\r\n this.onScalerMouseUp()\r\n }\r\n }\r\n\r\n onScalerMouseEnter = () => {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n }\r\n\r\n onScalerMouseDown = (event: React.MouseEvent | React.Touch) => {\r\n const { activeChartInteraction, setActiveChartInteraction, model } = this.props\r\n if ((event instanceof MouseEvent && event.button) || activeChartInteraction || !this.chartLayoutModel.scrollable) {\r\n return\r\n }\r\n setActiveChartInteraction('scaler')\r\n\r\n this.scalerLastY = event.clientY\r\n // here we need current domain scale or former \"nice\" value\r\n const [currentDomainMax, currentDomainMin] = model.scale.y.domain()\r\n this.currentViewRange = { min: currentDomainMin, max: currentDomainMax }\r\n document.addEventListener<'mousemove'>('mousemove', this.onScalerMouseMove)\r\n document.addEventListener('mouseup', this.onScalerMouseUp)\r\n document.addEventListener('touchmove', this.onScalerTouchMove)\r\n document.addEventListener('touchend', this.onScalerTouchEnd)\r\n }\r\n\r\n onScalerMouseMove = (event: MouseEvent | Touch) => {\r\n const { model, chartModel } = this.props\r\n if (model.scaleRange === null && this.currentViewRange === null) {\r\n return\r\n }\r\n let { min, max } = model.scaleRange || this.currentViewRange!\r\n let difY\r\n switch (this.props.chartModel.scale) {\r\n case ScaleType.Logarithmic: {\r\n difY = this.scalerLastY! - event.clientY\r\n min = model.scale.y.invert(model.scale.y(min) - difY)\r\n max = model.scale.y.invert(model.scale.y(max) + difY)\r\n break\r\n }\r\n default: {\r\n difY = -(this.scalerLastY! - event.clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\r\n min -= difY\r\n max += difY\r\n break\r\n }\r\n }\r\n this.scalerLastY = event.clientY\r\n\r\n const originalMinMax = model.getChartOrIndicatorElement()?.instance?.getMinMax?.()\r\n if (originalMinMax) {\r\n const currentDiff = Math.abs(max - min)\r\n const originalDiff = Math.abs(originalMinMax.max - originalMinMax.min)\r\n\r\n if (currentDiff > originalDiff * ALLOWED_MIN_MAX_ZOOM || currentDiff < originalDiff / ALLOWED_MIN_MAX_ZOOM) {\r\n return\r\n }\r\n }\r\n\r\n model.updateAttribute('scaleRange', { min, max })\r\n chartModel.updateAttribute('dateRange', null)\r\n this.recountScale()\r\n }\r\n\r\n onScalerMouseUp = () => {\r\n this.scalerLastY = null\r\n\r\n document.removeEventListener('mousemove', this.onScalerMouseMove)\r\n document.removeEventListener('mouseup', this.onScalerMouseUp)\r\n document.removeEventListener('touchmove', this.onScalerTouchMove)\r\n document.removeEventListener('touchend', this.onScalerTouchEnd)\r\n this.props.setActiveChartInteraction(null)\r\n }\r\n\r\n onScalerReset = () => {\r\n const { model, chartModel } = this.props\r\n if (!this.chartLayoutModel.scrollable) return\r\n chartModel.updateAttribute('dateRange', null)\r\n model.updateAttribute('scaleRange', null)\r\n this.recountScale()\r\n }\r\n\r\n addToLeftOffset = (n: number) => {\r\n const quote = this.props.chartModel.quote()\r\n const barWidth = getBarWidthWithMargin({\r\n chartLayout: this.chartLayoutModel,\r\n zoomFactor: this.props.chartModel.zoomFactor,\r\n })\r\n const leftOffset = getMinMaxLeftOffset({\r\n newLeftOffset: this.props.chartModel.leftOffset + n,\r\n chartModel: this.props.chartModel,\r\n barWidth,\r\n barIndex: quote.barIndex[quote.open.length - 1],\r\n })\r\n\r\n if (leftOffset > barWidth) {\r\n quote.fetchOlderData()\r\n }\r\n this.props.chartModel.updateAttributes({\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n }\r\n\r\n onDoubleClick = (event: HammerInput) => {\r\n event.preventDefault()\r\n const area = this.getArea(event)\r\n const element = this.props.model.selection || this.getElement(area)\r\n if (element && element.type !== IndicatorType.Cot && !element.isCreator) {\r\n setTimeout(() => {\r\n this.props.openElementStyleDialog!(element)\r\n }, 0)\r\n element.trigger('dblclick', event)\r\n }\r\n }\r\n\r\n onPress = (e: ObjectHash) => {\r\n if (e.pointerType !== 'touch') return\r\n\r\n e.clientX = e.center.x\r\n e.clientY = e.center.y\r\n\r\n const el = this.props.model.selection || this.getElement(this.getArea(e))\r\n if (!this.chartLayoutModel.isTouchCrossActive) {\r\n if (!el) {\r\n this.onCanvasPress(e as React.MouseEvent)\r\n } else {\r\n this.onContextMenu(e as React.MouseEvent, el)\r\n }\r\n }\r\n }\r\n\r\n onContextMenu = (e: React.MouseEvent, element?: IndicatorElement | CanvasElement) => {\r\n e.preventDefault()\r\n const area = this.getArea(e)\r\n const elementInArea = this.getElement(area)\r\n const el = element ?? elementInArea\r\n if (!el || el.thumbsAreInArea(area)) {\r\n return\r\n }\r\n const elementModel = ElementModel.findByAttribute('instance', el)\r\n if (!elementModel) return\r\n this.setSelectedElement(el)\r\n const hasProperties =\r\n ['indicator', 'canvas'].some((type) => el.type.startsWith(type)) && el.type !== IndicatorType.Cot\r\n const isElementDrawing = elementModel.isDrawing()\r\n\r\n return ContextMenu.show(\r\n e,\r\n [\r\n hasProperties && {\r\n id: 'edit',\r\n label: 'Edit style',\r\n onClick: () => this.props.openElementStyleDialog!(el),\r\n },\r\n\r\n !(elementModel.isChart() || elementModel?.isIndicator()) && {\r\n id: 'clone',\r\n label: 'Clone',\r\n onClick: () => elementModel.makeClone(),\r\n },\r\n\r\n ...(isElementDrawing\r\n ? [\r\n { type: 'divider', label: 'Visibility' },\r\n\r\n {\r\n id: 'visibility-current-and-above',\r\n label: 'Current interval and above',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndAbove),\r\n },\r\n\r\n {\r\n id: 'visibility-current-and-below',\r\n label: 'Current interval and below',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndBelow),\r\n },\r\n\r\n {\r\n id: 'visibility-current-only',\r\n label: 'Current interval only',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentOnly),\r\n },\r\n\r\n {\r\n id: 'visibility-all-intervals',\r\n label: 'All intervals',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.all),\r\n },\r\n ]\r\n : []),\r\n\r\n (isElementDrawing || hasProperties) && { type: 'divider' },\r\n\r\n {\r\n id: 'bring-to-front',\r\n label: 'Bring to Front',\r\n onClick: () => elementModel.bringToFront(),\r\n },\r\n {\r\n id: 'send-to-back',\r\n label: 'Send to Back',\r\n onClick: () => elementModel.sendToBack(),\r\n },\r\n {\r\n id: 'bring-forward',\r\n label: 'Bring Forward',\r\n onClick: () => elementModel.bringForward(),\r\n },\r\n {\r\n id: 'send-backward',\r\n label: 'Send Backward',\r\n onClick: () => elementModel.sendBackward(),\r\n },\r\n\r\n { type: 'divider' },\r\n\r\n {\r\n id: 'remove',\r\n label: 'Remove',\r\n onClick: () => {\r\n if (elementModel.isIndicator()) {\r\n handleRemoveIndicatorPane({ paneIndex: this.props.paneIndex, chartLayoutModel: this.chartLayoutModel })\r\n } else {\r\n elementModel.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n this.props.model.normalizeZIndexes()\r\n }\r\n },\r\n },\r\n ]\r\n .filter(Boolean)\r\n .map((item) => ({ ...item, gtag: { element_type: el.type } }))\r\n )\r\n }\r\n\r\n immediateRecountScaleOnChartIndicatorChange = (element?: ElementModel) => {\r\n if (element?.isChart() || element?.isIndicator()) {\r\n this.recountScale()\r\n }\r\n }\r\n\r\n recountScale = (_?: unknown, updateType?: Spine.Event) => {\r\n const { model } = this.props\r\n const chartModel = model.chart()\r\n if (updateType === 'destroy' || !chartModel || !chartModel.quote()) {\r\n return\r\n }\r\n\r\n recountScale({ chartModel, paneModel: model })\r\n\r\n if (this.canvasCtx) {\r\n this.renderAll()\r\n }\r\n }\r\n\r\n onBlur = () => {\r\n if (this.props.model.selection?.getIsCreator?.()) {\r\n this.setSelection(null)\r\n } else {\r\n this.setSelectedElement(null)\r\n }\r\n if (this.hoveredElement) {\r\n this.hoveredElement.setIsHovered(false)\r\n this.hoveredElement = null\r\n }\r\n this.props.model.getAllElements().forEach((element) => {\r\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n }\r\n\r\n renderAll = (type?: string) => {\r\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = true\r\n\r\n if (type === 'cross' && this.chartLayoutModel.cross) {\r\n if (this.crossRafId === null) {\r\n const crossRafId = window.requestAnimationFrame(() => {\r\n this.renderCross()\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: crossRafId, isInProgress: false })\r\n }\r\n })\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: crossRafId, isInProgress: true })\r\n }\r\n this.crossRafId = crossRafId\r\n }\r\n } else if (this.rafId == null && this.canvasCtx) {\r\n const rafId = window.requestAnimationFrame(() => {\r\n this._renderAll()\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: rafId, isInProgress: false })\r\n }\r\n })\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: rafId, isInProgress: true })\r\n }\r\n this.rafId = rafId\r\n }\r\n }\r\n\r\n _renderAll = () => {\r\n const { model } = this.props\r\n // _renderAll may be called after Chart was deleted because of requestAnimationFrame\r\n if (model.chart() === null || this.canvasRef.current === null || !this.canvasCtx) {\r\n return\r\n }\r\n if (this.getIsUpdatedDesign()) {\r\n if (this.crossRafId === null) {\r\n this.crossRafId = window.requestAnimationFrame(this.renderCross)\r\n }\r\n }\r\n this.rafId = undefined\r\n\r\n renderPane({\r\n chartLayoutModel: this.chartLayoutModel,\r\n chartModel: this.props.chartModel,\r\n paneModel: model,\r\n canvasCtx: this.canvasCtx,\r\n })\r\n }\r\n\r\n getIsUpdatedDesign() {\r\n const { specificChartFunctionality } = this.chartLayoutModel\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto = isRedesignedPage({ specificChartFunctionality })\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n renderCross = () => {\r\n const { model } = this.props\r\n const isMouseInPane = MouseModel.getShouldRenderCrossInPane(model)\r\n this.crossRafId = null\r\n if (!this.crossCanvasCtx) {\r\n return\r\n }\r\n this.crossCanvasCtx.clearRect(0, 0, this.props.chartModel.width, model.height)\r\n const isCrossDisabled =\r\n PaneModel.select((p) => !!p.selection && !p.selection.type.startsWith('indicators/')).length !== 0 ||\r\n this.props.chartModel.getIsDisabled() ||\r\n !isMouseInPane\r\n\r\n for (const { instance: elementInstance } of model.getAllElements()) {\r\n if (\r\n (!isCrossDisabled && elementInstance.renderCross != null) ||\r\n (isCrossDisabled && elementInstance.renderCrossText != null)\r\n ) {\r\n this.crossCanvasCtx.save()\r\n if (isCrossDisabled) {\r\n elementInstance.renderCrossText!(this.crossCanvasCtx, Number.NaN)\r\n } else {\r\n elementInstance.renderCross!(this.crossCanvasCtx)\r\n }\r\n this.crossCanvasCtx.restore()\r\n }\r\n }\r\n }\r\n\r\n getArea = (e: ObjectHash, additionalData?: T): PaneArea => {\r\n const { model } = this.props\r\n const clientX = e.clientX || additionalData?.clientX\r\n const clientY = e.clientY || additionalData?.clientY\r\n const Settings = getSettings(model)\r\n const areaRectangle = this.canvas!.getBoundingClientRect()\r\n const areaRectangleCursorX = clientX - areaRectangle.left\r\n const areaRectangleCursorY = clientY - areaRectangle.top\r\n const x = areaRectangleCursorX - model.chart().leftOffset - Settings.left.width\r\n const y = areaRectangleCursorY - Settings.top.height\r\n const scale = model.scale\r\n const chartLeftX = areaRectangle.left + Settings.left.width\r\n const chartRightX = areaRectangle.right - Settings.right.width\r\n return {\r\n ...(additionalData as T),\r\n // TODO: rewrite if canvas uses padding/border\r\n x: scale.x.invert(x),\r\n y: scale.y.invert(y),\r\n scaled: {\r\n x,\r\n y,\r\n },\r\n width: 1,\r\n height: 1,\r\n cursorX: areaRectangleCursorX,\r\n cursorY: areaRectangleCursorY,\r\n isCursorInChartWidthBoundaries: clientX > chartLeftX && clientX < chartRightX,\r\n }\r\n }\r\n\r\n setCanvasSize = ({ width, height }: { width: number; height: number }) => {\r\n const ratio = Utils.getScaleRatio()\r\n const canvasElement = this.canvasRef.current\r\n\r\n /**\r\n * It seems that value passed into element attr (e.g. height) is ceiled down,\r\n * so if you provide canvas element with height 100.5 we'll get integer 100 from canvasElement.height\r\n * If the difference in values between \"new height\" and canvasElement.height is less than 1, I treat it as the same value\r\n */\r\n if (\r\n this.canvasCtx &&\r\n canvasElement &&\r\n (Math.abs(height * ratio - canvasElement.height) >= 1 || Math.abs(width * ratio - canvasElement.width) >= 1)\r\n ) {\r\n Utils.setSizeOnCanvasElement({ canvasElement, width, height })\r\n this.canvasCtx.scale(ratio, ratio)\r\n if (this.chartLayoutModel.cross && this.crossCanvasCtx) {\r\n Utils.setSizeOnCanvasElement({\r\n canvasElement: this.crossCanvasRef.current,\r\n width,\r\n height,\r\n })\r\n this.crossCanvasCtx.scale(ratio, ratio)\r\n }\r\n setTimeout(() => {\r\n this.recountScale()\r\n })\r\n }\r\n }\r\n\r\n onClick = (event: HammerInput) => {\r\n const area = this.getArea(event, {\r\n clientX: event.center.x,\r\n clientY: event.center.y,\r\n })\r\n const element = this.props.model.selection || this.getElement(area)\r\n element?.trigger('click', area)\r\n\r\n if (!this.isDisableTouchCrossAvailable) {\r\n this.isDisableTouchCrossAvailable = true\r\n return\r\n }\r\n\r\n if (this.chartLayoutModel.isTouchCrossActive) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n this.chartLayoutModel.updateAttributes({\r\n scrollable: this.chartLayoutModel.initialScrollable,\r\n isTouchCrossActive: false,\r\n })\r\n } else if (\r\n this.isMobile &&\r\n !this.state.hasSeenCrossNotification &&\r\n this.lastActiveTool === DrawingTool.Mouse &&\r\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.smallIndex\r\n ) {\r\n const isChartsPage = this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n\r\n this.setState({ hasSeenCrossNotification: true })\r\n this.props.notificationContext.show(\r\n {\r\n this.props.notificationContext.hide()\r\n window.localStorage.setItem('hasSeenCrossNotification', 'true')\r\n }}\r\n theme=\"dark\"\r\n >\r\n Got it\r\n \r\n }\r\n >\r\n Long press the chart to show the crosshair.\r\n ,\r\n { inline: !isChartsPage }\r\n )\r\n }\r\n\r\n this.lastActiveTool = this.props.activeTool\r\n }\r\n\r\n onPaneMouseLeave = () => {\r\n // timout in onPaneMouseMove may cause racecondition where active class is added right after it's been removed\r\n setTimeout(() => {\r\n this.zoomControlsRef.current?.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n })\r\n if (this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n this.renderCross()\r\n }\r\n }\r\n\r\n onPaneMouseMove = (e: React.MouseEvent | React.Touch, isMouseDownIgnored = false) => {\r\n const { model, chartModel } = this.props\r\n const zoomControls = this.zoomControlsRef.current\r\n const paneHeight = model.height\r\n if (zoomControls) {\r\n const area = this.getArea<{ mouseDown: boolean; clientX: number; clientY: number }>(e, {\r\n mouseDown: !isMouseDownIgnored && this.mouseDown,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n })\r\n\r\n // timeout is needed here as adding a classname on parent element of a button where we are listening on a click is not working properly if done synchrnousely\r\n setTimeout(() => {\r\n // 103 is the destance between pane bottom and zoom-controls top\r\n // zoomer bottom (8 px) + zoomer height (20px) - 13px + zoom controls height (75px) = 90px\r\n const isInArea = model.height - 90 <= area.cursorY && paneHeight > 210\r\n\r\n if (\r\n isInArea &&\r\n !zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS) &&\r\n !chartModel.getIsDisabled()\r\n ) {\r\n zoomControls.classList.add(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n } else if (!isInArea && zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS)) {\r\n zoomControls.classList.remove(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n }\r\n\r\n if (!area.mouseDown && !model.selection && isInArea && !chartModel.getIsDisabled()) {\r\n if (!zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\r\n zoomControls.classList.add(ZOOM_CONTROLS_ACTIVE_CLASS)\r\n }\r\n } else if (zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\r\n zoomControls.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS)\r\n }\r\n })\r\n }\r\n }\r\n\r\n onMouseLeave = () => {\r\n this.mouseDown = false\r\n }\r\n\r\n onTouchStart = (e: React.TouchEvent) => {\r\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\r\n const touchEvent = e.targetTouches[0]\r\n if (this.chartLayoutModel.scrollable) {\r\n this.onCanvasInteractionStart(touchEvent)\r\n } else if (this.chartLayoutModel.isTouchCrossActive) {\r\n this.lastClientX = touchEvent.clientX\r\n this.lastClientY = touchEvent.clientY\r\n if (!MouseModel.pane()?.eql(this.props.model)) {\r\n const area = this.getArea(touchEvent, {\r\n mouseDown: this.mouseDown,\r\n clientX: touchEvent.clientX,\r\n clientY: touchEvent.clientY,\r\n })\r\n this.setMousePosition(this.getMousePositionInBoundaries(area))\r\n this.isDisableTouchCrossAvailable = false\r\n }\r\n } else {\r\n const area = this.getArea(touchEvent, { isTouch: true }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\r\n const element = this.getElement(area)\r\n if (element?.getIsChartEvent?.() && 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.RefForwardingComponent\r\n config: RootChartConfigObjectChart\r\n chartModel: ChartModel\r\n layoutModel: ChartLayout\r\n setActiveChartInteraction: (interaction: string | null) => void\r\n activeChartInteraction: string | null\r\n activeTool: DrawingTool\r\n touchEventsDisabled: boolean\r\n hasOutline?: boolean\r\n shouldResize?: boolean\r\n renderChartToolbar?: () => React.ReactNode\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { ChartEditorEnum, SpecificChartFunctionality } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport MouseModel from '../../models/mouse'\r\nimport PaneModel from '../../models/pane'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport utils, { isRedesignEnabled } from '../../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../../utils/chart'\r\nimport { ChartControls } from '../chart-controls'\r\nimport Pane from '../pane'\r\nimport {\r\n getBarIndex,\r\n getIsSmallIndexChart,\r\n getLeftOffset,\r\n getMinMaxLeftOffset,\r\n updateZoomAndLeftOffsetByDateRange,\r\n} from '../renderUtils'\r\nimport { ChartProps } from './constants'\r\nimport { withChartInit } from './with-chart-init'\r\nimport { withWatchedPanesOnChartModel } from './with-watched-panes-on-chart-model'\r\n\r\nfunction preventDefaultFunc(event: Event) {\r\n event.preventDefault()\r\n}\r\n\r\nfunction getZoomFactor({\r\n chartLayout,\r\n currentZoomFactor,\r\n diff,\r\n minBarWidthInPx = 1,\r\n maxBarWidthInPx = 66,\r\n}: {\r\n chartLayout: ChartLayout\r\n currentZoomFactor: number\r\n diff: number\r\n minBarWidthInPx?: number\r\n maxBarWidthInPx?: number\r\n}) {\r\n const minZoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth: minBarWidthInPx,\r\n numOfVisibleBars: 1,\r\n })\r\n const maxZoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth: maxBarWidthInPx,\r\n numOfVisibleBars: 1,\r\n })\r\n const isNegativeDirection = diff < 0\r\n const newZoomFactor = currentZoomFactor + diff\r\n const newZoomFactorInRange = Math.min(Math.max(minZoomFactor, newZoomFactor), maxZoomFactor)\r\n\r\n if (newZoomFactor > newZoomFactorInRange && currentZoomFactor > newZoomFactorInRange) {\r\n return isNegativeDirection ? newZoomFactor : currentZoomFactor\r\n }\r\n\r\n if (newZoomFactor < newZoomFactorInRange && currentZoomFactor < newZoomFactorInRange) {\r\n return !isNegativeDirection ? newZoomFactor : currentZoomFactor\r\n }\r\n\r\n return newZoomFactorInRange\r\n}\r\n\r\ninterface ChartState {\r\n panesWrapperElement: HTMLDivElement | null\r\n}\r\n\r\nclass Chart extends React.Component {\r\n lastWidth: number\r\n mouseWheelTimeout?: number\r\n setStateWithPanesTimeout?: number\r\n lastHeight = 0\r\n lastY: number | null = null\r\n lastX: number | null = null\r\n resizerPaneIndex = -1\r\n minimalPaneHeight = 0\r\n zoomerRightAlign: {\r\n barIndex?: number\r\n index: number\r\n offsetDiff: number\r\n } | null = null\r\n\r\n // expects model, config, layoutModel\r\n constructor(props: ChartProps) {\r\n super(props)\r\n\r\n this.lastWidth = props.chartModel.width\r\n this.props.layoutModel.bind('change', this.onLayoutModelChange)\r\n this.state = { panesWrapperElement: null }\r\n }\r\n\r\n componentDidMount() {\r\n const { chartModel } = this.props\r\n this.lastWidth = this.props.layoutModel.width\r\n\r\n chartModel.trigger('change', chartModel)\r\n chartModel.bind('createPane', this.onPaneCreate)\r\n\r\n this.calculateMinimalPaneHeight()\r\n this.handleQuoteChange(chartModel.quote()!)\r\n this.onModelChange()\r\n\r\n chartModel.bind('update', this.onModelChange)\r\n chartModel.bind('destroy', () => {\r\n Quote.unbind('olderData', this.onOlderDataLoaded)\r\n Quote.unbind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\r\n })\r\n\r\n Quote.bind('olderData', this.onOlderDataLoaded)\r\n Quote.bind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly, prevState: Readonly) {\r\n if (\r\n prevState.panesWrapperElement !== this.state.panesWrapperElement ||\r\n prevProps.layoutModel.isWheelZoomEnabled !== this.props.layoutModel.isWheelZoomEnabled\r\n ) {\r\n prevState.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\r\n\r\n if (this.props.layoutModel.isWheelZoomEnabled) {\r\n // can't use onWheel as it has passive: true\r\n this.state.panesWrapperElement?.addEventListener('wheel', preventDefaultFunc, { passive: false })\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { chartModel, layoutModel } = this.props\r\n if (this.setStateWithPanesTimeout) {\r\n clearTimeout(this.setStateWithPanesTimeout)\r\n }\r\n layoutModel.unbind('change', this.onLayoutModelChange)\r\n chartModel.unbind('update', this.onModelChange)\r\n\r\n this.state.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\r\n }\r\n\r\n handleSetPanesWrapperRef = (panesWrapperElement: HTMLDivElement | null) => {\r\n this.setState({ panesWrapperElement })\r\n }\r\n\r\n render() {\r\n const { activeTool, chartIndex, layoutModel, chartModel, renderChartToolbar } = this.props\r\n const isChartPage = layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const panes =\r\n layoutModel.specificChartFunctionality === SpecificChartFunctionality.futuresPage\r\n ? chartModel.getAllValidPanes()\r\n : chartModel.getAllPanes()\r\n const showSettings = layoutModel.editors.includes(ChartEditorEnum.settings)\r\n\r\n return (\r\n <>\r\n this.onClick(undefined) : undefined}\r\n data-testid={`chart-${chartIndex}-settings`}\r\n onMouseEnter={this.resetMouseModel}\r\n >\r\n {showSettings && }\r\n \r\n {layoutModel.editable && showSettings && renderChartToolbar && (\r\n \r\n {renderChartToolbar()}\r\n \r\n )}\r\n \r\n {panes.map((pane, index) => (\r\n \r\n ))}\r\n \r\n \r\n )\r\n }\r\n\r\n onMouseWheel = (e: React.WheelEvent) => {\r\n const { chartModel, layoutModel } = this.props\r\n const isLoading = chartModel.panes().count() < 1\r\n if (!layoutModel.isWheelZoomEnabled || isLoading) {\r\n return\r\n }\r\n if (!this.zoomerRightAlign) {\r\n this.calcZoomerRightAlign()\r\n }\r\n clearTimeout(this.mouseWheelTimeout)\r\n this.mouseWheelTimeout = window.setTimeout(() => {\r\n this.zoomerRightAlign = null\r\n }, 250)\r\n this.onZoomerMouseMove(e, undefined, true)\r\n }\r\n\r\n onClick = (activePane: PaneModel | undefined) => {\r\n if (\r\n !this.props.layoutModel.activeChart.eql(this.props.chartModel) ||\r\n !(this.props.layoutModel.activePane?.eql(activePane) || this.props.layoutModel.activePane === activePane)\r\n ) {\r\n this.props.layoutModel.updateAttributes({ activeChart: this.props.chartModel, activePane })\r\n }\r\n }\r\n\r\n onPaneCreate = () => {\r\n const { chartModel } = this.props\r\n this.onModelChange()\r\n this.calculateMinimalPaneHeight()\r\n chartModel.trigger('change', chartModel)\r\n }\r\n\r\n onPaneDestroy = (paneId: string) => {\r\n const { chartModel } = this.props\r\n const pane = chartModel.panes().find(paneId)\r\n\r\n if (pane) {\r\n pane.destroyCascade()\r\n this.onModelChange()\r\n chartModel.trigger('change', chartModel)\r\n }\r\n }\r\n\r\n onModelChange = (chartModelParam?: ChartModel) => {\r\n const { chartModel, config } = this.props\r\n const panes = chartModel.getAllPanes()\r\n const quote = chartModel.quote()\r\n\r\n if (panes.length === 0 || !quote || chartModel.leftOffset === undefined) {\r\n return\r\n }\r\n\r\n const { width, height } = chartModel\r\n let panesHeight = panes.reduce((sum, pane) => sum + (pane.height ?? 0), 0)\r\n if (panesHeight !== height) {\r\n panesHeight = panes.reduce((sum, pane) => {\r\n const newPaneHeight = Math.round((pane.height / panesHeight) * height)\r\n if (!Number.isNaN(newPaneHeight)) {\r\n pane.updateAttribute('height', newPaneHeight)\r\n }\r\n return sum + newPaneHeight\r\n }, 0)\r\n const chartPane = chartModel.getChartPane()\r\n if (chartPane && panesHeight !== height) {\r\n const newChartPaneHeight = chartPane.height + height - panesHeight\r\n if (!Number.isNaN(newChartPaneHeight)) {\r\n chartPane.updateAttribute('height', newChartPaneHeight)\r\n }\r\n }\r\n }\r\n\r\n const newLeftOffset = getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: config,\r\n })\r\n const newIsScrolled = chartModel.leftOffset !== newLeftOffset\r\n const isScrolled = chartModel.isScrolled\r\n if (!isScrolled && this.lastWidth !== width) {\r\n this.lastWidth = width\r\n chartModel.updateAttribute('leftOffset', newLeftOffset)\r\n } else if (isScrolled !== newIsScrolled) {\r\n chartModel.updateAttributes({ isScrolled: newIsScrolled })\r\n }\r\n\r\n if (this.lastHeight !== height) {\r\n this.lastHeight = height\r\n this.calculateMinimalPaneHeight()\r\n }\r\n\r\n if (chartModelParam) {\r\n this.handleQuoteChange(chartModelParam.quote())\r\n }\r\n }\r\n\r\n onLayoutModelChange = ({ activeChart, activePane }: { activeChart: ChartModel; activePane: PaneModel }) => {\r\n const { chartModel } = this.props\r\n if (!activeChart) {\r\n return\r\n }\r\n for (const pane of chartModel.getAllPanes()) {\r\n if (activePane?.id !== pane.id && pane.selection?.isSelected === true) {\r\n pane.selection.setIsSelected(false)\r\n pane.updateAttribute('selection', undefined)\r\n }\r\n }\r\n }\r\n\r\n onResizerMouseDown = (e: React.MouseEvent | MouseEvent, model: PaneModel) => {\r\n if (e.button !== 0) {\r\n return\r\n }\r\n this.lastY = e.clientY\r\n this.resizerPaneIndex = this.props.chartModel\r\n .panes()\r\n .all()\r\n .findIndex((pane) => pane.eql(model))\r\n document.addEventListener('mousemove', this.onResizerMouseMove)\r\n document.addEventListener('mouseup', this.onResizerMouseUp)\r\n }\r\n\r\n onResizerMouseMove = (e: MouseEvent) => {\r\n if (this.resizerPaneIndex > 0 && this.lastY !== null && this.resizePanesAccordingly(this.lastY! - e.clientY)) {\r\n this.lastY = e.clientY\r\n }\r\n }\r\n\r\n onResizerMouseUp = (e: MouseEvent) => {\r\n const { chartModel } = this.props\r\n if (this.resizerPaneIndex > 0 && this.lastY !== null) {\r\n this.resizePanesAccordingly(this.lastY - e.clientY)\r\n this.lastY = null\r\n\r\n chartModel.trigger('change', chartModel)\r\n }\r\n\r\n document.removeEventListener('mousemove', this.onResizerMouseMove)\r\n document.removeEventListener('mouseup', this.onResizerMouseUp)\r\n }\r\n\r\n calculateMinimalPaneHeight() {\r\n const { chartModel } = this.props\r\n const { minHeight, total } = chartModel\r\n .panes()\r\n .all()\r\n .reduce(\r\n ({ minHeight, total }, pane) => {\r\n if (minHeight > pane.height) {\r\n minHeight = pane.height\r\n }\r\n total += pane.getIsChartPane() ? 3 : 1\r\n return { minHeight, total }\r\n },\r\n { minHeight: chartModel.height, total: 0 }\r\n )\r\n const optiMinHeight = Math.floor(chartModel.height / total)\r\n this.minimalPaneHeight = Math.min(minHeight, optiMinHeight)\r\n }\r\n\r\n resizePanesAccordingly(difY: number) {\r\n const { chartModel } = this.props\r\n const panes = chartModel.panes().all()\r\n let basePane = this.resizerPaneIndex\r\n if (!difY) {\r\n return true\r\n } else if (difY > 0) {\r\n let i = basePane\r\n let pane = panes[i]\r\n if (pane.height + difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height + difY)\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n for (--i; i >= 0; i--) {\r\n pane = panes[i]\r\n if (pane.height - difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height - difY)\r\n break\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n }\r\n } else if (difY < 0) {\r\n basePane = Math.max(0, basePane - 1)\r\n let i = basePane\r\n let pane = panes[i]\r\n if (pane.height - difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height - difY)\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n for (++i; i < panes.length; i++) {\r\n pane = panes[i]\r\n if (pane.height + difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height + difY)\r\n break\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n }\r\n }\r\n\r\n const panesHeight = panes.reduce((sum, pane) => sum + pane.height, 0)\r\n if (panesHeight !== chartModel.height) {\r\n difY = chartModel.height - panesHeight\r\n\r\n const pane = panes[basePane]\r\n pane.updateAttribute('height', pane.height + difY)\r\n\r\n // if we exceeded total height we need to stop updating lastY - return false\r\n return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n onZoomerTouchStart = (e: React.TouchEvent | TouchEvent) => {\r\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1 || this.props.touchEventsDisabled) {\r\n return\r\n }\r\n this.onZoomerMouseDown(e.targetTouches[0])\r\n }\r\n\r\n onZoomerTouchMove = (e: TouchEvent) => {\r\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1) {\r\n return\r\n }\r\n this.onZoomerMouseMove(e.targetTouches[0])\r\n }\r\n\r\n onZoomerTouchEnd = () => {\r\n if (!this.props.layoutModel.scrollable) {\r\n return\r\n }\r\n this.onZoomerMouseUp()\r\n }\r\n\r\n getRawDistance = (e: Pick) => {\r\n const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY }\r\n return math.distance(p1, p2)\r\n }\r\n\r\n onPinchStart = (e: React.TouchEvent) => {\r\n const { chartModel } = this.props\r\n const { activeChartInteraction, setActiveChartInteraction, touchEventsDisabled } = this.props\r\n const isLoading = chartModel.panes().count() < 1\r\n\r\n if (\r\n this.props.layoutModel.scrollable &&\r\n e.touches.length === 2 &&\r\n !activeChartInteraction &&\r\n !isLoading &&\r\n !touchEventsDisabled\r\n ) {\r\n setActiveChartInteraction('pinch')\r\n this.onZoomerMouseDown({ clientX: this.getRawDistance(e as unknown as TouchEvent) })\r\n\r\n document.addEventListener('touchmove', this.onPinchMove)\r\n document.addEventListener('touchend', this.onPinchEnd)\r\n }\r\n }\r\n\r\n onPinchMove = (e: TouchEvent) => {\r\n if (e.touches.length === 2) {\r\n this.onZoomerMouseMove({ clientX: this.getRawDistance(e) })\r\n }\r\n }\r\n\r\n onPinchEnd = (e: TouchEvent) => {\r\n if (e.touches.length === 1) {\r\n this.onZoomerMouseUp()\r\n document.removeEventListener('touchmove', this.onPinchMove)\r\n document.removeEventListener('touchend', this.onPinchEnd)\r\n }\r\n }\r\n\r\n calcZoomerRightAlign = () => {\r\n const { chartModel } = this.props\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const quote = chartModel.quote()\r\n const fx = chartModel.panes().first().scale.x\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: this.props.layoutModel })\r\n const currentLeftOffset = getLeftOffset({ quote, chartModel, config: this.props.config, barWidth })\r\n this.zoomerRightAlign = null\r\n\r\n if (quote.isIntraday && quote.instrument === Instrument.Stock) {\r\n const barIndex = quote.getBarIndex(quote.close.length - 1)\r\n let offsetDiff =\r\n chartModel.leftOffset -\r\n getLeftOffset({\r\n quote,\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex,\r\n shouldAlignDaysToLeftApplied: false,\r\n })\r\n const offsetBars = ~~(offsetDiff / barWidth)\r\n offsetDiff -= offsetBars * barWidth\r\n this.zoomerRightAlign = {\r\n barIndex,\r\n index: barIndex - offsetBars,\r\n offsetDiff,\r\n }\r\n } else if (chartModel.leftOffset <= currentLeftOffset) {\r\n this.zoomerRightAlign = {\r\n index: quote.getBarIndex(quote.open.length - 1),\r\n offsetDiff: chartModel.leftOffset - currentLeftOffset,\r\n }\r\n } else {\r\n const offset = chartModel.leftOffset\r\n for (let i = 0; i < quote.open.length; i += 1) {\r\n const x = fx(i)\r\n if (x + offset < 0) {\r\n continue\r\n }\r\n if (x + offset > chartModel.width - ChartSettings.left.width - ChartSettings.right.width) {\r\n const barIndex = quote.getBarIndex(i - 1)\r\n let offsetDiff =\r\n offset -\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex,\r\n })\r\n const offsetBars = ~~(offsetDiff / barWidth)\r\n offsetDiff -= offsetBars * barWidth\r\n this.zoomerRightAlign = {\r\n barIndex,\r\n index: barIndex - offsetBars,\r\n offsetDiff,\r\n }\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n onZoomerMouseDown = (e: Partial) => {\r\n if ((e.button !== 0 && 'button' in e) || !this.props.layoutModel.scrollable) {\r\n return\r\n }\r\n switch (this.props.activeChartInteraction) {\r\n case 'pinch':\r\n break\r\n case null:\r\n this.props.setActiveChartInteraction('zoomer')\r\n break\r\n default:\r\n return\r\n }\r\n\r\n this.lastX = e.clientX ?? null\r\n this.calcZoomerRightAlign()\r\n\r\n document.addEventListener('mousemove', this.onZoomerMouseMove)\r\n document.addEventListener('mouseup', this.onZoomerMouseUp)\r\n document.addEventListener('touchmove', this.onZoomerTouchMove)\r\n document.addEventListener('touchend', this.onZoomerTouchEnd)\r\n }\r\n\r\n normalizeWheelDeltaY = (e: WheelEvent) => {\r\n // because wheel deltaY on mouse and touchpad is quite different we need to normalize it\r\n const abs = Math.abs(e.deltaY)\r\n if (abs === 0) return 0\r\n return Math.log(abs) * Math.sign(e.deltaY) * 10\r\n }\r\n\r\n onZoomerMouseMove = (\r\n e: React.WheelEvent | MouseEvent | Touch | { clientX: number },\r\n _?: unknown,\r\n isMouseWheel = false\r\n ) => {\r\n const { chartModel, layoutModel } = this.props\r\n let difX\r\n if (!layoutModel.scrollable) return\r\n if (!isMouseWheel && this.lastX !== null) {\r\n difX = (this.lastX - e.clientX) / chartModel.width\r\n this.lastX = e.clientX\r\n } else {\r\n // standard difX calculation result is around 0.00x, wheel deltaY is whole px\r\n // because of that we divide px with 1000\r\n difX = this.normalizeWheelDeltaY(e as WheelEvent) / 1000\r\n }\r\n\r\n this.addToZoomFactor({ diff: -difX })\r\n }\r\n\r\n addToZoomFactor = ({\r\n diff,\r\n shouldCalculateRightAlign = false,\r\n }: {\r\n diff: number\r\n shouldCalculateRightAlign?: boolean\r\n }) => {\r\n const { chartModel, layoutModel } = this.props\r\n if (shouldCalculateRightAlign) {\r\n this.calcZoomerRightAlign()\r\n }\r\n // 6 is default bar width with margin on charts page, so to get the similar feeling when zooming we're multiplying the zoom factor by the coefficient\r\n const diffCoefficient = chartModel.zoomFactor * (6 / getBarWidthWithMargin({ chartLayout: this.props.layoutModel }))\r\n const zoomFactor = getZoomFactor({\r\n chartLayout: layoutModel,\r\n currentZoomFactor: chartModel.zoomFactor,\r\n diff: diff * diffCoefficient,\r\n })\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: this.props.layoutModel,\r\n })\r\n\r\n let leftOffset\r\n if (this.props.config.stretch) {\r\n leftOffset = 0\r\n } else if (getIsSmallIndexChart(this.props.layoutModel.specificChartFunctionality)) {\r\n leftOffset = barWidth\r\n } else if (this.zoomerRightAlign) {\r\n leftOffset = getMinMaxLeftOffset({\r\n newLeftOffset:\r\n getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex: this.zoomerRightAlign.index,\r\n shouldAlignDaysToLeftApplied: false,\r\n }) + this.zoomerRightAlign.offsetDiff,\r\n chartModel: chartModel,\r\n barWidth,\r\n barIndex: getBarIndex(chartModel.quote()),\r\n })\r\n } else {\r\n return\r\n }\r\n chartModel.updateAttributes({\r\n zoomFactor,\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n if (shouldCalculateRightAlign) {\r\n this.zoomerRightAlign = null\r\n }\r\n }\r\n\r\n onZoomerMouseUp = () => {\r\n this.zoomerRightAlign = null\r\n document.removeEventListener('mousemove', this.onZoomerMouseMove)\r\n document.removeEventListener('mouseup', this.onZoomerMouseUp)\r\n document.removeEventListener('touchmove', this.onZoomerTouchMove)\r\n document.removeEventListener('touchend', this.onZoomerTouchEnd)\r\n this.props.setActiveChartInteraction(null)\r\n }\r\n\r\n onZoomerReset = () => {\r\n const { chartModel, layoutModel } = this.props\r\n const zoomFactor = chartModel.chart_layout().defaultZoomFactor\r\n const barWidth = getBarWidthWithMargin({ zoomFactor, chartLayout: layoutModel })\r\n const leftOffset = getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n })\r\n\r\n chartModel.updateAttributes({\r\n zoomFactor,\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n }\r\n\r\n onOlderDataLoaded = () => {\r\n throw new Error('onOlderDataLoaded not implemented')\r\n // TODO implement similarly to onDataLoaded\r\n }\r\n\r\n resetMouseModel = () => {\r\n const isLoading = this.props.chartModel.panes().count() < 1\r\n if (!isLoading) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n }\r\n }\r\n\r\n handleQuoteChange = (quote: Quote) => {\r\n const { chartModel } = this.props\r\n\r\n // Update only date range chart\r\n if (chartModel.dateRange) {\r\n if (!quote.eql(chartModel.quote()) || chartModel.timeframe !== quote.timeframe || quote.date.length === 0) {\r\n return\r\n }\r\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\r\n }\r\n }\r\n\r\n onDataLoaded = (newQuote: Quote, fetchType: QuoteFetchType) => {\r\n const { chartModel } = this.props\r\n const quote = chartModel.quote()\r\n if (!quote?.eql(newQuote)) {\r\n return\r\n }\r\n\r\n const shouldForceLeftOffsetUpdate = fetchType === QuoteFetchType.Refetch\r\n let newLeftOffset = chartModel.leftOffset // TODO find proper fix. If this line is removed (if we don't trigger leftOffset update), the chart stops being updated for the user until they move chart around.\r\n if (\r\n (this.props.layoutModel.scrollable === false && !this.props.layoutModel.isTouchCrossActive) ||\r\n !chartModel.isScrolled ||\r\n shouldForceLeftOffsetUpdate\r\n ) {\r\n newLeftOffset = getLeftOffset({\r\n quote,\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n })\r\n }\r\n\r\n chartModel.setChartEvents(quote.chartEvents, !quote.events)\r\n\r\n if (newLeftOffset !== chartModel.leftOffset) {\r\n chartModel.getAllElements().forEach((element) => {\r\n if (element.isDrawing() && !element.isMouseDown()) {\r\n element.instance.updateScales()\r\n }\r\n })\r\n }\r\n\r\n chartModel.updateAttribute('leftOffset', newLeftOffset)\r\n\r\n this.handleQuoteChange(quote)\r\n }\r\n}\r\n\r\nexport default withChartInit(withWatchedPanesOnChartModel(Chart))\r\n","import classNames from 'classnames'\r\nimport merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../types/shared'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Quote from '../../models/quote'\r\nimport { getChartsDimensions, isRedesignEnabled } from '../../utils'\r\nimport { prefetchPerfIndicatorAllQuotes } from '../../utils/chart'\r\nimport { getLeftOffset } from '../renderUtils'\r\nimport { ChartSpinnerOverlay } from './chart-spinner-overlay'\r\nimport { CHART_CLASS_NAMES, ChartProps, DEFAULT_WRAPPER_COMPONENT } from './constants'\r\n\r\nexport function withChartInit(Component: React.ComponentType) {\r\n return function WrappedComponent(props: ChartProps) {\r\n const { WrapperComp = DEFAULT_WRAPPER_COMPONENT, gridArea } = props\r\n const isModelDestroyedRef = React.useRef(false)\r\n const model = useModelState(props.chartModel, { watchProperties: ['panes', 'quote'] })\r\n const layoutModel = useModelState(props.layoutModel, { watchProperties: ['activeChart'] })\r\n const quote = model.quote()\r\n\r\n const initChartRef = React.useRef(async () => {\r\n const { chartModel, config } = props\r\n const { premarket, hasChartEvents, aftermarket, ticker, instrument, timeframe, panes: panesConfig } = config\r\n\r\n const options = {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns: panesConfig.some(\r\n (pane) =>\r\n pane.elements?.some(\r\n (element) => element.overlays?.some((overlay: ObjectHash) => overlay.type === 'overlays/patterns')\r\n )\r\n ),\r\n }\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n })\r\n const panesWithPerfIndicator = panesConfig.filter(({ elements }) =>\r\n elements.some(({ type }) => type === 'indicators/perf')\r\n )\r\n\r\n if (panesWithPerfIndicator) {\r\n await Promise.allSettled(\r\n panesWithPerfIndicator.map((paneWithPerfIndicator) =>\r\n prefetchPerfIndicatorAllQuotes({ paneWithPerfIndicator, timeframe, options })\r\n )\r\n )\r\n }\r\n\r\n if (isModelDestroyedRef.current) {\r\n return\r\n }\r\n\r\n config.panes.forEach((pane) => {\r\n const paneProperties = merge({}, pane)\r\n paneProperties.chart = chartModel\r\n chartModel.createPaneCascade(paneProperties)\r\n })\r\n\r\n chartModel.updateAttributes({\r\n quote,\r\n premarket: options.premarket,\r\n aftermarket: options.aftermarket,\r\n })\r\n\r\n chartModel.setChartEvents(quote.chartEvents, true)\r\n\r\n if (props.shouldResize) {\r\n const chartsDimensions = getChartsDimensions(props.layoutModel.getHTMLElementId())\r\n props.layoutModel.updateAttributes(chartsDimensions)\r\n }\r\n\r\n if (chartModel.leftOffset == null) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chartModel, config: props.config })\r\n chartModel.updateAttribute('leftOffset', leftOffset)\r\n }\r\n })\r\n\r\n React.useEffect(() => {\r\n const handleModelBeforeDestroy = () => {\r\n isModelDestroyedRef.current = true\r\n }\r\n\r\n model.bind('beforeDestroy', handleModelBeforeDestroy)\r\n initChartRef.current()\r\n return () => {\r\n model.unbind('beforeDestroy', handleModelBeforeDestroy)\r\n }\r\n // We want to run it only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const isQuotePage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isChartPage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(props.layoutModel.specificChartFunctionality)\r\n const isModelReady =\r\n quote && ((quote.fetchedAt === undefined && quote.close.length > 0) || quote.fetchedAt > 0 || quote)\r\n const loadingStyle =\r\n !isModelReady && isQuotePage\r\n ? // 2px is border\r\n { width: model.width ? model.width + 2 : '100%', height: model.height + 2 }\r\n : undefined\r\n\r\n return (\r\n \r\n {isChartPage && (\r\n \r\n )}\r\n {isModelReady && }\r\n \r\n )\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\n\r\nexport function withWatchedPanesOnChartModel

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const model = useModelState(props.chartModel, { watchProperties: ['panes'] })\r\n\r\n return \r\n }\r\n}\r\n","export const drawingCreatorsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"drawing-creators\" */ './module-entry'),\r\n cacheKey: 'drawing-creators',\r\n}\r\n","import { DrawingActions, IToolbarDrawingAction, IToolbarDrawingActionItem } from './interfaces'\r\n\r\nexport const drawingActions: Record = {\r\n [DrawingActions.AddNote]: {\r\n id: DrawingActions.AddNote,\r\n title: 'Add note',\r\n icon: 'note',\r\n },\r\n [DrawingActions.DeleteDrawings]: {\r\n id: DrawingActions.DeleteDrawings,\r\n title: 'Remove all drawings',\r\n icon: 'drawingActionDelete',\r\n },\r\n [DrawingActions.DeleteAutoSavedDrawings]: {\r\n id: DrawingActions.DeleteAutoSavedDrawings,\r\n title: 'Remove all autosaved drawings',\r\n icon: 'drawingActionDelete',\r\n },\r\n}\r\n\r\nexport const getToolbarDrawingActions = ({\r\n isAutoSaveActive,\r\n isAddNoteAvailable = false,\r\n isIdea,\r\n}: {\r\n isAutoSaveActive: boolean\r\n isAddNoteAvailable?: boolean\r\n isIdea?: boolean\r\n}): Array => [\r\n ...(isAddNoteAvailable\r\n ? [\r\n {\r\n defaultItem: drawingActions[DrawingActions.AddNote],\r\n isDisabled: isIdea,\r\n disabledTooltip: 'Add note is not available in ideas',\r\n },\r\n ]\r\n : []),\r\n {\r\n defaultItem:\r\n drawingActions[isAutoSaveActive ? DrawingActions.DeleteAutoSavedDrawings : DrawingActions.DeleteDrawings],\r\n },\r\n]\r\n","import { DrawingSetting, IToolbarDrawingSetting, IToolbarDrawingsSettingItem } from './interfaces'\r\n\r\nconst drawingSettings: Record = {\r\n [DrawingSetting.PreserveDrawings]: {\r\n id: DrawingSetting.PreserveDrawings,\r\n icon: 'drawingSettingPreserveDrawings',\r\n iconActive: 'drawingSettingPreserveDrawingsActive',\r\n title: 'Preserve drawings: Off',\r\n titleActive: 'Preserve drawings: On',\r\n },\r\n [DrawingSetting.DrawingModeContinuous]: {\r\n id: DrawingSetting.DrawingModeContinuous,\r\n icon: 'drawingSettingDrawingMode',\r\n iconActive: 'drawingSettingDrawingModeActive',\r\n title: 'Drawing mode: Single',\r\n titleActive: 'Drawing mode: Continuous',\r\n },\r\n [DrawingSetting.HideDrawings]: {\r\n id: DrawingSetting.HideDrawings,\r\n icon: 'drawingSettingHide',\r\n iconActive: 'drawingSettingShow',\r\n title: 'Hide drawings',\r\n titleActive: 'Show drawings',\r\n },\r\n [DrawingSetting.LockDrawings]: {\r\n id: DrawingSetting.LockDrawings,\r\n icon: 'drawingSettingLock',\r\n iconActive: 'drawingSettingUnlock',\r\n title: 'Lock drawings',\r\n titleActive: 'Unlock drawings',\r\n },\r\n}\r\n\r\nconst preserveDrawingsAutosaveOverride: IToolbarDrawingSetting = {\r\n id: DrawingSetting.PreserveDrawings, // DrawingSetting.PreserveDrawings so it works with current settings sync to DB\r\n icon: 'drawingSettingAutosaveOff',\r\n iconActive: 'drawingSettingAutosaveOn',\r\n iconAction: 'drawingSettingAutosaveSaving',\r\n title: 'Drawings autosave: Off',\r\n titleActive: 'Drawings Autosave: On',\r\n titleAction: 'Drawings Autosave: Saving',\r\n}\r\n\r\nexport const getToolbarDrawingSettings = ({\r\n isPreserveDrawingsAndAutosaveAvailable,\r\n isIdea,\r\n isAutoSaveInProgress,\r\n}: {\r\n isPreserveDrawingsAndAutosaveAvailable?: boolean\r\n isIdea?: boolean\r\n isAutoSaveInProgress?: boolean\r\n}): Array => {\r\n const toolbarSettings = [\r\n {\r\n defaultItem: drawingSettings[DrawingSetting.DrawingModeContinuous],\r\n },\r\n ...(isPreserveDrawingsAndAutosaveAvailable\r\n ? [\r\n {\r\n defaultItem: preserveDrawingsAutosaveOverride,\r\n isDisabled: isIdea,\r\n isInAction: isAutoSaveInProgress,\r\n disabledTooltip: 'Autosave is not available in ideas',\r\n },\r\n ]\r\n : []),\r\n {\r\n defaultItem: drawingSettings[DrawingSetting.HideDrawings],\r\n },\r\n {\r\n defaultItem: drawingSettings[DrawingSetting.LockDrawings],\r\n },\r\n ]\r\n\r\n return toolbarSettings\r\n}\r\n","import { DrawingTool, IToolbarDrawingTool, IToolbarDrawingToolItem } from './interfaces'\r\n\r\nexport const drawingTools: Record = {\r\n [DrawingTool.Mouse]: {\r\n id: DrawingTool.Mouse,\r\n title: 'Mouse',\r\n icon: 'toolMouse',\r\n },\r\n [DrawingTool.Measure]: {\r\n id: DrawingTool.Measure,\r\n title: 'Measure',\r\n icon: 'toolMeasure',\r\n },\r\n [DrawingTool.ScaledLine]: {\r\n id: DrawingTool.ScaledLine,\r\n title: 'Line',\r\n icon: 'toolLine',\r\n },\r\n [DrawingTool.Arrow]: {\r\n id: DrawingTool.Arrow,\r\n title: 'Arrow',\r\n icon: 'toolArrow',\r\n },\r\n [DrawingTool.VerticalLine]: {\r\n id: DrawingTool.VerticalLine,\r\n title: 'Vertical line',\r\n icon: 'toolMidLineV',\r\n },\r\n [DrawingTool.HorizontalLine]: {\r\n id: DrawingTool.HorizontalLine,\r\n title: 'Horizontal line',\r\n icon: 'toolMidLineH',\r\n },\r\n [DrawingTool.Rectangle]: {\r\n id: DrawingTool.Rectangle,\r\n title: 'Rectangle',\r\n icon: 'toolRect',\r\n },\r\n [DrawingTool.RotatedRectangle]: {\r\n id: DrawingTool.RotatedRectangle,\r\n title: 'Rotated rectangle',\r\n icon: 'toolRectRotated',\r\n },\r\n [DrawingTool.Triangle]: {\r\n id: DrawingTool.Triangle,\r\n title: 'Triangle',\r\n icon: 'toolTriangle',\r\n },\r\n [DrawingTool.Ellipse]: {\r\n id: DrawingTool.Ellipse,\r\n title: 'Ellipse',\r\n icon: 'toolEllipse',\r\n },\r\n [DrawingTool.Curve]: {\r\n id: DrawingTool.Curve,\r\n title: 'Curve',\r\n icon: 'toolCurve',\r\n },\r\n [DrawingTool.Pitchfork]: {\r\n id: DrawingTool.Pitchfork,\r\n title: 'Pitchfork',\r\n icon: 'toolPitchfork',\r\n },\r\n [DrawingTool.Polygon]: {\r\n id: DrawingTool.Polygon,\r\n title: 'Polygon',\r\n icon: 'toolPolygon',\r\n },\r\n [DrawingTool.Xabcd]: {\r\n id: DrawingTool.Xabcd,\r\n title: 'XABCD',\r\n icon: 'toolXABCD',\r\n },\r\n [DrawingTool.ScaledText]: {\r\n id: DrawingTool.ScaledText,\r\n title: 'Text',\r\n icon: 'toolText',\r\n },\r\n [DrawingTool.Brush]: {\r\n id: DrawingTool.Brush,\r\n title: 'Brush',\r\n icon: 'toolBrush',\r\n },\r\n [DrawingTool.ElliottWaves]: {\r\n id: DrawingTool.ElliottWaves,\r\n title: 'Elliott waves',\r\n icon: 'toolElliottWave',\r\n },\r\n [DrawingTool.FibonacciRetracements]: {\r\n id: DrawingTool.FibonacciRetracements,\r\n title: 'Fibonacci retracements',\r\n icon: 'toolFibonacci',\r\n },\r\n [DrawingTool.Position]: {\r\n id: DrawingTool.Position,\r\n title: 'Position',\r\n icon: 'toolPosition',\r\n },\r\n [DrawingTool.Callout]: {\r\n id: DrawingTool.Callout,\r\n title: 'Callout',\r\n icon: 'toolCallout',\r\n },\r\n}\r\n\r\nexport const toolbarDrawingTools: Array = [\r\n {\r\n defaultItem: drawingTools[DrawingTool.Mouse],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Measure],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.ScaledLine],\r\n toolGroup: [\r\n drawingTools[DrawingTool.ScaledLine],\r\n drawingTools[DrawingTool.VerticalLine],\r\n drawingTools[DrawingTool.HorizontalLine],\r\n drawingTools[DrawingTool.Curve],\r\n ],\r\n toolGroupTitle: 'Line tools',\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Arrow],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Rectangle],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.RotatedRectangle],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Triangle],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Ellipse],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Polygon],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Xabcd],\r\n toolGroup: [drawingTools[DrawingTool.Xabcd], drawingTools[DrawingTool.Pitchfork]],\r\n toolGroupTitle: 'XABCD tools',\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.ScaledText],\r\n toolGroup: [drawingTools[DrawingTool.ScaledText], drawingTools[DrawingTool.Callout]],\r\n toolGroupTitle: 'Text tools',\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Brush],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.ElliottWaves],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.FibonacciRetracements],\r\n },\r\n {\r\n defaultItem: drawingTools[DrawingTool.Position],\r\n },\r\n]\r\n","import { Toolbar as ToolbarComponent, ToolbarDivider, ToolbarGroupProps, ToolbarItem } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { PaneArea } from '../../../types/shared'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { drawingCreatorsAsyncModule } from '../../creators/async-modules'\r\nimport { ElementStyleDialogContext } from '../../modals/element_style'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport PaneModel from '../../models/pane'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\r\nimport { getToolbarDrawingActions } from './drawingActions'\r\nimport { getToolbarDrawingSettings } from './drawingSettings'\r\nimport { drawingTools, toolbarDrawingTools } from './drawingTools'\r\nimport { DrawingSetting, DrawingTool, IToolBarProps } from './interfaces'\r\n\r\nexport const DISABLED_ITEM_TOOLTIP_LABEL = \"Disabled due 'lock/hide' drawings active\"\r\n\r\nexport default function Toolbar({\r\n isSidebar,\r\n isHorizontal,\r\n isMobileOverlay,\r\n activeTool,\r\n chartLayoutModel,\r\n onActiveToolChange,\r\n onDrawingActionClick,\r\n onDrawingSettingClick,\r\n onDrawingEnd,\r\n drawingSettings,\r\n isAlternativeTheme,\r\n areToolsDisabled,\r\n}: IToolBarProps) {\r\n const [drawingCreatorsModule, { isLoading: isDrawingCreatorsModuleLoading }] = useAsyncModule({\r\n ...drawingCreatorsAsyncModule,\r\n shouldLoadModule: true,\r\n })\r\n const { autoSaveState } = useModelState(\r\n React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel]),\r\n { watchProperties: ['autoSaveState'] }\r\n )\r\n const [isDrawing, setIsDrawing] = React.useState(false)\r\n const openElementStyleDialog = React.useContext(ElementStyleDialogContext)\r\n\r\n const availableDrawingSettings = getToolbarDrawingSettings({\r\n isPreserveDrawingsAndAutosaveAvailable: getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel),\r\n isAutoSaveInProgress: autoSaveState === AutoSaveState.Saving,\r\n isIdea: !!chartLayoutModel.idea?.id,\r\n })\r\n\r\n const availableDrawingActions = getToolbarDrawingActions({\r\n isAutoSaveActive: autoSaveState !== AutoSaveState.Off,\r\n isAddNoteAvailable: chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage,\r\n isIdea: !!chartLayoutModel.idea?.id,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!drawingCreatorsModule) {\r\n return\r\n }\r\n\r\n const onMouseDown = (model: PaneModel, area: PaneArea & { isTouch: boolean }) => {\r\n const isDrawingModeContinuous = drawingSettings[DrawingSetting.DrawingModeContinuous]\r\n const hasData = model.chart().quote().close.length > 0\r\n const hasHiddenDrawings = drawingSettings[DrawingSetting.HideDrawings]\r\n const tool = drawingTools[activeTool].id\r\n\r\n if (tool === DrawingTool.Mouse || isDrawing || hasHiddenDrawings || !hasData) {\r\n return\r\n }\r\n\r\n setIsDrawing(true)\r\n const { drawingToolsTouchCreatorsByType, drawingToolsCreatorsByType } = drawingCreatorsModule\r\n const ToolClass = area.isTouch ? drawingToolsTouchCreatorsByType[tool] : drawingToolsCreatorsByType[tool]\r\n const element = model.elements().create({\r\n instance: new ToolClass(area, {}, model, openElementStyleDialog, () => {\r\n if (!isDrawingModeContinuous) {\r\n onActiveToolChange(DrawingTool.Mouse)\r\n }\r\n setIsDrawing(false)\r\n onDrawingEnd?.()\r\n }),\r\n })\r\n element.one('destroy', ({ instance }) => {\r\n if (instance.getIsCreator()) {\r\n setIsDrawing(false)\r\n onDrawingEnd?.()\r\n }\r\n })\r\n\r\n element.trigger('select', element)\r\n }\r\n PaneModel.bind('mousedown', onMouseDown)\r\n return () => {\r\n PaneModel.unbind('mousedown', onMouseDown)\r\n }\r\n }, [\r\n activeTool,\r\n onActiveToolChange,\r\n openElementStyleDialog,\r\n onDrawingEnd,\r\n drawingCreatorsModule,\r\n drawingSettings,\r\n isDrawing,\r\n ])\r\n\r\n return (\r\n \r\n {toolbarDrawingTools.map((item) => {\r\n const isActive = activeTool === item.defaultItem.id || item.toolGroup?.some((tool) => tool.id === activeTool)\r\n const isToolLoading = isDrawingCreatorsModuleLoading && isActive\r\n\r\n return (\r\n \r\n )\r\n })}\r\n \r\n {availableDrawingSettings.map((item) => (\r\n \r\n ))}\r\n {availableDrawingActions.map((item) => (\r\n \r\n ))}\r\n \r\n )\r\n}\r\n","import Toolbar from './toolbar'\r\n\r\nexport default Toolbar\r\n","import { Textarea } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../../types/shared'\r\nimport { useModelState } from '../../../model-hooks/use-model-state'\r\nimport Chart from '../../../models/chart'\r\nimport ChartLayout from '../../../models/chart_layout'\r\nimport { useDrawingAutoSaveControls } from '../../autosave/use-drawing-auto-save-controls'\r\nimport { getElementNoteText, getTickersAndContainerTypesInLayoutModel } from '../../autosave/utils'\r\n\r\ninterface ChartAutoSaveNoteProps {\r\n ticker: string\r\n note: string\r\n onNoteChange: (note: string, ticker: string) => void\r\n}\r\n\r\nfunction ChartAutoSaveNote({ ticker, note, onNoteChange }: ChartAutoSaveNoteProps) {\r\n return (\r\n ) => {\r\n onNoteChange(e.target.value, ticker)\r\n }}\r\n />\r\n )\r\n}\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function ChartAutoSaveNotes({ chartLayoutModel }: Props) {\r\n const { handleAutoSaveNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\r\n const [tickers, setTickers] = React.useState([])\r\n const unwatchedInternalStore = React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel])\r\n const drawingsInternalStore = useModelState(unwatchedInternalStore, { watchProperties: ['elements'] })\r\n\r\n React.useEffect(() => {\r\n // There was no better way how to listen on ticker changes which is necessary for displaying correct text areas\r\n const handleChartChange = () => {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\r\n setTickers(tickers)\r\n }\r\n\r\n Chart.bind('change', handleChartChange)\r\n handleChartChange()\r\n return () => {\r\n Chart.unbind('change', handleChartChange)\r\n }\r\n }, [chartLayoutModel])\r\n\r\n const tickerNoteMap = React.useMemo(() => {\r\n const map: ObjectHash = {}\r\n drawingsInternalStore.elements.forEach((element) => {\r\n if (element.containerType === 'note' && tickers.includes(element.ticker)) {\r\n map[element.ticker] = getElementNoteText(element)\r\n }\r\n })\r\n\r\n return map\r\n }, [drawingsInternalStore.elements, tickers])\r\n\r\n return (\r\n

\r\n {tickers.map((ticker) => (\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport ChartLayout from '../../../models/chart_layout'\r\nimport { ChartAutoSaveNotes } from './auto-save-notes'\r\n\r\ninterface INoteDialog {\r\n state: DialogStateReturn\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function AutoSaveNotesDialog({ state, chartLayoutModel }: INoteDialog) {\r\n const isOpen = state.useState('open')\r\n const isAnimating = state.useState('animating')\r\n const isFullyClosed = !isOpen && !isAnimating\r\n\r\n return (\r\n \r\n Notes\r\n {!isFullyClosed && }\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ConfirmationDialog as ConfirmationDialogComponent,\r\n DialogDismiss,\r\n DialogStateReturn,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nconst getDialogContent = ({\r\n isAutosaveDialogContent,\r\n tickers,\r\n}: {\r\n isAutosaveDialogContent: boolean\r\n tickers: string[]\r\n}) => {\r\n if (isAutosaveDialogContent) {\r\n return {\r\n title: 'Remove all autosaved drawings?',\r\n message: (\r\n <>\r\n Do you really want to remove all autosaved drawings? This action is irreversible and will remove all\r\n non-idea drawings for {tickers.join(', ')}.\r\n \r\n ),\r\n }\r\n }\r\n return {\r\n title: 'Remove all drawings?',\r\n message: `Do you really want to remove all drawings? This action only affects the current page and visible tickers. This action doesn't remove autosaved drawings or ideas.`,\r\n }\r\n}\r\n\r\nexport interface IConfirmationDialog {\r\n state: DialogStateReturn\r\n onAction: () => void\r\n onCancel?: () => void\r\n isAutosaveDialogContent: boolean\r\n tickers: string[]\r\n}\r\n\r\nexport function ConfirmationDialog({\r\n state,\r\n onAction,\r\n onCancel,\r\n isAutosaveDialogContent = false,\r\n tickers,\r\n}: IConfirmationDialog) {\r\n const dialogContent = getDialogContent({ isAutosaveDialogContent, tickers })\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n }\r\n >\r\n {dialogContent.message}\r\n \r\n )\r\n}\r\n","import { Button, Icon } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { drawingTools } from '../drawingTools'\r\nimport { DrawingTool } from '../interfaces'\r\n\r\ntype ToolButtonProps = {\r\n onClick: () => void\r\n activeTool: DrawingTool\r\n}\r\n\r\nexport default function ToolButton({ activeTool, onClick }: ToolButtonProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import { Button } from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SIDEBAR_QUERY_PARAM } from '../../sidebar/sidebar'\r\nimport { MOBILE_TOOLBAR_DIV_ID } from '../../sidebar/sidebar-tabs'\r\nimport { DrawingActions, DrawingTool, IToolBarProps } from '../interfaces'\r\nimport Toolbar from '../toolbar'\r\nimport ToolButton from './tool-button'\r\n\r\ntype ToolbarMobileProps = Omit\r\n\r\nexport default function ToolbarMobile({\r\n activeTool,\r\n onActiveToolChange,\r\n onDrawingActionClick,\r\n ...rest\r\n}: ToolbarMobileProps) {\r\n const [isToolbarVisible, setIsToolbarVisible] = React.useState(false)\r\n const [urlSearchParams, setUrlSearchParams] = useSearchParams()\r\n const [toolbarMobileElement, setToolbarMobileElement] = React.useState(null)\r\n\r\n // get toolbar mobile element on first render\r\n React.useEffect(() => {\r\n setToolbarMobileElement(document.getElementById(MOBILE_TOOLBAR_DIV_ID))\r\n }, [])\r\n\r\n const handleActiveToolChange = React.useCallback(\r\n (drawingTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => {\r\n onActiveToolChange(drawingTool, trigger)\r\n\r\n if (trigger !== 'group') return setIsToolbarVisible(false)\r\n },\r\n [onActiveToolChange]\r\n )\r\n\r\n // Hide toolbar on click outside\r\n const wrapperRef = React.useRef(null)\r\n React.useEffect(() => {\r\n if (!isToolbarVisible) return\r\n\r\n function handleClickOutside(event: TouchEvent | MouseEvent) {\r\n // Get the currently open select\r\n const openSelect = document.querySelector('.finviz-popover[data-enter]')\r\n if (wrapperRef.current?.contains(event.target as Node) || openSelect?.contains(event.target as Node)) return\r\n setIsToolbarVisible(false)\r\n }\r\n\r\n document.addEventListener('mousedown', handleClickOutside)\r\n document.addEventListener('touchstart', handleClickOutside)\r\n\r\n return () => {\r\n document.removeEventListener('mousedown', handleClickOutside)\r\n document.removeEventListener('touchstart', handleClickOutside)\r\n }\r\n }, [isToolbarVisible])\r\n\r\n const handleDrawingActionClick = (actionId: DrawingActions) => {\r\n onDrawingActionClick?.(actionId)\r\n setIsToolbarVisible(false)\r\n }\r\n\r\n if (!toolbarMobileElement) return null\r\n\r\n return ReactDOM.createPortal(\r\n <>\r\n \r\n \r\n \r\n {urlSearchParams.has(SIDEBAR_QUERY_PARAM) || activeTool === DrawingTool.Mouse ? (\r\n {\r\n setIsToolbarVisible(true)\r\n setUrlSearchParams((params) => {\r\n params.delete(SIDEBAR_QUERY_PARAM)\r\n return params\r\n })\r\n }}\r\n >\r\n Draw\r\n \r\n ) : (\r\n {\r\n setIsToolbarVisible(true)\r\n }}\r\n />\r\n )}\r\n ,\r\n toolbarMobileElement\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\n\r\ninterface LoadLatestDataButtonProps {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function AutoSaveStateIndicator({ chartLayoutModel }: LoadLatestDataButtonProps) {\r\n const drawingsInternalStoreUnwatched = React.useMemo(\r\n () => chartLayoutModel.drawingsInternalStore(),\r\n [chartLayoutModel]\r\n )\r\n const { autoSaveState } = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['autoSaveState'] })!\r\n const [isVisible, setIsVisible] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (autoSaveState === AutoSaveState.Off) {\r\n return\r\n }\r\n\r\n let setVisibilityTimeout: number | null = null\r\n const newIsVisible = autoSaveState !== AutoSaveState.Saved\r\n\r\n setVisibilityTimeout = window.setTimeout(\r\n () => {\r\n setIsVisible(newIsVisible)\r\n },\r\n newIsVisible ? 0 : 3000\r\n )\r\n\r\n const checkIfNeededPreventLeaving = (event: BeforeUnloadEvent) => {\r\n if (autoSaveState === AutoSaveState.Saved) {\r\n return undefined\r\n }\r\n\r\n const message = `Your latest changes haven't been saved yet. If you leave now, your changes might be lost.`\r\n event.returnValue = message\r\n return message\r\n }\r\n\r\n window.addEventListener('beforeunload', checkIfNeededPreventLeaving)\r\n\r\n return () => {\r\n window.removeEventListener('beforeunload', checkIfNeededPreventLeaving)\r\n if (setVisibilityTimeout) {\r\n clearTimeout(setVisibilityTimeout)\r\n }\r\n }\r\n }, [autoSaveState])\r\n\r\n if (!isVisible) {\r\n return null\r\n }\r\n\r\n // @todo - add proper indicator component here\r\n return null\r\n}\r\n","import { Textarea } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useDrawingAutoSaveControls } from '../autosave/use-drawing-auto-save-controls'\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n ideaNoteRef?: React.RefObject\r\n}\r\n\r\nconst hasRedesign = isRedesignEnabled()\r\n\r\nexport function ChartLayoutAutoSaveNote({ chartLayoutModel: chartLayoutModelUnwatched, ideaNoteRef }: Props) {\r\n const chartLayoutModel = useModelState(chartLayoutModelUnwatched, {\r\n watchProperties: ['idea'],\r\n })!\r\n const { handleIdeaNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\r\n\r\n if (!chartLayoutModel.editable) {\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n {!hasRedesign &&
Note:
}\r\n
\r\n ) => {\r\n handleIdeaNoteChange(e.target.value)\r\n }}\r\n />\r\n
\r\n
\r\n )\r\n}\r\n","import { useDialogState } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface PublishOldButtonClickListenerProps {\r\n isListening: boolean\r\n layoutModel: ChartLayout\r\n}\r\n\r\nexport function getPublishChartHtmlElements() {\r\n const publishChartElements = document.getElementsByClassName('js-publish-chart')\r\n const publishChartHtmlElements = Array.from(publishChartElements) as HTMLElement[]\r\n\r\n return publishChartHtmlElements\r\n}\r\n\r\nfunction getChartImgUrl(index: number) {\r\n const imgElement = document.getElementById(`chart${index}`) as HTMLImageElement | null\r\n return imgElement?.src ?? null\r\n}\r\n\r\nexport function PublishOldButtonClickListener({ isListening, layoutModel }: PublishOldButtonClickListenerProps) {\r\n const dialog = useDialogState()\r\n const isOpen = dialog.useState('open')\r\n const [dialogConfig, setDialogConfig] = React.useState({\r\n isCanvas: true,\r\n chartImgUrl: null as null | string,\r\n timeframe: '',\r\n ticker: '',\r\n })\r\n const [publishModalModule] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: isOpen,\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n\r\n React.useEffect(() => {\r\n const publishChartHtmlElements = getPublishChartHtmlElements()\r\n const clickHandler = (event: MouseEvent) => {\r\n const { index, ticker, timeframe } = (event.currentTarget as HTMLElement).dataset\r\n if (index && ticker && timeframe) {\r\n const indexInt = Number.parseInt(index)\r\n setDialogConfig({\r\n ticker,\r\n timeframe,\r\n isCanvas: indexInt === 0,\r\n chartImgUrl: indexInt > 0 ? getChartImgUrl(indexInt) : null,\r\n })\r\n dialog.show()\r\n }\r\n }\r\n\r\n if (isListening) {\r\n publishChartHtmlElements.forEach((el) => {\r\n el.addEventListener('click', clickHandler)\r\n })\r\n }\r\n\r\n return () => {\r\n publishChartHtmlElements.forEach((el) => {\r\n el.removeEventListener('click', clickHandler)\r\n })\r\n }\r\n }, [dialog, isListening])\r\n\r\n return PublishDialog ? : null\r\n}\r\n","import {\r\n Button,\r\n Dialog,\r\n DialogBody,\r\n DialogDismiss,\r\n DialogFooter,\r\n DialogHeader,\r\n DialogStateReturn,\r\n Paragraph,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nexport enum IdeaDrawingsConfirmationOptions {\r\n Merge,\r\n Override,\r\n Nothing,\r\n Cancel,\r\n}\r\n\r\ninterface IIdeaLeaveDialog {\r\n state: DialogStateReturn\r\n actionCallback: (action: IdeaDrawingsConfirmationOptions) => void\r\n}\r\n\r\nexport function IdeaLeaveDialog({ state, actionCallback }: IIdeaLeaveDialog) {\r\n return (\r\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)} />}\r\n >\r\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}>\r\n You’re About to Leave your Idea\r\n \r\n \r\n
\r\n What would you like to do with the drawings from your current Idea?\r\n \r\n Replace Drawings\r\n
\r\n Your Autosaved Drawings for this ticker will be deleted, and the Idea Drawings will be copied to the live\r\n chart.\r\n
\r\n \r\n Combine Drawings\r\n
\r\n The Idea Drawings will be copied to the live chart without changing the positions or settings of any\r\n Autosaved Drawings. This may cause duplicates if some drawings were also autosaved.\r\n
\r\n \r\n Do Nothing\r\n
\r\n Close the idea without changing any Autosaved Drawings.\r\n
\r\n
\r\n
\r\n \r\n actionCallback(IdeaDrawingsConfirmationOptions.Override)}\r\n >\r\n Replace\r\n \r\n actionCallback(IdeaDrawingsConfirmationOptions.Merge)}\r\n >\r\n Combine\r\n \r\n actionCallback(IdeaDrawingsConfirmationOptions.Nothing)}\r\n >\r\n Do Nothing\r\n \r\n \r\n \r\n )\r\n}\r\n","import { useDialogState, useTrackPageView } from '@finviz/website'\r\nimport * as dateFns from 'date-fns'\r\nimport React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport {\r\n ChartElementType,\r\n ChartsOrQuotePageQueryParams,\r\n ChartsPageQueryParams,\r\n QuotePageQueryChartTypes,\r\n QuotePageQueryParams,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport { getRawTickerForInstrument } from '../../models/utils'\r\nimport utils from '../../utils'\r\nimport { getInstrument, handleTypeChange } from '../../utils/chart'\r\nimport { getUuid } from '../../utils/helpers'\r\nimport { initHlc } from '../../utils/hlc'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport { IdeaLeaveDialog } from '../autosave/idea-leave-dialog'\r\nimport { IdeaDrawingsConfirmationOptions } from '../autosave/idea-leave-dialog'\r\nimport { useDrawingAutoSaveApi } from '../autosave/use-drawing-autosave-api'\r\nimport { getTickersAndContainerTypesInLayoutModel, handleCallMethodOnAllDrawings } from '../autosave/utils'\r\nimport { getChartElementTypeFromResponseType } from '../utils'\r\n\r\nconst getChartElementTypeFromQueryType = (queryType: QuotePageQueryChartTypes | null) => {\r\n switch (queryType) {\r\n case QuotePageQueryChartTypes.l:\r\n return ChartElementType.LineChart\r\n case QuotePageQueryChartTypes.hc:\r\n return ChartElementType.HollowCandleStick\r\n case QuotePageQueryChartTypes.ha:\r\n return ChartElementType.HeikinAshi\r\n case QuotePageQueryChartTypes.o:\r\n return ChartElementType.OhlcChart\r\n case QuotePageQueryChartTypes.p:\r\n return ChartElementType.PerfChart\r\n case QuotePageQueryChartTypes.c:\r\n case QuotePageQueryChartTypes.cs:\r\n return ChartElementType.CandleStick\r\n default:\r\n return (\r\n getChartElementTypeFromResponseType(window.FinvizSettings?.TA?.style ?? null) ?? ChartElementType.CandleStick\r\n )\r\n }\r\n}\r\n\r\nconst useChartRouteChange = (chartLayoutModel: ChartLayoutModel | null) => {\r\n useTrackPageView({ trackInitial: false })\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const { deleteAllDrawings } = useDrawingAutoSaveApi()\r\n const dialog = useDialogState()\r\n const isIdeasDialogOpen = dialog.useState('open')\r\n\r\n const isQuotePage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isChartPage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(chartLayoutModel?.specificChartFunctionality as SpecificChartFunctionality)\r\n\r\n React.useEffect(() => {\r\n if (isChartPage) {\r\n utils.setCookie(\r\n 'chartsUrl',\r\n `?${encodeQueryString({ ...decodeQueryString(location.search), i: undefined, settings: undefined })}`,\r\n dateFns.add(new Date(), { months: 1 })\r\n )\r\n }\r\n }, [isChartPage, location.search])\r\n\r\n React.useEffect(() => {\r\n const decodedQueryString = decodeQueryString(location.search)\r\n // We can navigate to idea chart without a refresh e.g. using browser back button\r\n // It breaks charts because we don't have idea data & idea quote anymore\r\n // So if we end up on a page with idea in the url and we don't have any idea data in chartLayout model we'll refresh the page\r\n if (chartLayoutModel && decodedQueryString.i && !chartLayoutModel.idea?.id) {\r\n window.location.reload()\r\n }\r\n // No need to have chartLayoutModel as dependecny here , I'm only interested in idea on the model\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [location.search, chartLayoutModel?.idea?.id])\r\n\r\n const updateChartConfig = React.useCallback(() => {\r\n if (!chartLayoutModel) return\r\n\r\n const decodedSearch = decodeQueryString(location.search)\r\n\r\n const urlType = (decodedSearch as QuotePageQueryParams).ty ?? null\r\n handleTypeChange({\r\n type: getChartElementTypeFromQueryType(urlType),\r\n chartLayoutModel,\r\n })\r\n\r\n if (isChartPage && chartLayoutModel.layout !== (decodedSearch as ChartsPageQueryParams).l) {\r\n chartLayoutModel.updateAttributes({ layout: (decodedSearch as ChartsPageQueryParams).l })\r\n }\r\n\r\n chartLayoutModel.getAllCharts().forEach((chartModel, chartIndex) => {\r\n const urlTicker = decodedSearch.t.split(',')[chartIndex] ?? null\r\n const urlTimeframe = decodedSearch.p?.split(',')[chartIndex] ?? null\r\n const urlDateRange = decodedSearch.r?.split(',')[chartIndex] ?? null\r\n const upperCaseTicker = urlTicker?.toUpperCase()\r\n\r\n /**\r\n * Only Charts page charts can change instruments. Other pages need forced\r\n * instrument because we might not be able to guess it from urlTicker\r\n */\r\n let instrument = getInstrument(upperCaseTicker)\r\n if (chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage) {\r\n instrument = chartModel.instrument\r\n }\r\n\r\n const newChartConfig = {\r\n instrument,\r\n ticker: getRawTickerForInstrument(instrument, upperCaseTicker),\r\n timeframe: urlTimeframe,\r\n dateRange: urlDateRange,\r\n }\r\n\r\n if (Object.entries(newChartConfig).some(([key, value]) => chartModel[key as keyof Chart] !== value)) {\r\n chartModel.updateAttributesAndSync(newChartConfig)\r\n }\r\n })\r\n }, [chartLayoutModel, location.search, isChartPage])\r\n\r\n React.useEffect(() => {\r\n const decodedSearch = decodeQueryString(location.search)\r\n\r\n if (\r\n !chartLayoutModel ||\r\n !decodedSearch.p ||\r\n !decodedSearch.t ||\r\n !(isQuotePage || isChartPage || isFuturesForexCryptoPage)\r\n ) {\r\n if (!decodedSearch.p && isQuotePage) {\r\n navigate(\r\n {\r\n search: `?${encodeQueryString({\r\n ...decodedSearch,\r\n p: window.FinvizSettings.defaultPeriod ?? TIMEFRAME.d,\r\n r: window.FinvizSettings.defaultDateRange,\r\n })}`,\r\n },\r\n {\r\n replace: true,\r\n }\r\n )\r\n }\r\n return\r\n }\r\n if (chartLayoutModel.idea?.id && isIdeasDialogOpen) {\r\n dialog.hide()\r\n }\r\n\r\n if (!decodedSearch.i && chartLayoutModel.idea?.id) {\r\n const urlTicker = decodedSearch.t.split(',')\r\n const isSameTicker = chartLayoutModel\r\n .getAllCharts()\r\n .every((chart, i) => chart.getQuoteRawTicker() === urlTicker[i])\r\n\r\n if (isSameTicker && window.FinvizSettings.hasUserPremium && chartLayoutModel.isPreserveDrawingsActive) {\r\n dialog.show()\r\n return\r\n }\r\n if (!chartLayoutModel.isPreserveDrawingsActive || !isSameTicker) {\r\n handleCallMethodOnAllDrawings({ chartLayoutModel, elementMethod: 'destroyCascade' })\r\n }\r\n chartLayoutModel.exitIdea()\r\n }\r\n updateChartConfig()\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n location.search,\r\n navigate,\r\n chartLayoutModel,\r\n isQuotePage,\r\n isChartPage,\r\n isFuturesForexCryptoPage,\r\n updateChartConfig,\r\n ])\r\n\r\n const handleIdeaLeave = React.useCallback(\r\n async (action: IdeaDrawingsConfirmationOptions) => {\r\n if (!chartLayoutModel) return\r\n if (action === IdeaDrawingsConfirmationOptions.Cancel) {\r\n navigate(-1)\r\n return\r\n }\r\n switch (action) {\r\n case IdeaDrawingsConfirmationOptions.Merge: {\r\n handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod: 'refreshElementId',\r\n })\r\n break\r\n }\r\n case IdeaDrawingsConfirmationOptions.Override: {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\r\n await deleteAllDrawings({ tickers, lastLocalChange: initHlc(getUuid(), Date.now()) })\r\n break\r\n }\r\n case IdeaDrawingsConfirmationOptions.Nothing: {\r\n handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod: 'destroyCascade',\r\n })\r\n break\r\n }\r\n default:\r\n break\r\n }\r\n chartLayoutModel.exitIdea()\r\n updateChartConfig()\r\n },\r\n [chartLayoutModel, updateChartConfig, deleteAllDrawings, navigate]\r\n )\r\n\r\n return {\r\n dialog,\r\n handleIdeaLeave,\r\n }\r\n}\r\n\r\nfunction getChartLayoutWithChartRouteChange

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

\r\n) {\r\n // Chart layout is used in ReactRouter context and also outside of RR context\r\n // if we use RR hooks outside the context it will crash so this function will return different component for quote & chart pages than for other usecases\r\n const ChartLayoutComponent = getChartLayoutWithChartRouteChange(Component)\r\n return function WrappedComponent(props: P) {\r\n const { ty } = decodeQueryString()\r\n const isChartPage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isQuotePage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(props.chartLayoutModel.specificChartFunctionality)\r\n if (isChartPage || (isQuotePage && ty !== 'p') || isFuturesForexCryptoPage) {\r\n return \r\n }\r\n\r\n return \r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { ChartGrid, ChartGridCell, DialogStateReturn } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport flowRight from 'lodash.flowright'\r\nimport merge from 'lodash.merge'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport {\r\n ChartConfigObject,\r\n DrawingSpineOptionsEvent,\r\n IIdea,\r\n RootChartConfigObject,\r\n RootChartConfigObjectChart,\r\n} from '../../../types/shared'\r\nimport { ChartEditorEnum, LAYOUTS, LayoutType, SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport ElementModel from '../../models/element'\r\nimport utils, {\r\n getChartsDimensions,\r\n getFullscreenStatus,\r\n getIsMobilePortrait,\r\n isRedesignEnabled,\r\n isRedesignedPage,\r\n} from '../../utils'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getIsSidebarEnabled } from '../../utils/chart'\r\nimport fetchApi from '../../utils/fetch_api'\r\nimport { getTickersAndContainerTypesInLayoutModel } from '../autosave/utils'\r\nimport { withDrawingsAutoSave } from '../autosave/with-auto-save'\r\nimport Chart from '../chart'\r\nimport { SidebarDirection } from '../sidebar/constants'\r\nimport { Sidebar } from '../sidebar/sidebar'\r\nimport Toolbar from '../toolbar'\r\nimport { AutoSaveNotesDialog } from '../toolbar/auto-save-notes'\r\nimport { ConfirmationDialog } from '../toolbar/confirmation_dialog'\r\nimport { DrawingActions, DrawingSetting, DrawingTool } from '../toolbar/interfaces'\r\nimport ToolbarMobile from '../toolbar/mobile/toolbar-mobile'\r\nimport { withDialogState } from '../with_dialog_state_hook'\r\nimport { AutoSaveStateIndicator } from './auto-save-state-indicator'\r\nimport { ChartLayoutAutoSaveNote } from './chart-layout-auto-save-note'\r\nimport { PublishOldButtonClickListener, getPublishChartHtmlElements } from './publish_old_button_click_listener'\r\nimport { withChartPageTitle } from './with-chart-page-title'\r\nimport { withChartRouteChange } from './with-chart-route-change'\r\nimport { withCompleteLayoutModelInit } from './with-complete-layout-model-init'\r\nimport { withIdeaModelState } from './with-idea-model-state'\r\nimport { withQuoteCacheManagement } from './with-quote-cache-management'\r\nimport { withQuotePolling } from './with-quote-polling'\r\n\r\ninterface ChartLayoutComponentProps {\r\n config: RootChartConfigObject\r\n confirmationDialogState: DialogStateReturn\r\n noteDialogState: DialogStateReturn\r\n shouldResize?: boolean\r\n chartLayoutModel: ChartLayoutModel\r\n idea?: IIdea\r\n deleteAllAutoSavedElements: () => void\r\n isAutoSaveActive: boolean\r\n}\r\n\r\ninterface ChartLayoutComponentState {\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n layout: LayoutType\r\n activeChartInteraction: string | null\r\n touchEventsDisabled: boolean\r\n isToolbarHorizontal: boolean\r\n activeTool: DrawingTool\r\n drawingSettings: Record\r\n}\r\n\r\nclass ChartLayoutComponentBase extends React.Component {\r\n // expects config, bindPublic\r\n model: ChartLayoutModel\r\n isMobile = Boolean(utils.isMobile(true))\r\n charts: Array<{ model: ChartModel; config: RootChartConfigObjectChart }>\r\n orientationChangeTimeout: number | undefined\r\n preserveDrawingAbortController = new AbortController()\r\n\r\n constructor(props: ChartLayoutComponentProps) {\r\n super(props)\r\n\r\n this.model = props.chartLayoutModel\r\n const config = props.config\r\n\r\n this.charts = []\r\n for (const chartConfig of config.charts) {\r\n const modelProperties: Partial = merge({}, chartConfig)\r\n\r\n modelProperties.chart_layout = this.model\r\n delete modelProperties.panes\r\n if (modelProperties.zoomFactor == null) {\r\n modelProperties.zoomFactor = this.model.defaultZoomFactor\r\n }\r\n if (modelProperties.refreshData == null) {\r\n modelProperties.refreshData = true\r\n }\r\n if (!modelProperties.dateRange) {\r\n modelProperties.dateRange = null\r\n }\r\n modelProperties.isHideDrawingsActive = this.model.isHideDrawingsActive\r\n modelProperties.isScrolled = false\r\n const model = this.model.charts().create(modelProperties)\r\n this.charts.push({ model, config: chartConfig })\r\n }\r\n this.model.updateAttribute('activeChart', this.model.charts().first())\r\n\r\n this.state = {\r\n editable: this.model.editable,\r\n editors: this.model.editors,\r\n layout: this.model.layout,\r\n activeChartInteraction: null,\r\n activeTool: DrawingTool.Mouse,\r\n touchEventsDisabled: false,\r\n isToolbarHorizontal: true,\r\n drawingSettings: {\r\n [DrawingSetting.DrawingModeContinuous]: false,\r\n [DrawingSetting.PreserveDrawings]: this.handleInitialPreserveDrawingsState(),\r\n [DrawingSetting.HideDrawings]: false,\r\n [DrawingSetting.LockDrawings]: false,\r\n },\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n if (this.state.editable) {\r\n const DELETE = 46\r\n window.addEventListener('keyup', (e) => {\r\n const selected = this.model.getPaneWithSelection()\r\n if (e.keyCode === DELETE && selected) {\r\n const element = ElementModel.findByAttribute('instance', selected.selection)\r\n if (element) {\r\n const elementPane = element.pane()\r\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n elementPane.normalizeZIndexes()\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (this.isMobile) {\r\n this.model.settings.ThumbSettings.size = this.model.settings.ThumbSettings.touchSize\r\n }\r\n\r\n this.onModelChange()\r\n\r\n this.model.bind('change', this.onModelChange)\r\n this.model.charts().bind('destroy', this.onChartDestroy)\r\n\r\n this.setToolbarPosition()\r\n window.addEventListener('resize', this.onWindowResize)\r\n window.addEventListener('orientationchange', this.handleOrientationChange)\r\n\r\n if (this.isMobile) {\r\n this.checkTouchEventsDisabled()\r\n window.addEventListener('touchend', this.checkTouchEventsDisabled)\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly): void {\r\n if (prevProps.idea && !this.props.idea) {\r\n if (this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n this.onWindowResize()\r\n }\r\n document.querySelector('#idea-title-container')?.remove()\r\n }\r\n\r\n this.setToolbarPosition()\r\n }\r\n\r\n componentWillUnmount() {\r\n this.preserveDrawingAbortController.abort()\r\n this.model.unbind('change', this.onModelChange)\r\n\r\n window.removeEventListener('resize', this.onWindowResize)\r\n window.removeEventListener('orientationchange', this.handleOrientationChange)\r\n\r\n if (this.isMobile) {\r\n window.removeEventListener('touchend', this.checkTouchEventsDisabled)\r\n }\r\n\r\n clearTimeout(this.orientationChangeTimeout)\r\n this.throttledResize.cancel()\r\n this.model.destroyCascade()\r\n }\r\n\r\n handleInitialPreserveDrawingsState = () => {\r\n let preserveDrawings = false\r\n if (getIsPreserveDrawingsAndAutosaveAvailable(this.model)) {\r\n if (window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings] !== undefined) {\r\n preserveDrawings = window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings]\r\n } else {\r\n this.handlePreserveDrawingsSettings()\r\n }\r\n }\r\n this.model.updateAttribute('isPreserveDrawingsActive', preserveDrawings)\r\n return preserveDrawings\r\n }\r\n\r\n handlePreserveDrawingsSettings = async (value?: boolean) => {\r\n const setPreserveDrawings = (val: boolean) => {\r\n this.model.updateAttribute('isPreserveDrawingsActive', val)\r\n this.setState((prevState) => ({\r\n drawingSettings: {\r\n ...prevState.drawingSettings,\r\n [DrawingSetting.PreserveDrawings]: val,\r\n },\r\n }))\r\n }\r\n\r\n try {\r\n this.preserveDrawingAbortController.abort()\r\n this.preserveDrawingAbortController = new AbortController()\r\n const response = await fetchApi({\r\n location: '/api/tools_state.ashx',\r\n method: value !== undefined ? 'POST' : 'GET',\r\n body:\r\n value !== undefined\r\n ? new URLSearchParams({ tools_state: JSON.stringify({ [DrawingSetting.PreserveDrawings]: value }) })\r\n : undefined,\r\n throwOnStatusCodes: [404],\r\n abortController: this.preserveDrawingAbortController,\r\n })\r\n\r\n if (value === undefined && response?.[DrawingSetting.PreserveDrawings] !== undefined) {\r\n setPreserveDrawings(response[DrawingSetting.PreserveDrawings])\r\n }\r\n } catch {\r\n if (value !== undefined) {\r\n setPreserveDrawings(!value)\r\n }\r\n }\r\n }\r\n\r\n handleOrientationChange = () => {\r\n this.orientationChangeTimeout = window.setTimeout(() => {\r\n this.setToolbarPosition()\r\n if (this.props.shouldResize) {\r\n this.handleResize()\r\n }\r\n })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.setToolbarPosition()\r\n\r\n if (this.props.shouldResize) {\r\n this.throttledResize()\r\n }\r\n }\r\n\r\n handleResize = () => {\r\n const modelAttrs: Partial = getChartsDimensions(this.model.getHTMLElementId())\r\n this.model.updateAttributes(modelAttrs)\r\n }\r\n\r\n throttledResize = throttle(this.handleResize, 200)\r\n\r\n setToolbarPosition() {\r\n // quote page toolbar\r\n // 210px represents: (20px (toolbar left margin) + 80px (toolbar width) + 5px (toolbar rigth margin)) * 2 (both sides of chart)\r\n const newIsToolbarHorizontal = this.model.width + 210 > window.innerWidth || window.innerWidth < 1000\r\n if (newIsToolbarHorizontal !== this.state.isToolbarHorizontal) {\r\n this.setState({\r\n isToolbarHorizontal: newIsToolbarHorizontal,\r\n })\r\n }\r\n }\r\n\r\n checkTouchEventsDisabled = () => {\r\n if (!/\\bcharts\\b/.test(window.location.pathname) || getFullscreenStatus() || this.getVisualViewportScale() === 1) {\r\n this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: false })\r\n } else {\r\n !this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: true })\r\n }\r\n }\r\n\r\n getVisualViewportScale = () => {\r\n if (process.env.IS_E2E_TESTING) {\r\n return 1\r\n }\r\n if (window.visualViewport && this.isMobile) {\r\n return window.visualViewport.scale\r\n } else {\r\n return 1\r\n }\r\n }\r\n\r\n handleActiveToolChange = (activeTool: DrawingTool) => {\r\n if (!this.model.isLockDrawingsActive) {\r\n this.setState({ activeTool })\r\n }\r\n }\r\n\r\n handleDrawingAction = (actionId: DrawingActions) => {\r\n switch (actionId) {\r\n case DrawingActions.AddNote:\r\n this.props.noteDialogState.toggle()\r\n break\r\n case DrawingActions.DeleteDrawings:\r\n case DrawingActions.DeleteAutoSavedDrawings:\r\n this.props.confirmationDialogState.show()\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n handleConfirmationDialogDeleteBtn = () => {\r\n if (this.model.drawingsInternalStore().autoSaveState !== AutoSaveState.Off) {\r\n this.props.deleteAllAutoSavedElements()\r\n }\r\n this.model.getAllElements().forEach((element) => {\r\n if (element.isDrawing()) {\r\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n const drawingToRemove = this.model\r\n .drawingsInternalStore()\r\n .elements.find(({ elementId }) => elementId === element.id)\r\n if (drawingToRemove) {\r\n drawingToRemove.changeType = 'destroy'\r\n }\r\n }\r\n })\r\n this.props.confirmationDialogState.hide()\r\n }\r\n\r\n handleDrawingsSetting = (settingId: DrawingSetting) => {\r\n const newObj = { ...this.state.drawingSettings, [settingId]: !this.state.drawingSettings[settingId] }\r\n\r\n switch (settingId) {\r\n case DrawingSetting.HideDrawings:\r\n this.handleActiveToolChange(DrawingTool.Mouse)\r\n this.toggleHideDrawings(newObj[DrawingSetting.HideDrawings])\r\n this.handleLockDrawings(newObj)\r\n break\r\n case DrawingSetting.PreserveDrawings:\r\n this.handlePreserveDrawingsSettings(newObj[DrawingSetting.PreserveDrawings])\r\n this.model.updateAttribute('isPreserveDrawingsActive', newObj[DrawingSetting.PreserveDrawings])\r\n break\r\n case DrawingSetting.LockDrawings:\r\n this.handleActiveToolChange(DrawingTool.Mouse)\r\n this.handleLockDrawings(newObj)\r\n break\r\n case DrawingSetting.DrawingModeContinuous:\r\n this.model.updateAttribute('isDrawingModeContinuousActive', newObj[DrawingSetting.DrawingModeContinuous])\r\n newObj[DrawingSetting.DrawingModeContinuous] === false && this.handleActiveToolChange(DrawingTool.Mouse)\r\n break\r\n default:\r\n break\r\n }\r\n\r\n this.setState({ drawingSettings: newObj })\r\n window.gtag?.('event', 'drawings_settings_toggle', {\r\n event_category: newObj[settingId] ? 'enable' : 'disable',\r\n event_label: settingId,\r\n })\r\n }\r\n\r\n handleLockDrawings = (drawingSettings: Record) => {\r\n this.model.updateAttribute(\r\n 'isLockDrawingsActive',\r\n !(!drawingSettings[DrawingSetting.HideDrawings] && !drawingSettings[DrawingSetting.LockDrawings])\r\n )\r\n }\r\n\r\n toggleHideDrawings(value: boolean) {\r\n this.model.updateAttribute('isHideDrawingsActive', value)\r\n this.model.getAllCharts().forEach((chart) => chart.updateAttribute('isHideDrawingsActive', value))\r\n }\r\n\r\n renderToolbar(args: any) {\r\n const { activeTool, drawingSettings } = this.state\r\n return args.isOverlayToolbar ? (\r\n \r\n ) : (\r\n \r\n )\r\n }\r\n\r\n render() {\r\n const { newCharts, useGrid } = this.props.config\r\n const { activeTool, editable, editors, isToolbarHorizontal } = this.state\r\n const publish = editors.includes(ChartEditorEnum.publish) && getPublishChartHtmlElements().length > 0\r\n const chartLayout = LAYOUTS[this.model.layout]\r\n const isMobilePortrait = getIsMobilePortrait(this.isMobile)\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(this.model)\r\n\r\n if (newCharts) {\r\n const isSidebarEnabled = getIsSidebarEnabled(SpecificChartFunctionality.chartPage)\r\n return (\r\n <>\r\n

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

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

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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

\r\n) {\r\n return function WrappedComponent(props: P) {\r\n const chartLayoutModel = useModelState(props.chartLayoutModel, { watchProperties: ['idea'] })\r\n return \r\n }\r\n}\r\n","import { NotificationWrapper, withSuspense } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { RootChartConfigObject } from '../../../types/shared'\r\nimport { ElementStyleDialogWrapper } from '../../modals/element_style'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { ChartLayoutComponent } from './chart_layout_component'\r\n\r\ninterface ChartLayoutProps {\r\n config: RootChartConfigObject\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n isWithNotifications?: boolean\r\n}\r\n\r\nexport function ChartLayout({ config, shouldResize, isWithNotifications = true }: ChartLayoutProps) {\r\n const Wrapper = isWithNotifications ? NotificationWrapper : React.Fragment\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport function ChartLayoutWithGlobalStateRaw({\r\n config,\r\n shouldResize,\r\n parentElement,\r\n}: Omit) {\r\n const { setChartLayoutModel, getChartLayoutModelConfig, lastGlobalRerender } = useChartLayoutGlobalModelAsync()\r\n\r\n return (\r\n \r\n {config && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutWithGlobalState = withSuspense(ChartLayoutWithGlobalStateRaw)\r\n","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?: HTMLElement }) {\r\n const [isInit, setIsInit] = React.useState(false)\r\n\r\n /*\r\n * This entire effect is used to check for updates in entire chart layout obj tree.\r\n * Once config object matches object generated from chart layout, the layout model is completely initialised.\r\n *\r\n * We couldn't just add a callback to `componentDidMount` (or equivalent) because its children are rendered asynchronously.\r\n *\r\n * */\r\n React.useEffect(() => {\r\n if (onRegisterChartLayoutModel && chartLayoutModel && !isInit) {\r\n const checkIfInitIsComplete = () => {\r\n const { charts } = chartLayoutModel.toConfig()\r\n const isReady =\r\n charts.length === config.charts.length &&\r\n charts.every(\r\n (chart, chartIndex) =>\r\n chart.panes.length === config.charts[chartIndex].panes.length &&\r\n chart.panes.every(\r\n (pane, paneIndex) =>\r\n pane.elements.length === config.charts[chartIndex].panes[paneIndex].elements.length &&\r\n pane.elements.every(\r\n (element, elementIndex) =>\r\n element.overlays?.length ===\r\n config.charts[chartIndex].panes[paneIndex].elements[elementIndex].overlays?.length\r\n )\r\n )\r\n )\r\n\r\n if (isReady) {\r\n setIsInit(true)\r\n chartLayoutModel.updateAttributes({ isInit: true })\r\n onRegisterChartLayoutModel(chartLayoutModel)\r\n if (parentElement) {\r\n parentElement.style.opacity = 'unset'\r\n parentElement.style.minHeight = 'unset'\r\n parentElement.style.minWidth = 'unset'\r\n }\r\n }\r\n }\r\n\r\n chartLayoutModel.bind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\r\n\r\n checkIfInitIsComplete()\r\n\r\n return () => {\r\n chartLayoutModel.unbind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\r\n }\r\n }\r\n }, [chartLayoutModel, config, isInit, onRegisterChartLayoutModel, parentElement])\r\n\r\n return null\r\n}\r\n\r\nexport const withCompleteLayoutModelInit = (Component: any) => (props: Props) => {\r\n const config = React.useMemo(() => {\r\n const newConfig = merge({}, props.config, {\r\n editable: props.config.editable ?? true,\r\n canChangeTicker: props.config.canChangeTicker ?? true,\r\n scrollable: props.config.scrollable ?? true,\r\n cross: props.config.cross ?? true,\r\n theme:\r\n props.config.theme && [Theme.light, Theme.dark].includes(props.config.theme) ? props.config.theme : Theme.light,\r\n editors: props.config.editors ?? [ChartEditorEnum.publish, ChartEditorEnum.tools, ChartEditorEnum.ideas],\r\n ideas: props.config.ideas ?? true,\r\n specificChartFunctionality: props.config.specificChartFunctionality ?? SpecificChartFunctionality.default,\r\n initialStoreDrawings: [],\r\n })\r\n\r\n if (!newConfig.ideas) {\r\n newConfig.editors = newConfig.editors.filter((x) => x !== 'ideas')\r\n }\r\n\r\n // We need to add these because ideas might not have them and chart controls wouldn’t render properly\r\n if (isRedesignedPage(newConfig, [SpecificChartFunctionality.quotePage])) {\r\n newConfig.editors = newConfig.editors.concat([ChartEditorEnum.settings, ChartEditorEnum.timeframe])\r\n }\r\n\r\n const initialStoreDrawings = getInitialStoreDrawings()?.filter(({ changeType }) => changeType !== 'destroy') ?? []\r\n const isQuotePage = newConfig.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuotePageWithDrawingsOff = isQuotePage && utils.getCookie('charts-draw') !== 'on'\r\n\r\n if (initialStoreDrawings.length === 0 || isQuotePageWithDrawingsOff) {\r\n return newConfig\r\n }\r\n\r\n const noteDrawing = initialStoreDrawings.find(\r\n ({ containerType, ticker }) =>\r\n containerType === 'note' && props.config.charts.some((chart) => chart.ticker === ticker)\r\n )\r\n\r\n const note = noteDrawing && JSON.parse(noteDrawing.elementAttrs)?.text\r\n const ideaObject = isQuotePage && note ? { note } : undefined\r\n\r\n return {\r\n ...newConfig,\r\n initialStoreDrawings,\r\n idea: newConfig.idea ?? ideaObject,\r\n charts: newConfig.charts.map((chart) => {\r\n const { ticker, panes } = chart\r\n return {\r\n ...chart,\r\n panes: panes.map((pane) => {\r\n const containerType = getContainerTypeFromPaneConfig(pane)\r\n const newElements = initialStoreDrawings\r\n .filter(\r\n (drawing) =>\r\n drawing.containerType === containerType &&\r\n drawing.ticker === ticker &&\r\n !pane.elements.some((paneElement) => paneElement.elementId === drawing.elementId)\r\n )\r\n .map(({ elementId, zIndex, elementAttrs }) => ({\r\n elementId,\r\n zIndex,\r\n ...JSON.parse(elementAttrs),\r\n }))\r\n return {\r\n ...pane,\r\n elements: [...pane.elements, ...newElements],\r\n }\r\n }),\r\n }\r\n }),\r\n }\r\n // We need to disable the eslint check because the hook is supposed to run only once on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const chartLayoutModel = React.useMemo(() => {\r\n const settings = getSettings({ ...config, theme: config.theme! })\r\n const chartLayout = ChartLayoutModel.create({\r\n layout: config.layout,\r\n width: config.width,\r\n height: config.height,\r\n editable: config.editable,\r\n canChangeTicker: config.canChangeTicker,\r\n scrollable: config.scrollable,\r\n initialScrollable: config.scrollable,\r\n cross: config.cross,\r\n editors: config.editors,\r\n theme: config.theme,\r\n idea: config.idea,\r\n settings,\r\n isWheelZoomEnabled: config.specificChartFunctionality === SpecificChartFunctionality.chartPage,\r\n specificChartFunctionality: config.specificChartFunctionality,\r\n isHideDrawingsActive: false,\r\n isPreserveDrawingsActive: !!(\r\n getIsPreserveDrawingsAndAutosaveAvailable(config) &&\r\n window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings]\r\n ),\r\n isLockDrawingsActive: false,\r\n uuid: config.uuid,\r\n drawingsInternalStore: DrawingsInternalStore.create({\r\n elements: config.initialStoreDrawings,\r\n }),\r\n })\r\n\r\n chartLayout.updateAttributes({ defaultZoomFactor: getDefaultZoomFactor(chartLayout) })\r\n\r\n return chartLayout\r\n\r\n // We need to disable the eslint check because the hook is supposed to run only once on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return chartLayoutModel ? (\r\n <>\r\n \r\n \r\n \r\n ) : null\r\n}\r\n","import debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../types/shared'\r\nimport { EXTRA_MARKET_BUFFER_MINUTES, QUOTE_FETCH_EVENT } from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport ChartLayoutModel from '../../models/chart_layout'\r\nimport Pane from '../../models/pane'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayoutModel\r\n}\r\n\r\ntype PollingIntervalToChartsType = ObjectHash\r\n\r\n/*\r\n * This HOC loops through all charts and checks if they are supposed to be refetch in some interval\r\n * It creates groups of charts to be refreshed grouped by the refresh interval\r\n * */\r\nexport const withQuotePolling = (Component: any) => (props: Props) => {\r\n const [pollingIntervalToCharts, setPollingIntervalToCharts] = React.useState({})\r\n const checkForChartsWithPolling = React.useCallback(() => {\r\n // check for charts which have some refresh interval and group chart ids by the interval value e.g. { interval_in_ms: [id1, id2] }\r\n const newPollingIntervalToCharts: PollingIntervalToChartsType = {} // example { 60000: ['c-0', 'c-1'], 9000: ['c-4'] }\r\n props.chartLayoutModel.getAllCharts().forEach((chart) => {\r\n const chartRefreshInterval = chart.getRefreshInterval()\r\n\r\n if (chartRefreshInterval) {\r\n newPollingIntervalToCharts[chartRefreshInterval] = newPollingIntervalToCharts[chartRefreshInterval] ?? []\r\n newPollingIntervalToCharts[chartRefreshInterval].push(chart.id)\r\n }\r\n })\r\n\r\n if (JSON.stringify(newPollingIntervalToCharts) !== JSON.stringify(pollingIntervalToCharts)) {\r\n setPollingIntervalToCharts(newPollingIntervalToCharts)\r\n }\r\n }, [props.chartLayoutModel, pollingIntervalToCharts])\r\n const intervalIdsRef = React.useRef([])\r\n\r\n React.useEffect(() => {\r\n const checkForChartsWithPollingDebounced = debounce(checkForChartsWithPolling)\r\n const chartsCheckerIntervalId = window.setInterval(\r\n checkForChartsWithPollingDebounced,\r\n EXTRA_MARKET_BUFFER_MINUTES * 1000\r\n )\r\n\r\n // listen on any changes in all charts & panes and call debounced check for charts/indicators with quotes that needs to be refetched periodically\r\n Chart.bind('change', checkForChartsWithPollingDebounced)\r\n Pane.bind('change', checkForChartsWithPollingDebounced)\r\n\r\n return () => {\r\n checkForChartsWithPollingDebounced.cancel()\r\n Chart.unbind('change', checkForChartsWithPollingDebounced)\r\n Pane.unbind('change', checkForChartsWithPollingDebounced)\r\n window.clearInterval(chartsCheckerIntervalId)\r\n }\r\n }, [checkForChartsWithPolling])\r\n\r\n React.useEffect(() => {\r\n const timeoutDurations = Object.keys(pollingIntervalToCharts).map(Number)\r\n const allCharts = props.chartLayoutModel.getAllCharts()\r\n const timeoutDurationsMin = Math.min(...timeoutDurations)\r\n\r\n timeoutDurations.forEach((duration) => {\r\n const timeoutId = window.setInterval(() => {\r\n const chartIds = pollingIntervalToCharts[duration]\r\n // get all UNIQUE quotes used in charts and refetch them\r\n allCharts\r\n .filter((chart) => chartIds.includes(chart.id))\r\n .flatMap((chart) => chart.getAllQuotes())\r\n .filter(\r\n (quote, index, quotesToUpdate) =>\r\n !quote.isFetching && index === quotesToUpdate.findIndex((quoteToUpdate) => quote.eql(quoteToUpdate))\r\n )\r\n .forEach((quote) => {\r\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\r\n })\r\n if (duration === timeoutDurationsMin) {\r\n document.dispatchEvent(new Event(QUOTE_FETCH_EVENT))\r\n }\r\n }, duration)\r\n intervalIdsRef.current.push(timeoutId)\r\n })\r\n\r\n return () => {\r\n if (intervalIdsRef.current.length > 0) {\r\n intervalIdsRef.current.forEach((timeoutId) => {\r\n window.clearInterval(timeoutId)\r\n })\r\n intervalIdsRef.current = []\r\n }\r\n }\r\n }, [props.chartLayoutModel, pollingIntervalToCharts])\r\n\r\n return \r\n}\r\n","import omit from 'lodash.omit'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash } from '../../../types/shared'\r\nimport { LayoutType } from '../../constants/common'\r\nimport { getTickerNoteText } from '../../controllers/autosave/utils'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\nimport fetchApi, { getFormDataFromObject } from '../../utils/fetch_api'\r\nimport { captureException } from '../../utils/helpers'\r\n\r\nexport interface IIdea {\r\n ticker: string\r\n instrument: string\r\n period: string\r\n company?: string\r\n date: string\r\n time: string\r\n note: string\r\n id: string\r\n}\r\n\r\nexport interface IIdeaCategory {\r\n ticker: string\r\n ideas: IIdea[]\r\n}\r\n\r\nexport function getIdeaUrl({ ticker, instrument, period, id }: Pick) {\r\n const searchObject = { t: ticker, p: period, i: id }\r\n const isStock = instrument === Instrument.Stock\r\n const isQuotePage = /\\/quote\\b/.test(window.location.pathname)\r\n const isStockOnQute = isQuotePage && isStock\r\n const path = !isQuotePage || isStock ? window.location.pathname : '/charts.ashx'\r\n\r\n return `${path}?${queryString.stringify({ ...searchObject, ...(isStockOnQute ? { ta: '2' } : { l: '1h1v' }) })}`\r\n}\r\n\r\nexport async function saveIdea(layoutModel: ChartLayout) {\r\n const activeChart = layoutModel.activeChart\r\n const activeChartQuote = activeChart.quote().toJSON()\r\n const { ticker, instrument, cid } = activeChart\r\n const period = activeChartQuote.timeframe\r\n const { ChartSettings } = layoutModel.settings\r\n const layout: ObjectHash = layoutModel.toObject()\r\n layout.layout = LayoutType['1h1v']\r\n layout.barWidth = ChartSettings.center.barWidth\r\n layout.barMargin = ChartSettings.center.barMargin\r\n layout.charts = layout.charts\r\n .filter((c: ObjectHash) => c.chartId === cid)\r\n .map((c: ObjectHash) => ({ ...c, dateRange: null, refreshData: false }))\r\n\r\n delete layout.charts[0].chartId\r\n\r\n // TODO: replace with better solution after indicators overhaul\r\n const getChartTickers = (layoutModelObjectPanes: { elements: { type: string; tickers: string }[] }[]) => {\r\n let tickers = []\r\n let tickersString = ''\r\n for (const pane of layoutModelObjectPanes) {\r\n for (const element of pane.elements) {\r\n if (element.type === 'indicators/perf') {\r\n tickersString = element.tickers\r\n }\r\n }\r\n }\r\n tickers = tickersString.split(',').filter((item) => item)\r\n if (!tickers.includes(ticker)) {\r\n tickers.push(ticker.replace('@', ''))\r\n }\r\n return tickers\r\n }\r\n const tickers = getChartTickers(layout.charts[0].panes)\r\n const quotes = Quote.select(\r\n (quote: Quote) =>\r\n tickers.includes(quote.ticker) && quote.timeframe === activeChart.timeframe && layoutModel.isIdeaId(quote.ideaID)\r\n ).filter((element, index, array) => array.findIndex((t) => t.ticker === element.ticker) === index)\r\n const quotesJsonString = JSON.stringify(quotes.map((q) => omit(q.toJSON(), ['ideaID', 'chartUuid'])))\r\n\r\n const chart = JSON.stringify(layout)\r\n const note =\r\n layoutModel.idea?.note ||\r\n getTickerNoteText({ ticker, elements: layoutModel.drawingsInternalStore().elements }) ||\r\n ''\r\n window.gtag?.('event', 'save', { event_category: 'ideas' })\r\n\r\n if (tickers.length !== quotes.length) {\r\n captureException(new Error('Idea saved with inconsistent quotes data'), {\r\n extra: {\r\n tickers,\r\n quoteTickersTimeframes: quotes.map((quote) => ({ ticker: quote.ticker, timeframe: quote.timeframe })),\r\n chartLayout: layoutModel.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n }\r\n\r\n const data = await fetchApi<{ id: string }>({\r\n location: '/api/idea_save.ashx',\r\n method: 'POST',\r\n body: getFormDataFromObject({ ticker, period, chart, quotes: quotesJsonString, note }),\r\n })\r\n\r\n const ideaUrl = getIdeaUrl({\r\n ticker,\r\n period,\r\n instrument,\r\n id: data.id,\r\n })\r\n\r\n if (process.env.IS_E2E_TESTING) {\r\n window.location.href = ideaUrl\r\n } else {\r\n // need to be in setTimeout because Safari block any call to window.open made in async,\r\n // this is hack to force run window.open in main thread\r\n setTimeout(() => {\r\n window.open(ideaUrl, 'FinvizSavedIdea')\r\n })\r\n }\r\n}\r\n\r\nexport function categorizeIdeas(ideas: IIdea[], tickers: string[]) {\r\n if (ideas.length <= 0) return []\r\n\r\n const categorizedIdeas = ideas.reduce((processed, idea) => {\r\n const tickerIdeas = processed.find((i) => i.ticker === idea.ticker)\r\n\r\n if (tickerIdeas) {\r\n tickerIdeas.ideas.push(idea)\r\n } else if (tickers.includes(idea.ticker)) {\r\n processed.push({\r\n ticker: idea.ticker,\r\n ideas: [idea],\r\n })\r\n }\r\n\r\n return processed\r\n }, [] as IIdeaCategory[])\r\n categorizedIdeas.unshift({\r\n ticker: 'All Ideas',\r\n ideas: ideas,\r\n })\r\n\r\n return categorizedIdeas\r\n}\r\n","import { Button, Icon, decodeQueryString } from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { ChartsOrQuotePageQueryParams, TIMEFRAME, TimeframeLabelShort } from '../../constants/common'\r\nimport { IIdea, getIdeaUrl } from './utils'\r\n\r\ntype IdeasListProps = {\r\n idea: IIdea\r\n onIdeaDeleted: (idea: IIdea) => void\r\n}\r\n\r\nexport default function IdeaItem({ idea, onIdeaDeleted }: IdeasListProps) {\r\n const [isDeleting, setIsDeleting] = React.useState(false)\r\n const [isConfirmDelete, setIsConfirmDelete] = React.useState(false)\r\n const { i: currentIdea } = decodeQueryString()\r\n\r\n const onDeleteIdeaClick = React.useRef(async (idea: IIdea) => {\r\n setIsDeleting(true)\r\n\r\n let wasDeleted\r\n try {\r\n const response = await fetch(`/api/idea_delete.ashx?id=${idea.id}`, {\r\n method: 'DELETE',\r\n })\r\n\r\n wasDeleted = response.status === 200\r\n } catch {}\r\n\r\n if (!wasDeleted) {\r\n return\r\n }\r\n\r\n if (currentIdea === idea.id.toString()) {\r\n const newUrl = new URL(window.location.href)\r\n newUrl.searchParams.delete('i')\r\n window.location.href = newUrl.href\r\n return\r\n }\r\n\r\n onIdeaDeleted(idea)\r\n })\r\n\r\n return (\r\n (document.location = getIdeaUrl(idea))}\r\n data-testid=\"charts-notice-idea-item\"\r\n >\r\n <>\r\n

\r\n

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

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

{idea.note}

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

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

\r\n
\r\n\r\n
\r\n {\r\n setIsConfirmDelete(false)\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n onDeleteIdeaClick.current(idea)\r\n }}\r\n >\r\n Delete\r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Badge, Tab, TabList, TabPanel, Tabs } from '@finviz/website'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { getInstrument } from '../../utils/chart'\r\nimport fetchApi from '../../utils/fetch_api'\r\nimport IdeaItem from './IdeaItem'\r\nimport { IIdea, IIdeaCategory, categorizeIdeas } from './utils'\r\n\r\nexport default function IdeasTabs() {\r\n const [hasError, setHasError] = React.useState(false)\r\n const [hasFetched, setHasFetched] = React.useState(false)\r\n const [categorizedIdeas, setCategorizedIdeas] = React.useState([])\r\n const [params] = useSearchParams()\r\n const queryTickers = params.get('t')!.split(',') // there always be some t param defined\r\n\r\n React.useEffect(() => {\r\n async function fetchIdeas() {\r\n window.gtag?.('event', 'load', { event_category: 'ideas' })\r\n try {\r\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\r\n const ideas = data.ideas.map((idea: IIdea) => {\r\n const dateParts = idea.date.split(' ')\r\n return {\r\n ...idea,\r\n instrument: getInstrument(idea.ticker),\r\n date: dateParts[0].replace('-', ' ').replace('-', ', '),\r\n time: dateParts[1],\r\n }\r\n })\r\n\r\n setCategorizedIdeas(categorizeIdeas(ideas, queryTickers))\r\n setHasFetched(true)\r\n } catch {\r\n setHasError(true)\r\n }\r\n }\r\n\r\n fetchIdeas()\r\n\r\n // run only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleIdeaDeleted = (idea: IIdea) => {\r\n setCategorizedIdeas((prev) => {\r\n const modifiedCategories = [...prev]\r\n\r\n // remove from specific ticker category\r\n const categoryIndex = modifiedCategories.findIndex((c) => c.ticker === idea.ticker)\r\n if (categoryIndex >= 0) {\r\n const updatedCategory = {\r\n ...modifiedCategories[categoryIndex],\r\n ideas: modifiedCategories[categoryIndex].ideas.filter((i) => i.id !== idea.id),\r\n }\r\n modifiedCategories[categoryIndex] = updatedCategory\r\n }\r\n\r\n // remove from all\r\n const updatedAll = {\r\n ...modifiedCategories[0],\r\n ideas: modifiedCategories[0].ideas.filter((i) => i.id !== idea.id),\r\n }\r\n modifiedCategories[0] = updatedAll\r\n\r\n // remove empty categories\r\n return modifiedCategories.filter((c) => c.ideas.length !== 0)\r\n })\r\n }\r\n\r\n if (!hasFetched || hasError) {\r\n return (\r\n
\r\n {hasError ? 'Unexpected error occurred, please refresh the page.' : 'Loading…'}\r\n
\r\n )\r\n }\r\n\r\n if (categorizedIdeas.length === 0) {\r\n return (\r\n \r\n No saved ideas.\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {categorizedIdeas.map((category) => (\r\n {category.ideas.length}}>\r\n {category.ticker}\r\n \r\n ))}\r\n \r\n {categorizedIdeas.map((category) => (\r\n \r\n
\r\n {category.ideas.map((idea) => (\r\n \r\n ))}\r\n
\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '@finviz/website'\r\n\r\nimport IdeasTabs from './IdeasTabs'\r\n\r\ntype IdeasDialogProps = {\r\n state: DialogStateReturn\r\n}\r\n\r\nexport default function IdeasDialog({ state }: IdeasDialogProps) {\r\n return (\r\n \r\n Your Ideas\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ButtonProps,\r\n Dropdown,\r\n DropdownItem,\r\n Spinner,\r\n Tooltip,\r\n TooltipTrigger,\r\n useDialogState,\r\n useDropdownState,\r\n useTooltipState,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport IdeasDialog from '../../modals/ideas/Ideas'\r\nimport { saveIdea } from '../../modals/ideas/utils'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\nimport { getIsMobileScreenSize } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\ninterface IdeaDropdownProps {\r\n model: ChartLayout\r\n rounding?: 'none' | 'regular'\r\n theme?: ButtonProps['theme']\r\n size?: ButtonProps['size']\r\n dropdownButtonClassName?: string\r\n}\r\n\r\nexport function IdeasDropdown({\r\n model,\r\n rounding,\r\n dropdownButtonClassName,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const tooltipState = useTooltipState({ placement: 'right-start' })\r\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\r\n const ref = React.useRef(null)\r\n const dialog = useDialogState()\r\n const dropdown = useDropdownState()\r\n const hideTooltip = tooltipState.hide\r\n\r\n const dropdownItemProps = isAnyQuoteLoading\r\n ? ({\r\n as: TooltipTrigger,\r\n state: tooltipState,\r\n } as ButtonComponentProps)\r\n : ({} as ButtonComponentProps)\r\n\r\n React.useEffect(() => {\r\n const checkIfAnyQuoteIsLoading = () => {\r\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\r\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\r\n }\r\n\r\n Quote.bind('change', checkIfAnyQuoteIsLoading)\r\n return () => {\r\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (!isAnyQuoteLoading || !dropdown.visible) {\r\n hideTooltip()\r\n }\r\n }, [isAnyQuoteLoading, dropdown.visible, hideTooltip])\r\n\r\n if (!window.FinvizSettings.hasUserPremium) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n }\r\n >\r\n {\r\n if (isAnyQuoteLoading) {\r\n tooltipState.show()\r\n return\r\n }\r\n saveIdea(model)\r\n }}\r\n >\r\n Save idea\r\n \r\n dialog.show()}>\r\n Load idea\r\n \r\n \r\n \r\n {isAnyQuoteLoading && (\r\n \r\n
\r\n \r\n
\r\n \r\n Some data is still loading. Please wait.\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Button, ButtonComponentProps, Delayed, Icon, Spinner, useDialogState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface PublishProps extends Pick {\r\n model: ChartLayout\r\n}\r\n\r\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\r\n const dialog = useDialogState()\r\n const isDialogOpen = dialog.useState('open')\r\n const [publishModalModule, { isLoading }] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: isDialogOpen,\r\n errorSeverity: 'medium',\r\n onError: () => dialog.hide(),\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n\r\n return (\r\n <>\r\n dialog.show()}\r\n leftContent={\r\n isLoading ? (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n 'share'\r\n )\r\n }\r\n />\r\n {PublishDialog && }\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonSizeType,\r\n ButtonThemeType,\r\n Delayed,\r\n Icon,\r\n Spinner,\r\n TourDefinition,\r\n useTour,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\n\r\n// If we need to update / discontinue some tour we can use skip flag on legacy version to ensure that it won't reset users tour but won't include it in new tours\r\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\r\n return [\r\n {\r\n id: 'chart-tour',\r\n steps: [\r\n {\r\n title: 'Chart Tour',\r\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\r\n },\r\n ...(isPremium\r\n ? [\r\n {\r\n title: 'Scale the Timeline',\r\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\r\n },\r\n {\r\n title: 'Scale the Price Axis',\r\n body: 'Grab the Price Axis to zoom it in and out. Move the chart around freely in any direction when Price Axis has custom scale. Double-click the Price Axis to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\r\n },\r\n {\r\n title: 'Drawing tools & settings',\r\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\r\n target: '#toolbar',\r\n },\r\n {\r\n title: 'Fine-tune Drawings',\r\n body: 'Double-click on a chart drawing to tweak its color and style. Right-click on a drawing to access other options, such as changing its visibility, order, and more.',\r\n target: '[data-testid=\"chart-0-pane-0\"]',\r\n },\r\n ]\r\n : [\r\n {\r\n title: 'Enable Drawing mode',\r\n body: (\r\n <>\r\n \r\n Finviz*Elite\r\n {' '}\r\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\r\n chart.
\r\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\r\n \r\n ),\r\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\r\n placement: 'bottom-start',\r\n },\r\n ]),\r\n {\r\n title: 'Save your best Ideas',\r\n body: isPremium\r\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\r\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\r\n target: '[data-testid=\"chart-toolbar-ideas\"]',\r\n placement: 'bottom-start',\r\n },\r\n ...(page === SpecificChartFunctionality.quotePage\r\n ? []\r\n : [\r\n {\r\n title: 'Chart Layouts & Charts Sync',\r\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\r\n target: '[data-testid=\"chart-layout-layout\"]',\r\n },\r\n ]),\r\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\r\n ? []\r\n : [\r\n {\r\n title: 'Fullscreen mode',\r\n body:\r\n page === SpecificChartFunctionality.quotePage\r\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\r\n : 'Toggle the window to fill your entire screen.',\r\n target: '[data-testid=\"chart-layout-fullscreen\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ]),\r\n {\r\n title: 'Share chart',\r\n body: 'Share a chart together with your analysis and ideas.',\r\n target: '[data-testid=\"chart-toolbar-publish\"]',\r\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\r\n placement: 'bottom',\r\n },\r\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\r\n ? [\r\n {\r\n title: 'Theme',\r\n body: 'Switch between the Light and Dark theme.',\r\n target: '[data-testid=\"chart-layout-theme\"]',\r\n },\r\n ]\r\n : []),\r\n {\r\n title: 'Study Settings',\r\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\r\n target: '[data-testid=\"chart-settings-open-btn\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ],\r\n },\r\n page === SpecificChartFunctionality.chartPage && {\r\n id: 'sidebar-watchlist',\r\n steps: [\r\n {\r\n title: 'Explore Your Portfolios',\r\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\r\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\r\n placement: 'left-start',\r\n },\r\n ],\r\n },\r\n ].filter(Boolean) as TourDefinition[]\r\n}\r\n\r\ninterface TourButtonProps {\r\n page: SpecificChartFunctionality\r\n rounding?: 'none' | 'regular'\r\n size?: ButtonSizeType\r\n theme?: ButtonThemeType\r\n className?: string\r\n}\r\n\r\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\r\n const tour = useTour()\r\n const pageTours = getTour(page)\r\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\r\n const buttonTheme: ButtonThemeType = userTour.hasNewTours ? 'blue' : theme ?? 'headerItem'\r\n\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n className={className}\r\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\r\n title=\"Explore new features\"\r\n onClick={async () => {\r\n if (userTour) {\r\n const activeTour = await tour.startTour(userTour.tour)\r\n activeTour?.once('inactive', () => {\r\n setCurrentTour(tour.getStepsForUser(pageTours))\r\n })\r\n }\r\n }}\r\n />\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { getChartStartEndDates } from '../controllers/renderUtils'\r\nimport Quote from '../models/quote'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange: string) {\r\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\r\n const parsedRange = getChartStartEndDates({ dateRange, quote })\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n\r\n let startQuoteDate: Date | null = null\r\n let endQuoteDate: Date | null = null\r\n let numOfDaysToRender: number | null = null\r\n\r\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const reversedDaysInQuote = [...daysInQuote].reverse()\r\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\r\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\r\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\r\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\r\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\r\n }\r\n\r\n return {\r\n start: parsedRange.start,\r\n end: parsedRange.end,\r\n startQuoteDate,\r\n endQuoteDate,\r\n numOfDaysToRender,\r\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\r\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\r\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { Instrument, ObjectHash } from '../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n DateRangeType,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport ChartLayout from '../models/chart_layout'\r\nimport { IChartSettings, IIndicatorSettings, ISettings } from '../models/chart_settings/interfaces'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport Element from '../models/element'\r\nimport Pane, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport Utils from '../utils'\r\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\r\nimport {\r\n DATE_RANGE_PREFIX_DELMITER,\r\n getParsedDateRangeMetaData,\r\n parseCustomDateRangeUrlParam,\r\n} from '../utils/chart-date-range-utils'\r\n\r\ninterface VisibleBarNumberProps {\r\n start: Date | null\r\n end: Date\r\n quote: Quote\r\n dateRange: string\r\n}\r\n\r\ninterface ChartZoomAndLeftOffsetProps extends Omit {\r\n chartVisibleWidth: number\r\n numOfBarsToRender?: number\r\n chartModel: Chart\r\n}\r\n\r\ninterface ChartStartEndDatesProps {\r\n dateRange: string\r\n quote: Quote\r\n}\r\n\r\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\r\n const startInSec = start ? start.getTime() / 1000 : 0\r\n const endInSec = end.getTime() / 1000\r\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\r\n const lastQuoteDateIndex = quote.barIndex[quote.barIndex.length - 1]\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = quote.barIndex[index]\r\n }\r\n lastVisibleBarIndex = quote.barIndex[index]\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n canCropChart,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n canCropChart: boolean\r\n}) {\r\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\r\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\r\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\r\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n const chartWidthWithOffset = fullChartWidth - offsetInPx\r\n const shouldCropChart =\r\n canCropChart && hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\r\n\r\n return {\r\n fullChartWidth,\r\n offsetInPx: shouldCropChart ? offsetInPx : 0,\r\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\r\n offsetChartAfter,\r\n }\r\n}\r\n\r\nexport const getLeftOffset = ({\r\n quote,\r\n chartModel,\r\n config,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex = getBarIndex(quote),\r\n numberOfBarsToDraw,\r\n shouldAlignDaysToLeftApplied = true,\r\n}: GetLeftOffsetProps) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\r\n if (config?.stretch) {\r\n return 0\r\n }\r\n if (getIsSmallIndexChart(specificChartFunctionality)) {\r\n return barWidth\r\n }\r\n const fx = (index: number) => index * barWidth\r\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\r\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\r\n if (\r\n shouldAlignDaysToLeftApplied &&\r\n shouldAlignDaysToLeft({\r\n quote,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n dateRange: chartModel.dateRange,\r\n })\r\n ) {\r\n let drawDaysInOneChart = 1\r\n if (numberOfBarsToDraw) {\r\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\r\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\r\n drawDaysInOneChart = 5\r\n } else if (quote.interval === 15) {\r\n drawDaysInOneChart = 6\r\n } else if (quote.interval === 30) {\r\n drawDaysInOneChart = 12\r\n } else if (quote.interval === 60) {\r\n drawDaysInOneChart = 22\r\n } else if (quote.interval === 120) {\r\n drawDaysInOneChart = 39\r\n } else if (quote.interval === 240) {\r\n drawDaysInOneChart = 78\r\n } else if (quote.interval > 240) {\r\n drawDaysInOneChart = (quote.interval / 30) * 10\r\n }\r\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\r\n hasPremarket: quote.premarket,\r\n hasAftermarket: quote.aftermarket,\r\n barWidthWithMargin: barWidth,\r\n timeframeMinutes: quote.interval,\r\n maxWidth: chartModel.width,\r\n canCropChart: !chartModel.dateRange,\r\n })\r\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\r\n\r\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\r\n if (drawDaysWidth <= width + 1) {\r\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\r\n // Align start of day to left if we have enough space to show all bars in day\r\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n // Math.max(1, ~~num) is to mimic imlementation from getHalfBarWidth(),\r\n // we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n leftOffset = Math.round(-fx(barsToOffset) + Math.max(1, ~~(barWidth / 2))) - offsetChartInPx\r\n }\r\n }\r\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\r\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n return leftOffset\r\n }\r\n return getMinMaxLeftOffset({\r\n newLeftOffset: leftOffset,\r\n chartModel,\r\n barWidth,\r\n barIndex,\r\n })\r\n}\r\n\r\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\r\n\r\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\r\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\ninterface ShouldAlignDaysToLeftProps {\r\n quote: Quote\r\n numberOfBarsToDraw?: number\r\n specificChartFunctionality: SpecificChartFunctionality\r\n dateRange: DateRangeType | null\r\n}\r\n\r\n/**\r\n * Evaluate if days should be aligned to the left\r\n * @param {object} object.quote - Quote model\r\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\r\n * @returns {boolean} boolean\r\n * */\r\nexport const shouldAlignDaysToLeft = ({\r\n quote,\r\n dateRange,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n}: ShouldAlignDaysToLeftProps) => {\r\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\r\n const isIntradayDateRange = !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isOffScreen = specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isOffScreenWithNoDateRange = isOffScreen && !dateRange\r\n const isOffScreenIntradayDateRange = isOffScreen && isIntradayDateRange\r\n const isOffScreenWithFixedBars = isOffScreen && numberOfBarsToDraw\r\n\r\n const isQuotePage = specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuotePageWithNoDateRange = isQuotePage && !dateRange\r\n const isQuotePageIntradayDateRange = isQuotePage && isIntradayDateRange\r\n const isQuotePageWithFixedBars = isQuotePage && numberOfBarsToDraw\r\n\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange = isChartPage && isIntradayDateRange\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return (\r\n isStockIntraday &&\r\n (isOffScreenWithNoDateRange ||\r\n isOffScreenIntradayDateRange ||\r\n isOffScreenWithFixedBars ||\r\n isQuotePageWithNoDateRange ||\r\n isQuotePageIntradayDateRange ||\r\n isQuotePageWithFixedBars ||\r\n isChartsInradayDateRange ||\r\n isChartPageWithFixedBars)\r\n )\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\r\n } else {\r\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\r\n fx.invert = (x: number) => x / barWidthWithMargin\r\n fx.width = function (w) {\r\n return this.invert(w) - this.invert(0)\r\n }\r\n }\r\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\r\n\r\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\r\n let fy\r\n\r\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\r\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\r\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\r\n const minPx = currentScale(min)\r\n const domain = currentScale.domain()\r\n if (minPx > protectedHeightPx) {\r\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\r\n const extendedMin = tempScale.invert(contentHeight)\r\n currentScale.domain([domain[0], extendedMin])\r\n }\r\n }\r\n }\r\n\r\n switch (scaleType) {\r\n case ScaleType.Logarithmic:\r\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n handleDomainOffset(fy, d3.scaleSymlog)\r\n break\r\n default:\r\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n if (!paneModel.scaleRange) {\r\n fy = fy.nice(10)\r\n handleDomainOffset(fy, d3.scaleLinear)\r\n }\r\n break\r\n }\r\n fy.height = function (h: number) {\r\n return this.invert(h) - this.invert(0)\r\n }\r\n paneModel.updateAttribute('scale', {\r\n x: fx,\r\n y: fy,\r\n })\r\n\r\n if (isChart) {\r\n el.setupAxis!(fx as ScaleAxis)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n// general, only when blurry ends won't be visible or didn't matter\r\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\r\n\r\ninterface IXYOffsetFromLine {\r\n lineWidth: number\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\n// return x,y offsets for pixel perfect line rendering\r\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\r\n // don't add offset is lineWidth is even\r\n if (lineWidth % 2 === 0) {\r\n return { x: 0, y: 0 }\r\n }\r\n if (y1 === y2) {\r\n return { x: 0, y: 0.5 } // horizontal line\r\n } else if (x1 === x2) {\r\n return { x: 0.5, y: 0 } // vertical line\r\n } else {\r\n return { x: 0.5, y: 0.5 } // diagonal line\r\n }\r\n}\r\n\r\nexport const getRoundedObject = (obj: T): T => {\r\n const rounded = Object.entries(obj)\r\n for (let i = 0; i < rounded.length; i++) {\r\n rounded[i][1] = Math.round(rounded[i][1])\r\n }\r\n return Object.fromEntries(rounded) as T\r\n}\r\n\r\ninterface ITranslate {\r\n context: CanvasRenderingContext2D\r\n xOffset: number\r\n yOffset: number\r\n}\r\n\r\ninterface ITranslateObj {\r\n do: () => void\r\n undo: () => void\r\n}\r\n\r\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\r\n do: () => context.translate(xOffset, yOffset),\r\n undo: () => context.translate(xOffset * -1, yOffset * -1),\r\n})\r\n\r\ninterface IPercentageScaleValue {\r\n number: number\r\n base: number\r\n}\r\n\r\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\r\n\r\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\r\n\r\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\r\n chartModel: Chart\r\n quote: Quote\r\n}\r\n\r\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\r\n\r\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\r\n dateRange: chartModel.dateRange,\r\n quote,\r\n })\r\n\r\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n numOfBarsToRender,\r\n chartModel: chartModel,\r\n })\r\n\r\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\r\n chartModel.updateAttributes({ zoomFactor, leftOffset })\r\n }\r\n}\r\n\r\nexport function renderPane({\r\n chartLayoutModel,\r\n chartModel,\r\n paneModel,\r\n canvasCtx,\r\n shouldRenderCross = false,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n chartModel: Chart\r\n paneModel: Pane\r\n canvasCtx: CanvasRenderingContext2D\r\n shouldRenderCross?: boolean\r\n}) {\r\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\r\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\r\n } else {\r\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\r\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\r\n }\r\n const elements = paneModel.getAllElements()\r\n for (const { instance: elementInstance } of elements) {\r\n if (typeof elementInstance.renderGrid === 'function') {\r\n canvasCtx.save()\r\n elementInstance.renderGrid(canvasCtx)\r\n canvasCtx.restore()\r\n }\r\n }\r\n\r\n const chartEvents = paneModel.getAllChartEvents()\r\n const Settings = getSettings(paneModel)\r\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\r\n const isDrawing = elementInstance.getIsDrawing()\r\n const isChartEvent = elementInstance.getIsChartEvent()\r\n\r\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\r\n continue\r\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\r\n continue\r\n }\r\n\r\n canvasCtx.save()\r\n if (elementInstance.renderContent != null) {\r\n canvasCtx.save()\r\n clip({\r\n canvasCtx,\r\n width: chartModel.width,\r\n height: paneModel.height,\r\n Settings,\r\n })\r\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\r\n elementInstance.renderContent(canvasCtx)\r\n canvasCtx.restore()\r\n if (typeof elementInstance.renderLabels === 'function') {\r\n elementInstance.renderLabels(canvasCtx)\r\n }\r\n } else {\r\n elementInstance.render(canvasCtx)\r\n }\r\n if (\r\n shouldRenderCross &&\r\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\r\n isRedesignedPage(chartLayoutModel)) &&\r\n elementInstance.renderCross != null\r\n ) {\r\n elementInstance.renderCross(canvasCtx)\r\n }\r\n canvasCtx.restore()\r\n }\r\n}\r\n","export const DEFAULT_WIDTHS = {\r\n min: 200,\r\n max: 400,\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","import React from 'react'\r\n\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\r\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\r\n\r\nexport type SidebarContextType = {\r\n isOpen: boolean\r\n isCloseVisible: boolean\r\n direction: SidebarDirection\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n activeModule: SidebarModuleType | null\r\n close: () => void\r\n onResize: () => void\r\n selectModule: (module?: SidebarModule) => void\r\n}\r\n\r\nconst DEFAULT_CONTEXT: SidebarContextType = {\r\n activeModule: null,\r\n isOpen: false,\r\n isCloseVisible: false,\r\n direction: SidebarDirection.horizontal,\r\n width: DEFAULT_WIDTHS,\r\n close: () => {},\r\n onResize: () => {},\r\n selectModule: () => {},\r\n}\r\n\r\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\r\nexport const useSidebarContext = () => React.useContext(SidebarContext)\r\n","import { DefaultErrorBoundary } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\n\r\nexport function ModuleLoadFailed(props: Partial) {\r\n return (\r\n \r\n )\r\n}\r\n","export const portfolioWatchlistAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\r\n cacheKey: 'portfolio-watchlist',\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\r\nimport { withModuleAsyncLoad } from './with-module-async-load'\r\n\r\nexport enum SidebarModule {\r\n portfolio = 'portfolio',\r\n}\r\n\r\nexport type SidebarModuleType = {\r\n key: SidebarModule\r\n icon: IconNameType\r\n description: string\r\n content: React.ComponentType\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n}\r\n\r\nexport const sidebarModules: Record = Object.freeze({\r\n [SidebarModule.portfolio]: {\r\n key: SidebarModule.portfolio,\r\n icon: 'briefcase',\r\n description: 'Portfolio watchlist',\r\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\r\n width: { min: 200, default: { mobile: 275 } },\r\n },\r\n})\r\n","import { Delayed, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\r\nimport { ModuleLoadFailed } from './module-load-failed'\r\n\r\nexport function withModuleAsyncLoad<\r\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\r\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\r\n return function InnerFunction() {\r\n const [isComponentReady, setIsComponentReady] = React.useState(false)\r\n const [sidebarModule, { isError }] = useAsyncModule({\r\n ...asyncModule,\r\n isSuspenseMode: true,\r\n })\r\n\r\n const SidebarModule = sidebarModule?.default\r\n\r\n if (isError) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n {!isComponentReady && withInitialLoading && (\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n {!!SidebarModule && }\r\n \r\n )\r\n }\r\n}\r\n","import { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\nimport { sidebarModules } from './modules/modules'\r\n\r\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\r\n\r\ntype SidebarTabsProps = {\r\n className?: string\r\n}\r\n\r\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\r\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\r\n const tooltipState = useTooltipState({ placement: 'left', showTimeout: 300 })\r\n\r\n return (\r\n \r\n {/* reserved space for drawing button on mobile devices */}\r\n {direction === SidebarDirection.horizontal && (\r\n \r\n )}\r\n\r\n {Object.entries(sidebarModules).map(([key, value]) => {\r\n const isActive = activeModule?.key === key\r\n return (\r\n \r\n {\r\n selectModule(isActive ? undefined : value.key)\r\n }}\r\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\r\n data-testid={`sidebar-${key}-btn`}\r\n >\r\n \r\n \r\n }\r\n state={tooltipState}\r\n aria-label={value.description}\r\n isHideOnClick\r\n />\r\n\r\n \r\n {value.description}\r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { Resizable } from 're-resizable'\r\nimport React from 'react'\r\n\r\nimport Utils from '../../utils'\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\n\r\ntype SidebarContentProps = {\r\n children: React.ReactNode\r\n}\r\n\r\nexport default function SidebarContent({ children }: SidebarContentProps) {\r\n const { direction, onResize, close, width } = useSidebarContext()\r\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\r\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\r\n const defaultMobile = width?.default?.mobile ?? minWidth\r\n const defaultDesktop = width?.default?.desktop ?? maxWidth\r\n\r\n return (\r\n <>\r\n {direction === SidebarDirection.vertical && (\r\n \r\n {children}\r\n \r\n )}\r\n {direction === SidebarDirection.horizontal && (\r\n <>\r\n
\r\n
\r\n {children}\r\n
\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { Delayed, Spinner, localStorage } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate, useSearchParams } from 'react-router-dom'\r\n\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { SidebarDirection } from './constants'\r\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\r\nimport { ModuleLoadFailed } from './modules/module-load-failed'\r\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\r\nimport SidebarContent from './sidebar-content'\r\nimport SidebarTabs from './sidebar-tabs'\r\n\r\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\r\n\r\n// This is a temp function, to remove unused property from localstorage\r\nfunction removeSidebarFromLocalstorage() {\r\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\r\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\r\n}\r\nremoveSidebarFromLocalstorage()\r\n\r\ntype SidebarProps = {\r\n onShouldResize: () => void\r\n direction: SidebarDirection\r\n tabsClassName?: string\r\n}\r\n\r\n// Todo - this is not correct approach but this component can unmount/mount on mobile orientation change so we can't keep it inside the component\r\nlet isInit = false\r\n\r\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\r\n const navigate = useNavigate()\r\n const [urlSearchParams] = useSearchParams()\r\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\r\n const [activeModule, setActiveModule] = React.useState(null)\r\n\r\n const isOpen = !!activeModule\r\n const handleSelectModule = React.useCallback(\r\n (key?: SidebarModule) => {\r\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\r\n if (key) {\r\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\r\n } else {\r\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\r\n }\r\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\r\n },\r\n [urlSearchParams, navigate]\r\n )\r\n\r\n const handleCloseSidebar = React.useCallback(() => {\r\n handleSelectModule(undefined)\r\n }, [handleSelectModule])\r\n\r\n // Resize charts every time the sidebar is opened/closed or active module is changed\r\n React.useEffect(() => {\r\n onShouldResize()\r\n }, [activeModule, onShouldResize])\r\n\r\n // Set active module based on sidebarModuleKey\r\n React.useEffect(() => {\r\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\r\n\r\n if (!isInit && getIsMobilePortrait()) {\r\n sidebarModule = null\r\n handleCloseSidebar()\r\n }\r\n\r\n setActiveModule(sidebarModule)\r\n isInit = true\r\n }, [sidebarModuleKey, handleCloseSidebar])\r\n\r\n const contextValue: SidebarContextType = React.useMemo(\r\n () => ({\r\n direction,\r\n isOpen,\r\n isCloseVisible: direction === SidebarDirection.horizontal,\r\n width: activeModule?.width,\r\n activeModule,\r\n onResize: onShouldResize,\r\n close: handleCloseSidebar,\r\n selectModule: handleSelectModule,\r\n }),\r\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\r\n )\r\n\r\n return (\r\n \r\n {activeModule && (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n }\r\n >\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n
\r\n )\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\n\r\nexport enum DrawingTool {\r\n Arrow = 'arrow',\r\n Brush = 'brush',\r\n Callout = 'callout',\r\n Curve = 'curve',\r\n ElliottWaves = 'elliott-wave',\r\n Ellipse = 'ellipse',\r\n FibonacciRetracements = 'fibonacci-retracements',\r\n HorizontalLine = 'horizontal-line',\r\n Measure = 'measure',\r\n Mouse = 'mouse',\r\n Pitchfork = 'pitchfork',\r\n Polygon = 'polygon',\r\n Position = 'position',\r\n Rectangle = 'rectangle',\r\n RotatedRectangle = 'rotated-rectangle',\r\n ScaledLine = 'scaled-line',\r\n ScaledText = 'scaled-text',\r\n Triangle = 'triangle',\r\n VerticalLine = 'vertical-line',\r\n Xabcd = 'xabcd',\r\n}\r\n\r\nexport enum DrawingActions {\r\n AddNote = 'add-note',\r\n DeleteDrawings = 'delete-drawings',\r\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\r\n}\r\n\r\nexport enum DrawingSetting {\r\n PreserveDrawings = 'preserve-drawings',\r\n DrawingModeContinuous = 'drawing-mode-continuous',\r\n HideDrawings = 'hide-drawings',\r\n LockDrawings = 'lock-drawings',\r\n}\r\n\r\nexport interface IToolBarProps {\r\n chartLayoutModel: ChartLayout\r\n isSidebar?: boolean\r\n isHorizontal?: boolean\r\n isMobileOverlay?: boolean\r\n /**\r\n * Current selected tool id\r\n */\r\n activeTool: DrawingTool\r\n /**\r\n * On tool item select callback\r\n */\r\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\r\n /**\r\n * On drawing actions item select callback\r\n */\r\n onDrawingActionClick?: (actionId: DrawingActions) => void\r\n /**\r\n * On drawing settings item select callback\r\n */\r\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\r\n /**\r\n * On drawing end callback\r\n */\r\n onDrawingEnd?: () => void\r\n /**\r\n * Current state of drawing settings\r\n */\r\n drawingSettings: Record\r\n isAlternativeTheme?: boolean\r\n /**\r\n * Are tools disabled\r\n */\r\n areToolsDisabled?: boolean\r\n}\r\n\r\nexport interface IToolbarItemProperties {\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\r\n id: DrawingTool\r\n}\r\n\r\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\r\n id: DrawingActions\r\n}\r\n\r\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\r\n id: DrawingSetting\r\n}\r\n\r\nexport interface IToolbarDrawingToolItem {\r\n defaultItem: IToolbarDrawingTool\r\n toolGroup?: Array\r\n toolGroupTitle?: string\r\n}\r\n\r\nexport interface IToolbarDrawingActionItem {\r\n defaultItem: IToolbarDrawingAction\r\n isDisabled?: boolean\r\n disabledTooltip?: string\r\n}\r\n\r\nexport interface IToolbarDrawingsSettingItem {\r\n defaultItem: IToolbarDrawingSetting\r\n isDisabled?: boolean\r\n isInAction?: boolean\r\n disabledTooltip?: string\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport QuoteModel from '../models/quote'\r\n\r\nexport function getInstrumentLabel(instrument: Instrument) {\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return 'Stock'\r\n case Instrument.Futures:\r\n return 'Futures'\r\n case Instrument.Forex:\r\n return 'Forex'\r\n case Instrument.Crypto:\r\n return 'Crypto'\r\n case Instrument.MarketSentiment:\r\n return 'Market Sentiment'\r\n }\r\n}\r\n\r\nexport function getChartAlt(quoteModel: QuoteModel) {\r\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\r\n}\r\n\r\nexport const getResponseChartType = (chartType: ChartElementType) => {\r\n switch (chartType) {\r\n case ChartElementType.HeikinAshi:\r\n return 'heikinashi'\r\n case ChartElementType.HollowCandleStick:\r\n return 'hollowcandlestick'\r\n case ChartElementType.LineChart:\r\n return 'line'\r\n case ChartElementType.OhlcChart:\r\n return 'ohlc'\r\n case ChartElementType.CandleStick:\r\n default:\r\n return 'candlestick'\r\n }\r\n}\r\n\r\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\r\n chartResponseType === null\r\n ? null\r\n : Object.values(ChartElementType).find(\r\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\r\n )\r\n","import utils from '../utils'\r\n\r\nclass AverageTrueRange {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(high: number, low: number, prevClose: number) {\r\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n\r\n if (this.count < this.period) {\r\n this.sum += tr\r\n this.value = this.sum / (this.count + 1)\r\n if (this.count === this.period - 1) {\r\n this.sum /= this.period\r\n }\r\n } else {\r\n this.value = (this.value * (this.period - 1) + tr) / this.period\r\n }\r\n this.count++\r\n }\r\n}\r\n\r\nexport default AverageTrueRange\r\n","import { PaneArea } from '../../types/shared'\r\nimport Element, { DefaultAttrs } from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport type PaneModel from '../models/pane'\r\nimport { ChartEventBadgeState } from '../utils/chart-events-utils'\r\n\r\ninterface ChartEventAttrs extends DefaultAttrs {\r\n x: number\r\n}\r\n\r\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\r\n if (chartEvent.isOpen) {\r\n return ChartEventBadgeState.selected\r\n }\r\n if (chartEvent.isHovered) {\r\n return ChartEventBadgeState.hover\r\n }\r\n return ChartEventBadgeState.default\r\n}\r\n\r\nclass ChartEvent extends Element {\r\n static type = ChartEventType.ChartEvent\r\n static label = 'ChartEvent'\r\n\r\n declare scaled: Pick\r\n\r\n declare chart: BaseChart\r\n\r\n declare model: PaneModel\r\n\r\n declare chartEventModel: ChartEventElement | undefined\r\n\r\n isOpen = false\r\n\r\n left = 0\r\n top = 0\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\r\n\r\n get type() {\r\n return (this.constructor as typeof ChartEvent).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof ChartEvent).label\r\n }\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n switch (this.type) {\r\n case ChartEventType.Dividends:\r\n return ChartEventBadgeType.Dividends\r\n case ChartEventType.Split:\r\n return ChartEventBadgeType.Split\r\n }\r\n\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n getChartEventModel(): ChartEventElement | undefined {\r\n if (!this.chartEventModel) {\r\n this.chartEventModel = this.model.chartEvents()?.findByAttribute('instance', this)\r\n }\r\n\r\n return this.chartEventModel\r\n }\r\n\r\n getXYPosition() {\r\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\r\n const chartEventModel = this.getChartEventModel()\r\n const { x } = this.scaled\r\n const roundedXY = getRoundedObject({ x })\r\n const y =\r\n (this.model as PaneModel).height -\r\n top.height -\r\n bottom.height -\r\n CHART_EVENT_BADGE_SIZE -\r\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\r\n\r\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\r\n }\r\n\r\n getIsVisible() {\r\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (!this.getIsVisible() || !this.chartEventModel) return\r\n\r\n this.attrs.x = Math.round(this.attrs.x)\r\n const chart = this.model.chart()\r\n const chartLayout = chart.chart_layout()\r\n const { x, y } = this.getXYPosition()\r\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\r\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\r\n return\r\n }\r\n const item = this.chartEventModel.getChartEventBadgeImage({\r\n theme: chartLayout.theme,\r\n state: getChartEventState(this),\r\n badgeType: this.getChartEvenBadgeType(),\r\n })\r\n\r\n if (!item) return\r\n\r\n const { left, top } = this.getChartLayoutSettings().ChartSettings\r\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\r\n this.top = y + top.height\r\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n if (!this.getIsVisible()) return\r\n\r\n this.isHovered = isHovered\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n // If isOpenOverride is undefined, the function works as toggle\r\n toggleIsOpen(isOpenOverride?: boolean) {\r\n const chartLayout = this.model.chart().chart_layout()\r\n const chartEventModel = this.getChartEventModel()\r\n\r\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\r\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\r\n this.isOpen = isOpen\r\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\r\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\r\n }\r\n if (isOpen || isCurrentEventActive) {\r\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\r\n }\r\n\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const scaledArea = area.scaled\r\n const { x, y } = this.getXYPosition()\r\n const isInArea =\r\n x <= scaledArea.x &&\r\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\r\n y <= scaledArea.y &&\r\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\r\n return isInArea\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const { x } = this.getXYPosition()\r\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\r\n return isInView\r\n }\r\n}\r\n\r\nexport default ChartEvent\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Dividends extends ChartEvent {\r\n static type = ChartEventType.Dividends\r\n static label = ChartEventLabels[ChartEventType.Dividends]\r\n}\r\n\r\nexport default Dividends\r\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport { IEarnings } from '../utils/chart-events-utils'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Earnings extends ChartEvent {\r\n static type = ChartEventType.Earnings\r\n static label = ChartEventLabels[ChartEventType.Earnings]\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\r\n\r\n if (!eventItem) {\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\r\n const now = Date.now() / 1000\r\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\r\n }\r\n return eventItem.epsActual - eventItem.epsEstimate < 0\r\n ? ChartEventBadgeType.EarningsNegative\r\n : ChartEventBadgeType.EarningsPositive\r\n }\r\n}\r\n\r\nexport default Earnings\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Split extends ChartEvent {\r\n static type = ChartEventType.Split\r\n static label = ChartEventLabels[ChartEventType.Split]\r\n}\r\n\r\nexport default Split\r\n","import { ChartEventType } from '../constants/common'\r\nimport chartEvent from './chart-event'\r\nimport dividends from './dividends'\r\nimport earnings from './earnings'\r\nimport split from './split'\r\n\r\nexport const chartEventsByType = Object.freeze({\r\n [ChartEventType.ChartEvent]: chartEvent,\r\n [ChartEventType.Dividends]: dividends,\r\n [ChartEventType.Split]: split,\r\n [ChartEventType.Earnings]: earnings,\r\n})\r\n","import { ChartConfigChartPaneElement } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport { chartEventsByType } from '../chart-events'\r\nimport { chartsByType } from '../charts/charts'\r\nimport { indicatorsByType } from '../indicators/indicators'\r\nimport { overlaysByType } from '../overlays/overlays'\r\n\r\nconst canvasElements = {\r\n ...overlaysByType,\r\n ...indicatorsByType,\r\n ...drawingToolsByType,\r\n ...chartsByType,\r\n ...chartEventsByType,\r\n}\r\n\r\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\r\n return canvasElements[elementType]\r\n}\r\n","import { Instrument, Point } from '../../types/shared'\r\n\r\ninterface LinePoints {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport enum BigNumber {\r\n Thousand,\r\n Million,\r\n Billion,\r\n Trillion,\r\n}\r\n\r\nexport const BIG_NUMBER_VALUES = {\r\n [BigNumber.Thousand]: 1e3,\r\n [BigNumber.Million]: 1e6,\r\n [BigNumber.Billion]: 1e9,\r\n [BigNumber.Trillion]: 1e12,\r\n}\r\n\r\nconst BIG_NUMBER_ZEROES = {\r\n [BigNumber.Thousand]: 3,\r\n [BigNumber.Million]: 6,\r\n [BigNumber.Billion]: 9,\r\n [BigNumber.Trillion]: 12,\r\n}\r\n\r\nconst BIG_NUMBER_SUFFIX = {\r\n [BigNumber.Thousand]: 'K',\r\n [BigNumber.Million]: 'M',\r\n [BigNumber.Billion]: 'B',\r\n [BigNumber.Trillion]: 'T',\r\n}\r\n\r\nconst math = {\r\n dotProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.x + p1.y * p2.y\r\n },\r\n\r\n crossProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.y - p1.y * p2.x\r\n },\r\n\r\n distance(p1: Point, p2: Point) {\r\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\r\n },\r\n\r\n lineEquation(line: LinePoints) {\r\n // ax + by + c = 0\r\n if (line.x1 === line.x2) {\r\n return {\r\n a: 1,\r\n b: 0,\r\n c: -line.x1,\r\n }\r\n }\r\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\r\n return {\r\n a: -k,\r\n b: 1,\r\n c: k * line.x1 - line.y1,\r\n k,\r\n }\r\n },\r\n\r\n pointInPolygon(point: Point, polygon: Point[]) {\r\n // http://alienryderflex.com/polygon/\r\n let j = polygon.length - 1\r\n let oddNodes = false\r\n for (let i = 0; i < polygon.length; i++) {\r\n const p = polygon[i]\r\n if (\r\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\r\n (p.x <= point.x || polygon[j].x <= point.x)\r\n ) {\r\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\r\n oddNodes = !oddNodes\r\n }\r\n }\r\n j = i\r\n }\r\n return oddNodes\r\n },\r\n\r\n distanceToLine(point: Point, line: LinePoints) {\r\n const { a, b, c } = this.lineEquation(line)\r\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\r\n return dist\r\n },\r\n\r\n distanceToSegment(point: Point, line: LinePoints) {\r\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\r\n if (l2 === 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\r\n if (t < 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n if (t > 1) {\r\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\r\n }\r\n const x = line.x1 + t * (line.x2 - line.x1)\r\n const y = line.y1 + t * (line.y2 - line.y1)\r\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\r\n },\r\n\r\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\r\n if (instrument === Instrument.Crypto && value <= 0.001) {\r\n return 8\r\n }\r\n\r\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\r\n return 4\r\n }\r\n\r\n return 2\r\n },\r\n\r\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\r\n const absNum = Math.abs(number)\r\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\r\n const str = num.toString()\r\n if (str.includes('e')) {\r\n const splitString = str.split('e')\r\n const addZeroes = Number(splitString[1]) - zeroes\r\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\r\n }\r\n const sign = Math.sign(num)\r\n const numberByZeroesCount = Math.pow(10, zeroes)\r\n const result = (absNum / numberByZeroesCount) * sign\r\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\r\n }\r\n\r\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\r\n })\r\n } else {\r\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\r\n }\r\n },\r\n\r\n round({\r\n value,\r\n lastClose = 0,\r\n instrument,\r\n overridePlaces,\r\n }: {\r\n value: number\r\n lastClose?: number\r\n instrument?: Instrument\r\n overridePlaces?: number\r\n }) {\r\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\r\n return this.formatBigNumber(value, overridePlaces)\r\n }\r\n\r\n const places =\r\n typeof overridePlaces === 'number'\r\n ? overridePlaces\r\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\r\n\r\n if (value < 0.000001) {\r\n // There was an issue with getting NaN when rounding small numbers with latter method\r\n return value.toFixed(places)\r\n }\r\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\r\n },\r\n\r\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\r\n if (distance === 0) {\r\n return { x: line.x2, y: line.y2 }\r\n }\r\n\r\n let yAxisCoeficient\r\n let xAxisCoeficient\r\n\r\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = 1\r\n } else {\r\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = 1\r\n }\r\n\r\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\r\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\r\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\r\n return { x, y }\r\n },\r\n\r\n rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n }: {\r\n rotationAxisPoint: Point\r\n angle: number\r\n pointToRotate: Point\r\n }) {\r\n // return newCoordinates for pointToRotate after rotation defined by\r\n // angle around rotationAxisPoint\r\n const sin = Math.sin(angle)\r\n const cos = Math.cos(angle)\r\n const rotatedX =\r\n cos * (pointToRotate.x - rotationAxisPoint.x) +\r\n sin * (pointToRotate.y - rotationAxisPoint.y) +\r\n rotationAxisPoint.x\r\n const rotatedY =\r\n cos * (pointToRotate.y - rotationAxisPoint.y) -\r\n sin * (pointToRotate.x - rotationAxisPoint.x) +\r\n rotationAxisPoint.y\r\n return { x: rotatedX, y: rotatedY }\r\n },\r\n sharedPointLinesAngle({\r\n sharedPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n sharedPoint: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) {\r\n // return angle between line from sharedPoint to oldLinePoint and\r\n // line from sharedPoint to newLinePoint\r\n const numerator =\r\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\r\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\r\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\r\n const denominator =\r\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\r\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\r\n const ratio = numerator / denominator\r\n\r\n return Math.atan(ratio)\r\n },\r\n\r\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\r\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\r\n // Determine the intersection point of two line segments\r\n // Return FALSE if the lines don't intersect\r\n\r\n // Check if none of the lines are of length 0\r\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\r\n return false\r\n }\r\n\r\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\r\n\r\n // Lines are parallel\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\r\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\r\n\r\n // is the intersection along the segments\r\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\r\n return false\r\n }\r\n\r\n // Return a object with the x and y coordinates of the intersection\r\n const x = p1.x + ua * (p2.x - p1.x)\r\n const y = p1.y + ua * (p2.y - p1.y)\r\n\r\n return { x, y }\r\n },\r\n\r\n // https://stackoverflow.com/a/60368757\r\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\r\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\r\n let a, b\r\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\r\n x: 0,\r\n y: 0,\r\n onLine1: false,\r\n onLine2: false,\r\n }\r\n const denominator =\r\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n a = line1_p1.y - line2_p1.y\r\n b = line1_p1.x - line2_p1.x\r\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\r\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\r\n a = numerator1 / denominator\r\n b = numerator2 / denominator\r\n\r\n // if we cast these lines infinitely in both directions, they intersect here:\r\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\r\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\r\n\r\n // if line1 is a segment and line2 is infinite, they intersect if:\r\n if (a > 0 && a < 1) {\r\n result.onLine1 = true\r\n }\r\n // if line2 is a segment and line1 is infinite, they intersect if:\r\n if (b > 0 && b < 1) {\r\n result.onLine2 = true\r\n }\r\n // if line1 and line2 are segments, they intersect if both of the above are true\r\n return result\r\n },\r\n\r\n // ray is considered line1, segment is considered line2\r\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\r\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\r\n\r\n if (\r\n !lineIntersection ||\r\n lineIntersection.onLine1 ||\r\n this.dotProduct(\r\n this.subtractPoints(rayOrigin, lineIntersection as Point),\r\n this.subtractPoints(rayOrigin, rayEnd)\r\n ) <= 0\r\n )\r\n return false\r\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\r\n },\r\n\r\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\r\n const x = (P1.x - P2.x) / 2 + P2.x\r\n const y = (P1.y - P2.y) / 2 + P2.y\r\n return { x, y }\r\n },\r\n\r\n normalizeVector(v: Point) {\r\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\r\n return { x: v.x / length, y: v.y / length }\r\n },\r\n\r\n multiplyVectorByScalar(v: Point, scalar: number) {\r\n return { x: v.x * scalar, y: v.y * scalar }\r\n },\r\n\r\n addPoints(P1: Point, P2: Point) {\r\n return { x: P1.x + P2.x, y: P1.y + P2.y }\r\n },\r\n\r\n subtractPoints(P1: Point, P2: Point): Point {\r\n return { x: P1.x - P2.x, y: P1.y - P2.y }\r\n },\r\n\r\n isSamePoint(P1: Point, P2: Point, margin = { x: 0, y: 0 }) {\r\n return P1.x - margin.x <= P2.x && P2.x <= P1.x + margin.x && P1.y - margin.y <= P2.y && P2.y <= P1.y + margin.y\r\n },\r\n}\r\n\r\nexport default math\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nexport class ExponentialMovingAverage {\r\n period: number\r\n multiplier: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.multiplier = 2 / (this.period + 1)\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(d: number) {\r\n if (this.count < this.period) {\r\n this.sum += d\r\n this.count++\r\n this.value = this.sum / this.count\r\n } else {\r\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\r\n }\r\n }\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ema: number[]\r\n}\r\n\r\nexport class EMACalculation extends MainCalculation {\r\n static type = OverlayType.Ema\r\n\r\n getDefaultCalculatedValues() {\r\n return { ema: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema.add(close[index])\r\n this.calculatedValues.ema[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { IndicatorType, OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\n\r\ntype OptionValuesType = ObjectHash\r\ntype CalculatedValuesType = ObjectHash\r\ninterface MainProps {\r\n quote?: Quote\r\n options: T\r\n}\r\n\r\nexport type OnValueCalculatedReturnValue = boolean | undefined\r\nexport type OnValueCalculated = ((value: T, dataIndex: number) => OnValueCalculatedReturnValue) | undefined\r\n\r\nexport class MainCalculation<\r\n TOptionValues extends OptionValuesType | undefined = undefined,\r\n TCalculatedValues extends CalculatedValuesType = CalculatedValuesType,\r\n> {\r\n static type: IndicatorType | OverlayType = IndicatorType.Indicator\r\n\r\n quote: NonNullable['quote']>\r\n options: MainProps['options']\r\n\r\n protected _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n throw Error('Implement getDefaultCalculatedValues')\r\n }\r\n\r\n calculate(_: OnValueCalculated) {\r\n throw Error('Implement calculate')\r\n }\r\n\r\n getAllCalculatedValues(lastNItems: number) {\r\n const calculatedValues = {} as TCalculatedValues\r\n Object.keys(this.calculatedValues).forEach((key) => {\r\n calculatedValues[key as keyof TCalculatedValues] = this.getCalculatedValues(key, lastNItems)\r\n })\r\n return calculatedValues\r\n }\r\n\r\n getCalculatedValues(key: keyof TCalculatedValues, lastNItems: number) {\r\n return (this.calculatedValues[key] as number[]).slice(-lastNItems) as TCalculatedValues[keyof TCalculatedValues]\r\n }\r\n\r\n /**\r\n * This function is used to construct sql script for db table creation\r\n * and also to build precalculated data object used on node server.\r\n *\r\n * Precalculated data object uses database column names as property keys to simplify data mapping on BE\r\n */\r\n getDbColumnName() {\r\n const { type } = this.constructor as typeof MainCalculation\r\n const typeLabel = type.split('/')[1]\r\n const optionKeys = Object.keys(this.options ?? {}).sort((key1, key2) => key1.localeCompare(key2))\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [typeLabel, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n FONT_SIZE,\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n OFFSET,\r\n PADDING,\r\n SpecificChartFunctionality,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport mouseModel from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport { roundedRect } from '../utils/canvas-render'\r\nimport { renderCross } from '../utils/chart'\r\nimport {\r\n drawInVisibleArea,\r\n getAreNoBarsVisible,\r\n getCompensatedFirstBarToRenderIndex,\r\n getVisibleBarToRenderIndex,\r\n} from '../utils/draw_in_visible_area'\r\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nconst MAX_POSITIVE_DEFAULT_VALUE = Number.MAX_VALUE\r\nconst MAX_NEGATIVE_DEFAULT_VALUE = -Number.MAX_VALUE\r\n\r\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\r\n switch (indicator) {\r\n case IndicatorType.Rvol:\r\n return { min: 0, max: 2 }\r\n case IndicatorType.Atr:\r\n return { min: 0, max: 10 }\r\n case IndicatorType.Adx:\r\n case IndicatorType.Aro:\r\n case IndicatorType.Mfi:\r\n case IndicatorType.Perf:\r\n case IndicatorType.Rmi:\r\n case IndicatorType.Rsi:\r\n case IndicatorType.Stofu:\r\n case IndicatorType.Ult:\r\n return { min: 0, max: 100 }\r\n case IndicatorType.Macd:\r\n case IndicatorType.Rwi:\r\n case IndicatorType.Trix:\r\n return { min: -1, max: 1 }\r\n case IndicatorType.Wr:\r\n return { min: -100, max: 0 }\r\n case IndicatorType.Aroosc:\r\n case IndicatorType.Roc:\r\n return { min: -100, max: 100 }\r\n case IndicatorType.Cci:\r\n case IndicatorType.Fi:\r\n return { min: -200, max: 200 }\r\n default:\r\n return { min: 0, max: 100 }\r\n }\r\n}\r\n\r\nexport interface IIndicatorIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\r\n static type = IndicatorType.Indicator\r\n static label = 'Indicator'\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n return this.model.height\r\n },\r\n })\r\n Object.defineProperty(this.prototype, 'contentHeight', {\r\n get() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static fromObject(values: ObjectHash, model: Pane) {\r\n const indicator = new this(values, model)\r\n indicator.set(values)\r\n return indicator\r\n }\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare min: number\r\n declare max: number\r\n declare contentHeight: number\r\n declare height: number\r\n\r\n attrs: Attrs\r\n model: Pane\r\n labelWidth = 0\r\n fetchedAt = -1\r\n leftOffset = 0\r\n width = 0\r\n contentWidth = 0\r\n lastValue: number | null = null\r\n shouldUpdate = true\r\n tickers: string | null = null\r\n period?: string | number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.attrs = attrs\r\n this.model = model\r\n this.data = this.model.chart().quote()\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n\r\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\r\n this.model.bind('update change', this.trigger.bind(this, 'change'))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Indicator).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Indicator).label\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.data = this.model.chart().quote()\r\n this.leftOffset = this.model.chart().leftOffset\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n this.compute()\r\n\r\n this.setupCache()\r\n\r\n this.renderYAxis(context)\r\n\r\n context.save()\r\n this.clip(context)\r\n this.renderXAxis(context)\r\n const translate = getTranslate({\r\n context,\r\n xOffset: this.leftOffset + IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n this.renderIndicator(context)\r\n translate.undo()\r\n context.restore()\r\n\r\n if (!this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabel(context)\r\n }\r\n }\r\n\r\n isComputeNecessary() {\r\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\r\n // or indicator setting was changed via modal (this.shouldUpdate)\r\n // allow compute and update variables to prevent another unless\r\n // those variables change again\r\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\r\n this.fetchedAt = this.data.fetchedAt\r\n this.shouldUpdate = false\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.model.scale.y.ticks(10)\r\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\r\n const yLine = new Line(\r\n {\r\n x1: 0,\r\n x2: this.contentWidth,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n for (let index = 0; index < ticks.length; index++) {\r\n const tick = ticks[index]\r\n y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n if (index % 2 === 0) {\r\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\r\n }\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\r\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\r\n new Text(\r\n {\r\n text: math.formatBigNumber(this.lastValue, 2),\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n y: valueY,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n background: Colors.indicatorCurrentBackground,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const xLine = new Line(\r\n {\r\n x1: 0,\r\n x2: 0,\r\n y1: 0,\r\n y2: this.contentHeight,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\r\n const x = Math.round(this.fx(tick) + this.leftOffset)\r\n if (x < -15 || x > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n } else {\r\n this.renderLabelQuotePage(context)\r\n }\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y: IndicatorSettings.left.indicatorLabel.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context)\r\n return label.render(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isDarkMode = theme === Theme.dark\r\n const x =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n ? OFFSET.S\r\n : IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: x * 2,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\r\n roundedRect({\r\n ctx: context,\r\n x,\r\n y,\r\n height: INDICATOR_LABEL_HEIGHT,\r\n width: this.labelWidth,\r\n radius: 6,\r\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\r\n })\r\n label.render(context)\r\n\r\n return { x, y, labelWidth: this.labelWidth }\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.model,\r\n quote: this.data,\r\n contentWidth: this.contentWidth,\r\n contentHeight: this.contentHeight,\r\n isIndicator: true,\r\n isPerfIndicator: this.type === IndicatorType.Perf,\r\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\r\n })\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\r\n }\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.data = this.model.chart().quote()\r\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n\r\n this.renderCrossTextChartsPage(context, index)\r\n } else {\r\n this.renderCrossTextQuotePage(context, index)\r\n }\r\n }\r\n\r\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderOversoldOverbought(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n zero: number,\r\n overbought: number,\r\n drawLines?: boolean\r\n ) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.data.close.length === 0) return\r\n const drawInVisibleAreaProps = {\r\n fromIndexOffset: from,\r\n leftOffset: this.leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width: this.width,\r\n }\r\n\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex(drawInVisibleAreaProps)\r\n\r\n if (drawLines == null) {\r\n drawLines = true\r\n }\r\n\r\n context.save()\r\n\r\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\r\n if (clipHeight <= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\r\n this.contentWidth,\r\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n context.clip()\r\n context.set('fillStyle', '#87ceef')\r\n\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(oversold)),\r\n y2: Math.round(this.fy(oversold)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n if (drawLines) {\r\n this.renderZeroLine(context, zero)\r\n }\r\n\r\n context.save()\r\n clipHeight = Math.round(this.fy(overbought))\r\n if (clipHeight >= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[0]),\r\n this.contentWidth,\r\n clipHeight > 0 ? clipHeight : 1 // // fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n\r\n context.clip()\r\n context.set('fillStyle', '#dc9fe5')\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[1])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(overbought)),\r\n y2: Math.round(this.fy(overbought)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.set('fillStyle', '#dc9fe5')\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(zero)),\r\n y2: Math.round(this.fy(zero)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n setupCache() {}\r\n\r\n clip(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n context.beginPath()\r\n context.rect(IndicatorSettings.left.width, IndicatorSettings.top.height, this.contentWidth, this.contentHeight + 1) // +1 shows one more pixel which is needed to be able to see a line at very bottom of an indicaor\r\n return context.clip()\r\n }\r\n\r\n formatAxis(value: number, tickStep?: number) {\r\n if (tickStep !== undefined && 10 > tickStep) {\r\n return value.toFixed(2)\r\n }\r\n return value.toString()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n set(values: Partial) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.shouldUpdate = true\r\n for (const key in values) {\r\n if (key !== 'type') {\r\n // @ts-expect-error - values keys don't have to always match variables on the instance\r\n this[key] = values[key]\r\n }\r\n }\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n const newAttrs = this.getModalConfig()\r\n .inputs.map(({ value }) => value.toString())\r\n .join(',')\r\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\r\n\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n\r\n parsePeriodInt(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n this.period = Number.parseInt(values.period, 10)\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n }\r\n\r\n setModel(model: Pane) {\r\n return (this.model = model)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n let width = OFFSET.M * 2 + this.labelWidth\r\n let height = OFFSET.S * 2 + FONT_SIZE.M\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n width = this.labelWidth\r\n height = INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n\r\n moveBy() {}\r\n\r\n thumbsAreInArea() {\r\n return false\r\n }\r\n\r\n computeVisibleMinMax(...arrays: number[][]) {\r\n let min = MAX_POSITIVE_DEFAULT_VALUE\r\n let max = MAX_NEGATIVE_DEFAULT_VALUE\r\n\r\n const { leftOffset } = this.model.chart()\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth: this.contentWidth,\r\n })\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n for (const arr of arrays) {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (!isNaN(arr[i])) {\r\n min = Math.min(min, arr[i])\r\n max = Math.max(max, arr[i])\r\n }\r\n }\r\n }\r\n\r\n return !areNoBarsVisible && min !== max && min !== MAX_POSITIVE_DEFAULT_VALUE && max !== MAX_NEGATIVE_DEFAULT_VALUE\r\n ? { min, max }\r\n : this.getDomainDefaults(this.type)\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\r\n\r\n getMinMax() {\r\n this.data = this.model.chart().quote()\r\n this.compute()\r\n return { min: this.min, max: this.max }\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n period: this.getModalConfig()\r\n .inputs.map((input: IModalConfigInput) => input.value.toString())\r\n .join(','),\r\n }\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n renderIndicator(_: CanvasRenderingContext2D) {\r\n throw Error('Implement renderIndicator method')\r\n }\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n getIsChartPageSpecificFunctionality() {\r\n const { specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto =\r\n isRedesignEnabled() &&\r\n [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.quotePage,\r\n ].includes(specificChartFunctionality)\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n getIsDrawing() {\r\n return false\r\n }\r\n\r\n getIsChartEvent() {\r\n return false\r\n }\r\n\r\n compute() {\r\n throw Error('Implement compute method')\r\n }\r\n}\r\n\r\nIndicator.initClass()\r\n\r\nexport default Indicator\r\n","export function roundedRect({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n radius,\r\n color,\r\n}: {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n radius: number\r\n color: string\r\n}) {\r\n ctx.translate(0.5, 0.5)\r\n ctx.set('strokeStyle', color)\r\n ctx.set('fillStyle', color)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + radius)\r\n ctx.lineTo(x, y + height - radius)\r\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\r\n ctx.lineTo(x + width - radius, y + height)\r\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\r\n ctx.lineTo(x + width, y + radius)\r\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\r\n ctx.lineTo(x + radius, y)\r\n ctx.arcTo(x, y, x, y + radius, radius)\r\n ctx.stroke()\r\n ctx.fill()\r\n ctx.translate(-0.5, -0.5)\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ADX extends Indicator {\r\n static type = IndicatorType.Adx\r\n static label = 'ADX'\r\n\r\n declare period: number\r\n pdi: number[] = []\r\n mdi: number[] = []\r\n adx: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let adx, amdm, apdm, mdi, pdi\r\n this.pdi = []\r\n this.mdi = []\r\n this.adx = []\r\n let atr = (apdm = amdm = adx = 0)\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\r\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\r\n\r\n let pdm = 0\r\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\r\n pdm = deltaHigh\r\n }\r\n\r\n let mdm = 0\r\n if (deltaLow > 0 && deltaLow > deltaHigh) {\r\n mdm = deltaLow\r\n }\r\n\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n\r\n atr = (atr * (this.period - 1) + tr) / this.period\r\n apdm = (apdm * (this.period - 1) + pdm) / this.period\r\n amdm = (amdm * (this.period - 1) + mdm) / this.period\r\n\r\n pdi = atr > 0 ? (apdm * 100) / atr : 0\r\n mdi = atr > 0 ? (amdm * 100) / atr : 0\r\n const di = Math.abs(pdi - mdi)\r\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\r\n adx = (adx * (this.period - 1) + dx) / this.period\r\n\r\n this.pdi[i] = pdi\r\n this.mdi[i] = mdi\r\n this.adx[i] = adx\r\n }\r\n this.lastValue = this.adx.last() ?? null\r\n }\r\n const { min, max } =\r\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\r\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#2eb12e')\r\n context.beginPath()\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\r\n },\r\n })\r\n\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#d43737')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ADX ${this.period}`\r\n }\r\n}\r\n\r\nexport default ADX\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n aroonUp: number[]\r\n aroonDown: number[]\r\n oscillator: number[]\r\n}\r\n\r\nexport class AroonCalculation extends MainCalculation {\r\n static type = IndicatorType.Aro\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n aroonUp: [],\r\n aroonDown: [],\r\n oscillator: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { low, high } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period; i < high.length; i++) {\r\n const highPeriod = high.slice(i - period, i + 1)\r\n const highestInPeriod = Math.max(...highPeriod)\r\n const periodSinceHigh = period - highPeriod.lastIndexOf(highestInPeriod)\r\n this._calculatedValues.aroonUp[i] = 100 * ((period - periodSinceHigh) / period)\r\n\r\n const lowPeriod = low.slice(i - period, i + 1)\r\n const lowestInPeriod = Math.min(...lowPeriod)\r\n const periodSinceLow = period - lowPeriod.lastIndexOf(lowestInPeriod)\r\n this._calculatedValues.aroonDown[i] = 100 * ((period - periodSinceLow) / period)\r\n\r\n this._calculatedValues.oscillator[i] = this._calculatedValues.aroonUp[i] - this._calculatedValues.aroonDown[i]\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Pane from '../models/pane'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst COLORS = {\r\n aroonUp: '#00a000',\r\n aroonDown: '#c80000',\r\n}\r\n\r\nclass Aroon extends Indicator {\r\n static type = IndicatorType.Aro\r\n static label = 'Aroon'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', COLORS.aroonUp)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonUp[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', COLORS.aroonDown)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonDown[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n if (!this.aroonCalculation) return\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (aroonDown.length > 0) {\r\n textLabels.push({\r\n text: aroonDown.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonDown.last()!)),\r\n background: COLORS.aroonDown,\r\n })\r\n }\r\n if (aroonUp.length > 0) {\r\n textLabels.push({\r\n text: aroonUp.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonUp.last()!)),\r\n background: COLORS.aroonUp,\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon ${this.period}`\r\n }\r\n}\r\n\r\nexport default Aroon\r\n","import { IndicatorType } from '../constants/common'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass AroonOscillator extends Indicator {\r\n static type = IndicatorType.Aroosc\r\n static label = 'Aroon Oscillator'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n this.lastValue = this.aroonCalculation.calculatedValues.oscillator.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.aroonCalculation?.calculatedValues.oscillator ?? [],\r\n this.period,\r\n 0,\r\n 0,\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon Oscillator ${this.period}`\r\n }\r\n}\r\n\r\nexport default AroonOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ATR extends Indicator {\r\n static type = IndicatorType.Atr\r\n static label = 'Average True Range'\r\n\r\n atr: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.atr = []\r\n const atr = new AverageTrueRange(this.period)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n this.atr[i] = atr.value\r\n }\r\n\r\n this.lastValue = this.atr.last() ?? null\r\n }\r\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ATR ${this.period}`\r\n }\r\n}\r\n\r\nexport default ATR\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst constant = 0.015\r\nclass CommodityChannelIndex extends Indicator {\r\n static type = IndicatorType.Cci\r\n static label = 'Commodity Channel Index'\r\n\r\n cci: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let smaCount\r\n const tp = []\r\n this.cci = []\r\n let smaSum = (smaCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let devCount\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n tp[i] = typicalPrice\r\n\r\n smaSum += typicalPrice\r\n smaCount++\r\n if (smaCount > this.period) {\r\n smaSum -= tp[i - this.period]\r\n smaCount--\r\n }\r\n const sma = smaSum / smaCount\r\n\r\n if (i < this.period - 1) {\r\n continue\r\n }\r\n\r\n let devSum = (devCount = 0)\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n devSum += Math.abs(tp[j] - sma)\r\n devCount++\r\n }\r\n\r\n const dev = devSum / devCount\r\n this.cci[i] = 0\r\n if (dev > 0) {\r\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\r\n }\r\n }\r\n\r\n this.lastValue = this.cci.last() ?? null\r\n }\r\n\r\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `CCI ${this.period}`\r\n }\r\n}\r\n\r\nexport default CommodityChannelIndex\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash, Theme } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nexport interface ICOT {\r\n code: string\r\n name: string\r\n units: string\r\n commercialHedgers: number[]\r\n largeTraders: number[]\r\n smallTraders: number[]\r\n}\r\n\r\ninterface Attrs {\r\n period: string\r\n code: string\r\n}\r\n\r\ntype ColorsKeys = keyof Pick\r\n\r\nclass COT extends Indicator {\r\n static type = IndicatorType.Cot\r\n static label = 'COT'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n declare colors: ObjectHash\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() || !this.data.COTs) return\r\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\r\n if (!this.attrs.code && cotQuoteCode) {\r\n this.attrs.code = cotQuoteCode\r\n }\r\n const cot = this.data.COTs[this.attrs.code]\r\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\r\n this.max = Math.max(Math.abs(max), Math.abs(min))\r\n this.min = -this.max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n context.translate(0.5, 0.5)\r\n for (const key in this.colors) {\r\n context.set('strokeStyle', this.colors[key as ColorsKeys])\r\n context.beginPath()\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(data[i])))\r\n },\r\n })\r\n context.stroke()\r\n }\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const name = new Text(\r\n {\r\n text: this.toString(),\r\n x: 8,\r\n y: 16,\r\n font: { size: 10, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n name.render(context)\r\n\r\n new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: 38 + name.measure(),\r\n y: 16,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\r\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\r\n\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n const secondarylabelX = labelWidth + x * 2\r\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\r\n const scaleCoefficient = 0.7\r\n\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX + x,\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...fontSettings,\r\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\r\n style: 'normal',\r\n }),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n secondarylabel.set({\r\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\r\n })\r\n secondarylabel.render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n new Text(\r\n {\r\n text: 'COT',\r\n x: 23,\r\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n const text = new Text(\r\n {\r\n text: 'Commercial Hedgers',\r\n x: IndicatorSettings.left.width,\r\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\r\n font: { size: 8, style: 'bold' },\r\n fillStyle: this.colors.commercialHedgers,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n text.render(context)\r\n\r\n let x = text.get('x')! + 8 + text.measure()\r\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\r\n text.render(context)\r\n\r\n x += 8 + text.measure()\r\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\r\n text.render(context)\r\n }\r\n\r\n formatAxis(value: number) {\r\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\r\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: 'COT',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n code: this.attrs.code,\r\n }\r\n }\r\n}\r\n\r\nCOT.prototype.colors = {\r\n commercialHedgers: '#10cc10',\r\n largeTraders: '#cc1010',\r\n smallTraders: '#1010cc',\r\n}\r\n\r\nexport default COT\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n fi: number[]\r\n}\r\n\r\nexport class FICalculation extends MainCalculation {\r\n static type = IndicatorType.Fi\r\n\r\n getDefaultCalculatedValues() {\r\n return { fi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close, volume } = this.quote\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 1; index < close.length; index++) {\r\n const value = ((close[index] - close[index - 1]) * volume[index]) / 1000000\r\n ema.add(value)\r\n this.calculatedValues.fi[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { FICalculation } from '../indicator-calculation/fi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ForceIndex extends Indicator {\r\n static type = IndicatorType.Fi\r\n static label = 'Force Index'\r\n\r\n fiCalculation: FICalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.fiCalculation = new FICalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.fiCalculation.calculate()\r\n this.lastValue = this.fiCalculation.calculatedValues.fi.last() ?? null\r\n }\r\n const fi = this.fiCalculation?.calculatedValues.fi ?? []\r\n const { min, max } = fi.length > 0 ? this.computeVisibleMinMax(fi) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.fiCalculation?.calculatedValues.fi ?? [], 1, 0, 0, 0, false)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 13,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `FORCE ${this.period}`\r\n }\r\n}\r\n\r\nexport default ForceIndex\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n macd: number[]\r\n signal: number[]\r\n histogram: number[]\r\n}\r\n\r\nexport class MACDCalculation extends MainCalculation {\r\n static type = IndicatorType.Macd\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n macd: [],\r\n signal: [],\r\n histogram: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { fastPeriod, slowPeriod, signalPeriod } = this.options\r\n const emaFast = new ExponentialMovingAverage(fastPeriod)\r\n const emaSlow = new ExponentialMovingAverage(slowPeriod)\r\n const emaSignal = new ExponentialMovingAverage(signalPeriod)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n const d = close[i]\r\n\r\n emaFast.add(d)\r\n emaSlow.add(d)\r\n const macd = emaFast.value - emaSlow.value\r\n emaSignal.add(macd)\r\n\r\n this.calculatedValues.macd[i] = macd\r\n this.calculatedValues.signal[i] = emaSignal.value\r\n this.calculatedValues.histogram[i] = macd - emaSignal.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { MACDCalculation } from '../indicator-calculation/macd'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\nclass MACD extends Indicator {\r\n static type = IndicatorType.Macd\r\n static label = 'MACD'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\r\n }\r\n\r\n macdCalculation: MACDCalculation | null = null\r\n\r\n declare fastPeriod: number\r\n declare slowPeriod: number\r\n declare signalPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\r\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary() || this.macdCalculation === null) {\r\n this.macdCalculation = new MACDCalculation({\r\n quote: this.data,\r\n options: {\r\n signalPeriod: this.signalPeriod,\r\n fastPeriod: this.fastPeriod,\r\n slowPeriod: this.slowPeriod,\r\n },\r\n })\r\n this.macdCalculation.calculate()\r\n\r\n this.lastValue = this.macdCalculation.calculatedValues.macd.last() ?? null\r\n }\r\n\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n\r\n const { min, max } =\r\n macd.length > 0 || signal.length > 0 || histogram.length > 0\r\n ? this.computeVisibleMinMax(macd, signal, histogram)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.macdCalculation === null || this.data.close.length === 0) return\r\n const y = Math.round(this.fy(0))\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n }\r\n\r\n context.set('fillStyle', '#79c3e8')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.rect(x - halfBarWidth, y, barWidthWithoutMargin, Math.round(this.fy(histogram[i]) - y))\r\n },\r\n })\r\n context.fill()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(macd[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.signalLine)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(signal[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const fastPeriod = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'fastPeriod',\r\n value: this.fastPeriod ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const slowPeriod = {\r\n type: 'number',\r\n label: 'Slow',\r\n name: 'slowPeriod',\r\n value: this.slowPeriod ?? 26,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const signalPeriod = {\r\n type: 'number',\r\n label: 'Signal',\r\n name: 'signalPeriod',\r\n value: this.signalPeriod ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [fastPeriod, slowPeriod, signalPeriod],\r\n inputsErrorMessages: {\r\n fastPeriod: `${fastPeriod.label} must be a whole number between ${fastPeriod.min} and ${fastPeriod.max}`,\r\n slowPeriod: `${slowPeriod.label} must be a whole number between ${slowPeriod.min} and ${slowPeriod.max}`,\r\n signalPeriod: `${signalPeriod.label} must be a whole number between ${signalPeriod.min} and ${signalPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'fastPeriod':\r\n case 'slowPeriod':\r\n case 'signalPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `MACD ${this.fastPeriod},${this.slowPeriod},${this.signalPeriod}`\r\n }\r\n}\r\n\r\nexport default MACD\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass MFI extends Indicator {\r\n static type = IndicatorType.Mfi\r\n static label = 'Money Flow Index'\r\n\r\n mfi: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n let negativeMoneyFlow\r\n const mf = []\r\n this.mfi = []\r\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\r\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n const moneyFlow = typicalPrice * this.data.volume[i]\r\n\r\n if (typicalPrice > prevTypicalPrice) {\r\n positiveMoneyFlow += moneyFlow\r\n mf[i] = moneyFlow\r\n } else if (typicalPrice < prevTypicalPrice) {\r\n negativeMoneyFlow += moneyFlow\r\n mf[i] = -moneyFlow\r\n }\r\n\r\n if (i > this.period) {\r\n const oldMF = mf[i - this.period]\r\n if (oldMF > 0) {\r\n positiveMoneyFlow -= oldMF\r\n } else if (oldMF < 0) {\r\n negativeMoneyFlow += oldMF\r\n }\r\n\r\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\r\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\r\n } else {\r\n this.mfi[i] = 50\r\n }\r\n }\r\n\r\n prevTypicalPrice = typicalPrice\r\n }\r\n\r\n this.lastValue = this.mfi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `MFI ${this.period}`\r\n }\r\n}\r\n\r\nexport default MFI\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\nclass None extends Indicator {\r\n static type = IndicatorType.None\r\n static label = 'None'\r\n\r\n compute() {}\r\n\r\n renderIndicator() {}\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nexport default None\r\n","import { IndicatorType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nclass OBV extends Indicator {\r\n static type = IndicatorType.Obv\r\n static label = 'On-Balance Volume'\r\n\r\n obv: number[] = []\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.obv = [0]\r\n\r\n for (let i = 1; i < this.data.volume.length; i++) {\r\n let currentObv = this.obv[i - 1]\r\n if (this.data.close[i] > this.data.close[i - 1]) {\r\n currentObv += this.data.volume[i]\r\n } else if (this.data.close[i] < this.data.close[i - 1]) {\r\n currentObv -= this.data.volume[i]\r\n }\r\n\r\n this.obv[i] = currentObv\r\n }\r\n\r\n this.lastValue = this.obv.last() ?? null\r\n }\r\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return 'OBV'\r\n }\r\n}\r\n\r\nexport default OBV\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport {\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n OFFSET,\r\n PADDING,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getSanitizedTicker } from '../utils'\r\nimport { getInstrument } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n tickers?: string\r\n}\r\n\r\nconst DEFAULT_TICKERS = 'SPY,QQQ'\r\n\r\nclass PricePerformance extends Indicator {\r\n static type = IndicatorType.Perf\r\n static label = 'Price Performance %'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n timeframe: string\r\n tickers = ''\r\n ready = false\r\n firstFetchCalled = false\r\n first: ObjectHash = {}\r\n perf: ObjectHash = {}\r\n quotes: ObjectHash = {}\r\n indicatorLabelWidth: ObjectHash = {}\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n\r\n this.timeframe = this.model.chart().timeframe\r\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\r\n if (this.attrs.period && !this.tickers) {\r\n this.tickers = this.attrs.period\r\n }\r\n }\r\n\r\n async compute() {\r\n const tickers = this.getTickers()\r\n const chartLayoutModel = this.model.chart().chart_layout()\r\n const chartUuid = chartLayoutModel.uuid\r\n const hasCachedData = this.getTickersAndTimeframe().every(\r\n ({ ticker, instrument, timeframe }) =>\r\n Quote.select(\r\n (q: Quote) =>\r\n q.ticker === ticker &&\r\n q.instrument === instrument &&\r\n q.timeframe === timeframe &&\r\n chartLayoutModel.isIdeaId(q.ideaID) &&\r\n chartUuid === q.chartUuid &&\r\n !q.isFetching\r\n ).length > 0\r\n )\r\n\r\n if (this.timeframe !== this.model.chart().quote().timeframe || (!this.ready && !this.firstFetchCalled)) {\r\n this.timeframe = this.model.chart().quote().timeframe\r\n this.firstFetchCalled = true\r\n\r\n if (!hasCachedData) {\r\n const data = await Quote.getAll(this.getTickersAndTimeframe())\r\n if (data) {\r\n this._compute(tickers, data)\r\n this.trigger('change')\r\n }\r\n } else {\r\n this.ready = true\r\n this.compute()\r\n }\r\n } else if (this.ready) {\r\n const data: ObjectHash = {}\r\n for (const ticker of tickers) {\r\n data[ticker] = Quote.select(\r\n (q: Quote) =>\r\n q.ticker === ticker &&\r\n q.timeframe === this.timeframe &&\r\n chartUuid === q.chartUuid &&\r\n chartLayoutModel.isIdeaId(q.ideaID)\r\n )[0]\r\n }\r\n this._compute(tickers, data)\r\n }\r\n }\r\n\r\n _compute(tickers: string[], data: ObjectHash) {\r\n const { leftOffset } = this.model.chart()\r\n let firstBarTime = null\r\n let lastBarTime = null\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.contentWidth) {\r\n // margin?\r\n continue\r\n }\r\n\r\n // Rendering one extra bar out of viewport ensures continuity of line, if there are missing data on intraday the indicator may have gaps\r\n if (firstBarTime === null) {\r\n firstBarTime = this.data.date[i]\r\n }\r\n\r\n lastBarTime = this.data.date[i]\r\n }\r\n\r\n data[this.data.ticker] = this.data\r\n this.quotes = data\r\n this.perf = {}\r\n const dateToIndex = this.data.getDateToIndex()\r\n for (const ticker of [this.data.ticker, ...tickers]) {\r\n this.perf[ticker] = []\r\n const d = data[ticker]\r\n if (!d) {\r\n continue\r\n }\r\n let first = null\r\n let index = -1\r\n for (let i = 0; i < d.close.length; i++) {\r\n const date = d.date[i]\r\n if (date < firstBarTime! || date > lastBarTime!) {\r\n continue\r\n }\r\n\r\n index = dateToIndex[date]\r\n if (index === undefined || index === null) {\r\n continue\r\n }\r\n\r\n if (first === null) {\r\n first = d.close[i]\r\n this.first[ticker] = first\r\n if (index > 0) {\r\n this.perf[ticker][index - 1] = (d.close[i] * 100) / first - 100\r\n }\r\n }\r\n\r\n this.perf[ticker][index] = (d.close[i] * 100) / first - 100\r\n }\r\n\r\n if (index < this.data.date.length - 1 && first !== null) {\r\n this.perf[ticker][index + 1] = this.perf[ticker][index]\r\n }\r\n }\r\n\r\n const perfArrays = Object.keys(this.perf).map((x) => this.perf[x])\r\n const { min, max } = perfArrays.some((array) => array.length > 0)\r\n ? this.computeVisibleMinMax(...perfArrays)\r\n : this.getDomainDefaults(this.type)\r\n\r\n this.min = min\r\n this.max = max\r\n\r\n const fy = d3\r\n .scaleLinear()\r\n .range([0, this.contentHeight])\r\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\r\n if (!this.model.scaleRange) {\r\n fy.nice(10)\r\n }\r\n // @ts-expect-error - TODO scale.y types dont match\r\n this.model.scale.y = this.fy = fy\r\n this.ready = true\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n const { ColorsSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.translate(0.5, 0.5)\r\n const iterable = this.getTickers()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const ticker = iterable[index]\r\n if (this.perf[ticker].length > 0) {\r\n context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n context.beginPath()\r\n for (let i = 0; i < this.perf[ticker].length; i++) {\r\n const y = Math.round(this.fy(this.perf[ticker][i]))\r\n context.lineTo(this.fx(i), y)\r\n }\r\n context.stroke()\r\n }\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n for (let i = 0; i < this.perf[this.data.ticker].length; i++) {\r\n const y = Math.round(this.fy(this.perf[this.data.ticker][i]))\r\n if (!isNaN(y)) {\r\n context.lineTo(this.fx(i), y)\r\n }\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || !crossIndex) {\r\n return\r\n }\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n tickers.forEach((key, index) => {\r\n const crossIndexTickerTimeStamp = this.quotes?.[this.data.ticker]?.getDataByBarIndex('date', crossIndex)\r\n const tickerDateToIndex = crossIndexTickerTimeStamp\r\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\r\n : null\r\n const tickerPerformance = tickerDateToIndex\r\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\r\n : null\r\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top! -\r\n PADDING.XXXS,\r\n PADDING.XXXS + this.indicatorLabelWidth[key] + PADDING.XXXS,\r\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\r\n )\r\n new Text(\r\n {\r\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y:\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || !crossIndex) {\r\n return\r\n }\r\n\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let isVertical = true\r\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n const tickerText = new Text(\r\n {\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...IndicatorSettings.left.indicatorLabel.font,\r\n style: 'normal',\r\n }),\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\r\n },\r\n this.model\r\n )\r\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n let y =\r\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\r\n\r\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\r\n\r\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\r\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\r\n isVertical = false\r\n x += x + this.labelWidth\r\n } else {\r\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n const tickerQuote = this.quotes?.[this.data.ticker]\r\n const maxCrossIndex = Math.min(crossIndex, (tickerQuote?.close.length ?? Infinity) - 1)\r\n tickers.forEach((key, index) => {\r\n const crossIndexTickerTimeStamp = tickerQuote?.getDataByBarIndex('date', maxCrossIndex)\r\n const tickerDateToIndex = crossIndexTickerTimeStamp\r\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\r\n : null\r\n const tickerPerformance = tickerDateToIndex\r\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\r\n : null\r\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\r\n tickerText.set({\r\n x,\r\n y,\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\r\n })\r\n const tickerTextWidth =\r\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\r\n if (\r\n !isVertical &&\r\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\r\n x + tickerTextWidth\r\n ) {\r\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\r\n y += tickerText.attrs.lineHeight\r\n tickerText.set({ x, y })\r\n }\r\n tickerText.render(context)\r\n\r\n if (isVertical) {\r\n y += tickerText.attrs.lineHeight\r\n } else {\r\n x += tickerTextWidth\r\n }\r\n }\r\n })\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n return super.renderXAxis(context)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n let ticker\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.ready) {\r\n return\r\n }\r\n if (this.perf[this.data.ticker].length === 0) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', { size }),\r\n lineHeight,\r\n padding: {\r\n left: padding!.left!,\r\n right: padding!.right!,\r\n top: padding!.top!,\r\n bottom: padding!.bottom!,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n },\r\n this.model\r\n )\r\n const iterable = this.getTickers()\r\n const textLabels = []\r\n for (let index = 0; index < iterable.length; index++) {\r\n ticker = iterable[index]\r\n if (this.perf[ticker].length > 0) {\r\n textLabels.push({\r\n text: this.perf[ticker].last().toFixed(2) + '%',\r\n y: Math.round(this.fy(this.perf[ticker].last())),\r\n background: ColorsSettings[index % ColorsSettings.length],\r\n })\r\n }\r\n }\r\n textLabels.push({\r\n text: this.perf[this.data.ticker].last().toFixed(2) + '%',\r\n y: Math.round(this.fy(this.perf[this.data.ticker].last())),\r\n background: Colors.performanceIndicatorLabel,\r\n })\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n super.renderLabelQuotePage(context)\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (this.ready) {\r\n const tickers = this.getTickers()\r\n const tickerPerformance = [\r\n { [this.data.ticker]: this.perf[this.data.ticker][this.perf[this.data.ticker].length - 1] },\r\n ...tickers.map((ticker) => ({ [ticker]: this.perf[ticker][this.perf[ticker].length - 1] })),\r\n ].reduce((prev, current) => ({ ...prev, ...current }), {})\r\n Object.keys(tickerPerformance).forEach((key, index) => {\r\n if (tickerPerformance[key]) {\r\n const text = new Text(\r\n {\r\n text: `${key} ${tickerPerformance[key].toFixed(2)}%`,\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y:\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\r\n text.render(context)\r\n }\r\n })\r\n }\r\n }\r\n\r\n getTickers() {\r\n return this.tickers\r\n .split(',')\r\n .map((ticker) => ticker)\r\n .filter((x) => x)\r\n }\r\n\r\n getTickersAndTimeframe() {\r\n const { timeframe } = this.model.chart().quote()\r\n return this.getTickers().map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n }\r\n\r\n set(values: Partial) {\r\n this.ready = false\r\n this.firstFetchCalled = false\r\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\r\n this.tickers = (this.tickers || '').toUpperCase()\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [\r\n {\r\n type: 'text',\r\n label: 'Tickers',\r\n name: 'tickers',\r\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\r\n required: true,\r\n },\r\n ],\r\n inputsErrorMessages: {\r\n tickers: 'At least one ticker has to be provided',\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'tickers':\r\n return this[key].length > 0\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return this.getIsChartPageSpecificFunctionality() ? 'PERF %' : `PERF% ${this.tickers}`\r\n }\r\n}\r\n\r\nexport default PricePerformance\r\n","import { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: number | string\r\n momentum: number\r\n}\r\n\r\nclass RMI extends Indicator {\r\n static type = IndicatorType.Rmi\r\n static label = 'Relative Momentum Index'\r\n\r\n rmi: number[] = []\r\n declare momentum: number\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, momentum })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.rmi = []\r\n let count = 0\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = this.momentum; i < this.data.close.length; i++) {\r\n u = d = 0\r\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\r\n u = this.data.close[i] - this.data.close[i - this.momentum]\r\n }\r\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\r\n d = this.data.close[i - this.momentum] - this.data.close[i]\r\n }\r\n\r\n if (count < this.period) {\r\n sumu += u\r\n sumd += d\r\n count++\r\n au = sumu / count\r\n ad = sumd / count\r\n } else {\r\n au = (au! * (this.period - 1) + u) / this.period\r\n ad = (ad! * (this.period - 1) + d) / this.period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\r\n }\r\n\r\n this.lastValue = this.rmi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const momentum = {\r\n type: 'number',\r\n label: 'Momentum',\r\n name: 'momentum',\r\n value: this.momentum ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, momentum],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n momentum: `${momentum.label} must be a whole number between ${momentum.min} and ${momentum.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'momentum':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RMI ${this.period},${this.momentum}`\r\n }\r\n}\r\n\r\nexport default RMI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ROC extends Indicator {\r\n static type = IndicatorType.Roc\r\n static label = 'Rate of Change %'\r\n\r\n roc: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.roc = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\r\n }\r\n\r\n this.lastValue = this.roc.last() ?? null\r\n }\r\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ROC ${this.period}`\r\n }\r\n}\r\n\r\nexport default ROC\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rsi: number[]\r\n}\r\n\r\nexport class RsiCalculation extends MainCalculation {\r\n static type = IndicatorType.Rsi\r\n\r\n getDefaultCalculatedValues() {\r\n return { rsi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = 1; i < close.length; i++) {\r\n u = d = 0\r\n if (close[i] > close[i - 1]) {\r\n u = close[i] - close[i - 1]\r\n }\r\n if (close[i] < close[i - 1]) {\r\n d = close[i - 1] - close[i]\r\n }\r\n\r\n if (i <= period) {\r\n sumu += u\r\n sumd += d\r\n au = sumu / i\r\n ad = sumd / i\r\n } else {\r\n au = (au! * (period - 1) + u) / period\r\n ad = (ad! * (period - 1) + d) / period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.calculatedValues.rsi[i] = 100 - 100 * (1 / (1 + rs))\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { RsiCalculation } from '../indicator-calculation/rsi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass RSI extends Indicator {\r\n static type = IndicatorType.Rsi\r\n static label = 'Relative Strength Index'\r\n\r\n rsiCalculation: RsiCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.rsiCalculation !== null) return\r\n\r\n this.rsiCalculation = new RsiCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.rsiCalculation.calculate()\r\n\r\n this.lastValue = this.rsiCalculation.calculatedValues.rsi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rsiCalculation?.calculatedValues.rsi ?? [], this.period, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RSI ${this.period}`\r\n }\r\n}\r\n\r\nexport default RSI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: number | string\r\n baseLine: number\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 50,\r\n BaseLine: 1.0,\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\r\n\r\n return [period, baseLine]\r\n}\r\n\r\nclass RelativeVolume extends Indicator {\r\n static type = IndicatorType.Rvol\r\n static label = 'Relative Volume'\r\n\r\n rvol: number[] = []\r\n declare period: number\r\n declare baseLine: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\r\n super.set({ ...values, period, baseLine })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.rvol = []\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.period; i++) {\r\n sum += this.data.volume[i]\r\n }\r\n for (let i = this.period; i < this.data.volume.length; i++) {\r\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\r\n this.rvol[i] = this.data.volume[i] / (sum / this.period)\r\n }\r\n\r\n this.lastValue = this.rvol.last() ?? null\r\n }\r\n\r\n const { min, max } =\r\n this.rvol.length > 0\r\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period + 1,\r\n drawBarCallback: (i, x) => {\r\n if (this.rvol[i] === undefined) return\r\n\r\n const baseLine = Math.round(this.fy(this.baseLine))\r\n const y = Math.round(this.fy(this.rvol[i]))\r\n\r\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\r\n },\r\n })\r\n\r\n const baseLineY = this.fy(this.baseLine)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(baseLineY),\r\n y2: Math.round(baseLineY),\r\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const baseLine = {\r\n type: 'number',\r\n label: 'Baseline',\r\n name: 'baseLine',\r\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\r\n required: true,\r\n step: 0.1,\r\n allowDecimal: true,\r\n min: 0,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, baseLine],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n baseLine: `${baseLine.label} must be a number between ${baseLine.min} and ${baseLine.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'baseLine':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RVOL ${this.period}, ${this.baseLine}, SMA`\r\n }\r\n}\r\n\r\nexport default RelativeVolume\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass RWI extends Indicator {\r\n static type = IndicatorType.Rwi\r\n static label = 'Random Walk Index'\r\n\r\n tr: number[] = []\r\n atr: number[] = []\r\n rwiHi: number[] = []\r\n rwiLo: number[] = []\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.tr = []\r\n this.atr = []\r\n this.rwiHi = []\r\n this.rwiLo = []\r\n let atr = 0\r\n\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n this.tr[i] = tr\r\n\r\n if (i < this.period) {\r\n atr += tr\r\n this.atr[i] = atr / (i + 1)\r\n if (i === this.period - 1) {\r\n atr /= this.period\r\n }\r\n } else {\r\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\r\n }\r\n }\r\n\r\n for (let i = this.period + 2; i < this.data.close.length; i++) {\r\n const h = this.data.high[i]\r\n const l = this.data.low[i]\r\n let trSum = this.tr[i - 1] + this.tr[i - 2]\r\n let count = 2\r\n let atrWeight = (trSum / count) * Math.sqrt(count)\r\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\r\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\r\n for (let j = i - 1; j > i - this.period + 1; j--) {\r\n trSum += this.tr[j - 2]\r\n count++\r\n atrWeight = (trSum / count) * Math.sqrt(count)\r\n if (atrWeight === 0) {\r\n continue\r\n }\r\n\r\n const hi = (h - this.data.low[j - 1]) / atrWeight\r\n if (hi > maxHi) {\r\n maxHi = hi\r\n }\r\n\r\n const lo = (this.data.high[j - 1] - l) / atrWeight\r\n if (lo > maxLo) {\r\n maxLo = lo\r\n }\r\n }\r\n this.rwiHi[i] = maxHi\r\n this.rwiLo[i] = maxLo\r\n }\r\n }\r\n const { min, max } =\r\n this.rwiHi.length > 0 || this.rwiLo.length > 0\r\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#00a000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (this.rwiLo.length > 0) {\r\n textLabels.push({\r\n text: this.rwiLo.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiLo.last()!)),\r\n background: '#c80000',\r\n })\r\n }\r\n if (this.rwiHi.length > 0) {\r\n textLabels.push({\r\n text: this.rwiHi.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiHi.last()!)),\r\n background: '#00a000',\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RWI ${this.period}`\r\n }\r\n}\r\n\r\nexport default RWI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass Stochastics extends Indicator {\r\n static type = IndicatorType.Stofu\r\n static label = 'Stochastics FULL'\r\n\r\n k: number[] = []\r\n k1: number[] = []\r\n d: number[] = []\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n const period = Math.min(this.period, this.data.close.length - 1)\r\n let dCount, dSum, k\r\n this.k1 = []\r\n this.k = []\r\n this.d = []\r\n let kSum = (dSum = 0)\r\n let kCount = (dCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\r\n if (highestHigh === lowestLow) {\r\n k = 100\r\n }\r\n this.k1[i] = k\r\n if (this.kPeriod > 1) {\r\n kSum += k\r\n kCount++\r\n if (kCount > this.kPeriod) {\r\n kSum -= this.k1[i - this.kPeriod]\r\n kCount--\r\n }\r\n k = kSum / kCount\r\n }\r\n\r\n dSum += k\r\n dCount++\r\n if (dCount > this.dPeriod) {\r\n dSum -= this.k[i - this.dPeriod]\r\n dCount--\r\n }\r\n\r\n const d = dSum / dCount\r\n this.k[i] = k\r\n this.d[i] = d\r\n }\r\n\r\n this.lastValue = this.k.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(50)),\r\n y2: Math.round(this.fy(50)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(20)),\r\n y2: Math.round(this.fy(20)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(80)),\r\n y2: Math.round(this.fy(80)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.k[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.d[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const kPeriod = {\r\n type: 'number',\r\n label: 'K Period',\r\n name: 'kPeriod',\r\n value: this.kPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, kPeriod, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n kPeriod: `${kPeriod.label} must be a whole number between ${kPeriod.min} and ${kPeriod.max}`,\r\n } as {\r\n period: string\r\n dPeriod: string\r\n kPeriod?: string\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n case 'kPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics FULL ${this.period},${this.kPeriod},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default Stochastics\r\n","import { IndicatorType } from '../constants/common'\r\nimport Pane from '../models/pane'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Stochastics from './stofu'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass StochasticsFast extends Stochastics {\r\n static type = IndicatorType.Stofa\r\n static label = 'Stochastics FAST'\r\n\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.kPeriod = 1\r\n }\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics FAST ${this.period},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default StochasticsFast\r\n","import { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Stochastics from './stofu'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass StochasticsSlow extends Stochastics {\r\n static type = IndicatorType.Stosl\r\n static label = 'Stochastics SLOW'\r\n\r\n kPeriod = 3\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics SLOW ${this.period},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default StochasticsSlow\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n trix: number[]\r\n}\r\n\r\nexport class TrixCalculation extends MainCalculation {\r\n static type = IndicatorType.Trix\r\n\r\n getDefaultCalculatedValues() {\r\n return { trix: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema1 = new ExponentialMovingAverage(period)\r\n const ema2 = new ExponentialMovingAverage(period)\r\n const ema3 = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let prev = 0\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema1.add(close[index])\r\n ema2.add(ema1.value)\r\n ema3.add(ema2.value)\r\n if (prev > 0) {\r\n this.calculatedValues.trix[index] = (ema3.value * 100) / prev - 100\r\n }\r\n prev = ema3.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { TrixCalculation } from '../indicator-calculation/trix'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass Trix extends Indicator {\r\n static type = IndicatorType.Trix\r\n static label = 'TRIX'\r\n\r\n trixCalculation: TrixCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.trixCalculation = new TrixCalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.trixCalculation.calculate()\r\n this.lastValue = this.trixCalculation.calculatedValues.trix.last() ?? null\r\n }\r\n const trix = this.trixCalculation?.calculatedValues.trix ?? []\r\n const { min, max } = trix.length > 0 ? this.computeVisibleMinMax(trix) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const value = this.trixCalculation?.calculatedValues.trix[i]\r\n if (value) context.lineTo(x, ~~this.fy(value))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `TRIX ${this.period}`\r\n }\r\n}\r\n\r\nexport default Trix\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n period1: number\r\n period2: number\r\n period3: number\r\n}\r\n\r\nclass UltimateOscillator extends Indicator {\r\n static type = IndicatorType.Ult\r\n static label = 'Ultimate Oscillator'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(period1, period2, period3)\r\n }\r\n\r\n declare period1: number\r\n declare period2: number\r\n declare period3: number\r\n ult: number[] = []\r\n tr: number[] = []\r\n bp: number[] = []\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period1, period2, period3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.ult = []\r\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\r\n const tr = []\r\n const bp = []\r\n let bpSum1 = (bpSum2 = bpSum3 = 0)\r\n let trSum1 = (trSum2 = trSum3 = 0)\r\n let count1 = (count2 = count3 = 0)\r\n let avg2, avg3\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\r\n tr[i] = Math.max(this.data.high[i], this.data.close[i - 1]) - Math.min(this.data.low[i], this.data.close[i - 1])\r\n\r\n bpSum1 += bp[i]\r\n trSum1 += tr[i]\r\n count1++\r\n if (count1 > this.period1) {\r\n bpSum1 -= bp[i - this.period1]\r\n trSum1 -= tr[i - this.period1]\r\n }\r\n\r\n bpSum2 += bp[i]\r\n trSum2 += tr[i]\r\n count2++\r\n if (count2 > this.period2) {\r\n bpSum2 -= bp[i - this.period2]\r\n trSum2 -= tr[i - this.period2]\r\n }\r\n\r\n bpSum3 += bp[i]\r\n trSum3 += tr[i]\r\n count3++\r\n if (count3 > this.period3) {\r\n bpSum3 -= bp[i - this.period3]\r\n trSum3 -= tr[i - this.period3]\r\n }\r\n\r\n let avg1 = (avg2 = avg3 = 0)\r\n if (trSum1 > 0) {\r\n avg1 = bpSum1 / trSum1\r\n }\r\n if (trSum2 > 0) {\r\n avg2 = bpSum2 / trSum2\r\n }\r\n if (trSum3 > 0) {\r\n avg3 = bpSum3 / trSum3\r\n }\r\n\r\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\r\n }\r\n\r\n this.lastValue = this.ult.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period1 = {\r\n type: 'number',\r\n label: 'Period 1',\r\n name: 'period1',\r\n value: this.period1 ?? 7,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const period2 = {\r\n type: 'number',\r\n label: 'Period 2',\r\n name: 'period2',\r\n value: this.period2 ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const period3 = {\r\n type: 'number',\r\n label: 'Period 3',\r\n name: 'period3',\r\n value: this.period3 ?? 28,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period1, period2, period3],\r\n inputsErrorMessages: {\r\n period1: `${period1.label} must be a whole number between ${period1.min} and ${period1.max}`,\r\n period2: `${period2.label} must be a whole number between ${period2.min} and ${period2.max}`,\r\n period3: `${period3.label} must be a whole number between ${period3.min} and ${period3.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period1':\r\n case 'period2':\r\n case 'period3':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ULT ${this.period1},${this.period2},${this.period3}`\r\n }\r\n}\r\n\r\nexport default UltimateOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nclass Volume extends Indicator {\r\n static type = IndicatorType.Vol\r\n static label = 'Volume'\r\n\r\n compute() {\r\n const { min, max } =\r\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n this.lastValue = this.data.volume.last() ?? null\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.fy(this.data.volume[i]))\r\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\r\n },\r\n })\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return `Volume`\r\n }\r\n}\r\n\r\nexport default Volume\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass WilliamsR extends Indicator {\r\n static type = IndicatorType.Wr\r\n static label = 'Williams %R'\r\n\r\n declare period: number\r\n r: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.r = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n this.r[i] = 0\r\n if (highestHigh - lowestLow > 0) {\r\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\r\n }\r\n }\r\n\r\n this.lastValue = this.r.last() ?? null\r\n }\r\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `W%R ${this.period}`\r\n }\r\n}\r\n\r\nexport default WilliamsR\r\n","import { IndicatorType } from '../constants/common'\r\nimport adx from './adx'\r\nimport aro from './aro'\r\nimport aroosc from './aroosc'\r\nimport atr from './atr'\r\nimport cci from './cci'\r\nimport cot from './cot'\r\nimport fi from './fi'\r\nimport indicator from './indicator'\r\nimport macd from './macd'\r\nimport mfi from './mfi'\r\nimport none from './none'\r\nimport obv from './obv'\r\nimport perf from './perf'\r\nimport rmi from './rmi'\r\nimport roc from './roc'\r\nimport rsi from './rsi'\r\nimport rvol from './rvol'\r\nimport rwi from './rwi'\r\nimport stofa from './stofa'\r\nimport stofu from './stofu'\r\nimport stosl from './stosl'\r\nimport trix from './trix'\r\nimport ult from './ult'\r\nimport vol from './vol'\r\nimport wr from './wr'\r\n\r\n// TODO check if this doesn't break saved charts\r\nexport const indicatorsByType = Object.freeze({\r\n [IndicatorType.Indicator]: indicator,\r\n [IndicatorType.None]: none,\r\n [IndicatorType.Adx]: adx,\r\n [IndicatorType.Aro]: aro,\r\n [IndicatorType.Aroosc]: aroosc,\r\n [IndicatorType.Atr]: atr,\r\n [IndicatorType.Cci]: cci,\r\n [IndicatorType.Cot]: cot,\r\n [IndicatorType.Fi]: fi,\r\n [IndicatorType.Macd]: macd,\r\n [IndicatorType.Mfi]: mfi,\r\n [IndicatorType.Obv]: obv,\r\n [IndicatorType.Perf]: perf,\r\n [IndicatorType.Rmi]: rmi,\r\n [IndicatorType.Roc]: roc,\r\n [IndicatorType.Rsi]: rsi,\r\n [IndicatorType.Rvol]: rvol,\r\n [IndicatorType.Rwi]: rwi,\r\n [IndicatorType.Stofa]: stofa,\r\n [IndicatorType.Stofu]: stofu,\r\n [IndicatorType.Stosl]: stosl,\r\n [IndicatorType.Trix]: trix,\r\n [IndicatorType.Ult]: ult,\r\n [IndicatorType.Vol]: vol,\r\n [IndicatorType.Wr]: wr,\r\n})\r\n\r\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol])\r\n","export const publishModalAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\r\n cacheKey: 'modals-publish',\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nimport { DefaultSpineEvents } from '../../types/shared'\r\nimport ElementModule from '../canvas/element'\r\nimport IndicatorModule from '../indicators/indicator'\r\nimport { useForceUpdate } from '../utils/force-update'\r\nimport { getJSONReplacerFunc } from '../utils/helpers'\r\n\r\ninterface UseModelStateOptions {\r\n watchProperties?: T extends null ? never[] : Array\r\n listenOnEvents?: string[]\r\n}\r\n\r\nconst getIsSpineObject = (value: any) =>\r\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\r\n\r\nconst getWatchedPropValue = (\r\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\r\n model: Model | null\r\n) => {\r\n if (typeof watchedProp === 'function') {\r\n const value = watchedProp.call(model)\r\n\r\n if (value && !getIsSpineObject(value)) {\r\n throw Error('Watched prop should have a primitive value or a spine object')\r\n }\r\n\r\n if (typeof value?.all === 'function') {\r\n return value.all()\r\n }\r\n\r\n return value\r\n }\r\n\r\n if (typeof watchedProp === 'object') {\r\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\r\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\r\n }\r\n\r\n return watchedProp\r\n}\r\n\r\nconst getWatchedProps = (model: Model | null, props?: Array) =>\r\n props?.reduce(\r\n (acc, propKey) => ({\r\n ...acc,\r\n [propKey]: getWatchedPropValue(model?.[propKey], model),\r\n }),\r\n {} as Partial\r\n )\r\n\r\nconst getAreWatchedPropsEqual = (\r\n currentValue: Value,\r\n previousValue: Value\r\n) => {\r\n if (currentValue instanceof Spine.Model) {\r\n return currentValue.eql(previousValue)\r\n }\r\n\r\n return currentValue === previousValue\r\n}\r\n\r\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\r\n\r\nexport function useModelState(\r\n model: Model,\r\n options: UseModelStateOptions = {}\r\n) {\r\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\r\n const stringifiedOptions = JSON.stringify(options)\r\n const { forceUpdate } = useForceUpdate()\r\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\r\n\r\n React.useEffect(() => {\r\n const handleModelChange = () => {\r\n const hasChange = watchProperties.some((propKey) => {\r\n const currentValue = getWatchedPropValue(model?.[propKey], model)\r\n const previousValue = watchedPropertiesRef.current?.[propKey]\r\n\r\n if (Array.isArray(currentValue)) {\r\n return (\r\n !Array.isArray(previousValue) ||\r\n currentValue.length !== previousValue.length ||\r\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\r\n )\r\n }\r\n\r\n return !getAreWatchedPropsEqual(currentValue, previousValue)\r\n })\r\n\r\n if (hasChange) {\r\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\r\n forceUpdate()\r\n }\r\n }\r\n\r\n const spineEvents = listenOnEvents.join(' ')\r\n\r\n model?.bind(spineEvents, handleModelChange)\r\n\r\n forceUpdate()\r\n\r\n return () => {\r\n model?.unbind(spineEvents, handleModelChange)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [model?.cid, stringifiedOptions, forceUpdate])\r\n\r\n return model\r\n}\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPane,\r\n CustomSpineEvents,\r\n Instrument,\r\n ObjectHash,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport BaseChart from '../charts/base_chart'\r\nimport PerfChart from '../charts/perf_chart'\r\nimport {\r\n DateRangeType,\r\n IndicatorType,\r\n QuotePollingIntervalInMs,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\r\nimport COT from '../indicators/cot'\r\nimport PricePerformance from '../indicators/perf'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils from '../utils'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\r\nimport ChartLayout from './chart_layout'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\n\r\nclass Chart extends Spine.Model {\r\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\r\n this.configure(\r\n 'Chart',\r\n 'width',\r\n 'height',\r\n 'timeframe',\r\n 'dateRange',\r\n 'scale',\r\n 'leftOffset',\r\n 'ticker',\r\n 'instrument',\r\n 'fx',\r\n 'fy',\r\n 'zoomFactor',\r\n 'refreshData',\r\n 'stretch',\r\n 'isHideDrawingsActive',\r\n 'isScrolled',\r\n 'firstBarClose',\r\n 'premarket',\r\n 'aftermarket',\r\n 'hasChartEvents'\r\n )\r\n this.hasMany('panes', paneModel)\r\n this.belongsTo('quote', quoteModel)\r\n this.belongsTo('chart_layout', chartLayoutModel)\r\n }\r\n\r\n declare stretch: boolean\r\n declare chart_layout_id: string\r\n declare chart_layout: () => ChartLayout\r\n declare quote_id: string\r\n declare quote: () => Quote\r\n declare panes: () => Collection\r\n declare refreshData: boolean | number\r\n declare dateRange: DateRangeType\r\n declare width: number\r\n declare height: number\r\n declare timeframe: TIMEFRAME\r\n declare leftOffset: number\r\n declare ticker: string\r\n declare instrument: Instrument\r\n declare fx: (x: number) => number\r\n declare fy: (x: number) => number\r\n declare zoomFactor: number\r\n declare isHideDrawingsActive: boolean\r\n declare isScrolled: boolean\r\n declare scale: ScaleType\r\n declare firstBarClose: number\r\n declare premarket: boolean\r\n declare aftermarket: boolean\r\n declare hasChartEvents: boolean\r\n\r\n getChartPane() {\r\n return this.panes()\r\n .all()\r\n .find((pane: Pane) =>\r\n pane\r\n .elements()\r\n .all()\r\n .some((el) => el.isChart())\r\n )\r\n }\r\n\r\n getChartElement() {\r\n for (const pane of this.panes().all()) {\r\n for (const el of pane.elements().all()) {\r\n if (el.isChart()) {\r\n return el\r\n }\r\n }\r\n }\r\n }\r\n\r\n getChartType() {\r\n return this.getChartElement()?.instance.type\r\n }\r\n\r\n getRefreshInterval() {\r\n let defaultRefreshInterval: number | null = null\r\n if (typeof this.refreshData === 'number') {\r\n defaultRefreshInterval = this.refreshData\r\n } else if (this.refreshData === true) {\r\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\r\n }\r\n\r\n const isStock = this.instrument === Instrument.Stock\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\r\n if (!isPremium) {\r\n customRefreshInterval = QuotePollingIntervalInMs.Free\r\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\r\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\r\n }\r\n\r\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\r\n }\r\n\r\n toObject() {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toObject())\r\n return {\r\n width: this.width,\r\n dateRange: this.dateRange,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toConfig(omitKeys))\r\n return omit(\r\n {\r\n width: this.width,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.panes()\r\n .all()\r\n .forEach((pane) => {\r\n pane.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart_layout())\r\n }\r\n\r\n getIsDisabled() {\r\n return this.quote()?.close.length === 0\r\n }\r\n\r\n getIsScrollable() {\r\n return this.chart_layout().scrollable\r\n }\r\n\r\n getAllPanes() {\r\n return this.panes().all()\r\n }\r\n\r\n getAllValidPanes() {\r\n const cotKeys = Object.keys(this.quote().COTs ?? {})\r\n return this.getAllPanes().filter((pane) => {\r\n const mainElement = pane.mainElement()\r\n if (mainElement?.instance.type === IndicatorType.Cot) {\r\n // Type of mainElement is `Element` but it can be an indicator too\r\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\r\n }\r\n return true\r\n })\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\r\n }\r\n\r\n getAllQuotes(): Quote[] {\r\n const perfQuotes = this.getAllElements()\r\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\r\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\r\n\r\n let quotePerfTickers: Quote[] = []\r\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\r\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\r\n if (perfChart) {\r\n quotePerfTickers = Quote.select(\r\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\r\n )\r\n }\r\n }\r\n\r\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\r\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\r\n )\r\n }\r\n\r\n createPaneCascade(paneProperties: ChartConfigChartPane) {\r\n const paneModel = this.panes().create(paneProperties)\r\n\r\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\r\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\r\n paneModel.elements().create({ instance, zIndex, elementId })\r\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\r\n })\r\n\r\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\r\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\r\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\r\n }\r\n\r\n return paneModel\r\n }\r\n\r\n updateAttributesAndSync(value: T) {\r\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\r\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\r\n .flatMap(([_, modelAttr]) => modelAttr)\r\n this.updateAttributes(value)\r\n\r\n if (attrsInSync.length > 0) {\r\n this.chart_layout()\r\n .getAllCharts()\r\n .forEach((chartModel) => {\r\n if (this.eql(chartModel)) {\r\n return\r\n }\r\n const newAttrs: ObjectHash = {}\r\n attrsInSync.forEach((modelAttr) => {\r\n if (value.hasOwnProperty(modelAttr)) {\r\n newAttrs[modelAttr] = value[modelAttr]\r\n }\r\n })\r\n chartModel.updateAttributes(newAttrs)\r\n })\r\n }\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return this.chart_layout().getIsChartPartInSync(chartPart)\r\n }\r\n\r\n getHasPatterns() {\r\n return this.getAllElements().some((element) => {\r\n if ('hasOverlay' in element.instance) {\r\n return (element.instance as BaseChart).hasOverlay?.('patterns')\r\n }\r\n\r\n return false\r\n })\r\n }\r\n\r\n getQuoteRawTicker(): string | null {\r\n return this.quote()?.getRawTicker() ?? null\r\n }\r\n\r\n setChartEvents(chartEvents?: Array, shouldClear = false) {\r\n const chartPane = this.getChartPane()\r\n if (!chartPane) {\r\n return\r\n }\r\n const allChartEvents = chartPane.chartEvents().all()\r\n if (shouldClear) {\r\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\r\n }\r\n\r\n const events = shouldClear\r\n ? chartEvents\r\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\r\n\r\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\r\n const newChartEvent = chartPane.chartEvents().create({\r\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\r\n elementId,\r\n })\r\n newChartEvent.instance.updateScales()\r\n })\r\n\r\n chartPane.updateChartEventsZIndexes()\r\n }\r\n}\r\n\r\nexport default Chart\r\n","/*\r\n * it converts it to numbered index and it causes problems later on\r\n * the reason it's not just numbered enum is that it when used in const below\r\n * */\r\nexport enum ChartSyncablePart {\r\n Crosshair = 'crosshair',\r\n Ticker = 'ticker',\r\n Timeframe = 'timeframe',\r\n}\r\n\r\nexport const ChartPartToAttrsSyncMap = {\r\n [ChartSyncablePart.Ticker]: ['ticker'],\r\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\r\n}\r\n\r\nexport const ChartSyncableParts = [\r\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\r\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\r\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\r\n]\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\r\nimport { DrawingSetting } from '../controllers/toolbar/interfaces'\r\nimport Indicator from '../indicators/indicator'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartSyncablePart } from './chart/contstants'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Pane from './pane'\r\nimport { QuoteFetchType } from './quote/constants'\r\n\r\nclass ChartLayout extends Spine.Model {\r\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\r\n this.configure(\r\n 'ChartLayout',\r\n 'layout',\r\n 'activeChart',\r\n 'activePane',\r\n 'activeChartEvent',\r\n 'width',\r\n 'height',\r\n 'editable',\r\n 'canChangeTicker',\r\n 'scrollable',\r\n 'initialScrollable',\r\n 'cross',\r\n 'editors',\r\n 'theme',\r\n 'settings',\r\n 'isWheelZoomEnabled',\r\n 'specificChartFunctionality',\r\n 'isLargeChart',\r\n 'isHideDrawingsActive',\r\n 'isPreserveDrawingsActive',\r\n 'isLockDrawingsActive',\r\n 'isDrawingModeContinuousActive',\r\n 'uuid',\r\n 'isTouchCrossActive',\r\n 'defaultZoomFactor',\r\n 'syncChartParts',\r\n 'isInit',\r\n 'willDestroy',\r\n 'idea'\r\n )\r\n this.hasMany('charts', chartModel)\r\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\r\n }\r\n\r\n declare layout: LayoutType\r\n declare activeChart: Chart\r\n declare activePane?: Pane\r\n declare activeChartEvent?: ChartEventElement\r\n declare width: number\r\n declare height: number\r\n declare editable: boolean\r\n declare canChangeTicker: boolean\r\n declare scrollable: boolean\r\n declare readonly initialScrollable: boolean\r\n declare cross: boolean\r\n declare editors: ChartEditorEnum[]\r\n declare theme: Theme\r\n declare settings: ISettings\r\n declare isWheelZoomEnabled: boolean\r\n declare specificChartFunctionality: SpecificChartFunctionality\r\n declare isLargeChart?: boolean\r\n declare charts: () => Collection\r\n declare isHideDrawingsActive: boolean\r\n declare isPreserveDrawingsActive: boolean\r\n declare isLockDrawingsActive: boolean\r\n declare isDrawingModeContinuousActive: boolean\r\n declare uuid: string\r\n declare isTouchCrossActive?: boolean\r\n declare defaultZoomFactor: number\r\n declare syncChartParts: ChartSyncablePart[]\r\n declare idea?: IIdea\r\n declare isInit?: boolean\r\n declare willDestroy?: boolean\r\n declare drawingsInternalStore: () => DrawingsInternalStore\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n\r\n if (!getIsSSr()) {\r\n this.bind('update', (model: ChartLayout) => {\r\n if (!window.FinvizSettings.toolsState) {\r\n window.FinvizSettings.toolsState = {}\r\n }\r\n window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings] = model.isPreserveDrawingsActive\r\n })\r\n }\r\n }\r\n\r\n getPaneWithSelection() {\r\n for (const pane of this.getAllPanes()) {\r\n if (pane.selection) {\r\n return pane\r\n }\r\n }\r\n }\r\n\r\n toObject() {\r\n const charts = this.getAllCharts().map((chart) => chart.toObject())\r\n return {\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n }\r\n }\r\n\r\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\r\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\r\n return JSON.parse(\r\n JSON.stringify(\r\n omit(\r\n {\r\n ...this.settings.ChartSettings.center,\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n colors: this.settings.ChartSettings.general.Colors,\r\n specificChartFunctionality: this.specificChartFunctionality,\r\n editors: this.editors,\r\n editable: this.editable,\r\n scrollable: this.scrollable,\r\n theme: this.theme,\r\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\r\n },\r\n omitKeys\r\n )\r\n )\r\n )\r\n }\r\n\r\n destroy(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n return super.destroy(options)\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n this.getAllCharts().forEach((chart) => {\r\n chart.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getAllCharts() {\r\n return this.charts().all()\r\n }\r\n\r\n getAllPanes() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\r\n\r\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\r\n\r\n if (isInSync) {\r\n newSyncedChartParts.push(...chartPartsToSync)\r\n }\r\n\r\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return !!this.syncChartParts?.includes(chartPart)\r\n }\r\n\r\n getIsIndicatorPresent(type: IndicatorType) {\r\n return !!this.charts()\r\n .first()\r\n ?.getAllElements()\r\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\r\n }\r\n\r\n getHTMLElementId() {\r\n return `chart-layout-${this.id}`\r\n }\r\n\r\n exitIdea() {\r\n this.updateAttribute('idea', undefined)\r\n this.getAllCharts().forEach((chart) => {\r\n // Change all idea quotes to non idea quotes and refetch because we don't need them anymore, but they may cause inconsistencies if they are in cache\r\n chart.getAllQuotes().forEach((quote) => {\r\n if (quote.ideaID) {\r\n quote.updateAttributes({ ideaID: undefined })\r\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\r\n }\r\n })\r\n\r\n chart.updateAttributes({ refreshData: true })\r\n })\r\n }\r\n\r\n isIdeaId(id: number | null = null) {\r\n return (this.idea?.id ?? null) === id\r\n }\r\n}\r\n\r\nexport default ChartLayout\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\r\n\r\nfunction normalizeHexAlpha(hexString = '') {\r\n const hexValue = hexString.replace('#', '')\r\n if (hexValue.length === 6) {\r\n return `${hexString}FF`\r\n }\r\n return hexString\r\n}\r\n\r\nexport const getColorOverwrites = ({\r\n theme,\r\n colors,\r\n}: {\r\n theme: Theme\r\n colors: ObjectHash, Theme>\r\n}) => {\r\n const customColors = colors[theme]\r\n const customColorKeys = Object.keys(customColors) as Array>\r\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\r\n\r\n return customColorKeys.reduce((acc, colorKey) => {\r\n const isDefaultOverWritten =\r\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\r\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\r\n\r\n return isDefaultOverWritten\r\n ? {\r\n ...acc,\r\n [colorKey]: customColors[colorKey],\r\n }\r\n : acc\r\n }, {})\r\n}\r\n","import tailwindColors from '../constants/colors'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\n\r\nexport interface IChartThemeColors {\r\n aftermarketFade: string\r\n background: string\r\n borderDown: string\r\n borderUp: string\r\n canvasFill: string\r\n cross: string\r\n crossText: string\r\n crossTextBackground: string\r\n currentBackground: string\r\n currentText: string\r\n grid: string\r\n gridSecondary: string\r\n indicatorCurrentBackground: string\r\n indicatorCurrentText: string\r\n line: string\r\n marketDown: string\r\n marketUp: string\r\n negativeChange: string\r\n ohlcTrendDown: string\r\n ohlcTrendUp: string\r\n overlayTransparentBackground: string\r\n percentageZeroLineText: string\r\n performanceIndicatorLabel: string\r\n positiveChange: string\r\n premarketFade: string\r\n prevClose: string\r\n text: string\r\n textSecondary: string\r\n trendDown: string\r\n trendUp: string\r\n volumeTrendDown: string\r\n volumeTrendUp: string\r\n wickDown: string\r\n wickUp: string\r\n zeroChange: string\r\n}\r\n\r\nexport interface IIndicatorThemeColors {\r\n line: string\r\n signalLine: string\r\n}\r\n\r\nexport interface IElementThemeColors {\r\n line: string\r\n border: string\r\n textWithoutBackground: string\r\n}\r\n\r\ninterface IDarkerWickColors {\r\n borderUp: string\r\n wickUp: string\r\n borderDown: string\r\n wickDown: string\r\n}\r\n\r\nexport const chartLightTheme: IChartThemeColors = {\r\n aftermarketFade: '#FFFFFF99',\r\n background: '#008CFF0E',\r\n borderDown: '#000000FF',\r\n borderUp: '#000000FF',\r\n canvasFill: '#FFFFFFFF',\r\n cross: '#0000004C',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.brightYellow[100],\r\n currentText: tailwindColors.gray[800],\r\n grid: '#D2D2D2FF',\r\n gridSecondary: '#ECECEC',\r\n indicatorCurrentBackground: tailwindColors.gray[600],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[500],\r\n marketUp: tailwindColors.green[500],\r\n negativeChange: '#C80000FF',\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\r\n percentageZeroLineText: '#111',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: '#009600FF',\r\n premarketFade: '#FFFFFF99',\r\n prevClose: '#C80000FF',\r\n text: '#828282',\r\n textSecondary: '#dedede',\r\n trendDown: '#FF0000FF',\r\n trendUp: '#00FF00FF',\r\n volumeTrendDown: '#ffc0c0',\r\n volumeTrendUp: '#a8e0a8',\r\n wickDown: '#000000FF',\r\n wickUp: '#000000FF',\r\n zeroChange: '#000',\r\n}\r\n\r\nexport const chartDarkTheme: IChartThemeColors = {\r\n aftermarketFade: '#4C526133',\r\n background: '#1E6DC019',\r\n borderDown: '#F63538FF',\r\n borderUp: '#30CC5AFF',\r\n canvasFill: tailwindColors.gray[800],\r\n cross: '#404553',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.yellow[200],\r\n currentText: tailwindColors.gray[700],\r\n grid: '#363A46FF',\r\n gridSecondary: '#2C303A',\r\n indicatorCurrentBackground: tailwindColors.gray[500],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[300],\r\n marketUp: tailwindColors.green[300],\r\n negativeChange: tailwindColors.red[400],\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\r\n percentageZeroLineText: '#fff',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: tailwindColors.green[400],\r\n premarketFade: '#4C526133',\r\n prevClose: '#C80000FF',\r\n text: '#929cb3',\r\n textSecondary: '#929CB399',\r\n trendDown: '#F63538FF',\r\n trendUp: '#30CC5AFF',\r\n volumeTrendDown: '#F635387F',\r\n volumeTrendUp: '#30CC5A7F',\r\n wickDown: '#F63538FF',\r\n wickUp: '#30CC5AFF',\r\n zeroChange: '#929cb3',\r\n}\r\n\r\nexport const darkerWickColors: IDarkerWickColors = {\r\n borderUp: '#006400FF',\r\n wickUp: '#006400',\r\n borderDown: '#6E0000FF',\r\n wickDown: '#6E0000FF',\r\n}\r\n\r\nexport const indicatorLightTheme: IIndicatorThemeColors = {\r\n line: '#000000',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\r\n line: '#D07933',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const elementLightTheme: IElementThemeColors = {\r\n line: '#000000',\r\n border: '#000000',\r\n textWithoutBackground: '#000000',\r\n}\r\n\r\nexport const elementDarkTheme: IElementThemeColors = {\r\n line: '#5faaf4',\r\n border: '#5192D1',\r\n textWithoutBackground: '#929cb3',\r\n}\r\nexport const generalColors: Array = [\r\n '#1f77b4',\r\n '#ff7f0e',\r\n '#2ca02c',\r\n '#d62728',\r\n '#9467bd',\r\n '#8c564b',\r\n '#e377c2',\r\n '#7f7f7f',\r\n '#bcbd22',\r\n '#17becf',\r\n]\r\n\r\n// node chart with thin bars color override\r\nexport const thinBarColorsOverride = {\r\n trendUp: '#00b400',\r\n trendDown: '#b40000',\r\n}\r\n\r\nexport enum AutoSaveState {\r\n Off,\r\n Saved,\r\n Unsaved,\r\n Saving,\r\n}\r\n\r\nexport const CHART_EVENT_BADGE_SIZE = 24\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { AutoSaveElement } from '../controllers/autosave/constants'\r\nimport { getUuid } from '../utils/helpers'\r\nimport { HLC, initHlc } from '../utils/hlc'\r\nimport { AutoSaveState } from './constants'\r\n\r\ninterface DrawingsInternalStateAttrs {\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n}\r\n\r\nclass DrawingsInternalStore extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'DrawingsInternalState',\r\n 'elements',\r\n 'latestRemoteUpdateTimestamp',\r\n 'latestLocalUpdateTimestamp',\r\n 'autoSaveState',\r\n 'instanceUUID'\r\n )\r\n }\r\n\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n\r\n constructor(attrs: Partial = {}) {\r\n super(attrs)\r\n\r\n this.elements = attrs.elements ?? []\r\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\r\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\r\n }\r\n\r\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\r\n if (this.autoSaveState !== newAutoSaveState) {\r\n this.updateAttributes({ autoSaveState: newAutoSaveState })\r\n }\r\n }\r\n}\r\n\r\nexport default DrawingsInternalStore\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport { TodoObjectHashAnyType } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport CanvasElement from '../canvas/element'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getIsSSr, getUuid } from '../utils/helpers'\r\nimport Pane from './pane'\r\nimport { changeElementZIndexes } from './utils'\r\n\r\nclass Element extends Spine.Model {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: CanvasElement\r\n declare pane_id: string\r\n declare destroyed: true | undefined\r\n declare pane: () => Pane\r\n lastChange: number | null = null\r\n elementId: string | null = null\r\n zIndex = -1\r\n\r\n generateUuid = getIsSSr() ? undefined : getUuid\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n const elementAttrs = args[0]\r\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\r\n this.one('create', () => {\r\n this.updateAttributes({\r\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\r\n })\r\n })\r\n }\r\n\r\n replace(instance: CanvasElement) {\r\n const oldInstance = this.instance\r\n this.updateAttribute('instance', instance)\r\n this.trigger('replace', this, oldInstance)\r\n }\r\n\r\n makeClone() {\r\n const { instance, pane_id } = this\r\n const { attrs } = instance\r\n const { scale } = instance.model\r\n const clonedObj = merge({ pane_id }, attrs)\r\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\r\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\r\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\r\n cloned.cachePointPositionTimestamp()\r\n Element.create({ instance: cloned, pane_id })\r\n this.trigger('makeClone', this, cloned)\r\n }\r\n\r\n moveToZIndex(zIndex: number) {\r\n const currentZIndex = this.zIndex\r\n const directionCoef = zIndex > currentZIndex ? 1 : -1\r\n\r\n if (this.isChart() || this.isIndicator()) {\r\n if (this.zIndex !== 0) {\r\n this.updateAttributes({ zIndex: 0 })\r\n }\r\n this.pane()\r\n .getAllElements()\r\n .filter((element) => {\r\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\r\n return shouldMove && element.isDrawing()\r\n })\r\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\r\n\r\n return\r\n }\r\n\r\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\r\n const { min, max } = this.pane().getElementZIndexRange()\r\n if (\r\n currentZIndex === newZIndex ||\r\n (currentZIndex === min && directionCoef === -1) ||\r\n (currentZIndex === max && directionCoef === 1)\r\n ) {\r\n return\r\n }\r\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsBelowZero,\r\n addElement: newZIndex < 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n isBelowZero: true,\r\n })\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsAboveZero,\r\n addElement: newZIndex > 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n })\r\n }\r\n\r\n bringToFront() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\r\n }\r\n\r\n sendToBack() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\r\n }\r\n\r\n bringForward() {\r\n this.moveToZIndex(this.zIndex + 1)\r\n }\r\n\r\n sendBackward() {\r\n this.moveToZIndex(this.zIndex - 1)\r\n }\r\n\r\n isChart() {\r\n return !!this.instance?.type.startsWith('charts/')\r\n }\r\n\r\n isIndicator() {\r\n return !!this.instance?.type.startsWith('indicators/')\r\n }\r\n\r\n isOverlay() {\r\n return !!this.instance?.type.startsWith('overlays/')\r\n }\r\n\r\n isDrawing() {\r\n return !!this.instance?.type.startsWith('canvas/')\r\n }\r\n\r\n isChartEvent() {\r\n return !!this.instance?.type.startsWith('chartEvent/')\r\n }\r\n\r\n isMouseDown() {\r\n return !!this.instance?.isMouseDown\r\n }\r\n\r\n hasOngoingInteraction() {\r\n return this.isMouseDown() || this.instance.isEditInProgress\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...this.instance.toObject(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...this.instance.toConfig(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n return this.destroy(options)\r\n }\r\n\r\n refreshElementId() {\r\n this.updateAttribute('elementId', this.generateUuid?.())\r\n }\r\n}\r\n\r\nexport default Element\r\n","import endOfDay from 'date-fns/endOfDay'\r\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\r\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\r\nimport setDate from 'date-fns/set'\r\n\r\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\r\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\r\nimport Chart from '../chart'\r\n\r\nconst MARKET_START = { hours: 9, minutes: 30 }\r\nconst END_OF_DAY = { hours: 23, minutes: 59 }\r\n\r\nfunction getIsDateBeforeMarketStart(date: Date) {\r\n const hours = date.getHours()\r\n const minutes = date.getMinutes()\r\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\r\n}\r\n\r\nexport function roundTimeForSyncedPane({\r\n sourceChart,\r\n targetChart,\r\n timestamp,\r\n}: {\r\n sourceChart: Chart\r\n targetChart: Chart\r\n timestamp: number\r\n}) {\r\n let dateToReturn = dateFromUnixTimestamp(timestamp)\r\n const sourceChartHasPremarket =\r\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\r\n const targetChartHasPremarket =\r\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\r\n\r\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\r\n dateToReturn = setDate(dateToReturn, MARKET_START)\r\n }\r\n\r\n if (targetChart.timeframe === TIMEFRAME.m) {\r\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.w) {\r\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\r\n dateToReturn = endOfDay(dateToReturn)\r\n }\r\n\r\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\r\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\r\n }\r\n\r\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { ChartSyncablePart } from '../chart/contstants'\r\nimport Pane from '../pane'\r\nimport { roundTimeForSyncedPane } from './mouse-utils'\r\n\r\nexport class Mouse extends Spine.Model {\r\n static initClass() {\r\n this.configure('Mouse', 'position')\r\n this.belongsTo('pane', Pane)\r\n }\r\n\r\n declare position: { x: number; y: number } | undefined\r\n declare pane: () => Pane | null\r\n\r\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\r\n\r\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\r\n\r\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\r\n\r\n getCrossIndexForPane = (pane: Pane) => {\r\n if (this.position) {\r\n if (this.getIsMouseInChartOfPane(pane)) {\r\n return Math.round(this.position.x)\r\n }\r\n const paneOfMouse = this.pane()\r\n if (this.getIsCrossSyncOn() && paneOfMouse) {\r\n const mouseInChart = paneOfMouse.chart()\r\n const currentPaneChart = pane.chart()\r\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\r\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\r\n roundTimeForSyncedPane({\r\n sourceChart: mouseInChart,\r\n targetChart: currentPaneChart,\r\n timestamp: mousePositionTimestamp,\r\n })\r\n )\r\n return Math.floor(currentPanePositionX)\r\n }\r\n }\r\n\r\n return Number.NaN\r\n }\r\n\r\n getPriceForPane = (pane: Pane) => {\r\n const positionY = this.position?.y ?? null\r\n\r\n if (this.pane()?.eql(pane)) {\r\n return positionY\r\n }\r\n\r\n if (this.getIsCrossSyncOn() && this.pane()) {\r\n const mousePaneIndex = this.pane()?.getIndexInChart()\r\n const currentPaneIndex = pane.getIndexInChart()\r\n return mousePaneIndex === currentPaneIndex ? positionY : null\r\n }\r\n\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Mouse is a singleton, so `initClass` must be called before we create the instance\r\n * otherwise it wouldn’t work\r\n */\r\nMouse.initClass()\r\n\r\nconst mouse = Mouse.create()\r\nmouse.save()\r\n\r\nexport default mouse as Mouse\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport Element from './element'\r\nimport { rebuildElementZIndexes } from './utils'\r\n\r\nexport interface ScaleAxis {\r\n (index: number): number\r\n invert: (x: number) => number\r\n domain: () => [currentDomainMax: number, currentDomainMin: number]\r\n width: (x: number) => number\r\n height: (y: number) => number\r\n ticks: (y: number) => number[]\r\n}\r\n\r\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\r\n ChartEventBadgeType.Split,\r\n ChartEventBadgeType.Dividends,\r\n ChartEventBadgeType.EarningsPositive,\r\n ChartEventBadgeType.EarningsNegative,\r\n ChartEventBadgeType.EarningsNeutral,\r\n ChartEventBadgeType.EarningsFuture,\r\n]\r\n\r\nclass Pane extends Spine.Model {\r\n static initClass(\r\n elementModel: typeof Element,\r\n chartEventElementModel: typeof ChartEventElement,\r\n chartModel: typeof Chart\r\n ) {\r\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\r\n this.hasMany('elements', elementModel)\r\n this.hasMany('chartEvents', chartEventElementModel)\r\n this.belongsTo('mainElement', elementModel)\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare id: string\r\n declare chart_id: string\r\n declare height: number\r\n declare scale: {\r\n x: ScaleAxis\r\n y: ScaleAxis\r\n }\r\n\r\n declare instance: any\r\n declare chart: () => Chart\r\n declare mainElement: () => T | null\r\n declare elements: () => Collection\r\n declare chartEvents: () => Collection\r\n selection: CanvasElement | null = null\r\n scaleRange: { min: number; max: number } | null = null\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.elements()\r\n .all()\r\n .forEach((element) => {\r\n element.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n toObject() {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toObject())\r\n return {\r\n height: this.height,\r\n scale: this.scale,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toConfig())\r\n return omit(\r\n {\r\n height: this.height,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n move(direction: Position) {\r\n const chartPanes = this.chart().getAllPanes()\r\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\r\n const targetPane = chartPanes.find((pane) => this.eql(pane))\r\n\r\n if (!chartPane || !targetPane) return\r\n\r\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\r\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\r\n\r\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\r\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\r\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\r\n\r\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\r\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\r\n if (direction === Position.Above) {\r\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\r\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n if (direction === Position.Below) {\r\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\r\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n\r\n Pane.records = ohterChartPaneRecords.concat([\r\n ...panesAbove,\r\n arrayWithoutTargetRecord[chartRecordIndex],\r\n ...panesBelow,\r\n ])\r\n this.chart().trigger('change', this.chart())\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart().chart_layout())\r\n }\r\n\r\n getAllElements() {\r\n return this.elements()\r\n .all()\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n }\r\n\r\n getAllChartEvents(isSorted = true) {\r\n const chartEvents = [...this.chartEvents().all()]\r\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\r\n }\r\n\r\n getChartOrIndicatorElement() {\r\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\r\n }\r\n\r\n getIsIndicatorPane() {\r\n return !!this.mainElement()?.isIndicator()\r\n }\r\n\r\n getIsChartPane() {\r\n return !!this.mainElement()?.isChart()\r\n }\r\n\r\n resetHeight() {\r\n if (this.getIsIndicatorPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\r\n }\r\n if (this.getIsChartPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\r\n }\r\n }\r\n\r\n getIndexInChart() {\r\n return this.chart()\r\n .getAllPanes()\r\n .findIndex((chartPane) => chartPane.eql(this))\r\n }\r\n\r\n getElementZIndexRange() {\r\n let max = -1\r\n let min = 1\r\n this.getAllElements().forEach((el) => {\r\n if (el.zIndex > max) {\r\n max = el.zIndex\r\n }\r\n if (el.zIndex < min) {\r\n min = el.zIndex\r\n }\r\n })\r\n return { min, max }\r\n }\r\n\r\n getBelowAboveZeroElements() {\r\n const allPaneElements = this.getAllElements()\r\n const elementsBelowZero: Element[] = []\r\n const elementsAboveZero: Element[] = []\r\n allPaneElements.forEach((el) => {\r\n if (el.zIndex < 0) {\r\n elementsBelowZero.push(el)\r\n }\r\n if (el.zIndex > 0) {\r\n elementsAboveZero.push(el)\r\n }\r\n })\r\n\r\n return { elementsBelowZero, elementsAboveZero }\r\n }\r\n\r\n normalizeZIndexes() {\r\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\r\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\r\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\r\n }\r\n\r\n getQuoteRawTicker() {\r\n return this.chart().getQuoteRawTicker()\r\n }\r\n\r\n getNumericId() {\r\n return Number(this.id.replace('c-', ''))\r\n }\r\n\r\n updateChartEventsZIndexes() {\r\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\r\n return\r\n }\r\n\r\n const chartEvents = this.getAllChartEvents(false).sort(\r\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\r\n )\r\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\r\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\r\n\r\n const hoveredTypeChartEventElements: ChartEventElement[] = []\r\n const openedTypeChartEventElements: ChartEventElement[] = []\r\n const nonActiveChartEventElements: ChartEventElement[] = []\r\n\r\n chartEvents.forEach((chartEvent, index) => {\r\n const chartEventsOnSameXPoint = chartEvents.filter(\r\n (chartEvent_B, i) =>\r\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\r\n )\r\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\r\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\r\n const isOpened = chartEvent.instance === openedChartEvent?.instance\r\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\r\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\r\n if (!isHovered || !isOpened) {\r\n if (isHoveredType) {\r\n hoveredTypeChartEventElements.push(chartEvent)\r\n } else if (isOpenType) {\r\n openedTypeChartEventElements.push(chartEvent)\r\n } else {\r\n nonActiveChartEventElements.push(chartEvent)\r\n }\r\n }\r\n })\r\n\r\n nonActiveChartEventElements.sort(\r\n (a, b) =>\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\r\n )\r\n\r\n const chartEventElements = [\r\n ...nonActiveChartEventElements,\r\n ...openedTypeChartEventElements,\r\n openedChartEvent,\r\n ...hoveredTypeChartEventElements,\r\n hoveredChartEvent,\r\n ].filter(Boolean)\r\n chartEventElements.forEach((chartEvent, index) => {\r\n chartEvent!.updateAttributes({ zIndex: index })\r\n })\r\n }\r\n}\r\n\r\nexport default Pane\r\n","import { ObjectHash, RequireByKey } from '../../types/shared'\r\n\r\ninterface HeikinAshiData {\r\n HAOpen: number[]\r\n HAClose: number[]\r\n}\r\n\r\ninterface QuoteValues {\r\n cachedAt: null | number\r\n dayToOffset: ObjectHash[]\r\n dateToIndex: ObjectHash[]\r\n heikinAshiData?: HeikinAshiData\r\n daysInQuote: Date[]\r\n}\r\n\r\ninterface QuoteCacheFunctionProps {\r\n cid: string\r\n key: keyof QuoteValues\r\n fetchedAt: number\r\n value: any\r\n}\r\n\r\nconst quoteCache = {} as ObjectHash\r\n\r\nexport function getCachedQuote({\r\n cid,\r\n key,\r\n fetchedAt,\r\n}: RequireByKey>, 'cid'>) {\r\n const quote = quoteCache[cid]\r\n if (quote?.cachedAt === fetchedAt && key) {\r\n return quote[key]\r\n } else if (!key) {\r\n return quote\r\n }\r\n return null\r\n}\r\n\r\nexport function setCachedQuote({\r\n cid,\r\n key,\r\n value,\r\n fetchedAt,\r\n}: Pick) {\r\n quoteCache[cid] = {\r\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\r\n [key]: value,\r\n cachedAt: fetchedAt,\r\n } as QuoteValues\r\n}\r\n\r\nexport function deleteCachedQuote({ cid }: Pick) {\r\n delete quoteCache[cid]\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { isSameMonth, isSameWeek } from 'date-fns'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\r\nimport type { ICOT } from '../indicators/cot'\r\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\r\nimport { getIsAbortError } from '../utils/abort_controller'\r\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\r\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\r\nimport { getRawTickerForInstrument } from './utils'\r\n\r\nconst quoteRefreshChecksBeforeFullRefresh = 15\r\n\r\ntype TodoPattern = TodoObjectHashAnyType\r\n\r\nexport interface TickerTimeframesProps {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ninterface QuoteFetchOptions {\r\n aftermarket?: boolean\r\n premarket?: boolean\r\n patterns?: boolean\r\n events?: boolean\r\n maxBars?: number\r\n}\r\n\r\ninterface QuoteInternalOptions {\r\n cachePredicate?: (quote: Quote) => boolean\r\n fetchNewDataOnCachedQuote?: boolean\r\n}\r\n\r\ninterface UrlOptions extends QuoteFetchOptions {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\r\n\r\nexport interface DataResponse {\r\n COTs: COTData\r\n name: string\r\n ticker: string\r\n instrument: string\r\n interval: number\r\n timeframe: string\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n date: number[]\r\n volume: number[]\r\n lastOpen: number\r\n lastHigh: number\r\n lastLow: number\r\n lastClose: number\r\n lastDate: number\r\n lastTime: string | null\r\n lastVolume: number\r\n dataId: string\r\n prevClose: number\r\n afterClose: number\r\n afterChange: number\r\n afterTime: string | null\r\n drawMinutesPerDay: number\r\n marketStartMinutes: number\r\n premarketLengthMinutes: number\r\n aftermarketLengthMinutes: number\r\n aftermarket: boolean\r\n premarket: boolean\r\n hasPatterns: boolean\r\n patterns: Array\r\n patternsMinRange: number\r\n patternsMaxRange: number\r\n relativeVolume: number\r\n isIntraday: boolean\r\n noNewData?: boolean\r\n chartEvents?: ChartEventDataRaw[]\r\n}\r\n\r\ninterface COTData {\r\n [code: string]: ICOT\r\n}\r\n\r\nconst emptyQuote = {\r\n open: [],\r\n high: [],\r\n low: [],\r\n close: [],\r\n volume: [],\r\n date: [],\r\n fetchedAt: -1,\r\n numberOfRefreshChecks: 0,\r\n isFetching: false,\r\n is404: false,\r\n COTs: undefined,\r\n name: undefined,\r\n drawMinutesPerDay: undefined,\r\n marketStartMinutes: undefined,\r\n premarketLengthMinutes: undefined,\r\n aftermarketLengthMinutes: undefined,\r\n patterns: [],\r\n patternsMinRange: undefined,\r\n patternsMaxRange: undefined,\r\n relativeVolume: undefined,\r\n lastOpen: undefined,\r\n lastHigh: undefined,\r\n lastLow: undefined,\r\n lastClose: undefined,\r\n lastVolume: undefined,\r\n dataId: undefined,\r\n lastDate: undefined,\r\n prevClose: undefined,\r\n afterClose: undefined,\r\n afterChange: undefined,\r\n chartEvents: [],\r\n}\r\n\r\ninterface ICacheAvailabilityCheckFunctionsArguments {\r\n quote: Quote\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n}\r\n\r\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !quote.premarket === !options?.premarket &&\r\n !quote.aftermarket === !options?.aftermarket &&\r\n !quote.hasPatterns === !options?.patterns &&\r\n // if options.events is false we can reuse quote with events\r\n (!options?.events || !!quote.events)\r\n\r\nconst doesQuoteAndFetchParamsMatch = ({\r\n quote,\r\n ticker,\r\n instrument,\r\n timeframe,\r\n}: {\r\n quote: Quote\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\r\n\r\n// either we don't care about matching uuid at all, or they have to match\r\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\r\n\r\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !options?.cachePredicate || options.cachePredicate(quote)\r\n\r\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\r\n\r\nexport type QuoteGetParams = {\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n abortController?: null | AbortController\r\n shouldUseCache?: boolean\r\n chartUuid?: string\r\n}\r\n\r\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\r\n return (\r\n chartEvents?.map((item) => {\r\n let eventType: ChartEventType\r\n switch (item.eventType) {\r\n case ChartEventDbType.Dividends:\r\n eventType = ChartEventType.Dividends\r\n break\r\n case ChartEventDbType.Split:\r\n eventType = ChartEventType.Split\r\n break\r\n case ChartEventDbType.Earnings:\r\n eventType = ChartEventType.Earnings\r\n break\r\n }\r\n return {\r\n ...item,\r\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\r\n eventType,\r\n }\r\n }) ?? []\r\n )\r\n}\r\n\r\nclass Quote extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'Quote',\r\n 'ticker',\r\n 'name',\r\n 'instrument',\r\n 'timeframe',\r\n 'open',\r\n 'high',\r\n 'low',\r\n 'close',\r\n 'date',\r\n 'volume',\r\n 'lastOpen',\r\n 'lastHigh',\r\n 'lastLow',\r\n 'lastClose',\r\n 'lastDate',\r\n 'lastVolume',\r\n 'lastTime',\r\n 'dataId',\r\n 'prevClose',\r\n 'COTs',\r\n 'chartEvents',\r\n 'afterClose',\r\n 'afterChange',\r\n 'afterTime',\r\n 'drawMinutesPerDay',\r\n 'marketStartMinutes',\r\n 'premarketLengthMinutes',\r\n 'aftermarketLengthMinutes',\r\n 'aftermarket',\r\n 'premarket',\r\n 'events',\r\n 'hasPatterns',\r\n 'patterns',\r\n 'patternsMinRange',\r\n 'patternsMaxRange',\r\n 'relativeVolume',\r\n 'fetchedAt',\r\n 'isIntraday',\r\n 'interval',\r\n 'drawDays',\r\n 'barIndex',\r\n 'barToDataIndex',\r\n 'fetchingPromise',\r\n 'isFetching',\r\n 'wasFetchAborted',\r\n 'chartUuid',\r\n 'numberOfRefreshChecks',\r\n 'maxBars',\r\n 'ideaID',\r\n 'is404'\r\n )\r\n }\r\n\r\n static async get({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n abortController,\r\n shouldUseCache = true,\r\n chartUuid,\r\n }: QuoteGetParams): Promise {\r\n const ticker = tickerRaw.replace('@', '')\r\n const [quote] = shouldUseCache\r\n ? Quote.select(\r\n (q) =>\r\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\r\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\r\n isNotEmptyQuote(q) &&\r\n isCacheAllowed({ quote: q, options }) &&\r\n (q.instrument !== Instrument.Stock ||\r\n Number.isInteger(q.ideaID) ||\r\n doesQuoteAndOptionsMatch({ quote: q, options }))\r\n )\r\n : []\r\n\r\n if (quote) {\r\n if (quote.isFetching) {\r\n await quote.getResolvedFetchingPromise()\r\n } else if (options?.fetchNewDataOnCachedQuote) {\r\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController })\r\n }\r\n return quote\r\n }\r\n\r\n const newQuote = Quote.create({\r\n ...emptyQuote,\r\n ticker,\r\n timeframe,\r\n instrument,\r\n chartUuid,\r\n maxBars: options?.maxBars,\r\n premarket: !!options?.premarket,\r\n aftermarket: !!options?.aftermarket,\r\n hasPatterns: !!options?.patterns,\r\n events: !!options?.events,\r\n })\r\n\r\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController })\r\n\r\n return newQuote\r\n }\r\n\r\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\r\n // TODO: fetch in 1 request\r\n if (tickersAndTimeframes.length === 0) {\r\n return {}\r\n }\r\n\r\n try {\r\n await Promise.all(\r\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n this.get({ ticker: ticker, instrument, timeframe })\r\n )\r\n )\r\n const data = tickersAndTimeframes.reduce(\r\n (accumulator, currentValue) => ({\r\n ...accumulator,\r\n [currentValue.ticker]: Quote.select(\r\n (q: Quote) =>\r\n q.ticker === currentValue.ticker &&\r\n q.instrument === currentValue.instrument &&\r\n q.timeframe === currentValue.timeframe\r\n )[0],\r\n }),\r\n {}\r\n )\r\n return data\r\n } catch (err) {\r\n // TODO: handle somehow\r\n }\r\n }\r\n\r\n declare ticker: string\r\n declare name: string\r\n declare instrument: Instrument\r\n declare interval: number\r\n declare timeframe: TIMEFRAME\r\n declare open: number[]\r\n declare high: number[]\r\n declare low: number[]\r\n declare close: number[]\r\n declare date: number[]\r\n declare volume: number[]\r\n declare lastOpen: number\r\n declare lastHigh: number\r\n declare lastLow: number\r\n declare lastClose: number\r\n declare lastDate: number\r\n declare lastVolume: number\r\n declare dataId: string\r\n declare prevClose: number\r\n declare COTs: COTData\r\n declare afterClose: number\r\n declare afterChange: number\r\n declare drawMinutesPerDay: number\r\n declare marketStartMinutes: number\r\n declare premarketLengthMinutes: number\r\n declare aftermarketLengthMinutes: number\r\n declare hasPatterns: boolean\r\n declare patterns: Array\r\n declare patternsMinRange: number\r\n declare patternsMaxRange: number\r\n declare relativeVolume: number\r\n declare isIntraday: boolean\r\n declare drawDays?: number\r\n declare barIndex: number[]\r\n /**\r\n * Array of length the same as number of bars\r\n *\r\n * If there's a gap and a bar index has no corresponding data index,\r\n * the last data index is used (or 0 if there's no last data index)\r\n *\r\n * @type {number[]}\r\n */\r\n declare barToDataIndex: number[]\r\n declare chartUuid?: string\r\n declare aftermarket: boolean\r\n declare premarket: boolean\r\n declare fetchedAt: number\r\n declare numberOfRefreshChecks: number\r\n declare isFetching: boolean\r\n declare fetchingPromise?: Promise\r\n declare wasFetchAborted: boolean\r\n declare maxBars?: number\r\n declare ideaID?: number\r\n declare is404?: boolean\r\n declare chartEvents: Array\r\n declare events?: boolean\r\n\r\n async fetchRequest({\r\n abortController,\r\n options = { type: QuoteFetchTypeUrlOption.New },\r\n }: {\r\n abortController?: null | AbortController\r\n options?: QuoteUrlOptions\r\n }) {\r\n let data: DataResponse | null = null\r\n let is404 = false\r\n let wasFetchAborted = false\r\n\r\n const fetchingPromise = fetchApi({\r\n location: this.getUrl(options),\r\n throwOnStatusCodes: [404],\r\n abortController,\r\n })\r\n\r\n this.updateAttributes({\r\n isFetching: true,\r\n fetchingPromise,\r\n })\r\n\r\n try {\r\n data = await fetchingPromise\r\n } catch (err) {\r\n if (getIsAbortError(err as Error)) {\r\n wasFetchAborted = true\r\n } else if (process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n is404 = err instanceof NotFoundError\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\r\n\r\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\r\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\r\n }\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\r\n is404,\r\n wasFetchAborted,\r\n isFetching: false,\r\n })\r\n\r\n return data\r\n }\r\n\r\n async isPossibleToFetchSequentialData({\r\n abortController,\r\n }: {\r\n abortController?: null | AbortController\r\n } = {}) {\r\n const data = await this.fetchRequest({ abortController })\r\n if (data && data.date.length > 0 && this.date.length > 0) {\r\n return this.date[this.date.length - 1] >= data.date[0]\r\n }\r\n return false\r\n }\r\n\r\n async fetchData({\r\n fetchType,\r\n abortController,\r\n }: {\r\n fetchType: QuoteFetchType\r\n abortController?: null | AbortController\r\n }) {\r\n let options: QuoteUrlOptions\r\n if (fetchType === QuoteFetchType.Refetch) {\r\n options = { type: QuoteFetchTypeUrlOption.New }\r\n } else if (fetchType === QuoteFetchType.NewerData) {\r\n options = { type: QuoteFetchTypeUrlOption.Newer }\r\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\r\n options.dataId = this.dataId\r\n }\r\n } else {\r\n return\r\n }\r\n if (this.instrument === Instrument.Stock) {\r\n options.events = this.events == null ? true : this.events\r\n }\r\n\r\n const data = await this.fetchRequest({ abortController, options })\r\n\r\n if (!data || data.noNewData === true) {\r\n this.updateAttributes({\r\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\r\n })\r\n return\r\n }\r\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\r\n return\r\n }\r\n\r\n const newQuoteData = {\r\n COTs: data.COTs,\r\n name: data.name,\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: data.volume,\r\n date: data.date,\r\n drawMinutesPerDay: data.drawMinutesPerDay,\r\n marketStartMinutes: data.marketStartMinutes,\r\n premarketLengthMinutes: data.premarketLengthMinutes,\r\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\r\n patterns: data.patterns ?? [],\r\n patternsMinRange: data.patternsMinRange,\r\n patternsMaxRange: data.patternsMaxRange,\r\n relativeVolume: data.relativeVolume,\r\n lastOpen: data.lastOpen,\r\n lastHigh: data.lastHigh,\r\n lastLow: data.lastLow,\r\n lastClose: data.lastClose,\r\n lastVolume: data.lastVolume,\r\n dataId: data.dataId,\r\n lastDate: data.lastDate,\r\n lastTime: data.lastTime,\r\n prevClose: data.prevClose,\r\n afterClose: data.afterClose,\r\n afterChange: data.afterChange,\r\n afterTime: data.afterTime,\r\n numberOfRefreshChecks: 0,\r\n chartEvents: data.chartEvents ?? [],\r\n fetchedAt: Date.now(),\r\n }\r\n\r\n if (\r\n !(\r\n fetchType === QuoteFetchType.Refetch ||\r\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\r\n )\r\n ) {\r\n /*\r\n * Merges current and new data taking date as index\r\n */\r\n let AIndex = 0\r\n let BIndex = 0\r\n let mergeIndex = -1\r\n while (AIndex < this.date.length || BIndex < data.date.length) {\r\n const ADate = this.date[AIndex]\r\n const BDate = data.date[BIndex]\r\n if (BDate === undefined) {\r\n break\r\n } else if (ADate === BDate) {\r\n // Same date, update OHLCV\r\n this.open[AIndex] = data.open[BIndex]\r\n this.high[AIndex] = data.high[BIndex]\r\n this.low[AIndex] = data.low[BIndex]\r\n this.close[AIndex] = data.close[BIndex]\r\n this.volume[AIndex] = data.volume[BIndex]\r\n AIndex++\r\n BIndex++\r\n } else if (ADate > BDate || ADate === undefined) {\r\n // New bar for a date not yet in our dataset\r\n // If weekly or monthly timeframe & wasn't merged on AIndex\r\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\r\n const prevAIndex = AIndex - 1\r\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\r\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\r\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\r\n if (\r\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\r\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\r\n ) {\r\n this.date[prevAIndex] = data.date[BIndex]\r\n this.open[prevAIndex] = data.open[BIndex]\r\n this.high[prevAIndex] = data.high[BIndex]\r\n this.low[prevAIndex] = data.low[BIndex]\r\n this.close[prevAIndex] = data.close[BIndex]\r\n this.volume[prevAIndex] = data.volume[BIndex]\r\n mergeIndex = prevAIndex\r\n // Incrementing BIndex only because we're mergin arrays on AIndex\r\n BIndex++\r\n continue\r\n }\r\n }\r\n this.date.splice(AIndex, 0, data.date[BIndex])\r\n this.open.splice(AIndex, 0, data.open[BIndex])\r\n this.high.splice(AIndex, 0, data.high[BIndex])\r\n this.low.splice(AIndex, 0, data.low[BIndex])\r\n this.close.splice(AIndex, 0, data.close[BIndex])\r\n this.volume.splice(AIndex, 0, data.volume[BIndex])\r\n // Incrementing AIndex because we're changing the array in-place\r\n AIndex++\r\n BIndex++\r\n } else if (ADate < BDate) {\r\n AIndex++\r\n } else {\r\n console.warn('fetchNewerData merge warning')\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\r\n extra: {\r\n thisDateLength: this.date.length,\r\n dataDateLength: data.date.length,\r\n AIndex,\r\n BIndex,\r\n ADate,\r\n BDate,\r\n },\r\n })\r\n }\r\n }\r\n\r\n newQuoteData.date = this.date\r\n newQuoteData.open = this.open\r\n newQuoteData.high = this.high\r\n newQuoteData.low = this.low\r\n newQuoteData.close = this.close\r\n newQuoteData.volume = this.volume\r\n }\r\n\r\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\r\n // https://github.com/finvizhq/charts/issues/510\r\n if (!hasUpdatedSuccessfully) {\r\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\r\n }\r\n if (!this) {\r\n // or this somehow became null / falsy\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\r\n }\r\n this.trigger(fetchType, this, fetchType)\r\n }\r\n\r\n async getResolvedFetchingPromise() {\r\n try {\r\n return await this.fetchingPromise\r\n } catch {\r\n // do nothing\r\n }\r\n }\r\n\r\n fetchOlderData() {\r\n return // not yet implemented\r\n // TODO cancel previous request\r\n }\r\n\r\n load(atts: ObjectHash) {\r\n super.load(atts)\r\n const { fetchedAt = 0 } = atts\r\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\r\n if (this.timeframe && cachedAt !== fetchedAt) {\r\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\r\n this.isIntraday = [\r\n TIMEFRAME.i1,\r\n TIMEFRAME.i2,\r\n TIMEFRAME.i3,\r\n TIMEFRAME.i5,\r\n TIMEFRAME.i10,\r\n TIMEFRAME.i15,\r\n TIMEFRAME.i30,\r\n TIMEFRAME.h,\r\n TIMEFRAME.h2,\r\n TIMEFRAME.h4,\r\n ].includes(this.timeframe)\r\n this.interval = this.isIntraday\r\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\r\n : 0\r\n this.drawDays = this.getDrawDays()\r\n this.barIndex = this.getBarIndexes()\r\n this.patterns = this.patterns ?? []\r\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\r\n const lastIndex = this.barIndex[index - 1] ?? -1\r\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\r\n })\r\n }\r\n if (this.timeframe && this.ticker) {\r\n this.chartEvents = getChartEventsWithId({\r\n ticker: this.ticker,\r\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\r\n })\r\n }\r\n return this\r\n }\r\n\r\n destroy(options?: ObjectHash) {\r\n super.destroy(options)\r\n deleteCachedQuote({ cid: this.cid })\r\n return this\r\n }\r\n\r\n getDrawDays() {\r\n if (this.instrument !== Instrument.Stock) {\r\n return Infinity\r\n }\r\n switch (this.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n return 10\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n return 15\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getHeikinAshiData() {\r\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\r\n if (cachedHeikinAshiData) {\r\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\r\n }\r\n\r\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\r\n const HAOpen = this.open.reduce(\r\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\r\n [] as number[]\r\n )\r\n\r\n const heikAshiData = { open: HAOpen, close: HAClose }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\r\n\r\n return heikAshiData\r\n }\r\n\r\n getDayToOffset(): ObjectHash {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as ObjectHash\r\n }\r\n const dayToOffset: ObjectHash = {}\r\n let day = 0\r\n let lastDay\r\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n const dateString = dateStringFromDate(date)\r\n if (dateString !== lastDay) {\r\n dayToOffset[dateString] = day\r\n day++\r\n lastDay = dateString\r\n }\r\n }\r\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\r\n // premarket=false in fetch query there isn't other way to distinguish that\r\n if (getIsSSr() && this.lastDate) {\r\n // YYYYMMDD / 20211118 => YYYY-MM-DD\r\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\r\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\r\n\r\n if (lastDay !== lastDate) {\r\n dayToOffset[lastDate] = day\r\n }\r\n }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\r\n return dayToOffset\r\n }\r\n\r\n getDaysInQuote() {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as Date[]\r\n }\r\n const dayToOffset = this.getDayToOffset()\r\n const daysInQuote = Object.keys(dayToOffset)\r\n .map((dateString) => {\r\n const [year, month, day] = dateString.split('-')\r\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\r\n })\r\n .sort((a, b) => a.getTime() - b.getTime())\r\n\r\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\r\n return daysInQuote\r\n }\r\n\r\n getBarIndexes() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return Array.from({ length: this.date.length }).map((_, index) => index)\r\n }\r\n\r\n const barIndex = []\r\n const dayToOffset = this.getDayToOffset()\r\n\r\n for (let i = 0; i < this.date.length; i += 1) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\r\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\r\n barIndex[i] = x\r\n }\r\n\r\n return barIndex\r\n }\r\n\r\n getBarIndex(i: number) {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return i\r\n }\r\n return this.barIndex[i]\r\n }\r\n\r\n getBarsInDay() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n return Math.ceil(this.drawMinutesPerDay / this.interval)\r\n }\r\n\r\n getDataIndexByBarIndex(index: number) {\r\n if (this.barIndex) {\r\n for (let i = 0; i < this.barIndex.length; i++) {\r\n if (this.barIndex[i] === index) {\r\n return i\r\n }\r\n }\r\n }\r\n return -1\r\n }\r\n\r\n getDataByBarIndex(key: keyof Quote, index: number) {\r\n const dataIndex = this.getDataIndexByBarIndex(index)\r\n if (dataIndex > -1) {\r\n const quoteData = this[key as keyof Quote]! as number[]\r\n return quoteData[dataIndex] ?? null\r\n }\r\n return null\r\n }\r\n\r\n getDateToIndex() {\r\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\r\n if (cachedDateToIndex) {\r\n return cachedDateToIndex as unknown as ObjectHash\r\n }\r\n const dateToIndex: ObjectHash = {}\r\n for (let i = 0; i < this.date.length; i++) {\r\n dateToIndex[this.date[i]] = i\r\n }\r\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\r\n return dateToIndex\r\n }\r\n\r\n getTimestampFomPositionX(positionX: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getTimestampFromPositionX({\r\n positionX,\r\n quote: this,\r\n })\r\n }\r\n\r\n getPositionXFromTimestamp(timestamp: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getPositionXFromTimestamp({\r\n timestamp,\r\n quote: this,\r\n })\r\n }\r\n\r\n getUrl(options: QuoteUrlOptions) {\r\n const config: UrlOptions = {\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n timeframe: this.timeframe || 'd1',\r\n aftermarket: this.aftermarket,\r\n premarket: this.premarket,\r\n patterns: this.hasPatterns,\r\n maxBars: this.maxBars,\r\n ...options,\r\n }\r\n\r\n const isStock = config.instrument === Instrument.Stock\r\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\r\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\r\n\r\n if (getIsSSr()) {\r\n domain = process.env.BE_API_URL!\r\n }\r\n\r\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\r\n }\r\n\r\n getRawTicker() {\r\n return getRawTickerForInstrument(this.instrument, this.ticker)\r\n }\r\n\r\n clearData() {\r\n this.updateAttributes(emptyQuote)\r\n }\r\n}\r\n\r\nQuote.initClass()\r\n\r\nexport default Quote\r\n","export enum QuoteFetchType {\r\n Refetch = 'refetch',\r\n NewerData = 'newerData',\r\n}\r\n\r\nexport enum QuoteFetchTypeUrlOption {\r\n New = 'new',\r\n Newer = 'newer',\r\n}\r\n\r\nexport interface QuoteUrlOptions {\r\n type: QuoteFetchTypeUrlOption\r\n dataId?: string\r\n events?: boolean\r\n}\r\n","export const largeChartFontSize = {\r\n S: 8,\r\n M: 10,\r\n XXL: 16,\r\n XXXL: 24,\r\n}\r\n","import { Theme } from '../../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n FONT_SIZE,\r\n LINE_HEIGHT,\r\n OFFSET,\r\n PADDING,\r\n SETTINGS_HEIGHT,\r\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n TextBaseline,\r\n} from '../../constants/common'\r\nimport {\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n generalColors,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from '../constants'\r\nimport { ISettings } from './interfaces'\r\n\r\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\r\n ChartSettings: {\r\n general: {\r\n Colors: {\r\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\r\n [Theme.light]: chartLightTheme,\r\n [Theme.dark]: chartDarkTheme,\r\n },\r\n settingsHeight: SETTINGS_HEIGHT,\r\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.XL,\r\n baseline: TextBaseline.alphabetic,\r\n ticker: {\r\n margin: {\r\n top: 30,\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.XXXL,\r\n style: 'bold',\r\n },\r\n },\r\n ohlc: {\r\n margin: {\r\n top: 30,\r\n left: 30,\r\n right: 30,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n change: {\r\n margin: {\r\n top: 30,\r\n right: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n },\r\n },\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.M,\r\n baseline: TextBaseline.top,\r\n axis: {\r\n margin: {\r\n top: 8,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n overlayLabel: {\r\n labelSpacing: 12,\r\n margin: {\r\n top: -8,\r\n left: 6,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n weight: 'bold',\r\n },\r\n },\r\n timeframe: {\r\n margin: {\r\n top: 0,\r\n left: 28,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n weight: '900',\r\n family: 'Lato, sans-serif',\r\n },\r\n },\r\n volumeAxis: {\r\n margin: {\r\n left: 33,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n },\r\n IndicatorSettings: {\r\n general: {\r\n height: 140,\r\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 2,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.S,\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.S,\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n indicatorLabel: {\r\n labelSpacing: 4,\r\n margin: {\r\n top: OFFSET.S,\r\n left: OFFSET.M,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n lineHeight: LINE_HEIGHT.M,\r\n },\r\n },\r\n },\r\n },\r\n MarketSentimentSettings: {\r\n general: {\r\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: 0,\r\n },\r\n bottom: {\r\n height: 12,\r\n },\r\n left: {\r\n width: 0,\r\n },\r\n right: {\r\n width: 30,\r\n },\r\n },\r\n ColorsSettings: generalColors,\r\n ThumbSettings: {\r\n size: 8,\r\n touchSize: 16,\r\n color: '#ddd',\r\n borderWidth: 1,\r\n borderColor: '#999',\r\n },\r\n ElementSettings: {\r\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\r\n defaultFill: '#1e6dc066',\r\n defaultTransparentFill: '#1e6dc000',\r\n },\r\n})\r\n","import merge from 'lodash.merge'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\r\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\r\nimport { SpecificChartFunctionality } from '../constants/common'\r\nimport Utils, { isRedesignedPage } from '../utils'\r\nimport LayoutModel from './chart_layout'\r\nimport { getColorOverwrites } from './chart_settings'\r\nimport { largeChartFontSize } from './chart_settings/constants'\r\nimport { INTERACTIVE_CHART_SETTINGS } from './chart_settings/interactive_chart_settings'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport {\r\n IChartThemeColors,\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from './constants'\r\n\r\ninterface Config {\r\n theme: Theme\r\n barMargin?: number\r\n barWidth?: number\r\n border?: number\r\n charts?: ChartConfigChart[]\r\n colorsOverride?: Array\r\n volumeHeight?: number\r\n colors?: ObjectHash, Theme>\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport function getSettings(config: Config, chartSettings?: ISettings): ISettings {\r\n const settings = merge({}, chartSettings ?? INTERACTIVE_CHART_SETTINGS(config.theme))\r\n\r\n if (config.barWidth != null) {\r\n settings.ChartSettings.center.barWidth = config.barWidth\r\n settings.IndicatorSettings.center.barWidth = config.barWidth\r\n }\r\n if (config.barMargin != null) {\r\n settings.ChartSettings.center.barMargin = config.barMargin\r\n settings.IndicatorSettings.center.barMargin = config.barMargin\r\n }\r\n if (config.border != null) {\r\n settings.ChartSettings.center.border = config.border\r\n settings.IndicatorSettings.center.border = config.border\r\n }\r\n if (config.colorsOverride) {\r\n settings.ColorsSettings = config.colorsOverride\r\n }\r\n if (config.volumeHeight) {\r\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\r\n }\r\n if (config.colors) {\r\n const settingColors = settings.ChartSettings.general.Colors\r\n settings.ChartSettings.general.Colors = {\r\n ...settingColors,\r\n [Theme.light]: {\r\n ...settingColors[Theme.light],\r\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\r\n },\r\n [Theme.dark]: {\r\n ...settingColors[Theme.dark],\r\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\r\n },\r\n }\r\n }\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\r\n settings.ChartSettings.left.width = 0\r\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\r\n settings.IndicatorSettings.left.width = 0\r\n }\r\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\r\n settings.ChartSettings.top.height = 10\r\n }\r\n\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\r\n if (isGroupInstrument) {\r\n settings.ChartSettings.top.ohlc.margin.top = 4\r\n settings.ChartSettings.top.ticker.margin.top = 0\r\n settings.ChartSettings.top.ticker.font = {\r\n size: largeChartFontSize.XXL,\r\n style: 'bold',\r\n }\r\n settings.ChartSettings.left.timeframe.margin.top = 12\r\n settings.ChartSettings.left.timeframe.font = {\r\n size: largeChartFontSize.S,\r\n style: 'bold',\r\n }\r\n }\r\n }\r\n\r\n if (config.isOurSiteRequest !== undefined) {\r\n settings.isOurSiteRequest = config.isOurSiteRequest\r\n }\r\n\r\n return settings\r\n}\r\n\r\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\r\n const settings = merge({}, chart_layout.settings)\r\n const isLight = theme === Theme.light\r\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\r\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\r\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\r\n\r\n return settings\r\n}\r\n\r\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\r\n const settings = chart_layout.settings\r\n\r\n return {\r\n ...settings,\r\n ChartSettings: {\r\n ...settings.ChartSettings,\r\n general: {\r\n ...settings.ChartSettings.general,\r\n Colors: {\r\n ...settings.ChartSettings.general.Colors,\r\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\r\n },\r\n },\r\n },\r\n }\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport ChartLayoutModel from './chart_layout'\r\nimport Element from './element'\r\n\r\nexport const handleRemoveIndicatorPane = ({\r\n paneIndex,\r\n chartLayoutModel,\r\n}: {\r\n paneIndex: number\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const charts = chartLayoutModel.getAllCharts()\r\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\r\n}\r\n\r\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\r\n return (index + 1) * (isBelowZero ? -1 : 1)\r\n}\r\n\r\nexport function rebuildElementZIndexes({\r\n elementsArray,\r\n isBelowZero,\r\n}: {\r\n elementsArray: Element[]\r\n isBelowZero: boolean\r\n}) {\r\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n elements.forEach((element, index) => {\r\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\r\n if (newZIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: newZIndex })\r\n }\r\n })\r\n}\r\n\r\nexport function changeElementZIndexes({\r\n elementsArray,\r\n addElement,\r\n oldZIndex,\r\n newZIndex,\r\n isBelowZero = false,\r\n}: {\r\n elementsArray: Element[]\r\n addElement: Element | undefined\r\n oldZIndex: number\r\n newZIndex: number\r\n isBelowZero?: boolean\r\n}) {\r\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n const elements =\r\n elementsArray.length === 0 && addElement\r\n ? [...array, addElement]\r\n : array\r\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\r\n .flatMap((el, index) =>\r\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\r\n )\r\n\r\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\r\n if (elements.length < Math.abs(newZIndex) && addElement) {\r\n elements.push(addElement)\r\n }\r\n\r\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\r\n}\r\n\r\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\r\n return `${\r\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\r\n }${ticker}`\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n deviations: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n stdDev: number[]\r\n upperBand: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class BbCalculation extends MainCalculation {\r\n static type = OverlayType.Bb\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n sma: [],\r\n stdDev: [],\r\n upperBand: [],\r\n lowerBand: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period, deviations } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = period; i < close.length; i++) {\r\n sum = sum - close[i - period] + close[i]\r\n this.calculatedValues.sma[i] = sum / period\r\n\r\n let stdDevSum = 0\r\n for (let j = i - period + 1; j <= i; j++) {\r\n stdDevSum += Math.pow(close[j] - this.calculatedValues.sma[i], 2)\r\n }\r\n this.calculatedValues.stdDev[i] = Math.sqrt(stdDevSum / period)\r\n\r\n this.calculatedValues.upperBand[i] = this.calculatedValues.sma[i] + this.calculatedValues.stdDev[i] * deviations\r\n this.calculatedValues.lowerBand[i] = this.calculatedValues.sma[i] - this.calculatedValues.stdDev[i] * deviations\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChartConfigChartPaneElement,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n RequireByKey,\r\n} from '../../types/shared'\r\nimport Element from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\r\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nexport interface IOverlayIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nconst DEFAULT_LABEL_COLOR = '#0587cd'\r\n\r\nclass Overlay extends Element implements IOverlayIsValid {\r\n static type = OverlayType.Overlay\r\n static label = 'Overlay'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare chart: BaseChart\r\n\r\n get type() {\r\n return (this.constructor as typeof Overlay).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Overlay).label\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\r\n }\r\n\r\n getFreeColor() {\r\n return this.getChartLayoutSettings().ColorsSettings[0]\r\n // TODO proper implementation - example how this could be done:\r\n // let colorsUsed = []\r\n // for (let overlay of this.chart.overlays) {\r\n // let object = overlay.getModalConfig().inputs\r\n // for (let _ in object) {\r\n // let input = object[_]\r\n // if (input.type === 'color') {\r\n // colorsUsed.push(input.value)\r\n // }\r\n // }\r\n // }\r\n // for (let color of colors) {\r\n // if (!colorsUsed.includes(color)) {\r\n // return color\r\n // }\r\n // }\r\n // return colors[0]\r\n }\r\n\r\n renderContent(_?: RenderingContext2DType) {\r\n this.data = this.model.chart().quote()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n isRendered() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toConfig() {\r\n const colors: string[] = []\r\n const periods: string[] = []\r\n\r\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\r\n if (input.type === 'color') {\r\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\r\n } else {\r\n periods.push(input.value.toString())\r\n }\r\n })\r\n\r\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\r\n }\r\n}\r\n\r\nexport default Overlay\r\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { BbCalculation } from '../indicator-calculation/bb'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst BB_COLORS = {\r\n [Theme.light]: {\r\n TOP: '#D386DF',\r\n BOTTOM: '#69C1EA',\r\n MIDDLE: '#CFD2F2',\r\n },\r\n [Theme.dark]: {\r\n TOP: '#D38BFB',\r\n BOTTOM: '#57AEFB',\r\n MIDDLE: '#E1B6FC',\r\n },\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Deviations: 2.0,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n deviations: number\r\n topColor?: string\r\n bottomColor?: string\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\r\n\r\n return [period, deviations]\r\n}\r\n\r\nclass BollingerBands extends Overlay {\r\n static type = OverlayType.Bb\r\n static label = 'Bollinger Bands'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, deviations] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.deviations = deviations\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n const { leftOffset, width } = this.model.chart()\r\n const [top, bottom] = this.model.scale.y.domain()\r\n const scaledTop = this.fy(top)\r\n const scaledBottom = this.fy(bottom)\r\n const { close } = this.data\r\n const period = Math.min(this.attrs.period, close.length - 1)\r\n\r\n let firstBarToRender: number | undefined\r\n let lastBarToRender = 0\r\n\r\n // middle line && find first & last bar to render\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\r\n\r\n const bbCalculation = new BbCalculation({\r\n quote: this.data,\r\n options: {\r\n period,\r\n deviations: this.attrs.deviations,\r\n },\r\n })\r\n\r\n bbCalculation.calculate(({ sma }, dataIndex) => {\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = dataIndex\r\n\r\n context.lineTo(this.fx(dataIndex), Math.round(this.fy(sma[dataIndex])))\r\n\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n lastBarToRender = dataIndex\r\n })\r\n\r\n if (firstBarToRender === undefined) return\r\n context.stroke()\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n\r\n // top line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledTop)\r\n context.set('strokeStyle', BB_COLORS[theme].TOP)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.upperBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledTop)\r\n context.fill()\r\n\r\n // bottom line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\r\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\r\n context.fill()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const deviations = {\r\n type: 'number',\r\n label: 'Deviations',\r\n name: 'deviations',\r\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\r\n required: true,\r\n min: 0.1,\r\n max: 999,\r\n step: 0.1,\r\n }\r\n const topColor = {\r\n type: 'color',\r\n label: 'Top Color',\r\n name: 'topColor',\r\n value: this.attrs.topColor ?? this.getFreeColor(),\r\n }\r\n const bottomColor = {\r\n type: 'color',\r\n label: 'Bottom Color',\r\n name: 'bottomColor',\r\n value: this.attrs.bottomColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, deviations, topColor, bottomColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'deviations':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'topColor':\r\n case 'bottomColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n return this.attrs.topColor || BB_COLORS[theme].TOP\r\n }\r\n\r\n toString() {\r\n return `BB ${this.attrs.period},${this.attrs.deviations}`\r\n }\r\n}\r\n\r\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\r\n\r\nexport default BollingerBands\r\n","import { OverlayType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n channelStrokeColor: string\r\n channelFillColor: string\r\n medianBandColor: string\r\n}\r\n\r\nconst DEFAULT_PERIOD = 20\r\n\r\nconst COLORS = {\r\n ChannelStroke: '#69c1ea',\r\n ChannelFill: '#69C1EA12',\r\n MedianBandStroke: '#ffa75f',\r\n}\r\n\r\nclass DonchianChannels extends Overlay {\r\n static type = OverlayType.Dch\r\n static label = 'Donchian Channels'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period } = this.attrs\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const medianBand: number[] = []\r\n let firstBarToRender = -1\r\n let lastBarToRender = 0\r\n if (this.data.close.length === undefined) {\r\n return\r\n }\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', COLORS.ChannelStroke)\r\n context.set('fillStyle', COLORS.ChannelFill)\r\n\r\n //upper band + clip\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\r\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\r\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\r\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n },\r\n })\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // lower band + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // median band\r\n context.set('strokeStyle', COLORS.MedianBandStroke)\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PERIOD,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Channels Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Channels Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\r\n }\r\n const medianBandColor = {\r\n type: 'color',\r\n label: 'Median Band Color',\r\n name: 'medianBandColor',\r\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, medianBandColor, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'medianBandColor':\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.medianBandColor\r\n }\r\n\r\n toString() {\r\n return `Donchian ${this.attrs.period}`\r\n }\r\n}\r\n\r\nDonchianChannels.prototype.defaults = {\r\n medianBandColor: COLORS.MedianBandStroke,\r\n channelStrokeColor: COLORS.ChannelStroke,\r\n channelFillColor: COLORS.ChannelFill,\r\n}\r\n\r\nexport default DonchianChannels\r\n","import { OverlayType } from '../constants/common'\r\nimport { EMACalculation } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n deviations: number\r\n color: string\r\n}\r\n\r\nclass EMA extends Overlay {\r\n static type = OverlayType.Ema\r\n static label = 'Exponential Moving Average'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n const emaCalculation = new EMACalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.attrs.period,\r\n },\r\n })\r\n emaCalculation.calculate(({ ema }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(ema[dataIndex])))\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `EMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nEMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default EMA\r\n","import { OverlayType } from '../constants/common'\r\nimport EMA from './ema'\r\n\r\nclass EMA2 extends EMA {\r\n static type = OverlayType.Ema2\r\n}\r\n\r\nEMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default EMA2\r\n","import { OverlayType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n lowColor: string\r\n highColor: string\r\n}\r\n\r\nclass HighLow extends Overlay {\r\n static type = OverlayType.Hilo\r\n static label = 'High/Low'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const chartModel = this.model.chart()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const halfWidth = barWidth / 2\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n context.translate(0.5, 0.5)\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.highColor)\r\n let prevHigh = -1\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < -10) {\r\n prevHigh = highestHigh\r\n continue\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n\r\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\r\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\r\n\r\n prevHigh = highestHigh\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n if (firstBarToRender === undefined) return\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.lowColor)\r\n let prevLow = -1\r\n let prevBar = firstBarToRender\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\r\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\r\n\r\n prevLow = lowestLow\r\n prevBar = i\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\r\n context.fill()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 50,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const highColor = {\r\n type: 'color',\r\n label: 'High Color',\r\n name: 'highColor',\r\n value: this.attrs.highColor ?? this.getFreeColor(),\r\n }\r\n const lowColor = {\r\n type: 'color',\r\n label: 'Low Color',\r\n name: 'lowColor',\r\n value: this.attrs.lowColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, highColor, lowColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'highColor':\r\n case 'lowColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.highColor\r\n }\r\n\r\n toString() {\r\n return `HILO ${this.attrs.period}`\r\n }\r\n}\r\n\r\nHighLow.prototype.defaults = {\r\n lowColor: '#69c1ea',\r\n highColor: '#d386df',\r\n}\r\n\r\nexport default HighLow\r\n","import { OverlayType } from '../constants/common'\r\nimport { isPositiveFloat } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n price: number\r\n color: string\r\n}\r\n\r\nclass HorizontalLine extends Overlay {\r\n static type = OverlayType.Hline\r\n static label = 'Horizontal Line'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\r\n this.attrs.price = parseFloat(this.attrs.period)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const y = Math.round(this.fy(this.attrs.price))\r\n context.set('strokeStyle', this.attrs.color)\r\n context.translate(0, 0.5)\r\n context.beginPath()\r\n context.moveTo(-this.model.chart().leftOffset, y)\r\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\r\n context.stroke()\r\n context.translate(0, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const price = {\r\n type: 'number',\r\n label: 'Price',\r\n name: 'price',\r\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\r\n required: true,\r\n step: 0.1,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [price, color],\r\n inputsErrorMessages: {\r\n price: `${price.label} must be number`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'price':\r\n return isPositiveFloat(this.attrs[key])\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `HL ${this.attrs.price}`\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\r\n\r\nexport default HorizontalLine\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n conversion: number\r\n base: number\r\n spanB: number\r\n spanAStrokeColor: string\r\n spanAFillColor: string\r\n spanBStrokeColor: string\r\n spanBFillColor: string\r\n conversionLineColor: string\r\n baseLineColor: string\r\n laggingSpanColor: string\r\n}\r\n\r\nconst COLORS = {\r\n SpanA: {\r\n Stroke: '#009600',\r\n Fill: '#00960022',\r\n },\r\n SpanB: {\r\n Stroke: '#C80000',\r\n Fill: '#C8000022',\r\n },\r\n ConversionLine: '#69C1EA',\r\n BaseLine: '#E54040',\r\n LaggingSpan: '#FFA75F',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Conversion: 9,\r\n Base: 26,\r\n SpanB: 52,\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\r\n getParsedIntegersFromPeriodString(period)\r\n return [conversion, base, spanB]\r\n}\r\n\r\nclass IchimokuCloud extends Overlay {\r\n static type = OverlayType.Ic\r\n static label = 'Ichimoku Cloud'\r\n static renderFull = false\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period))\r\n }\r\n\r\n get renderFull() {\r\n return (this.constructor as typeof IchimokuCloud).renderFull\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\r\n ) {\r\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\r\n this.attrs.conversion = conversion\r\n this.attrs.base = base\r\n this.attrs.spanB = spanB\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { high, low, close } = this.data\r\n\r\n const {\r\n conversion,\r\n base,\r\n spanB,\r\n spanAFillColor,\r\n spanAStrokeColor,\r\n spanBFillColor,\r\n spanBStrokeColor,\r\n baseLineColor,\r\n conversionLineColor,\r\n laggingSpanColor,\r\n } = this.attrs\r\n\r\n const conversionLine: number[] = []\r\n const baseLine: number[] = []\r\n const senkouSpanA: number[] = []\r\n const senkouSpanB: number[] = []\r\n const conversionStartIndex = conversion - 1\r\n const baseStartIndex = base - 1\r\n const spanBIndex = spanB - 1\r\n const start = Math.min(baseStartIndex, conversionStartIndex)\r\n const end = close.length + baseStartIndex\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n // Calculation\r\n for (let i = start; i < end; i++) {\r\n if (i >= conversionStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\r\n conversionLine[i] = (highestHi + lowestLo) / 2\r\n }\r\n\r\n if (i >= baseStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\r\n baseLine[i] = (highestHi + lowestLo) / 2\r\n\r\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n\r\n if (i >= spanBIndex) {\r\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\r\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n }\r\n\r\n let lastSpanAX = 0\r\n let lastSpanBX = 0\r\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\r\n\r\n const drawInVisibleAreaProps = {\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width,\r\n fxOverride: this.fx,\r\n }\r\n\r\n context.set('lineWidth', 1)\r\n context.translate(0.5, 0.5)\r\n context.save()\r\n // 1. Senkou Span A\r\n // 1.1 Stroke\r\n context.set('strokeStyle', spanAStrokeColor)\r\n context.set('fillStyle', spanAFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n lastSpanAX = x\r\n },\r\n })\r\n context.stroke()\r\n // 1.2 Clipping area\r\n context.lineTo(lastSpanAX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 1.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n lastSpanBX = x\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n\r\n // 2. Senkou Span B\r\n // 2.1 Stroke\r\n context.save()\r\n context.set('strokeStyle', spanBStrokeColor)\r\n context.set('fillStyle', spanBFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n },\r\n })\r\n context.stroke()\r\n // 2.2 Clipping area\r\n context.lineTo(lastSpanBX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 2.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n context.translate(-0.5, -0.5)\r\n\r\n if (this.renderFull) {\r\n // conversion line\r\n context.set('strokeStyle', conversionLineColor)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // base line\r\n context.set('strokeStyle', baseLineColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // lagging span\r\n context.set('strokeStyle', laggingSpanColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n fxOverride: (x: number) => this.fx(x - base),\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const conversion = {\r\n type: 'number',\r\n label: 'Conversion Line',\r\n name: 'conversion',\r\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const base = {\r\n type: 'number',\r\n label: 'Base Line Length',\r\n name: 'base',\r\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const spanB = {\r\n type: 'number',\r\n label: 'Leading Span B Length',\r\n name: 'spanB',\r\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const spanAStrokeColor = {\r\n type: 'color',\r\n label: 'Span A Stroke Color',\r\n name: 'spanAStrokeColor',\r\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanAFillColor = {\r\n type: 'color',\r\n label: 'Span A Fill Color',\r\n name: 'spanAFillColor',\r\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\r\n }\r\n const spanBStrokeColor = {\r\n type: 'color',\r\n label: 'Span B Stroke Color',\r\n name: 'spanBStrokeColor',\r\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanBFillColor = {\r\n type: 'color',\r\n label: 'Span B Fill Color',\r\n name: 'spanBFillColor',\r\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\r\n }\r\n const conversionLineColor = {\r\n type: 'color',\r\n label: 'Conversion Line Color',\r\n name: 'conversionLineColor',\r\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\r\n }\r\n const baseLineColor = {\r\n type: 'color',\r\n label: 'Base Line Color',\r\n name: 'baseLineColor',\r\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\r\n }\r\n const laggingSpanColor = {\r\n type: 'color',\r\n label: 'Lagging Span Color',\r\n name: 'laggingSpanColor',\r\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [\r\n conversion,\r\n base,\r\n spanB,\r\n spanAStrokeColor,\r\n spanAFillColor,\r\n spanBStrokeColor,\r\n spanBFillColor,\r\n conversionLineColor,\r\n baseLineColor,\r\n laggingSpanColor,\r\n ],\r\n inputsErrorMessages: {\r\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\r\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\r\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'conversion':\r\n case 'base':\r\n case 'spanB':\r\n case 'lagging':\r\n return this.getIsNumberInputValid({ key })\r\n case 'spanAStrokeColor':\r\n case 'spanAFillColor':\r\n case 'spanBStrokeColor':\r\n case 'spanBFillColor':\r\n case 'conversionLineColor':\r\n case 'baseLineColor':\r\n case 'laggingSpanColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.spanAStrokeColor\r\n }\r\n\r\n toString() {\r\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\r\n }\r\n}\r\n\r\nIchimokuCloud.prototype.defaults = {\r\n spanAStrokeColor: COLORS.SpanA.Stroke,\r\n spanAFillColor: COLORS.SpanA.Fill,\r\n spanBStrokeColor: COLORS.SpanB.Stroke,\r\n spanBFillColor: COLORS.SpanB.Fill,\r\n conversionLineColor: COLORS.ConversionLine,\r\n baseLineColor: COLORS.BaseLine,\r\n laggingSpanColor: COLORS.LaggingSpan,\r\n}\r\n\r\nexport default IchimokuCloud\r\n","import { OverlayType } from '../constants/common'\r\nimport IchimokuCloud from './ic'\r\n\r\nclass IchimokuCloudFull extends IchimokuCloud {\r\n static type = OverlayType.Icf\r\n static label = 'Ichimoku Cloud (Full)'\r\n static renderFull = true\r\n}\r\n\r\nexport default IchimokuCloudFull\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { ExponentialMovingAverage } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n emaPeriod: number\r\n multiplier: number\r\n atrPeriod: number\r\n strokeColor: string\r\n fillColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n emaPeriod: 20,\r\n multiplier: 2.0,\r\n atrPeriod: 10,\r\n}\r\n\r\nconst COLORS = {\r\n Stroke: '#69C1EA',\r\n Fill: '#69C1EA33',\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const values = period.split(',')\r\n const emaPeriod = parseInt(values[0])\r\n const multiplier = parseFloat(values[1])\r\n const atrPeriod = parseInt(values[2])\r\n\r\n return [emaPeriod, multiplier, atrPeriod]\r\n}\r\n\r\nclass KeltnerChannel extends Overlay {\r\n static type = OverlayType.Kch\r\n static label = 'Keltner Channel'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period)) * 2\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\r\n ) {\r\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\r\n this.attrs.emaPeriod = emaPeriod\r\n this.attrs.multiplier = multiplier\r\n this.attrs.atrPeriod = atrPeriod\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\r\n const ema = new ExponentialMovingAverage(emaPeriod)\r\n const atr = new AverageTrueRange(atrPeriod)\r\n const middleLine: number[] = []\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const start = Math.max(emaPeriod, atrPeriod)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', strokeColor)\r\n context.set('fillStyle', fillColor)\r\n\r\n //top line + clip\r\n context.beginPath()\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n ema.add(this.data.close[i])\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n if (i < start) {\r\n continue\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n middleLine[i] = ema.value\r\n upperBand[i] = ema.value + multiplier * atr.value\r\n lowerBand[i] = ema.value - multiplier * atr.value\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n }\r\n if (firstBarToRender === undefined) {\r\n context.restore()\r\n return\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // bottom line + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // middle line\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const emaPeriod = {\r\n type: 'number',\r\n label: 'EMA Period',\r\n name: 'emaPeriod',\r\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Multiplier',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const atrPeriod = {\r\n type: 'number',\r\n label: 'ATR Period',\r\n name: 'atrPeriod',\r\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.strokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.fillColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'emaPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'atrPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.strokeColor\r\n }\r\n\r\n toString() {\r\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\r\n }\r\n}\r\n\r\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\r\n\r\nexport default KeltnerChannel\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\r\nclass None extends Overlay {\r\n static type = OverlayType.None\r\n static label = 'None'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n isRendered() {\r\n return false\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n}\r\n\r\nexport default None\r\n","import Text from '../canvas/text'\r\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport Overlay from './overlay'\r\n\r\ntype aboveBelowType = 'above' | 'below'\r\n\r\nclass Patterns extends Overlay {\r\n static type = OverlayType.Patterns\r\n static label = 'Patterns (daily charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const data = this.data\r\n if (data.patterns.length === 0) {\r\n return\r\n }\r\n\r\n const originalScale = {\r\n width: 600,\r\n height: 300,\r\n barsInDay: Math.min(data.close.length, 200),\r\n high: data.patternsMaxRange,\r\n low: data.patternsMinRange,\r\n barWidth: 0,\r\n }\r\n originalScale.barWidth = originalScale.width / 200\r\n\r\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\r\n const fx = (x: number) => {\r\n if (x === 0) {\r\n return this.fx(0)\r\n }\r\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\r\n }\r\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\r\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\r\n const roundedXY = getRoundedObject({\r\n x1: fx(x1),\r\n y1: fy(y1),\r\n x2: fx(x2),\r\n y2: fy(y2),\r\n })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\r\n context.translate(translateXY.x, translateXY.y)\r\n\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', color)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n }\r\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx((x1 + x2) / 2),\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx(x1) + 5,\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 9, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const above = (y: number) =>\r\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\r\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\r\n\r\n const supportColor = 'rgb(0, 150, 220)'\r\n const resistColor = 'rgb(180, 50, 200)'\r\n\r\n for (const pattern of data.patterns) {\r\n const { x1, x2, x3, y3 } = pattern\r\n let { y1, y2 } = pattern\r\n switch (pattern.kind) {\r\n case 1: // Horiz S/R\r\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\r\n break\r\n\r\n case 2: // tl resist\r\n line(resistColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 3: // tl support\r\n if (y1 === originalScale.height && y2 === originalScale.height) {\r\n y1 = y2 = originalScale.height - 1\r\n // Maybe just need to check on the new scale?\r\n } // support \"pod grafom\"\r\n line(supportColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 12: // double top\r\n text('Double Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 13: // double bottom\r\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 14: // multi top\r\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 15: // multi bottom\r\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 16: // h&s top\r\n textHS('L', below(y1), resistColor, x1, y1)\r\n textHS('H', below(y2), resistColor, x2, y2)\r\n textHS('R', below(y3), resistColor, x3, y3)\r\n break\r\n\r\n case 17: // h&s bot\r\n textHS('L', above(y1), supportColor, x1, y1)\r\n textHS('H', above(y2), supportColor, x2, y2)\r\n textHS('R', above(y3), supportColor, x3, y3)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const supportColor = {\r\n type: 'color',\r\n label: 'Support Color',\r\n name: 'supportColor',\r\n value: this.attrs.supportColor ?? this.getFreeColor(),\r\n }\r\n const resistColor = {\r\n type: 'color',\r\n label: 'Resist Color',\r\n name: 'resistColor',\r\n value: this.attrs.resistColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [supportColor, resistColor],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return false\r\n }\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\r\n\r\nexport default Patterns\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { Instrument } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { OverlayType, TIMEFRAME, TextBaseline } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport Utils from '../utils'\r\nimport { getBarWidthWithMargin, round } from '../utils/chart'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\nenum Calculation {\r\n standard = 'Standard',\r\n fibonacci = 'Fibonacci',\r\n}\r\ntype CalculationType = keyof typeof Calculation\r\n\r\nenum PivotPeriod {\r\n day,\r\n week,\r\n month,\r\n year,\r\n}\r\n\r\ntype PivotPointType = {\r\n pivot: number\r\n res1: number\r\n res2: number\r\n res3: number\r\n sup1: number\r\n sup2: number\r\n sup3: number\r\n}\r\n\r\ninterface Attrs {\r\n period?: string\r\n calculationType: CalculationType\r\n color: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n CalculationType: 'standard' as CalculationType,\r\n Color: '#FFA75F',\r\n}\r\nconst FIB_LVL_1 = 0.382\r\nconst FIB_LVL_2 = 0.618\r\nconst DAY_SECONDS = 86400\r\nconst MINUTES_PER_DAY = 1440\r\n\r\nclass PivotPoints extends Overlay {\r\n static type = OverlayType.Pp\r\n static label = 'Pivot Points'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (period) {\r\n this.attrs.calculationType = period as CalculationType\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n getPeriodType() {\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n return PivotPeriod.week\r\n case TIMEFRAME.h4:\r\n case TIMEFRAME.d:\r\n return PivotPeriod.month\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n return PivotPeriod.year\r\n default:\r\n return PivotPeriod.day\r\n }\r\n }\r\n\r\n getIsEnoughData(startIndex: number, endIndex: number, periodType: PivotPeriod) {\r\n let dayGap = 7 // one week for week period\r\n if (periodType === PivotPeriod.month) dayGap = 28 // shortest month\r\n if (periodType === PivotPeriod.year) dayGap = 365\r\n\r\n if (startIndex !== endIndex) {\r\n if (startIndex === 0) {\r\n const daysDiff = (this.data.date[endIndex] - this.data.date[startIndex]) / DAY_SECONDS\r\n // we need to somehow determine if we have data if it starts from index 0\r\n // and we can't easily check if day before is different (different month/week/year)\r\n // so we are at least checking if it is [dayGap] days between start and end date\r\n return daysDiff >= dayGap\r\n } else {\r\n const startDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex])\r\n const beforeDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex - 1])\r\n if (periodType === PivotPeriod.week) {\r\n return beforeDay.getDate() !== startDay.getDate()\r\n } else {\r\n return beforeDay.getMonth() !== startDay.getMonth()\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (this.data.close.length === 0) return\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const text = (label: string, price: number, calculatedX: number) => {\r\n new Text(\r\n {\r\n x: calculatedX,\r\n y: this.fy(price) - 13,\r\n font: { size: 8, weight: '900' },\r\n textBaseline: TextBaseline.top,\r\n fillStyle: this.attrs.color,\r\n text: `${label} (${round({ data: this.data, num: price })})`,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n const line = (fromX: number, toX: number, y: number) => {\r\n context.moveTo(fromX, this.fy(y))\r\n context.lineTo(toX, this.fy(y))\r\n }\r\n\r\n let startIndex = -1\r\n let endIndex = -1\r\n const isStock = this.data.instrument === Instrument.Stock\r\n const periodType = this.getPeriodType()\r\n let currentDate = new Date()\r\n let lastDate: Date | undefined\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n for (let index = firstBarToRender.index; index <= lastBarToRender.index; index++) {\r\n currentDate = Utils.dateFromUnixTimestamp(this.data.date[index])\r\n\r\n // check if new calculation/render is necessary\r\n switch (periodType) {\r\n case PivotPeriod.day: // only if it is a new day\r\n if (currentDate.getDate() === lastDate?.getDate()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.week: // only if it is a new week\r\n if (lastDate && dateFns.isSameWeek(lastDate, currentDate, { weekStartsOn: 1 })) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.month: // only if it is a new month\r\n if (currentDate.getMonth() === lastDate?.getMonth()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.year: // only if it is a new year\r\n if (currentDate.getFullYear() === lastDate?.getFullYear()) {\r\n continue\r\n }\r\n break\r\n }\r\n lastDate = currentDate\r\n\r\n // Find start/end indexes for the entire previous period\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n if (index > 0) {\r\n let previousTradingDay = new Date()\r\n for (let i = index - 1; i >= 0; i--) {\r\n previousTradingDay = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (previousTradingDay.getDate() !== currentDate.getDate()) break\r\n }\r\n previousTradingDay.setHours(0, 0, 0, 0)\r\n const previousNYMidnightTimestamp = Utils.convertLocalToNyTime(previousTradingDay, false).getTime() / 1000\r\n const currentMidnight = new Date(currentDate)\r\n currentMidnight.setHours(0, 0, 0, 0)\r\n const currentNYMidnightTimestamp = Utils.convertLocalToNyTime(currentMidnight, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= previousNYMidnightTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > currentNYMidnightTimestamp)\r\n\r\n // check if we have data for entire day\r\n if (startIndex !== endIndex) {\r\n const diff = this.data.date[endIndex] - this.data.date[startIndex]\r\n const isNonStockFullDay = !isStock && diff >= DAY_SECONDS\r\n const isStockFullDay = isStock && previousTradingDay.getDate() !== currentDate.getDate()\r\n if (!isNonStockFullDay && !isStockFullDay) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n }\r\n }\r\n break\r\n case PivotPeriod.week:\r\n const firstDayCurrentWeek = dateFns.startOfWeek(currentDate, { weekStartsOn: 1 })\r\n const firstDayCurrentWeekTimestamp = Utils.convertLocalToNyTime(firstDayCurrentWeek, false).getTime() / 1000\r\n const firstDayPreviousWeek = dateFns.sub(firstDayCurrentWeek, { weeks: 1 })\r\n const firstDayPreviousWeekTimestamp = Utils.convertLocalToNyTime(firstDayPreviousWeek, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousWeekTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentWeekTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.month:\r\n const firstDayCurrentMonth = dateFns.startOfMonth(currentDate)\r\n const firstDayCurrentMonthTimestamp = Utils.convertLocalToNyTime(firstDayCurrentMonth, false).getTime() / 1000\r\n const firstDayPreviousMonth = dateFns.sub(firstDayCurrentMonth, { months: 1 })\r\n const firstDayPreviousMonthTimestamp =\r\n Utils.convertLocalToNyTime(firstDayPreviousMonth, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousMonthTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentMonthTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.year:\r\n const firstDayCurrentYear = dateFns.startOfYear(currentDate)\r\n const firstDayCurrentYearTimestamp = Utils.convertLocalToNyTime(firstDayCurrentYear, false).getTime() / 1000\r\n const firstDayPreviousYear = dateFns.sub(firstDayCurrentYear, { years: 1 })\r\n const firstDayPreviousYearTimestamp = Utils.convertLocalToNyTime(firstDayPreviousYear, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousYearTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentYearTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n }\r\n\r\n // calculate pivot point if it was found\r\n if (!(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex)) continue\r\n\r\n let pivot, sup1, sup2, sup3, res1, res2, res3\r\n const previousHigh = Math.max(...this.data.high.slice(startIndex, endIndex))\r\n const previousLow = Math.min(...this.data.low.slice(startIndex, endIndex))\r\n const previousClose = this.data.close[endIndex - 1] // endIndex is the beginning of the next period\r\n\r\n if (this.attrs.calculationType === 'standard') {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = 2 * pivot - previousHigh\r\n sup2 = pivot - (previousHigh - previousLow)\r\n sup3 = previousLow - 2 * (previousHigh - pivot)\r\n res1 = 2 * pivot - previousLow\r\n res2 = pivot + (previousHigh - previousLow)\r\n res3 = previousHigh + 2 * (pivot - previousLow)\r\n } else {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = pivot - (previousHigh - previousLow) * FIB_LVL_1\r\n sup2 = pivot - (previousHigh - previousLow) * FIB_LVL_2\r\n sup3 = pivot - (previousHigh - previousLow)\r\n res1 = pivot + (previousHigh - previousLow) * FIB_LVL_1\r\n res2 = pivot + (previousHigh - previousLow) * FIB_LVL_2\r\n res3 = pivot + (previousHigh - previousLow)\r\n }\r\n\r\n const pivotPoint: PivotPointType = { pivot, sup1, sup2, sup3, res1, res2, res3 }\r\n\r\n // prepare x coordinates for lines rendering\r\n let fromX = this.fx(index)\r\n let toX = this.fx(index)\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n const interval = this.data.interval\r\n const currentX = fromX\r\n\r\n const toDate = new Date(currentDate)\r\n toDate.setHours(16, 0, 0, 0)\r\n if (this.data.aftermarket && interval <= 5) toDate.setHours(18, 30, 0, 0)\r\n if (interval <= 15 && !isStock) toDate.setHours(23, 59, 59, 99)\r\n const toTimestamp = toDate.getTime() / 1000\r\n const toDiffMinutes = (toTimestamp - currentDate.getTime() / 1000) / 60\r\n const toBars = toDiffMinutes / interval\r\n toX = Math.min(currentX + toBars * barWidth, -leftOffset + width)\r\n\r\n const fromDate = new Date(currentDate)\r\n fromDate.setHours(9, 30, 0, 0)\r\n if (this.data.premarket && interval <= 5) fromDate.setHours(7, 0, 0, 0)\r\n if (interval <= 15 && !isStock) fromDate.setHours(0, 0, 0, 0)\r\n const fromTimestamp = fromDate.getTime() / 1000\r\n const fromDiffMinutes = (fromTimestamp - currentDate.getTime() / 1000) / 60\r\n const fromBars = fromDiffMinutes / interval\r\n fromX = currentX + fromBars * barWidth\r\n break\r\n\r\n case PivotPeriod.week:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n fromX = this.fx(i + 1) // because we need start from current week\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the week\r\n const barsPerDay = Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n toX += (isStock ? 5 : 7) * barsPerDay * barWidth\r\n }\r\n break\r\n\r\n case PivotPeriod.month:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n fromX = this.fx(i + 1) // because we need start from current month\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the month\r\n const barsPerDay = this.data.isIntraday\r\n ? Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n : 1\r\n toX += (isStock ? 20 : 30) * barsPerDay * barWidth\r\n }\r\n break\r\n default:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n fromX = this.fx(i + 1) // because we need start from current year\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the year\r\n toX += (this.data.timeframe === TIMEFRAME.w ? 49 : 12) * barWidth\r\n }\r\n break\r\n }\r\n fromX = Math.max(fromX, -leftOffset)\r\n\r\n // render pivot line\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.pivot)\r\n context.stroke()\r\n\r\n // render resistance and support lines\r\n context.save()\r\n context.setLineDash([3, 3])\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.res1)\r\n line(fromX, toX, pivotPoint.res2)\r\n line(fromX, toX, pivotPoint.res3)\r\n line(fromX, toX, pivotPoint.sup1)\r\n line(fromX, toX, pivotPoint.sup2)\r\n line(fromX, toX, pivotPoint.sup3)\r\n context.stroke()\r\n context.restore()\r\n\r\n // render labels if there is enough space\r\n if (toX - fromX >= 48) {\r\n text('P', pivotPoint.pivot, fromX)\r\n text('R1', pivotPoint.res1, fromX)\r\n text('R2', pivotPoint.res2, fromX)\r\n text('R3', pivotPoint.res3, fromX)\r\n text('S1', pivotPoint.sup1, fromX)\r\n text('S2', pivotPoint.sup2, fromX)\r\n text('S3', pivotPoint.sup3, fromX)\r\n }\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const calculationType = {\r\n type: 'select',\r\n label: 'Calculation Type',\r\n name: 'calculationType',\r\n value: this.attrs.calculationType ?? DEFAULT_PARAMETERS.CalculationType,\r\n required: true,\r\n items: [\r\n {\r\n value: 'standard',\r\n label: 'Standard',\r\n },\r\n {\r\n value: 'fibonacci',\r\n label: 'Fibonacci',\r\n },\r\n ],\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [calculationType, color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'calculationType':\r\n case 'color':\r\n return !!this.attrs[key]\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Pivot Points (${Calculation[this.attrs.calculationType]})`\r\n }\r\n}\r\n\r\nPivotPoints.prototype.defaults = {\r\n calculationType: DEFAULT_PARAMETERS.CalculationType,\r\n color: DEFAULT_PARAMETERS.Color,\r\n}\r\n\r\nexport default PivotPoints\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n fallingColor: string\r\n}\r\n\r\nclass SAR extends Overlay {\r\n static type = OverlayType.Sar\r\n static label = 'Parabolic SAR'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\r\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\r\n this.attrs.step = step\r\n this.attrs.maxStep = maxStep\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const data = this.data\r\n const deltaHigh = data.high[1] - data.high[0]\r\n const deltaLow = data.low[0] - data.low[1]\r\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\r\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\r\n let isLong = pdm >= mdm\r\n\r\n let sar = isLong ? data.low[0] : data.high[0]\r\n let ep = isLong ? data.high[1] : data.low[1]\r\n let newHigh = data.high[0]\r\n let newLow = data.low[0]\r\n let af = this.attrs.step\r\n\r\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\r\n let sarToDraw\r\n const prevHigh = newHigh\r\n const prevLow = newLow\r\n newHigh = data.high[i]\r\n newLow = data.low[i]\r\n\r\n if (isLong) {\r\n if (newLow <= sar) {\r\n isLong = false\r\n sar = ep\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newLow\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newHigh > ep) {\r\n ep = newHigh\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n }\r\n } else {\r\n if (newHigh >= sar) {\r\n isLong = true\r\n sar = ep\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newHigh\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newLow < ep) {\r\n ep = newLow\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n }\r\n }\r\n\r\n const x = Math.round(this.fx(i) - 1.5)\r\n const y = Math.round(this.fy(sarToDraw) - 1.5)\r\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\r\n context.fillRect(x, y, 3, 3)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const step = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Step',\r\n name: 'step',\r\n value: this.attrs.step ?? 0.02,\r\n required: true,\r\n }\r\n const maxStep = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Maximum Step',\r\n name: 'maxStep',\r\n value: this.attrs.maxStep ?? 0.2,\r\n required: true,\r\n }\r\n const risingColor = {\r\n type: 'color',\r\n label: 'Rising Color',\r\n name: 'risingColor',\r\n value: this.attrs.risingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n const fallingColor = {\r\n type: 'color',\r\n label: 'Falling Color',\r\n name: 'fallingColor',\r\n value: this.attrs.fallingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [step, maxStep, risingColor, fallingColor],\r\n inputsErrorMessages: {\r\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\r\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'step':\r\n case 'maxStep': {\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n }\r\n case 'risingColor':\r\n case 'fallingColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.risingColor\r\n }\r\n\r\n toString() {\r\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\r\n }\r\n}\r\n\r\nSAR.prototype.defaults = {\r\n risingColor: '#69c1ea',\r\n fallingColor: '#d386df',\r\n}\r\n\r\nexport default SAR\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n}\r\n\r\nexport class SMACalculation extends MainCalculation {\r\n static type = OverlayType.Sma\r\n declare options: Options\r\n\r\n getDefaultCalculatedValues() {\r\n return { sma: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.options.period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = this.options.period; i <= lastIndex; i++) {\r\n sum = sum - close[i - this.options.period] + close[i]\r\n this.calculatedValues.sma[i] = sum / this.options.period\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { SMACalculation } from '../indicator-calculation/sma'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n color: string\r\n}\r\n\r\nclass SMA extends Overlay {\r\n static type = OverlayType.Sma\r\n static label = 'Simple Moving Average'\r\n\r\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\r\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\r\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n context.beginPath()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const smaCalculation = new SMACalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n smaCalculation.calculate(({ sma }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(sma[dataIndex])))\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n context.stroke()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `SMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nSMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default SMA\r\n","import { OverlayType } from '../constants/common'\r\nimport SMA from './sma'\r\n\r\nclass SMA2 extends SMA {\r\n static type = OverlayType.Sma2\r\n}\r\n\r\nSMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default SMA2\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n multiplier: number\r\n uptrendColor: string\r\n downtrendColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 7,\r\n Multiplier: 3.0,\r\n}\r\n\r\nconst COLORS = {\r\n Uptrend: '#00a000',\r\n Downtrend: '#c80000',\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\r\n\r\n return [period, multiplier]\r\n}\r\n\r\nclass Supertrend extends Overlay {\r\n static type = OverlayType.Str\r\n static label = 'Supertrend'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = parsePeriod(period)\r\n return periodInt + 1\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, multiplier] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.multiplier = multiplier\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period, multiplier } = this.attrs\r\n const { high, low, close } = this.data\r\n const atr = new AverageTrueRange(period)\r\n const finalUpperBand: number[] = []\r\n const finalLowerBand: number[] = []\r\n const supertrend: boolean[] = []\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.uptrendColor)\r\n for (let i = 1; i < close.length; i++) {\r\n atr.add(high[i], low[i], close[i - 1])\r\n\r\n // compute bands\r\n const avg = (high[i] + low[i]) / 2\r\n const upperBand = avg + multiplier * atr.value\r\n const lowerBand = avg - multiplier * atr.value\r\n\r\n finalUpperBand[i] = upperBand\r\n finalLowerBand[i] = lowerBand\r\n\r\n // identify supertrend\r\n if (close[i] > finalUpperBand[i - 1]) {\r\n supertrend[i] = true\r\n } else if (close[i] < finalLowerBand[i - 1]) {\r\n supertrend[i] = false\r\n } else {\r\n supertrend[i] = supertrend[i - 1]\r\n }\r\n\r\n // adjust bands\r\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\r\n finalLowerBand[i] = finalLowerBand[i - 1]\r\n }\r\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\r\n finalUpperBand[i] = finalUpperBand[i - 1]\r\n }\r\n\r\n const x = this.fx(i)\r\n if (i < period || x + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n if (supertrend[i] && !supertrend[i - 1]) {\r\n // buy\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else if (supertrend[i]) {\r\n // keep buying\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else {\r\n // keep selling\r\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n }\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n\r\n if (firstBarToRender === undefined) {\r\n context.translate(-0.5, -0.5)\r\n return\r\n }\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.downtrendColor)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n if (!supertrend[i] && supertrend[i - 1]) {\r\n // sell\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else if (!supertrend[i]) {\r\n // keep selling\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else {\r\n // keep buying\r\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n }\r\n }\r\n context.stroke()\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const uptrendColor = {\r\n type: 'color',\r\n label: 'Uptrend Color',\r\n name: 'uptrendColor',\r\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\r\n }\r\n const downtrendColor = {\r\n type: 'color',\r\n label: 'Downtrend Color',\r\n name: 'downtrendColor',\r\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, multiplier, uptrendColor, downtrendColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'uptrendColor':\r\n case 'downtrendColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor(): string {\r\n return this.attrs.uptrendColor\r\n }\r\n\r\n toString() {\r\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\r\n }\r\n}\r\n\r\nSupertrend.prototype.defaults = {\r\n uptrendColor: COLORS.Uptrend,\r\n downtrendColor: COLORS.Downtrend,\r\n}\r\n\r\nexport default Supertrend\r\n","import * as d3 from 'd3'\r\n\r\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport utils from '../utils'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst VP_COLORS = {\r\n UP: '#00FF00',\r\n DOWN: '#FF0000',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Opacity: 0.3,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n opacity: number\r\n upColor?: string\r\n downColor?: string\r\n}\r\n\r\nfunction applyOpacityToColor(color: string, opacity: number) {\r\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\r\n}\r\n\r\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\r\n return [\r\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\r\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\r\n ]\r\n}\r\n\r\n// Only time when we want value to be able to equal start of segment is first segment,\r\n// because start of next segment is equal to end of previous and value would match two segments\r\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\r\n return (notEqualStart ? val > start : val >= start) && val <= end\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\r\n\r\n return [period, opacity]\r\n}\r\n\r\nclass VolumeProfile extends Overlay {\r\n static type = OverlayType.Vp\r\n static label = 'Volume Profile'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, opacity] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.opacity = opacity\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\r\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender.index, lastBarToRender.index + 1))\r\n\r\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\r\n const segments = [] // create an empty array to hold the segments\r\n\r\n for (let i = 0; i < this.attrs.period; i++) {\r\n const segmentStart = minClose + segment * i // calculate start of current segment\r\n const segmentEnd = segmentStart + segment // calculate end of current segment\r\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\r\n }\r\n\r\n // loop through visible bars and assign volumes to segments\r\n for (let i = firstBarToRender.index; i <= lastBarToRender.index; i++) {\r\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\r\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\r\n )\r\n if (segmentIndex === -1) continue\r\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\r\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\r\n }\r\n\r\n const max = utils.max(segments.map((item) => item.up + item.down))\r\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\r\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\r\n\r\n segments.forEach((item) => {\r\n const y = Math.round(this.fy(item.start))\r\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\r\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\r\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\r\n const upSegmentWidth = Math.round(volumeFX(item.up))\r\n const downSegmentWidth = Math.round(volumeFX(item.down))\r\n\r\n context.fillStyle = upColor\r\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\r\n context.fillStyle = downColor\r\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\r\n })\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Zones',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const opacity = {\r\n type: 'number',\r\n label: 'Opacity',\r\n name: 'opacity',\r\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\r\n required: true,\r\n min: 0,\r\n max: 1,\r\n step: 0.1,\r\n }\r\n const upColor = {\r\n type: 'color',\r\n label: 'Up Color',\r\n name: 'upColor',\r\n value: this.attrs.upColor ?? VP_COLORS.UP,\r\n }\r\n const downColor = {\r\n type: 'color',\r\n label: 'Down Color',\r\n name: 'downColor',\r\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, opacity, upColor, downColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'opacity':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'upColor':\r\n case 'downColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.upColor || VP_COLORS.UP\r\n }\r\n\r\n toString() {\r\n return `VP ${this.attrs.period}`\r\n }\r\n}\r\n\r\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\r\n\r\nexport default VolumeProfile\r\n","import { OverlayType } from '../constants/common'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nconst datesAreOnSameDay = (first: Date, second: Date) =>\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n\r\ntype DefaultCalculatedValuesType = {\r\n vwap: number[]\r\n}\r\n\r\nexport class VWapCalculation extends MainCalculation {\r\n static type = OverlayType.Vwap\r\n\r\n getDefaultCalculatedValues() {\r\n return { vwap: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { date, close, low, high, volume } = this.quote\r\n const lastIndex = date.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let cumulativePV = 0\r\n let cumulativeVolume = 0\r\n\r\n for (let i = 0; i <= lastIndex; i++) {\r\n if (i > 0) {\r\n const prevDate = dateFromUnixTimestamp(date[i - 1])\r\n if (!datesAreOnSameDay(prevDate, dateFromUnixTimestamp(date[i]))) {\r\n cumulativePV = 0\r\n cumulativeVolume = 0\r\n }\r\n }\r\n\r\n const typicalPrice = (close[i] + low[i] + high[i]) / 3\r\n const pv = typicalPrice * volume[i]\r\n\r\n cumulativePV += pv\r\n cumulativeVolume += volume[i]\r\n\r\n this.calculatedValues.vwap[i] = cumulativePV / cumulativeVolume\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n color: string\r\n}\r\n\r\nclass VWAP extends Overlay {\r\n static type = OverlayType.Vwap\r\n static label = 'VWAP (intraday charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 1\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.attrs.period = 5\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (!this.isRendered()) {\r\n return\r\n }\r\n\r\n const { leftOffset, width } = this.model.chart()\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const vwapCalculation = new VWapCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n vwapCalculation.calculate(({ vwap }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return // continue\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false // break\r\n }\r\n const y = Math.round(this.fy(vwap[dataIndex]))\r\n context.lineTo(x, y)\r\n })\r\n\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'color':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n isRendered() {\r\n return this.model.chart().quote().isIntraday\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n toString() {\r\n return `VWAP`\r\n }\r\n}\r\n\r\nVWAP.prototype.defaults = { color: '#9467bd' }\r\n\r\nexport default VWAP\r\n","import { OverlayType } from '../constants/common'\r\nimport bb from './bb'\r\nimport dch from './dch'\r\nimport ema from './ema'\r\nimport ema2 from './ema2'\r\nimport hilo from './hilo'\r\nimport hline from './hline'\r\nimport ic from './ic'\r\nimport icf from './icf'\r\nimport kch from './kch'\r\nimport none from './none'\r\nimport overlay from './overlay'\r\nimport patterns from './patterns'\r\nimport pp from './pp'\r\nimport sar from './sar'\r\nimport sma from './sma'\r\nimport sma2 from './sma2'\r\nimport str from './str'\r\nimport vp from './vp'\r\nimport vwap from './vwap'\r\n\r\nexport const overlaysByType = Object.freeze({\r\n [OverlayType.Overlay]: overlay,\r\n [OverlayType.None]: none,\r\n [OverlayType.Bb]: bb,\r\n [OverlayType.Dch]: dch,\r\n [OverlayType.Ema]: ema,\r\n [OverlayType.Ema2]: ema2,\r\n [OverlayType.Hilo]: hilo,\r\n [OverlayType.Hline]: hline,\r\n [OverlayType.Ic]: ic,\r\n [OverlayType.Icf]: icf,\r\n [OverlayType.Kch]: kch,\r\n [OverlayType.Patterns]: patterns,\r\n [OverlayType.Pp]: pp,\r\n [OverlayType.Sar]: sar,\r\n [OverlayType.Sma]: sma,\r\n [OverlayType.Sma2]: sma2,\r\n [OverlayType.Str]: str,\r\n [OverlayType.Vp]: vp,\r\n [OverlayType.Vwap]: vwap,\r\n})\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch (e) {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch (e) {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\n\r\nconst requestsAbortControllersCache: ObjectHash = {}\r\n\r\nexport function removeFromAbortCache(key: string) {\r\n delete requestsAbortControllersCache[key]\r\n}\r\n\r\nexport function abortRequest(key: string) {\r\n requestsAbortControllersCache[key]?.abort()\r\n removeFromAbortCache(key)\r\n}\r\n\r\nexport function getIsAbortError(error: Error) {\r\n return error.name === 'AbortError'\r\n}\r\n\r\nexport function createRequestAbortController({\r\n key,\r\n shouldAbortRunningRequest = false,\r\n}: {\r\n key: string\r\n shouldAbortRunningRequest?: boolean\r\n}) {\r\n if (shouldAbortRunningRequest) {\r\n abortRequest(key)\r\n }\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n if (controller) {\r\n requestsAbortControllersCache[key] = controller\r\n }\r\n return controller\r\n}\r\n","import * as websiteShared from '@finviz/website'\r\n\r\nimport { captureException } from './helpers'\r\n\r\n/**\r\n * Hook used to asynchronously load a module\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\r\n */\r\nexport const useAsyncModule = (\r\n props: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n captureException?: (exception: Error, captureContext?: { extra: Record }) => void\r\n errorSeverity?: 'medium' | 'high'\r\n } & (websiteShared.ControlledModuleConfig | websiteShared.SuspenseModuleConfig)\r\n) =>\r\n websiteShared.useAsyncModule({ captureException, ...props }) as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n","import { getIsSSr } from './helpers'\r\n\r\n// Extracted from isMobile, and modified to fit usage\r\nfunction isFirefoxDesktop() {\r\n const matchesAndroid = navigator.userAgent.match(/Android/i)\r\n const matchesWebOS = navigator.userAgent.match(/webOS/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesiPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\n const matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n const isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\n const matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\n\r\n return matchesFirefox && !isMobileDevice\r\n}\r\n\r\n// Due bug in FireFox, when if HW acceleration is used canvas is blurry\r\n// we need to set canvas as CPU only\r\nconst shouldUseCPUOnly = getIsSSr() ? false : isFirefoxDesktop()\r\n\r\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\r\n if (!canvas) {\r\n return null\r\n }\r\n\r\n const context = canvas.getContext('2d', shouldUseCPUOnly ? { willReadFrequently: true } : undefined)\r\n if (!context) {\r\n window.Sentry?.captureMessage('Context unavailable')\r\n return null\r\n }\r\n\r\n context._cache = {}\r\n\r\n const _restore = CanvasRenderingContext2D.prototype.restore\r\n context.restore = function () {\r\n this._cache = {}\r\n return _restore.apply(this)\r\n }\r\n\r\n context.set = function (key, value) {\r\n if (this._cache[key] !== value) {\r\n this[key] = value\r\n this._cache[key] = value\r\n }\r\n }\r\n\r\n return context\r\n}\r\n","import { Theme } from '../../types/shared'\r\nimport twColors from '../constants/colors'\r\nimport { ChartEventType } from '../constants/common'\r\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../helpers/math'\r\nimport utils from '../utils'\r\nimport { formatDateToStringUS } from '../utils/helpers'\r\n\r\ninterface IChartEventBase {\r\n elementId: string\r\n eventType: ChartEventType\r\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\r\n}\r\n\r\nexport interface IEarnings extends IChartEventBase {\r\n epsActual?: number\r\n epsEstimate?: number\r\n epsReportedActual?: number\r\n epsReportedEstimate?: number\r\n fiscalEndDate: number\r\n fiscalPeriod: string\r\n salesActual?: number\r\n salesEstimate?: number\r\n}\r\n\r\nexport interface IDividends extends IChartEventBase {\r\n ordinary: number\r\n special: number\r\n}\r\n\r\nexport interface ISplit extends IChartEventBase {\r\n factorFrom: number\r\n factorTo: number\r\n}\r\n\r\nexport enum ChartEventBadgeState {\r\n default = 'default',\r\n hover = 'hover',\r\n selected = 'selected',\r\n}\r\n\r\nexport interface IChartEventBadgeProps {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n width: number\r\n}\r\n\r\ninterface IGetChartEventBadgeColors {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n colors: IBadgeColors\r\n}\r\n\r\ninterface IBadgeStateColors {\r\n default: string\r\n hover: string\r\n selected: string\r\n}\r\n\r\ninterface IBadgeThemeColors {\r\n outerStroke: string\r\n innerStroke: string\r\n innerFill: IBadgeStateColors\r\n textFill: IBadgeStateColors\r\n}\r\n\r\ninterface IBadgeColors {\r\n light: IBadgeThemeColors\r\n dark: IBadgeThemeColors\r\n}\r\n\r\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\r\n return {\r\n outerStroke: colors[theme].outerStroke,\r\n innerStroke: colors[theme].innerStroke,\r\n innerFill: colors[theme].innerFill[state],\r\n textFill: colors[theme].textFill[state],\r\n }\r\n}\r\n\r\nexport function getFormattedEventDate(\r\n exdate: number,\r\n hasEarningsDateSuffix = false,\r\n options: ObjectHash = {\r\n month: 'short',\r\n }\r\n) {\r\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\r\n\r\n const hours = parsedDate.getHours()\r\n const formattedDate = formatDateToStringUS(parsedDate, options)\r\n\r\n if (hasEarningsDateSuffix) {\r\n let suffix = ''\r\n\r\n if (hours <= 9) {\r\n suffix = 'BMO'\r\n } else if (hours >= 16) {\r\n suffix = 'AMC'\r\n }\r\n\r\n return `${formattedDate} ${suffix}`\r\n }\r\n\r\n return formattedDate\r\n}\r\n\r\nexport function getFormattedValue({\r\n value,\r\n bigNumberUnit,\r\n maxDecimalPlaces = 3,\r\n}: {\r\n value: number\r\n bigNumberUnit?: BigNumber\r\n maxDecimalPlaces?: number\r\n}) {\r\n let numberString = ''\r\n let suffix = ''\r\n\r\n if (bigNumberUnit === undefined) {\r\n numberString = math.round({ value, overridePlaces: 3 })\r\n } else {\r\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\r\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\r\n suffix = bigNumber.substring(bigNumber.length - 1)\r\n }\r\n\r\n const [wholeNumber, decimalNumber] = numberString.split('.')\r\n\r\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\r\n\r\n let formattedDecimalNumber = decimalNumber\r\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\r\n formattedDecimalNumber = decimalNumber.slice(0, -1)\r\n }\r\n\r\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\r\n}\r\n\r\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\r\n return {\r\n light: {\r\n outerStroke: twColors.white,\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][50],\r\n hover: twColors[colorKey][100],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors[colorKey][500],\r\n hover: twColors[colorKey][600],\r\n selected: twColors.white,\r\n },\r\n },\r\n dark: {\r\n outerStroke: twColors.gray[900],\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][800],\r\n hover: twColors[colorKey][600],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors.white,\r\n hover: twColors.white,\r\n selected: twColors.white,\r\n },\r\n },\r\n } as IBadgeColors\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport { chartsByType } from '../charts/charts'\r\nimport {\r\n CRYPTOS,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAME_SECONDS,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getPercentageFromValue } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport ChartLayoutModel from '../models/chart_layout'\r\nimport { IChartSettings } from '../models/chart_settings/interfaces'\r\nimport { Mouse } from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote, { QuoteGetParams } from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils, { dateFromUnixTimestamp } from '../utils'\r\nimport { captureException } from './helpers'\r\n\r\nconst DAY_IN_SECONDS = 86400\r\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\r\nconst virtualDatesCache: ObjectHash<{\r\n fromSeconds: number\r\n toSeconds: number\r\n lastUsed: number\r\n virtualDates: number[]\r\n}> = {}\r\n\r\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\r\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\r\n const ts1Utc = ts1\r\n const ts2Utc = ts2\r\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\r\n}\r\n\r\nfunction getVirtualDatesCacheId({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n}) {\r\n return `${ticker}-${timeframe}-${idRevision}`\r\n}\r\n\r\nfunction getCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n const cache = virtualDatesCache[id]\r\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\r\n cache.lastUsed = Date.now()\r\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\r\n return cache.virtualDates\r\n }\r\n return cache.virtualDates.filter(\r\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction checkVirtualCacheSize() {\r\n const now = Date.now()\r\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\r\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\r\n delete virtualDatesCache[virtualDatesCacheId]\r\n }\r\n })\r\n}\r\n\r\nfunction setCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n virtualDates: number[]\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n checkVirtualCacheSize()\r\n virtualDatesCache[id] = {\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n lastUsed: Date.now(),\r\n }\r\n}\r\n\r\nconst MAX_BAR_BORDER_WIDTH = 1\r\nconst MIN_BAR_MARGIN_WIDTH = 0\r\nconst MAX_BAR_MARGIN_WIDTH = 16\r\n\r\nexport function getBarWidthWithMarginByParts({\r\n zoomFactor = 1,\r\n chartLayout,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const { ChartSettings } = chartLayout.settings\r\n const settingsCenter = ChartSettings.center\r\n const barMargin =\r\n zoomFactor > 1 && settingsCenter.barMargin === 0\r\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\r\n : settingsCenter.barMargin\r\n\r\n const barFillWidth = settingsCenter.barWidth * zoomFactor\r\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\r\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\r\n\r\n return {\r\n barFillWidth,\r\n barBorderWidth,\r\n barMarginWidth,\r\n }\r\n}\r\n\r\nexport function getBarWidthWithMargin({\r\n zoomFactor = 1,\r\n chartLayout,\r\n shouldRound = true,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n shouldRound?: boolean\r\n}) {\r\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\r\n\r\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\r\n if (!shouldRound) {\r\n return barWidth\r\n }\r\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\r\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\r\n}\r\n\r\nexport function getBarWithoutMarginWidth(chartModel: Chart) {\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: chartModel.chart_layout(),\r\n zoomFactor: chartModel.zoomFactor,\r\n })\r\n return barFillWidth + barBorderWidth * 2\r\n}\r\n\r\nexport function getHalfBarWidth(chartModel: Chart, floor = true) {\r\n // Math.max(1, num) is kept from previous implementation, it is highly likely\r\n // that some function which use getHalfBarWidth expect return to be >= 1,\r\n // because we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n // but some function require raw not floored number to be able to do it's calculations\r\n // TODO: it would be good to possibly revisit this and check usage if we do need\r\n // to perform floor as well as limit result to be >= 1 but it is most likely necessary\r\n const halfBarWidthRaw = Math.max(1, getBarWithoutMarginWidth(chartModel) / 2)\r\n return floor ? ~~halfBarWidthRaw : halfBarWidthRaw\r\n}\r\n\r\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\r\n\r\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\r\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\r\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\r\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\r\nconst setZoomFactorToCache = (key: string, value: number) => {\r\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\r\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\r\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\r\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\r\n if (poppedKey) {\r\n delete zoomFactorForBarsToDisplayCache[poppedKey]\r\n }\r\n }\r\n }\r\n\r\n zoomFactorForBarsToDisplayCache[key] = value\r\n}\r\n\r\nexport function getZoomFactorForBarsToDisplay({\r\n chartVisibleWidth,\r\n numOfVisibleBars,\r\n chartLayout,\r\n}: {\r\n chartVisibleWidth: number\r\n numOfVisibleBars: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\r\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\r\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\r\n let zoomIncrement = 0\r\n let currentZoomFactor = 1\r\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\r\n let iteration = 0\r\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\r\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\r\n }\r\n while (finalZoomFactor === null) {\r\n iteration += 1\r\n const threshold = 0.01\r\n currentZoomFactor += zoomIncrement\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\r\n const barWidthDiff = barWidthWithMargin - barWidth\r\n if (barWidthDiff > threshold) {\r\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else if (barWidthDiff < -threshold) {\r\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else {\r\n finalZoomFactor = currentZoomFactor\r\n }\r\n\r\n if (iteration === 1000) {\r\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\r\n extra: {\r\n iteration,\r\n zoomIncrement,\r\n barWidthWithMargin,\r\n barWidth,\r\n barWidthDiff,\r\n currentZoomFactor,\r\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n return currentZoomFactor\r\n }\r\n }\r\n\r\n setZoomFactorToCache(cacheKey, finalZoomFactor)\r\n\r\n return finalZoomFactor\r\n}\r\n\r\nexport function getTimeframeSeconds({\r\n lowerIndex,\r\n dates,\r\n timeframe,\r\n}: {\r\n lowerIndex: number\r\n dates: number[]\r\n timeframe: TIMEFRAME\r\n}) {\r\n const upperIndex = lowerIndex + 1\r\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\r\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\r\n}\r\n\r\nfunction getVirtualTradedDays({\r\n dateStartSeconds,\r\n dateEndSeconds,\r\n datesSeconds,\r\n marketStartMinutes,\r\n}: {\r\n dateStartSeconds: number\r\n dateEndSeconds: number\r\n datesSeconds: number[]\r\n marketStartMinutes: number\r\n}) {\r\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\r\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\r\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\r\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\r\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\r\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\r\n return dateFns\r\n .eachDayOfInterval({\r\n start:\r\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\r\n ? dateFns.addBusinessDays(dateStart, -1)\r\n : dateStart,\r\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\r\n })\r\n .filter((date) => {\r\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\r\n return (\r\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\r\n datesSeconds.some((dateTime) =>\r\n areTimestampsFromSameDay({\r\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\r\n ts2,\r\n })\r\n )\r\n )\r\n })\r\n}\r\n\r\nexport function getVirtualTimeframeTradedDates({\r\n dateStart,\r\n dateEnd,\r\n quote,\r\n}: {\r\n dateStart: number\r\n dateEnd: number\r\n quote: Quote\r\n}) {\r\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\r\n const barsInDay = quote.getBarsInDay() ?? 0\r\n\r\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\r\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\r\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\r\n\r\n const commonVirtualCacheProps = {\r\n idRevision: dates.length,\r\n ticker,\r\n timeframe,\r\n fromSeconds: dateStart,\r\n toSeconds: dateEnd,\r\n }\r\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\r\n if (cachedDates) {\r\n return cachedDates\r\n }\r\n if (!isIntraday || instrument !== Instrument.Stock) {\r\n if (isWithinRangeOfQuoteDate) {\r\n return dates\r\n }\r\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\r\n const firstDate = dates[0]\r\n const lastDate = dates[dates.length - 1]\r\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\r\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\r\n return [\r\n ...Array.from({ length: numOfDatesBefore })\r\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\r\n .reverse(),\r\n ...dates,\r\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\r\n ]\r\n }\r\n\r\n const virtualTradedDays = isWithinRangeOfQuoteDate\r\n ? quote.getDaysInQuote()\r\n : getVirtualTradedDays({\r\n dateStartSeconds: dateStart,\r\n dateEndSeconds: dateEnd,\r\n datesSeconds: dates,\r\n marketStartMinutes,\r\n })\r\n\r\n const marketStartSeconds = marketStartMinutes * 60\r\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\r\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\r\n const virtualDates = virtualTradedDays.flatMap((date) => {\r\n const daySeconds =\r\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\r\n const dayStartSeconds = daySeconds + marketStartSeconds\r\n return barTimeframeSeconds.map(\r\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\r\n (barSeconds, index) =>\r\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\r\n dayStartSeconds +\r\n barSeconds\r\n )\r\n })\r\n\r\n if (!isWithinRangeOfQuoteDate) {\r\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\r\n const isLowerBounded =\r\n date >= dateStart ||\r\n areTimestampsFromSameDay({\r\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\r\n ts2: dateStart - quoteDatesTimestampOffset,\r\n })\r\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\r\n return isLowerBounded || isOneBeforeLowerBoundStarts\r\n })\r\n }\r\n\r\n setCachedVirtualDates({\r\n ...commonVirtualCacheProps,\r\n virtualDates,\r\n })\r\n\r\n return virtualDates\r\n}\r\n\r\ninterface TimestampPositionGettersProps {\r\n quote: Quote\r\n}\r\n\r\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (positionX >= 0 && positionX <= lastDateIndex) {\r\n const lowerIndex = Math.floor(positionX)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\r\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\r\n }\r\n const isLookingBack = positionX < 0\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n const numOfSecondsOutOfBounds = isLookingBack\r\n ? Math.abs(positionX) * averageBarDate\r\n : (positionX - lastDateIndex) * averageBarDate\r\n return Math.round(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\r\n}\r\n\r\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\r\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\r\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\r\n return upperIndex - positionDiffUpperTimestamp\r\n }\r\n const isLookingBack = timestamp < dateStart\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n return isLookingBack\r\n ? -((dateStart - timestamp) / averageBarDate)\r\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\r\n}\r\n\r\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\r\nexport function getInstrument(tickerRaw: string) {\r\n if (tickerRaw.indexOf('@') === 0) {\r\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\r\n\r\n if (CRYPTOS[ticker]) {\r\n return Instrument.Crypto\r\n } else if (ticker.length === 6) {\r\n return Instrument.Forex\r\n } else {\r\n return Instrument.Futures\r\n }\r\n }\r\n return Instrument.Stock\r\n}\r\n\r\nexport function getPerfIndicatorTickerAndTimeframes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n}: {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n timeframe: TIMEFRAME\r\n}) {\r\n const { elements } = paneWithPerfIndicator\r\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\r\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\r\n return tickers.map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n}\r\n\r\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n chartUuid?: string\r\n}\r\n\r\nexport async function prefetchPerfIndicatorAllQuotes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n}: PrefetchPerfIndicatorAllQuotesProps) {\r\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\r\n\r\n if (tickersAndTimeframes.length > 0) {\r\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n })\r\n )\r\n return Promise.all(promises)\r\n }\r\n return Promise.resolve([])\r\n}\r\n\r\ninterface RenderCrossProps {\r\n context: CanvasRenderingContext2D\r\n mouseModel: Mouse\r\n paneModel: Pane\r\n quote: Quote\r\n contentWidth: number\r\n contentHeight: number\r\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\r\n getRoundDecimalPlaces?: (price?: number) => number | undefined\r\n isIndicator?: boolean\r\n isPerfIndicator?: boolean\r\n}\r\n\r\nexport function renderCross({\r\n context,\r\n mouseModel,\r\n paneModel,\r\n quote,\r\n contentWidth,\r\n contentHeight,\r\n onRenderCrossText,\r\n getRoundDecimalPlaces,\r\n isIndicator = false,\r\n isPerfIndicator = false,\r\n}: RenderCrossProps) {\r\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\r\n const chartModel = paneModel.chart()\r\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\r\n const settings = isIndicator ? IndicatorSettings : ChartSettings\r\n const { Colors } = ChartSettings.general\r\n\r\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\r\n return false\r\n }\r\n\r\n const price = mouseModel.getPriceForPane(paneModel)\r\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\r\n const isXAxisInView = middle > 0 && middle <= contentWidth\r\n if (isXAxisInView) {\r\n const x = middle + settings.left.width\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: settings.top.height,\r\n y2: settings.top.height + contentHeight,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n onRenderCrossText?.(context, crossIndex)\r\n }\r\n\r\n const domainRange = paneModel.scale.y\r\n .domain()\r\n .slice()\r\n .sort((a, b) => a - b)\r\n\r\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\r\n return isXAxisInView\r\n }\r\n\r\n const priceFy = paneModel.scale.y(price)\r\n const y = Math.round(priceFy + settings.top.height)\r\n new Line(\r\n {\r\n x1: settings.left.width,\r\n x2: settings.left.width + contentWidth,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\r\n\r\n const getCrossText = () => {\r\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\r\n return `${math.round({\r\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: 2,\r\n })}%`\r\n }\r\n return `${math.round({\r\n value: price,\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\r\n })}${isPerfIndicator ? '%' : ''}`\r\n }\r\n\r\n new Text(\r\n {\r\n text: getCrossText(),\r\n x:\r\n settings.left.width +\r\n settings.right.axis.margin.left! +\r\n contentWidth +\r\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\r\n padding: isIndicator\r\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\r\n : {\r\n top: PADDING.XXS,\r\n right: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n },\r\n ...{\r\n y,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n background: Colors.crossTextBackground,\r\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\r\n lineHeight: settings.right.axis.font.lineHeight,\r\n },\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Set canvas width and height to 0 which fixes Safari memory problems\r\n *\r\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n */\r\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\r\n if (!canvas) return\r\n\r\n canvas.width = 0\r\n canvas.height = 0\r\n canvas.style.width = '0px'\r\n canvas.style.height = '0px'\r\n}\r\n\r\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\r\n const { Colors } = ChartSettings.general\r\n if (change === 0) {\r\n return Colors.zeroChange\r\n }\r\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\r\n}\r\n\r\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\r\n return math.round({\r\n value: num,\r\n lastClose: data.lastClose,\r\n instrument: data.instrument,\r\n overridePlaces: overridePlaces,\r\n })\r\n}\r\n\r\nexport interface ITickerChange {\r\n points: number\r\n string: string\r\n percentString: string\r\n}\r\ninterface ITickerChangeResult {\r\n tickerChange: ITickerChange | null\r\n tickerAfterChange: ITickerChange | null\r\n}\r\n\r\nexport function getTickerChangeFromCloseValues({\r\n anchorClose,\r\n prevClose,\r\n data,\r\n}: {\r\n anchorClose: number\r\n prevClose: number\r\n data: Quote\r\n}): ITickerChange {\r\n const changePoints = anchorClose - prevClose\r\n const changePercent = (anchorClose / prevClose - 1) * 100\r\n const sign = changePoints < 0 ? '-' : changePoints > 0 ? '+' : ''\r\n const changePercentString = `${round({\r\n data,\r\n num: Math.abs(changePercent),\r\n overridePlaces: 2,\r\n })}%`\r\n const changePointsString = `${sign}${round({\r\n data,\r\n num: Math.abs(changePoints),\r\n })} (${changePercentString})`\r\n\r\n return {\r\n points: changePoints,\r\n string: changePointsString,\r\n percentString: `${sign}${changePercentString}`,\r\n }\r\n}\r\nexport function getTickerChange({ data }: { data: Quote }) {\r\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\r\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\r\n if (isChange) {\r\n result.tickerChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.lastClose,\r\n prevClose: data.prevClose,\r\n })\r\n }\r\n\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n if (isAfterChange) {\r\n const tickerAfterChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.afterClose,\r\n prevClose: data.lastClose,\r\n })\r\n result.tickerAfterChange = {\r\n ...tickerAfterChange,\r\n string: `AH: ${tickerAfterChange.string}`,\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.futuresPage,\r\n ].includes(specificChartFunctionality)\r\n}\r\n\r\nexport function getShouldUseDarkerWickColors({\r\n specificChartFunctionality,\r\n totalBarWidth,\r\n}: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n timeFrame?: TIMEFRAME\r\n totalBarWidth: number\r\n}) {\r\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\r\n const isOffscreenChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\r\n const isQuoteChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\r\n\r\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\r\n}\r\n\r\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabled() {\r\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport function setIsDrawingEnabled(value: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function getIsSidebarEnabled(specificChartFunctionality?: SpecificChartFunctionality) {\r\n return specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n}\r\n\r\nexport const handleTypeChange = ({\r\n type,\r\n chartLayoutModel,\r\n}: {\r\n type: ChartElementType\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const elements = chartLayoutModel.getAllElements()\r\n elements.forEach((element) => {\r\n if (element.isChart() && element.instance.attrs.type !== type) {\r\n const pane = element.pane()\r\n const instance = chartsByType[type].fromObject(\r\n {\r\n ...element.instance.attrs,\r\n type,\r\n },\r\n pane\r\n )\r\n element.replace(instance)\r\n }\r\n })\r\n}\r\n\r\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n}) => {\r\n const { specificChartFunctionality, editable, editors } = args\r\n\r\n return (\r\n editable &&\r\n editors?.includes(ChartEditorEnum.tools) &&\r\n specificChartFunctionality &&\r\n [\r\n SpecificChartFunctionality.chartPage,\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(specificChartFunctionality)\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\r\n const isRgb = getIsRgb(strColor)\r\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\r\n\r\n if (allowAlpha) {\r\n return hexColor\r\n }\r\n return hexColor.slice(0, 7)\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\r\n// otherwise cursor is set if element exists\r\nexport const setElementCursor = ({\r\n elementId,\r\n cursor,\r\n conditionalCursor,\r\n}: {\r\n elementId: string\r\n cursor: string\r\n conditionalCursor?: string\r\n}) => {\r\n const element = document.getElementById(elementId)\r\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\r\n element.style.cursor = cursor\r\n }\r\n}\r\n","/*\r\n * We want to be able to render only bars/parts of line that are visible to users,\r\n * but without introducing visual artifacts like bars missing in front of users while scrolling\r\n * or lines that start in middle of chart for sparse intraday stock data.\r\n *\r\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\r\n * one bar outside of visible area to create a continuous line.\r\n */\r\nimport type Pane from '../models/pane'\r\nimport type Quote from '../models/quote'\r\nimport { getHalfBarWidth } from './chart'\r\n\r\ninterface IBarToRender {\r\n index: number\r\n isBarVisible: boolean\r\n}\r\n\r\nexport const drawInVisibleArea = ({\r\n drawBarCallback,\r\n fromIndexOffset = 0,\r\n fxOverride,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n toIndexOffset = 0,\r\n width,\r\n}: {\r\n drawBarCallback: (i: number, x: number) => void\r\n fromIndexOffset?: number\r\n fxOverride?: (index: number) => number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n toIndexOffset?: number\r\n width: number\r\n}) => {\r\n const fx = fxOverride ?? ((index: number) => paneModel.scale.x(quote.barIndex[index]))\r\n\r\n // We want to start rendering one bar outside of the visible area for two reasons:\r\n // 1. To create a seamless transition for bars entering/leaving the view, avoiding them from\r\n // abruptly dis/appearing when half the bar is outside.\r\n // 2. To prevent disconnected lines in case there's a bar gap.\r\n // However, if a `fromIndex` is provided and it's higher than the first visible bar,\r\n // we need to start rendering from that specific index. This ensures correct starting\r\n // points for elements like indicators that rely on this value.\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex({ quote, paneModel, leftOffset, fromIndexOffset })\r\n\r\n let lastBarToRender = -1\r\n for (let i = firstBarToRenderIndex; i < quote.close.length + toIndexOffset; i++) {\r\n const x = fx(i)\r\n if (x + leftOffset > width) {\r\n lastBarToRender = i\r\n break\r\n }\r\n drawBarCallback(i, x)\r\n }\r\n\r\n if (lastBarToRender > -1) {\r\n const x = fx(lastBarToRender)\r\n drawBarCallback(lastBarToRender, x)\r\n }\r\n}\r\n\r\n/**\r\n * Get first or last visible bar index.\r\n * IMPORTANT: If chartWidth provided return is lastVisibleBarIndex\r\n */\r\nexport function getVisibleBarToRenderIndex({\r\n chartWidth,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n chartWidth?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n const chartModel = paneModel.chart()\r\n\r\n // not all the time there is bar present on barIndex calculated via inverted leftOffset\r\n // there might be a gap between bars, if there is, barToDataIndex on that gap spot will have value of\r\n // previous bar which isn't visible\r\n\r\n const barIndex = Math.round(paneModel.scale.x.invert(-leftOffset + (chartWidth !== undefined ? chartWidth : 0)))\r\n const dataBarIndex = quote.barToDataIndex[Math.min(Math.max(barIndex, 0), quote.barToDataIndex.length - 1)]\r\n const halfBarWidth = getHalfBarWidth(chartModel, false)\r\n\r\n const isBarVisible = Math.round(paneModel.scale.x(quote.barIndex[dataBarIndex]) + halfBarWidth) + leftOffset > 0\r\n\r\n return {\r\n index:\r\n chartWidth === undefined\r\n ? isBarVisible\r\n ? dataBarIndex\r\n : Math.max(Math.min(dataBarIndex + 1, quote.barIndex.length - 1), 0)\r\n : dataBarIndex,\r\n isBarVisible,\r\n }\r\n}\r\n\r\n// Get first bar to render compensated for fromIndexOffset\r\nexport function getCompensatedFirstBarToRenderIndex({\r\n fromIndexOffset = 0,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n fromIndexOffset?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n return Math.max(0, getVisibleBarToRenderIndex({ quote, leftOffset, paneModel }).index - 1, fromIndexOffset)\r\n}\r\n\r\n/**\r\n * Checks if there are no visible bars between the specified first and last bars to render.\r\n * IMPORTANT: Provided indexes should be without bar gap compensation.\r\n *\r\n * @param {IBarToRender} firstBarToRenderIndex The index of the first bar to render.\r\n * @param {IBarToRender} lastBarToRenderIndex The index of the last bar to render.\r\n * @returns {boolean} True if there are no visible bars between the first and last bars, false otherwise.\r\n */\r\nexport function getAreNoBarsVisible(firstBarToRenderIndex: IBarToRender, lastBarToRenderIndex: IBarToRender): boolean {\r\n return !firstBarToRenderIndex.isBarVisible && !lastBarToRenderIndex.isBarVisible\r\n}\r\n","import queryString from 'query-string'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface FetchApiProps {\r\n location: string\r\n queryParameters?: ObjectHash\r\n method?: string\r\n body?: RequestInit['body']\r\n contentType?: ContentType\r\n abortController?: null | AbortController\r\n throwOnStatusCodes?: number[]\r\n throwOnPredicate?: (response: Response) => boolean\r\n keepalive?: boolean\r\n}\r\n\r\nexport const getFormDataFromObject = (object: ObjectHash) =>\r\n Object.keys(object).reduce((formData, key) => {\r\n formData.append(key, object[key])\r\n return formData\r\n }, new FormData())\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nconst fetchApi = async ({\r\n location,\r\n queryParameters,\r\n method,\r\n body,\r\n contentType,\r\n abortController,\r\n throwOnStatusCodes,\r\n throwOnPredicate,\r\n keepalive = false,\r\n}: FetchApiProps) => {\r\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\r\n const parameters: RequestInit = {\r\n method: method || 'GET',\r\n credentials: 'include',\r\n headers: contentType && {\r\n 'Content-Type': contentType,\r\n },\r\n signal: abortController?.signal,\r\n body: body,\r\n keepalive,\r\n }\r\n try {\r\n const response = await fetch(url, parameters)\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\r\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\r\n const StatusCodeError = getStatusCodeError(response.status)\r\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\r\n }\r\n return responseData as T\r\n } catch (err) {\r\n throw err\r\n }\r\n}\r\n\r\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\r\n switch (statusCode) {\r\n case 403:\r\n return ForbiddenError\r\n case 404:\r\n return NotFoundError\r\n case 410:\r\n return GoneError\r\n case 500:\r\n return InternalServerError\r\n default:\r\n return GenericStatusCodeError\r\n }\r\n}\r\n\r\nexport class GenericStatusCodeError extends Error {\r\n response: ObjectHash | string\r\n statusCode: number\r\n\r\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\r\n super(message)\r\n this.response = response\r\n this.statusCode = statusCode\r\n }\r\n}\r\nexport class ForbiddenError extends GenericStatusCodeError {}\r\nexport class NotFoundError extends GenericStatusCodeError {}\r\nexport class InternalServerError extends GenericStatusCodeError {}\r\nexport class GoneError extends GenericStatusCodeError {}\r\n\r\nexport default fetchApi\r\n","import React from 'react'\r\n\r\nexport function useForceUpdate() {\r\n const [forceUpdateKey, increment] = React.useState(0)\r\n const forceUpdate = React.useCallback(() => {\r\n increment((prev) => prev + 1)\r\n }, [])\r\n return { forceUpdate, forceUpdateKey }\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n","export type HLC = {\r\n ts: number\r\n count: number\r\n uuid: string\r\n}\r\n\r\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\r\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\r\n\r\nexport const parseHlc = (serialized: string) => {\r\n const [ts, count, uuid] = serialized.split(':')\r\n return {\r\n ts: Number.parseInt(ts),\r\n count: Number.parseInt(count, 36),\r\n uuid,\r\n }\r\n}\r\n\r\nexport const initHlc = (uuid: string, now: number): HLC => ({\r\n ts: now,\r\n count: 0,\r\n uuid,\r\n})\r\n\r\nexport const compareHlc = (one: HLC, two: HLC) => {\r\n if (one.ts === two.ts) {\r\n if (one.count === two.count) {\r\n if (one.uuid === two.uuid) {\r\n return 0\r\n }\r\n return one.uuid < two.uuid ? -1 : 1\r\n }\r\n return one.count - two.count\r\n }\r\n return one.ts - two.ts\r\n}\r\n\r\nexport const incrementHlc = (local: HLC, now: number): HLC => {\r\n if (now > local.ts) {\r\n return { ts: now, count: 0, uuid: local.uuid }\r\n }\r\n\r\n return { ...local, count: local.count + 1 }\r\n}\r\n\r\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\r\n if (compareHlc(local, remote) >= 0) {\r\n return local\r\n }\r\n return { ...local, ts: remote.ts, count: remote.count }\r\n}\r\n","import { useChartLayoutGlobalModelAsyncModule } from '../controllers/chart-settings/async-modules'\r\nimport { useAsyncModule } from './async-modules-utils'\r\n\r\nexport function useChartLayoutGlobalModelAsync() {\r\n const [useChartLayoutGlobalModelModule] = useAsyncModule({\r\n ...useChartLayoutGlobalModelAsyncModule,\r\n isSuspenseMode: true,\r\n })\r\n return useChartLayoutGlobalModelModule.useChartLayoutGlobalModel()\r\n}\r\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\r\n\r\nimport {\r\n CanvasElementType,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n LayoutType,\r\n OverlayType,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../app/constants/common'\r\nimport ChartModel from '../app/models/chart'\r\nimport ChartLayout from '../app/models/chart_layout'\r\nimport { IChartThemeColors } from '../app/models/constants'\r\n\r\ninterface ISentry {\r\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\r\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n Sentry: ISentry\r\n FinvizSettings: ObjectHash\r\n FinvizChartsSettings: ObjectHash\r\n globalChartConfig: RootChartConfigObject\r\n isRenderInProgress: boolean | number\r\n rendersInProgress: number[]\r\n FinvizQuoteTypeCurrent: string\r\n handleScriptNotLoaded: () => void\r\n renderScriptNotLoaded: () => void\r\n gtag?: any\r\n }\r\n\r\n interface Document {\r\n fullscreenElement: any\r\n webkitFullscreenElement?: () => void\r\n mozFullScreenElement?: () => void\r\n msFullscreenElement?: () => void\r\n\r\n webkitExitFullscreen?: () => void\r\n mozExitFullScreen?: () => void\r\n msExitFullscreen?: () => void\r\n }\r\n\r\n interface HTMLElement {\r\n webkitRequestFullScreen?: () => void\r\n mozRequestFullScreen?: () => void\r\n msRequestFullscreen?: () => void\r\n }\r\n\r\n interface Navigator {\r\n msMaxTouchPoints: any\r\n }\r\n\r\n interface Array {\r\n last(): T | undefined\r\n }\r\n\r\n interface String {\r\n padLeft(paddingValue: string): string\r\n startsWith(str: string): boolean\r\n }\r\n\r\n type CanvasCache = Partial>\r\n\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n // We need to omit `canvas` because it is read only\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n\r\n interface HTMLCanvasElement {\r\n _cache: CanvasCache\r\n }\r\n\r\n interface ImageBitmapRenderingContext {\r\n _cache: CanvasCache\r\n }\r\n\r\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\r\n}\r\n\r\ndeclare module 'skia-canvas' {\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n}\r\n\r\nexport type TodoObjectHashAnyType = Record\r\nexport type TodoAreaObject = Record\r\nexport type ObjectHash = Record\r\nexport type EmptyObject = Record\r\n\r\nexport type TodoAnyType = any\r\n\r\nexport type ThumbType = string\r\n\r\nexport type PaneArea = {\r\n mouseDown?: boolean\r\n x: number\r\n y: number\r\n scaled: {\r\n x: number\r\n y: number\r\n }\r\n width: number\r\n height: number\r\n cursorX: number\r\n cursorY: number\r\n isCursorInChartWidthBoundaries: boolean\r\n} & T\r\n\r\nexport type Maybe = T | null | undefined\r\n\r\nexport interface DrawingBorder {\r\n color: string\r\n width: number\r\n}\r\n\r\nexport interface TextAttrs {\r\n text?: string\r\n background: string\r\n border?: { width: number; color: string }\r\n lineWidth?: number\r\n font: {\r\n size: number\r\n family?: string\r\n style?: string\r\n weight?: string\r\n }\r\n fillStyle?: string\r\n strokeStyle?: string\r\n angle?: number\r\n lineHeight: number\r\n textAlign?: TextAlign\r\n textBaseline: TextBaseline\r\n padding: {\r\n top: number\r\n right: number\r\n bottom: number\r\n left: number\r\n }\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type RequireByKey = Omit & Required>\r\n\r\nexport interface ResizeByThumbFuncProps {\r\n type: ThumbType\r\n difX: number\r\n difY: number\r\n area: PaneArea\r\n}\r\n\r\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\r\n\r\nexport interface ChartConfigChartPaneElement {\r\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\r\n overlays?: OverlayConfigObject[]\r\n period?: string\r\n code?: string\r\n elementId?: string | null\r\n zIndex?: number\r\n}\r\n\r\nexport interface RendererChartBarProps {\r\n index: number\r\n chartSettingsColors: IChartThemeColors\r\n hasFillAndBorder?: boolean\r\n}\r\n\r\nexport interface ChartConfigChartPane {\r\n elements: ChartConfigChartPaneElement[]\r\n height: number\r\n chart?: ChartConfigObject | ChartModel\r\n}\r\n\r\nexport interface IIdea {\r\n id?: number\r\n date?: string\r\n note: string\r\n}\r\n\r\nexport interface ChartConfigObjectExtended {\r\n editable: boolean\r\n canChangeTicker: boolean\r\n scrollable: boolean\r\n cross: boolean\r\n ideas: boolean\r\n editors: ChartEditorEnum[]\r\n specificChartFunctionality: SpecificChartFunctionality\r\n theme: Theme\r\n layout: LayoutType\r\n uuid?: string\r\n idea?: IIdea\r\n}\r\n\r\nexport interface ChartConfigObject {\r\n width: number\r\n height: number\r\n panes: ChartConfigChartPane[]\r\n premarket: boolean\r\n aftermarket: boolean\r\n dateRange: string | null\r\n hasChartEvents?: boolean\r\n stretch?: boolean\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n chart_layout: ChartLayout\r\n zoomFactor: number\r\n leftOffset: number | null\r\n refreshData: boolean | number\r\n isHideDrawingsActive: boolean\r\n isScrolled?: boolean\r\n scale: ScaleType\r\n}\r\n\r\nexport type RootChartConfigObjectChart = Omit<\r\n ChartConfigObject,\r\n 'chart_layout' | 'leftOffset' | 'zoomFactor' | 'isHideDrawingsActive'\r\n>\r\nexport interface RootChartConfigObject extends Partial {\r\n charts: Array\r\n width: number\r\n height: number\r\n newCharts?: boolean\r\n useGrid?: boolean\r\n}\r\n\r\nexport interface OverlayConfigObject {\r\n color: string\r\n period: string\r\n type: OverlayType\r\n}\r\n\r\nexport enum Instrument {\r\n Stock = 'stock',\r\n Crypto = 'crypto',\r\n MarketSentiment = 'market_sentiment',\r\n Futures = 'futures',\r\n Forex = 'forex',\r\n Group = 'group',\r\n}\r\n\r\nexport enum Theme {\r\n light = 'light',\r\n dark = 'dark',\r\n}\r\n\r\nexport interface IModalConfig {\r\n title: string\r\n inputs: IModalConfigInput[]\r\n inputsErrorMessages: ObjectHash\r\n}\r\nexport interface IOptionType {\r\n value: string | number\r\n label: string\r\n}\r\nexport interface IModalConfigInput {\r\n type: React.HTMLInputTypeAttribute\r\n label: string\r\n name: string\r\n value: number | string\r\n required?: boolean\r\n min?: number\r\n color?: string\r\n step?: number\r\n items?: IOptionType[]\r\n}\r\n\r\n// Keep in sync with config/types/globals.d.ts\r\nexport enum Position {\r\n Above = 'above',\r\n Below = 'below',\r\n}\r\n\r\nexport enum DefaultSpineEvents {\r\n Change = 'change',\r\n Destroy = 'destroy',\r\n Refresh = 'refresh',\r\n Update = 'update',\r\n}\r\n\r\nexport enum CustomSpineEvents {\r\n IndicatorsChange = 'indicatorsChange',\r\n ManualChange = 'manualChange',\r\n}\r\n\r\nexport enum DrawingSpineOptionsEvent {\r\n Remove = 'remove',\r\n}\r\n\r\nexport interface DrawingSpineOptions {\r\n eventType: DrawingSpineOptionsEvent\r\n}\r\n\r\nexport type TodoButtonProps = ObjectHash\r\nexport type TodoButtonTheme = string\r\n"],"names":["module","exports","white","black","inherit","transparent","current","finviz","blue","gray","red","orange","amber","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","Array","prototype","last","this","length","String","padLeft","paddingValue","slice","startsWith","str","indexOf","_callbackCache","Spine","bind","ev","callback","that","cb","record","fkey","id","_len","arguments","rest","_key","push","newCb","origCb","model","unbind","item","findIndex","element","iterable","all","index","el","eql","defaults","enabled","collapsed","duration","timestamp","logErrors","withStackTrace","level","logger","console","filterChanges","attrs","props","Object","keys","constructor","name","errorTransformer","error","titleFormatter","title","time","took","parts","toFixed","join","colors","prevState","action","nextState","pad","num","maxLength","repeat","times","toString","printLogEntry","logEntry","options","startedTime","data","formattedTime","getHours","getMinutes","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","e","log","styles","trace","groupEnd","initialize","window","protoModelLoad","load","started","Date","now","cid","attributes","returnedValue","apply","badgeImages","getSvgImageCacheKey","concat","badgeType","theme","state","ChartEventElement","ElementModel","_defineProperty","initClass","paneModel","configure","belongsTo","getChartEventBadgeImage","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","src","encodeURIComponent","onload","onerror","captureException","Error","extra","fetchAndCacheChartEventBadges","trigger","getChartEventData","_this$instance$model$","instance","chart","quote","chartEvents","find","stockEvent","elementId","toObject","super","yIndex","toConfig","Indicator","chartModel","Overlay","Chart","Pane","Quote","ChartLayout","DrawingsInternalStore","Element","document","location","hostname","isIPad","Utils","IPAD_FULLSCREEN_CLASS","FullscreenButton","isFullscreen","setIsFullscreen","React","getFullscreenStatus","requestFullscreen","getRequestFullscreen","documentElement","exitFullscreen","getExitFullscreen","onClick","call","checkFullscreen","body","classList","add","remove","addEventListener","removeEventListener","_jsx","Button","leftContent","contentClass","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","useDropdownState","placement","orientation","Dropdown","label","l","_jsxs","className","layout","DropdownItem","appearance","Icon","DropdownSeparator","Paragraph","size","ChartSyncableParts","_ref4","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","StockDetailTimeframeBar","withSuspense","_chartModel$timeframe","_chartModel$dateRange","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","TimeframeBar","chartIndex","rounding","isRedesignEnabled","selectedTimeframe","timeframe","selectedDateRange","loadingTimeframe","onCustomDateRangeClick","show","onFavoriteTimeframeToggle","containerElement","isFavoritesEnabled","CustomDateRange","dialogState","dateRangeTimeframe","pushIndicators","panes","indicator","_options$COTs","cotKeys","COTs","code","elements","type","IndicatorType","Cot","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","period","parameters","getChartTypeByTaConfigStyle","style","candlestick","ChartElementType","CandleStick","heikinashi","HeikinAshi","hollowcandlestick","HollowCandleStick","line","LineChart","ohlc","OhlcChart","mergeChartAndTAConfig","chartConfig","taConfig","charts","scale","_chartScaleMap","linear","ScaleType","Linear","percentage","Percentage","logarithmic","Logarithmic","indicators","filter","position","Position","Above","overlays","overlay","_overlay$parameters","_overlay$color","color","Below","getPanes","_overlay$parameters2","_overlay$color2","SettingsTab","SidebarDirection","createAlertAsyncModule","saveToPortfolioAsyncModule","AdsProvider","getAdsProvider","FinvizSettings","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag2","_window2","pathname","query","freestarPageView","_window$freestar","replace","freestar","queue","trackPageview","portfolioWatchlistTableAsyncModule","assets","logo","logo_light","useTrackPageView","trackInitial","trackAutomatically","initialRender","handleTrackView","tracking","PortfolioQuery","PortfolioMapSizeKey","PortfolioView","PortfolioTableView","PortfolioTableViewLabels","Ticker","Trade","PortfolioSymbolType","PortfolioTransaction","ColumnId","RowKind","ActionKind","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","Arrow","x","y","renderContent","resize","_thumbs","Thumb","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","border","getChartLayoutSettings","ElementSettings","Colors","context","scaled","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","set","angle","Math","PI","moveTo","lineTo","stroke","lineAngle","atan2","h","abs","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","moveBy","difX","difY","isInArea","area","isDrawingElementLockedOrInvisible","math","distanceToSegment","CanvasElementType","arrow","modalConfig","inputs","Brush","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","points","getTimestampFomPositionX","places","Number","parseFloat","round","overridePlaces","domainDiff","numberOfLeadingZeros","floor","log10","roundToFixed","untranslatedContext","getContextWithCache","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","i","fx","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","lastX","lastY","moveByThumb","getIsCreator","onMouseUp","currentDomainMax","currentDomainMin","domain","roundY","_this$untranslatedCon","isPointInPath","updateScales","getPositionXFromTimestamp","getAutosaveOmittedProperties","getEdgeXYValues","edgeXYValues","_edgeXYValues$minX","_edgeXYValues$minY","_edgeXYValues$maxX","_edgeXYValues$maxY","minX","min","minY","maxX","max","maxY","brushV1","default","TailDirection","getTailHalfWidth","halfWidth","p1","p2","dist","distance","Callout","Text","getModalConfigBase","required","textWithoutBackground","text","font","family","weight","fillStyle","lineHeight","textAlign","textBaseline","padding","top","right","bottom","left","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","ctx","lastAttrs","JSON","stringify","merge","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","S","render","renderText","previousDescent","fillText","getCalloutProperties","_this$lines","textWidth","requiredTailHalfWidth","radius","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","twoSegmentLinesIntersection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","renderBackground","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","perpendicularPointToLine","pointOffsetX","pointOffsetY","tailP2","polygon","pointInPolygon","getIsInChartView","leftOffset","calloutV1","Curve","x3","y3","drawQuadraticCurve","curve","Bezier","quadraticFromPoints","cp1x","cp2x","cp1y","cp2y","project","d","thumbsAreInArea","_Bezier$quadraticFrom","Ellipse","invert","getCoordinates","centerLeftX","centerLeftY","centerRightX","centerRightY","boundingPointKeys","c","bottomCenterX","bottomCenterY","bezierCurveTo","bottomRightX","bottomRightY","topRightX","topRightY","topCenterX","topCenterY","topLeftX","topLeftY","bottomLeftX","bottomLeftY","rotationAngle","atan","sign","radiusX","radiusY","width_two_thirds","dx1","dy1","dx2","dy2","ellipse","RotatedRectangle","getRectCoordinates","coords","mx1","mx2","my1","my2","nk","dx","sqrt","dy","x4","y4","rotatedRectangle","SymbolElement","sx","getRotatedCoordinates","scaleX","sy","textHeight","scaleY","symbol","xScale","yScale","xOffset","yOffset","save","rotate","restore","cx","cy","halfHeight","drawingToolsByType","freeze","brush_v1","callout_v1","elliottWaves","ellipseV1","ellipse_v1","fibonacciRetracements","fibonacci","horizontalLine","measure","pitchforkV1","pitchfork_v1","rectangle","rotatedRectangleV1","rotatedRectangle_v1","scaledLine","scaledText","symbolElement","triangle","verticalLine","xabcd","fromObject","obj","getNumOfBarsBuffer","_","xPointKeys","positionTimestamps","positionX","onMouseDown","onMouseMove","_this$model$chartEven","_this$model2","_this$model$elements","_this$model3","getIsChartEvent","findByAttribute","__","setIsSelected","isSelected","setIsHovered","isHovered","getIsPaneSelection","_this$model$elements$","pane","selection","attrsSubset","customizer","objValue","srcValue","getIsDrawing","mergewith","cachePointPositionTimestamp","get","defineProperty","globalAlpha","thumb","isMouseDown","isEditInProgress","activeThumb","startEditing","mouseDown","pointPoitionsFromTimestamp","chart_layout","isLockDrawingsActive","getIsVisible","getModalConfig","config","input","toAutosaveConfig","omit","replaceMyself","_window$Sentry","captureMessage","oldElement","isCreator","newElement","getIsCreatorDialogOpen","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","visibility","isInRange","from","to","setVisibilityTo","setTo","MacroTimeframe","timeframesToSet","attrsToSet","SetVisibilityTo","currentAndAbove","currentAndBelow","currentOnly","assign","_this$getBoundingPoin","xPoints","yPoints","positionY","omitX","isMaxXInvalid","isNaN","isMinXInvalid","omitY","topBound","bottomBound","ElliottWaves","positionWavesTimestamps","waves","wave","offset","getOffsetFromLineWidth","p","TextBaseline","middle","TextAlign","center","EllipseV1","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPointLinesAngle","sharedPoint","rotatedPoinCoordinates","rotatedPointCoordinates","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","cursor","distanceToLine","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","newLeftPoint","leftRotatedCursorPoint","getRotatedPointCoordinates","newRightPoint","rightRotatedCursorPoint","FibonacciRetracements","parseCoefficients","coefficients","parsed","split","trim","getMaxCoefficientUnscaledY","getMinCoefficientUnscaledY","heightScaled","includes","_ref5","_ref6","_ref7","maxCoefficientY","minCoefficientY","allYValues","HorizontalLine","ScaledLine","updateDecimalPlaces","decimalPlaces","step","getInstrumentDecimalPlaces","lastClose","ChartSettings","getBarIndex","close","renderLabels","IndicatorSettings","isIndicator","allowDecimal","Line","strokeStyle","dashLength","setLineDash","Measure","volume","barIndex","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","x1Dif","x2Dif","startingX1","startingX2","fillRect","priceDif","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","getVolumeSumString","addToCoordinates","difs","newX1","newX2","paneArea","getEdgeIntersectionPoint","sides","rayOrigin","rayDirection","intersection","intersectionDistance","rayToLineIntersection","getRayToLineSegmentIntersection","getPitchforkCoordinates","rayDirectionControlPoint1","rayDirectionControlPoint2","trend1","trend2","chartVisibleAreaLeftX","chartVisibleAreaRightX","chartVisibleAreaBottomY","chartVisibleAreaTopLeftPoint","chartVisibleAreaTopRightPoint","chartVisibleAreaBottomLeftPoint","chartVisibleAreaBottomRightPoint","getChartVisibleAreaBoundaries","medianRay","trend1Ray1","trend2Ray1","trend1Ray2","trend2Ray2","medianRayDirectionPoint","getMiddlePointOnLineSegment","rayOriginToRayDirectionVector","rayDirectionControlPoint1ToPoint2Vector","normalizedRayDirectionControlPoint1ToPoint2Vector","normalizeVector","medianRayDirectionPointToRayDirectionControlPoint1Distance","trend1Ray","getTrendRayCoordinates","trend","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","addPoints","multiplyVectorByScalar","trendPoint2RayOriginPoint2","subtractPoints","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","Pitchfork","median","_trendLines$filter$","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","Polygon","isPolygon","_this$attrs$points$la","_this$attrs$points$la2","scaledPoints","xPoint","yPoint","targetY","stopY","centerY","stopBaseline","targetBaseline","targetColor","stopColor","targetDif","targetPerc","targetStr","stopDif","stopPerc","stopStr","middle1","result","roundDif","coordType","coordIndex","t","s","Rectangle","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","ScaledText","XXXS","XXS","rect","textBoxX","textBoxY","textBoxWidth","textBoxHeight","DEFAULTS","alphabetic","getMergedPropsWithDefaults","propKey","count","f","_obj$font","_this$context$measure","_this$context","MIN_SAFE_INTEGER","testArea","convertArea","rawHight","_border$width","borderWidth","ThumbSettings","borderColor","thumbWidth","getThumbWidth","Triangle","VerticalLine","XABCD","xx","xy","ax","ay","bx","by","start","toUpperCase","retLabel","len","ret","xab","bcd","result1","canvas","rendered","refresh","ratio","drawImage","cWidth","cHeight","sWidth","screen","sHeight","getScaleRatio","setSizeOnCanvasElement","canvasElement","OHLCType","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","isM","m","isL","getDateString","date","dateString","month","getMonth","year","getFullYear","day","getDate","TIMEFRAME","i1","i2","i3","i5","i10","i15","i30","h2","h4","MONTHS","w","getClosestDifferentMinMaxValueIndices","currentMinIndex","currentMaxIndex","low","hasPreviousIndex","hasNextIndex","minIndex","maxIndex","gray300","tailwindColors","BaseChart","overlaysByType","isLargeChart","isMobile","utils","overlayDefinition","convertColorToHEX","addOverlay","renderYAxis","renderCrossText","setupCache","renderOverlaysLabels","CustomSpineEvents","IndicatorsChange","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","unmountCanvas","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","getIsSmallIndexChart","ticker","general","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","Group","getTimeframeLabel","textSecondary","isOurSiteRequest","L","tickerWidth","SpecificChartFunctionality","offScreen","XS","M","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","open","afterHour","isFinite","afterClose","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","Crypto","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","getMinMax","placesAxis","stepPrice","scaleRange","updateAttribute","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","previousTick","positiveScaleY","getYLineText","val","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","direction","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","_ref8","currentText","getDrawDays","MarketSentiment","textRenderer","startBarIndex","getVisibleBarToRenderIndex","endBarIndex","chartWidth","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","buffer","renderXAxisLabels","_ref9","labels","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","getIsOverlapping","interval","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","barWidth","getBarWidthWithMargin","zoomFactor","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","_ref11","lastDay","lastHours","NaN","hours","_ref12","indexOffset","getBarsInDay","_ref13","lastMonth","_ref14","gridSecondary","isYearLabel","substring","_ref15","lastYear","isJanuary","shouldRenderVolume","getIsIndicatorPresent","Vol","getVolumeTicks","maxHeight","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","renderCross","isRendered","contentWidth","contentHeight","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","getCrossIndexForPane","setElementCursor","getHTMLElementId","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","n","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","prevClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","_ref16","change","tickerChange","tickerAfterChange","getTickerChange","isOffscreen","isGroupInstrument","finvizWatermarkOffset","changeText","percentString","string","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref17","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","flatMap","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref18","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","XXL","alignTop","renderOHLCToCanvas","_ref19","ohlcSet","isSingleLineWithChange","parseInt","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isStock","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","smallIndex","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","firstBarToRenderIndex","lastBarToRenderIndex","volumes","getAreNoBarsVisible","addMarginBottom","marginBottom","setOverlays","removeOverlay","splice","MAX_VALUE","MIN_VALUE","prevMin","closestMinMaxIndices","placesLastClose","priceAbs","hasOverlay","chartPage","getCandleLikeChartsRenderingColors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","light","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","isRedesignedPage","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","getIsSSr","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","first","redLine","greenLine","MarketSentimentSettings","sum","_data","lastIndex","_dataLastIndex","renderLineBullBear","array","oversold","overbought","isRedesign","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","months","MultiLineChart","ColorsSettings","quotes","getQuotes","tickers","end","asc","_this$data$getDataByB","maxTickerLength","isLastDate","tickersDimensions","closeValue","arrays","q","select","_this$data","isIdeaId","ideaID","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","hasData","percentageText","lastCrossIndex","_d3$max","fromDate","toDate","filteredQuotes","closes","daysCount","end1","asc1","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXXL","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","ChartEditorEnum","LayoutType","OverlayType","ChartEventDbType","ChartEventType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","columns","rows","gridAreas","DESC","TimeframeLabelShort","DateRangeType","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","QuotePageQueryChartTypes","minutes","days","weeks","MicroTimeframeRange","prev","curr","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","getContainerTypeFromPaneConfig","indicatorElement","getContainerType","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","isChart","updateInternalStoreWithChangedElement","changeType","currentInternalStore","lastUpdateTimestamp","getQuoteRawTicker","containerType","destroyed","instanceJson","newDrawing","zIndex","lastChange","elementAttrs","newInternalStore","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","getTickersAndContainerTypesInLayoutModel","containerTypes","getAllPanes","mergeUpdatedDrawingsToInternalStore","updatedDrawings","isRefetchAll","newLastUpdateTimestamp","updatedElementIds","drawing","receiveHlc","drawingIndex","currentDrawing","currentNote","getElementNoteText","autoSavedNote","incrementHlc","parse","compareHlc","getInitialStoreDrawings","_window$FinvizSetting","_window$FinvizSetting2","_window$FinvizChartsS","_initialDrawings$map","initialDrawings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","elementMethod","getAllElements","isDrawing","getNoteElementId","noteElement","_JSON$parse","getTickerNoteText","ts","lastChangeTimestamp","lastChangeCounter","uuid","lastChangeNodeUUID","getDBRecordFromAutosaveElement","utmCampaign","quotePage","futuresPage","forexPage","cryptoPage","PopoverInner","hidePopover","chartSettingsModule","chartSettingsAsyncModule","onClose","ScrollableChartSettingsPopover","isOpen","forceGlobalRerender","getIsConfigChanged","confirmationDialogState","usePopoverState","hide","checkChangesAndOpenDiscard","preventDefault","discardChangesAndHide","buttonPosition","_popoverContentElemen","popoverContentElement","getState","disclosureElement","getBoundingClientRect","scrollY","chartHeight","_chartElement$clientH","chartElement","getElementById","clientHeight","Popover","minHeight","classNames","PopoverRounding","regular","PopoverTheme","Delayed","Spinner","ConfirmationDialog","actions","as","DialogDismiss","ChartSettingsButton","settingsPopoverState","useState","buttonProps","PopoverTrigger","href","encodeQueryString","utm_source","utm_medium","utm_campaign","focusRing","getQuoteRequestKey","_chartModel$chart_lay","_chartLayoutModel$ide","_chartModel$quote","unwatchedChartModel","chartModelRef","modelRef","useModelRef","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getRawTicker","getChartOrIndicatorElement","getLeftOffset","isScrolled","getAllQuotes","chartQuote","fetchData","fetchType","QuoteFetchType","NewerData","chartPane","getChartPane","activeChartEvent","toggleIsOpen","getAllChartEvents","isChartEvent","isPreserveDrawingsActive","destroyCascade","setChartEvents","updateChartEventsZIndexes","fetchQuote","hasChartEvents","premarket","aftermarket","patterns","getHasPatterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","events","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","fetchedAt","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","every","shouldRecalculateOnCharts","barMargin","hasSameBarWidth","hasSameBarMargin","_chartLayoutModel$spe","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","numOfVisibleBars","getVisibleBarsNumber","getChartStartEndDates","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","Timeframe","syncChartParts","hasSyncedTicker","_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","QuoteNodeChartTypes","QuoteUrlChartTypes","QuoteShortToLongType","cs","candlesticksimple","o","ha","hc","QuoteLongToShortType","DEFAULT_TYPES","icon","FREE_TYPES_QUOTE","FREE_TYPES_QUOTE_VALUES","useChartLayoutGlobalModelAsyncModule","preventClosingUnsavedChangesAsyncModule","BackgroundInput","onChange","InputColorPicker","inputDataTestId","toLocaleLowerCase","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","currentTarget","handleColorChange","RangeSlider","rightContent","BorderInput","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","setFamily","setSize","setStyle","setWeight","setValue","valueSetter","Label","Select","items","selected","Input","LineInput","MultilineStringInput","Textarea","placeholder","target","autoFocus","NumberInput","pattern","StringInput","Trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","setFrom","macroKey","macroLabel","charAt","INPUTS_AVAILABLE","getInitialState","visibilities","macroTimeframe","valueMacroTimeframe","getIsVisibilityOutsideAvailableTimeframes","macrotimeframe","macroRange","_macroRange$from","_macroRange$to","Visibility","initialVisibilityRef","handleChange","handleDisableSubmit","TAB_BUTTON_COMMON_PROPS","getValuesFromFormState","formState","cur","DialogTabs","ElementStyleDialog","_config$title","initialFormStateRef","setFormState","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","handleValuesChange","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","checkValidity","handleCloseDialog","Dialog","isDraggable","modal","backdrop","onFullyClosed","onHide","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","InputComponent","getInputForType","inputType","stateInput","DialogFooter","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","Provider","openDialog","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","fetchDrawings","fetchApi","queryParameters","throwOnStatusCodes","saveDrawings","bodyJsonString","keepalive","hi","charCodeAt","lo","getByteLengthOfString","method","contentType","ContentType","ApplicationJson","latestChangeHlc","_window$Sentry2","InternalServerError","ForbiddenError","GoneError","newTicker","response","message","GenericStatusCodeError","invalidItems","deleteAllDrawings","lastLocalChange","newHlc","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","isInit","getIsPreserveDrawingsAndAutosaveAvailable","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","saveQueueExtraFilterCallback","saveQueue","latestLocalUpdateTimestamp","instanceUUID","setAutoSaveState","AutoSaveState","Unsaved","Saving","Saved","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","paneDrawing","parsedElementAttrs","hasOngoingInteraction","getCanvasElementByType","create","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","_chartLayout$activeCh","_chartLayout$activeCh2","activeChart","checkDrawingUpdate","latestRemoteUpdateTimestamp","initHlc","allElements","normalizeZIndexes","_chartLayout$activeCh3","_chartLayout$activeCh4","activeTicker","updateInternalStoreWithElement","updateResult","deleteAllAutoSavedElements","onElementChange","elementPane","elementContainerType","elementPaneTicker","eventType","DrawingSpineOptionsEvent","Remove","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","Off","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","checkDrawingUpdateInterval","setInterval","unregisterListeners","clearInterval","willDestroy","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","ta","ty","taInt","isQuotePage","defaultType","FinvizQuoteTypeCurrent","generateRouterPath","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","nativeSelect","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","ChangeLabel","changePoints","isTiny","classnames","DailyChangeDisplay","listenOnEvents","quoteModel","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","expires","setMonth","setCookie","finally","getLayoutType","tickersCount","_tickers$index","Search","onTickerSelected","dropdownState","saveToPortfolioDialogState","isSaveToPortfolioVisible","createAlertDialogState","isCreateAlertVisible","saveToPortfolioModule","isLoadingSaveToPortfolio","createAlertModule","isLoadingCreateAlert","SaveToPortfolio","CreateAlert","detailLink","formattedTicker","Futures","Forex","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","event_category","_window$gtag3","_window3","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","timeframeBarProps","canChangeTicker","hasTimeframe","editors","Heading","tools","editable","ideas","compactViewMaxBreakpointPx","grow","publish","ContextMenu","contextMenu","selector","forceUpdate","componentDidMount","update","componentWillUnmount","_document$querySelect2","_document$querySelect","shown","querySelector","onContextMenu","ContextMenuComponent","ready","ReactDOM","event","clientY","pageYOffset","clientX","ChartEventPopoverWithState","unwatchedChartLayout","popoverState","isPopoverMounted","chartEventsModule","isChartEventOfThisChart","setData","clickAwayRef","isListening","refCallback","handler","contains","useClickAway","_chartModel$getChartP","chartEvent","popoverShow","popoverHide","newData","getChartEvenBadgeType","PopoverAnchor","store","ZIndexContext","AriakitPortal","tabIndex","hideOnInteractOutside","focusable","autoFocusOnShow","ChartEventPopoverContent","delayComponent","LoadLatestDataButton","isMountedRef","hasNewDataAvailable","setHasNewDataAvailable","getRefreshInterval","isPossibleToFetchSequentialData","hasNewData","promises","refreshData","ZOOM_CONTROLS_ACTIVE_CLASS","ZOOM_CONTROLS_IS_IN_AREA_CLASS","buttonCommonProps","getDefaultLeftOffset","ZoomControls","zoomControlsRef","isVisible","onZoomIn","onZoomOut","onZoomReset","isGoToRecentVisible","setIsGoToRecentVisible","defaultZoomFactor","isZoomResetVisible","setIsZoomResetVisible","handleGoToMostRecent","handleChartModelChangeDebounced","hidden","_window$localStorage","_this","hasSeenCrossNotification","localStorage","getItem","isTouchCrossActive","scrollable","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","getArea","MouseModel","_event$targetTouches","activeChartInteraction","TouchEvent","targetTouches","lastClientX","dif","addToLeftOffset","lastClientY","_this$props$model$get","_this$props$model$get2","_this$props$model$get3","currentViewRange","touchEventsDisabled","onScalerMouseDown","onScalerMouseMove","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","scalerLastY","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","originalDiff","getMinMaxLeftOffset","newLeftOffset","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","elementModel","hasProperties","isElementDrawing","makeClone","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","hoveredElement","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","cross","crossRafId","requestAnimationFrame","process","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","getShouldRenderCrossInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","additionalData","Settings","getSettings","areaRectangle","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","cursorX","cursorY","isCursorInChartWidthBoundaries","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","Mouse","isChartsPage","setState","setItem","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","isTouch","onPaneMouseMove","getIsHammerAllowScrollActive","onCanvasInteractionMove","onCanvasInteractionEnd","onMouseMoveOnScrolling","Touch","isPrimaryClick","_model$selection","_element$getIsChartEv2","_element$instance$get3","_element$instance3","_element$instance$get4","_element$instance4","_model$getChartOrIndi3","_model$getChartOrIndi4","_model$getChartOrIndi5","_model$selection$getI","_model$selection2","CanvasElement","isElementHovered","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","ManualChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","_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","CHART_LAYOUT_CHILD_CHANGE_EVENT","_this$canvasWrapperRe2","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseLeave","onPaneMouseLeave","onTouchStart","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","withNotificationContext","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","panesWrapperElement","layoutModel","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","_pane$height","newPaneHeight","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","handleQuoteChange","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","getRawDistance","onPinchMove","onPinchEnd","currentLeftOffset","isIntraday","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","isMouseWheel","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","stretch","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","Refetch","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","isChartPage","getAllValidPanes","showSettings","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","total","optiMinHeight","minimalPaneHeight","basePane","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","PreserveDrawings","iconActive","titleActive","DrawingModeContinuous","HideDrawings","LockDrawings","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","Xabcd","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isActive","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","ToolbarDivider","ChartAutoSaveNote","onNoteChange","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isAnimating","isFullyClosed","hideOnEsc","onAction","onCancel","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","urlSearchParams","setUrlSearchParams","useSearchParams","toolbarMobileElement","setToolbarMobileElement","MOBILE_TOOLBAR_DIV_ID","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","_wrapperRef$current","openSelect","actionId","has","SIDEBAR_QUERY_PARAM","params","delete","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishModalModule","publishModalAsyncModule","PublishDialog","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","getChartElementTypeFromResponseType","TA","useChartRouteChange","isIdeasDialogOpen","dateFns","updateChartConfig","_ty","urlType","handleTypeChange","_decodedSearch$r$spli","urlTicker","urlTimeframe","urlDateRange","getInstrument","newChartConfig","getRawTickerForInstrument","updateAttributesAndSync","_chartLayoutModel$ide3","_chartLayoutModel$ide4","exitIdea","_window$FinvizSetting3","defaultPeriod","defaultDateRange","handleIdeaLeave","getUuid","ChartLayoutComponentBase","AbortController","preserveDrawings","toolsState","handlePreserveDrawingsSettings","setPreserveDrawings","preserveDrawingAbortController","abort","URLSearchParams","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","throttle","_this$state","_this$state2","test","getVisualViewportScale","visualViewport","noteDialogState","toggle","drawingToRemove","settingId","newObj","toggleHideDrawings","handleLockDrawings","_this$model$activeCha","updateLayout","modelProperties","isHideDrawingsActive","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","keyCode","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","newIsToolbarHorizontal","innerWidth","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","_chartLayout$gridArea","ChartGridCell","Sidebar","onShouldResize","horizontal","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","removeCharts","addCharts","_layout$gridAreas","rowStart","columnStart","rowEnd","columnEnd","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","withCompleteLayoutModelInit","updateChartsTitle","defaultDocumentTitleRef","percentageChange","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","withQuotePolling","isWithNotifications","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","parentElement","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","onRegisterChartLayoutModel","getDefaultZoomFactor","OnInitListener","setIsInit","checkIfInitIsComplete","elementIndex","_config$charts$chartI","opacity","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","dark","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","newElements","ChartLayoutModel","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","timeoutDurations","allCharts","timeoutDurationsMin","timeoutId","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","getIdeaUrl","searchObject","isStockOnQute","path","queryString","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","onDeleteIdeaClick","wasDeleted","fetch","status","newUrl","URL","searchParams","company","stopPropagation","IdeasTabs","hasError","setHasError","hasFetched","setHasFetched","categorizedIdeas","setCategorizedIdeas","queryTickers","dateParts","processed","tickerIdeas","categorizeIdeas","fetchIdeas","handleIdeaDeleted","modifiedCategories","categoryIndex","updatedCategory","updatedAll","Tabs","TabList","category","Tab","Badge","TabPanel","toLowerCase","IdeasDialog","hasPadding","dropdownButtonClassName","tooltipState","useTooltipState","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","hideTooltip","dropdownItemProps","TooltipTrigger","checkIfAnyQuoteIsLoading","fetchingQuotes","visible","closeOnClick","_layoutModel$idea","activeChartQuote","toJSON","chartId","layoutModelObjectPanes","tickersString","getChartTickers","quotesJsonString","quoteTickersTimeframes","getFormDataFromObject","ideaUrl","saveIdea","Tooltip","getIsMobileScreenSize","isDialogOpen","tour","useTour","pageTours","steps","overlayPadding","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","d1","d5","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","m1","m3","m6","ytd","y5","numOfBarsInView","getIntradayChartConfig","timeframeMinutes","barWidthWithMargin","hasPremarket","hasAftermarket","maxWidth","canCropChart","fullChartWidth","marketMinutesLength","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isIntradayDateRange","isOffScreen","isOffScreenWithNoDateRange","isOffScreenIntradayDateRange","isOffScreenWithFixedBars","isQuotePageWithNoDateRange","isQuotePageIntradayDateRange","isQuotePageWithFixedBars","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","rounded","fromEntries","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","shouldRenderCross","DEFAULT_WIDTHS","DEFAULT_CONTEXT","activeModule","isCloseVisible","onResize","selectModule","SidebarContext","useSidebarContext","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","withModuleAsyncLoad","mobile","SidebarTabs","showTimeout","vertical","isHideOnClick","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","defaultMobile","defaultDesktop","desktop","Resizable","enable","handleClasses","defaultSize","tabsClassName","sidebarModuleKey","setActiveModule","handleSelectModule","newUrlSearchParams","handleCloseSidebar","contextValue","ErrorBoundary","FallbackComponent","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","ChartEvent","getChartEventModel","chartEventModel","getXYPosition","_chartEventModel$yInd","_this$model$chart$quo","hover","isOpenOverride","isCurrentEventActive","scaledArea","Earnings","_this$getChartEventMo","eventItem","epsActual","epsEstimate","dateTimestamp","chartEventsByType","dividends","earnings","canvasElements","indicatorsByType","elementType","BigNumber","BIG_NUMBER_VALUES","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","k","j","oddNodes","l2","formatBigNumber","minNumber","absNum","getString","suffix","zeroes","splitString","addZeroes","padEnd","numberByZeroesCount","isInteger","yAxisCoeficient","xAxisCoeficient","radAngle","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","rayEnd","segmentStart","segmentEnd","lineIntersection","v","scalar","isSamePoint","ExponentialMovingAverage","multiplier","EMACalculation","MainCalculation","getDefaultCalculatedValues","ema","calculate","onValueCalculated","_calculatedValues","calculatedValues","Ema","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","_this$options","key1","key2","localeCompare","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Atr","Adx","Aro","Mfi","Perf","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","drawInVisibleAreaProps","fromIndexOffset","getCompensatedFirstBarToRenderIndex","clipHeight","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","areNoBarsVisible","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","AroonCalculation","aroonUp","aroonDown","oscillator","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","AroonOscillator","_this$aroonCalculatio","_this$aroonCalculatio2","_this$aroonCalculatio3","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","FICalculation","fi","ForceIndex","_this$fiCalculation$c2","_this$fiCalculation","_this$fiCalculation$c","fiCalculation","_this$fiCalculation$c3","_this$fiCalculation2","MACDCalculation","macd","signal","histogram","fastPeriod","slowPeriod","signalPeriod","emaFast","emaSlow","emaSignal","MACD","_this$macdCalculation","macdCalculation","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","OBV","_this$obv$last","obv","currentObv","Obv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","getAll","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RsiCalculation","rsi","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","Stofa","StochasticsSlow","Stosl","TrixCalculation","trix","ema1","ema2","ema3","_this$trixCalculation2","_this$trixCalculation3","_this$trixCalculation","trixCalculation","_this$trixCalculation4","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","isArray","spineEvents","hasMany","getChartElement","getChartType","_this$getChartElement","defaultRefreshInterval","Default","customRefreshInterval","Elite","isStockFastRefreshAvailable","EliteStocksReduced","Free","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","quotePerf","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","hasOwnProperty","chartParts","isInSync","chartPart","_hasOverlay","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","_this$instance2","isOverlay","_this$instance3","_this$instance4","_this$instance5","_this$instance6","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","move","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_this$mainElement","_this$mainElement2","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","emptyQuote","numberOfRefreshChecks","is404","patternsMinRange","patternsMaxRange","dataId","tickerRaw","shouldUseCache","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","isNotEmptyQuote","isCacheAllowed","hasPatterns","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","maxBars","tickersAndTimeframes","accumulator","fetchRequest","QuoteFetchTypeUrlOption","New","fetchingPromise","getUrl","getIsAbortError","NotFoundError","shouldUseEmptyQuote","_data$ticker","_data$patterns","_data$chartEvents","_this$numberOfRefresh","Newer","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","atts","_this$patterns","drawDays","getBarIndexes","barToDataIndex","_this$barIndex","_chartEvents$map","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","padStart","dataIndex","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","host","env","BE_API_URL","rev","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","tickerTimeframeChangeHeight","chartSettings","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","BbCalculation","stdDev","upperBand","lowerBand","deviations","stdDevSum","Bb","getFreeColor","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","bbCalculation","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","topColor","bottomColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","Dch","EMA","_this$attrs$color","EMA2","Ema2","HighLow","highColor","prevHigh","lowColor","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","Hilo","isPositiveFloat","Hline","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","toIndexOffset","fxOverride","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","Ic","IchimokuCloudFull","Icf","KeltnerChannel","emaPeriod","atrPeriod","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","Kch","Patterns","originalScale","barsInDay","aboveBelow","textHS","above","below","supportColor","resistColor","kind","_this$attrs$supportCo","_this$attrs$resistCol","Calculation","PivotPeriod","PivotPoints","calculationType","getPeriodType","week","getIsEnoughData","startIndex","endIndex","periodType","dayGap","startDay","beforeDay","_lastDate","_lastDate2","_lastDate3","calculatedX","fromX","toX","currentDate","previousTradingDay","previousNYMidnightTimestamp","currentMidnight","currentNYMidnightTimestamp","isNonStockFullDay","isStockFullDay","firstDayCurrentWeek","firstDayCurrentWeekTimestamp","firstDayPreviousWeek","firstDayPreviousWeekTimestamp","firstDayCurrentMonth","firstDayCurrentMonthTimestamp","firstDayPreviousMonth","firstDayPreviousMonthTimestamp","firstDayCurrentYear","firstDayCurrentYearTimestamp","firstDayPreviousYear","firstDayPreviousYearTimestamp","pivot","sup1","sup2","sup3","res1","res2","res3","previousHigh","previousLow","pivotPoint","currentX","toBars","nextDate","_this$data$drawMinute","_this$data$drawMinute2","_this$attrs$calculati","Pp","SAR","maxStep","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","Sar","SMACalculation","Sma","SMA","SMA2","Sma2","Supertrend","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","_this$attrs$uptrendCo","_this$attrs$downtrend","Str","VP_COLORS","applyOpacityToColor","VolumeProfile","upColor","downColor","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","Vp","VWapCalculation","vwap","cumulativePV","cumulativeVolume","second","datesAreOnSameDay","Vwap","VWAP","bb","dch","hilo","hline","ic","icf","kch","pp","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getQuoteDateTimestampOffsetInSeconds","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","controller","websiteShared","shouldUseCPUOnly","matchesAndroid","matchesWebOS","matchesiPad","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","isMobileDevice","isFirefoxDesktop","getContext","willReadFrequently","_cache","_restore","CanvasRenderingContext2D","getChartEventBadgeColors","outerStroke","innerStroke","innerFill","textFill","getFormattedEventDate","exdate","hasEarningsDateSuffix","parsedDate","formattedDate","formatDateToStringUS","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","twColors","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","halfBarWidthRaw","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","resolve","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","_ref23","hexStringToRGBA","hexColor","removeHashSymbol","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","dataBarIndex","isBarVisible","object","formData","append","FormData","statusCode","throwOnPredicate","url","credentials","headers","responseContentType","Html","responseData","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","getStatusCodeError","forceUpdateKey","increment","precision","periodString","part","parsedNumber","MAX_SAFE_INTEGER","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","two","local","remote","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel"],"sourceRoot":""}