{"version":3,"file":"255.08a1b231.js","mappings":"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","sources":["webpack://@finviz/website/../charts/app/lib/shims.ts","webpack://@finviz/website/../charts/app/logger.js","webpack://@finviz/website/../charts/app/models/chart-event-element.ts","webpack://@finviz/website/../charts/app/models/indicator.ts","webpack://@finviz/website/../charts/app/models/overlay.ts","webpack://@finviz/website/../charts/app/models/relationships.ts","webpack://@finviz/website/../charts/app/index.ts","webpack://@finviz/website/../charts/app/controllers/header/fullscreen_button.tsx","webpack://@finviz/website/../charts/app/controllers/header/layout_dropdown.tsx","webpack://@finviz/website/../charts/app/helpers/sorter.ts","webpack://@finviz/website/../charts/app/controllers/header/theme_toggle_button.tsx","webpack://@finviz/website/../charts/app/controllers/header/index.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/stock-detail-timeframe-bar.tsx","webpack://@finviz/website/../charts/app/utils/convert_ta.ts","webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/quote/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/components/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown.tsx","webpack://@finviz/website/./js/main/components/dropdown/dropdown-item.tsx","webpack://@finviz/website/./js/main/components/dropdown/hooks.ts","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/tabs/tab.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-list.tsx","webpack://@finviz/website/./js/main/components/tabs/tab-panel.tsx","webpack://@finviz/website/./js/main/components/tabs/tabs.tsx","webpack://@finviz/website/./js/main/components/badge.tsx","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/services/async-modules-utils.tsx","webpack://@finviz/website/./js/main/services/import-with-retry.ts","webpack://@finviz/website/../charts/app/canvas/ElementBaseConfig.ts","webpack://@finviz/website/../charts/app/canvas/arrow.ts","webpack://@finviz/website/../charts/app/canvas/brush/brush_v1.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_utils.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_v1.ts","webpack://@finviz/website/../charts/app/canvas/curve.ts","webpack://@finviz/website/../charts/app/canvas/ellipse.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle.ts","webpack://@finviz/website/../charts/app/canvas/symbol.ts","webpack://@finviz/website/../charts/app/canvas/drawingTools.ts","webpack://@finviz/website/../charts/app/canvas/element.ts","webpack://@finviz/website/../charts/app/canvas/elliott_waves/elliott_waves.ts","webpack://@finviz/website/../charts/app/canvas/ellipse/ellipse_v1.ts","webpack://@finviz/website/../charts/app/canvas/fibonacci_retracements.ts","webpack://@finviz/website/../charts/app/canvas/horizontal_line.ts","webpack://@finviz/website/../charts/app/canvas/line.ts","webpack://@finviz/website/../charts/app/canvas/measure.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_utils.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_v1.ts","webpack://@finviz/website/../charts/app/canvas/polygon.ts","webpack://@finviz/website/../charts/app/canvas/position.ts","webpack://@finviz/website/../charts/app/canvas/rectangle.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://@finviz/website/../charts/app/canvas/scaled_line.ts","webpack://@finviz/website/../charts/app/canvas/scaled_text.ts","webpack://@finviz/website/../charts/app/canvas/text.ts","webpack://@finviz/website/../charts/app/canvas/thumb.ts","webpack://@finviz/website/../charts/app/canvas/triangle.ts","webpack://@finviz/website/../charts/app/canvas/vertical_line.ts","webpack://@finviz/website/../charts/app/canvas/xabcd.ts","webpack://@finviz/website/../charts/app/canvas/cache.js","webpack://@finviz/website/../charts/app/models/chart_settings/interfaces.ts","webpack://@finviz/website/../charts/app/charts/utils.ts","webpack://@finviz/website/../charts/app/charts/base_chart.ts","webpack://@finviz/website/../charts/app/charts/candle_stick.ts","webpack://@finviz/website/../charts/app/charts/candle_stick_hollow.ts","webpack://@finviz/website/../charts/app/charts/heikin_ashi.ts","webpack://@finviz/website/../charts/app/charts/line_chart.ts","webpack://@finviz/website/../charts/app/charts/market_sentiment.ts","webpack://@finviz/website/../charts/app/charts/multi_line_chart.ts","webpack://@finviz/website/../charts/app/charts/ohlc_chart.ts","webpack://@finviz/website/../charts/app/charts/perf_chart.ts","webpack://@finviz/website/../charts/app/charts/charts.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/controllers/autosave/utils.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/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/toolbar-mobile.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/idea-leave-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-route-change.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout_component.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://@finviz/website/../charts/app/controllers/with_dialog_state_hook.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-page-title.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-idea-model-state.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-polling.tsx","webpack://@finviz/website/../charts/app/modals/ideas/utils.ts","webpack://@finviz/website/../charts/app/modals/ideas/IdeaItem.tsx","webpack://@finviz/website/../charts/app/modals/ideas/IdeasTabs.tsx","webpack://@finviz/website/../charts/app/modals/ideas/Ideas.tsx","webpack://@finviz/website/../charts/app/controllers/header/ideas_dropdown.tsx","webpack://@finviz/website/../charts/app/controllers/header/publish.tsx","webpack://@finviz/website/../charts/app/controllers/header/tour_button.tsx","webpack://@finviz/website/../charts/app/utils/chart-date-range-utils.ts","webpack://@finviz/website/../charts/app/controllers/renderUtils.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/constants.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/module-load-failed.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-tabs.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-content.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/interfaces.ts","webpack://@finviz/website/../charts/app/controllers/utils.ts","webpack://@finviz/website/../charts/app/helpers/atr.ts","webpack://@finviz/website/../charts/app/chart-events/chart-event.ts","webpack://@finviz/website/../charts/app/chart-events/dividends.ts","webpack://@finviz/website/../charts/app/chart-events/earnings.ts","webpack://@finviz/website/../charts/app/chart-events/split.ts","webpack://@finviz/website/../charts/app/chart-events/index.ts","webpack://@finviz/website/../charts/app/helpers/get-canvas-element-by-type.ts","webpack://@finviz/website/../charts/app/helpers/math.ts","webpack://@finviz/website/../charts/app/indicator-calculation/ema.ts","webpack://@finviz/website/../charts/app/indicator-calculation/main.ts","webpack://@finviz/website/../charts/app/indicators/configs/indicatorBaseConfig.ts","webpack://@finviz/website/../charts/app/indicators/configs/shrtfl.ts","webpack://@finviz/website/../charts/app/indicators/configs/shrtra.ts","webpack://@finviz/website/../charts/app/indicators/configs/adx.ts","webpack://@finviz/website/../charts/app/indicators/indicator.ts","webpack://@finviz/website/../charts/app/utils/canvas-render.ts","webpack://@finviz/website/../charts/app/indicators/adx.ts","webpack://@finviz/website/../charts/app/indicators/configs/aro.ts","webpack://@finviz/website/../charts/app/indicator-calculation/aroon.ts","webpack://@finviz/website/../charts/app/indicators/aro.ts","webpack://@finviz/website/../charts/app/indicators/configs/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/configs/atr.ts","webpack://@finviz/website/../charts/app/indicators/atr.ts","webpack://@finviz/website/../charts/app/indicators/configs/cci.ts","webpack://@finviz/website/../charts/app/indicators/cci.ts","webpack://@finviz/website/../charts/app/indicators/configs/cot.ts","webpack://@finviz/website/../charts/app/indicators/cot.ts","webpack://@finviz/website/../charts/app/indicators/configs/fi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/fi.ts","webpack://@finviz/website/../charts/app/indicators/fi.ts","webpack://@finviz/website/../charts/app/indicators/configs/macd.ts","webpack://@finviz/website/../charts/app/indicator-calculation/macd.ts","webpack://@finviz/website/../charts/app/indicators/macd.ts","webpack://@finviz/website/../charts/app/indicators/configs/mfi.ts","webpack://@finviz/website/../charts/app/indicators/mfi.ts","webpack://@finviz/website/../charts/app/indicators/configs/none.ts","webpack://@finviz/website/../charts/app/indicators/none.ts","webpack://@finviz/website/../charts/app/indicators/configs/obv.ts","webpack://@finviz/website/../charts/app/indicators/obv.ts","webpack://@finviz/website/../charts/app/indicators/configs/perf.ts","webpack://@finviz/website/../charts/app/indicators/perf.ts","webpack://@finviz/website/../charts/app/indicators/configs/rmi.ts","webpack://@finviz/website/../charts/app/indicators/rmi.ts","webpack://@finviz/website/../charts/app/indicators/configs/roc.ts","webpack://@finviz/website/../charts/app/indicators/roc.ts","webpack://@finviz/website/../charts/app/indicators/configs/rsi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rsi.ts","webpack://@finviz/website/../charts/app/indicators/configs/rvol.ts","webpack://@finviz/website/../charts/app/indicators/rvol.ts","webpack://@finviz/website/../charts/app/indicators/configs/rwi.ts","webpack://@finviz/website/../charts/app/indicators/rwi.ts","webpack://@finviz/website/../charts/app/indicators/financialIndicator.ts","webpack://@finviz/website/../charts/app/indicators/shrtfl.ts","webpack://@finviz/website/../charts/app/indicators/shrtra.ts","webpack://@finviz/website/../charts/app/indicators/configs/stofa.ts","webpack://@finviz/website/../charts/app/indicators/configs/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofa.ts","webpack://@finviz/website/../charts/app/indicators/configs/stosl.ts","webpack://@finviz/website/../charts/app/indicators/stosl.ts","webpack://@finviz/website/../charts/app/indicators/configs/trix.ts","webpack://@finviz/website/../charts/app/indicator-calculation/trix.ts","webpack://@finviz/website/../charts/app/indicators/trix.ts","webpack://@finviz/website/../charts/app/indicators/configs/ult.ts","webpack://@finviz/website/../charts/app/indicators/ult.ts","webpack://@finviz/website/../charts/app/indicators/configs/vol.ts","webpack://@finviz/website/../charts/app/indicators/vol.ts","webpack://@finviz/website/../charts/app/indicators/configs/wr.ts","webpack://@finviz/website/../charts/app/indicators/wr.ts","webpack://@finviz/website/../charts/app/indicators/indicators.ts","webpack://@finviz/website/../charts/app/modals/publish/async-modules.ts","webpack://@finviz/website/../charts/app/model-hooks/use-model-state.ts","webpack://@finviz/website/../charts/app/models/chart.ts","webpack://@finviz/website/../charts/app/models/chart/contstants.ts","webpack://@finviz/website/../charts/app/models/chart_layout.ts","webpack://@finviz/website/../charts/app/models/chart_settings/index.ts","webpack://@finviz/website/../charts/app/models/constants.ts","webpack://@finviz/website/../charts/app/models/drawings-internal-store.ts","webpack://@finviz/website/../charts/app/models/element.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse-utils.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse.ts","webpack://@finviz/website/../charts/app/models/pane.ts","webpack://@finviz/website/../charts/app/models/quoteCache.ts","webpack://@finviz/website/../charts/app/models/quote.ts","webpack://@finviz/website/../charts/app/models/quote/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/interactive_chart_settings.ts","webpack://@finviz/website/../charts/app/models/settings.ts","webpack://@finviz/website/../charts/app/models/utils.ts","webpack://@finviz/website/../charts/app/overlays/configs/ema.ts","webpack://@finviz/website/../charts/app/overlays/configs/overlayBaseConfig.ts","webpack://@finviz/website/../charts/app/overlays/configs/bb.ts","webpack://@finviz/website/../charts/app/indicator-calculation/bb.ts","webpack://@finviz/website/../charts/app/overlays/overlay.ts","webpack://@finviz/website/../charts/app/overlays/bb.ts","webpack://@finviz/website/../charts/app/overlays/configs/dch.ts","webpack://@finviz/website/../charts/app/overlays/dch.ts","webpack://@finviz/website/../charts/app/overlays/ema.ts","webpack://@finviz/website/../charts/app/overlays/configs/ema2.ts","webpack://@finviz/website/../charts/app/overlays/ema2.ts","webpack://@finviz/website/../charts/app/overlays/configs/hilo.ts","webpack://@finviz/website/../charts/app/overlays/hilo.ts","webpack://@finviz/website/../charts/app/overlays/configs/hline.ts","webpack://@finviz/website/../charts/app/overlays/hline.ts","webpack://@finviz/website/../charts/app/overlays/configs/ic.ts","webpack://@finviz/website/../charts/app/overlays/ic.ts","webpack://@finviz/website/../charts/app/overlays/configs/icf.ts","webpack://@finviz/website/../charts/app/overlays/icf.ts","webpack://@finviz/website/../charts/app/overlays/configs/kch.ts","webpack://@finviz/website/../charts/app/overlays/kch.ts","webpack://@finviz/website/../charts/app/overlays/configs/none.ts","webpack://@finviz/website/../charts/app/overlays/none.ts","webpack://@finviz/website/../charts/app/overlays/configs/patterns.ts","webpack://@finviz/website/../charts/app/overlays/patterns.ts","webpack://@finviz/website/../charts/app/overlays/configs/pp.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/configs/sar.ts","webpack://@finviz/website/../charts/app/overlays/sar.ts","webpack://@finviz/website/../charts/app/overlays/configs/sma.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma.ts","webpack://@finviz/website/../charts/app/overlays/configs/sma2.ts","webpack://@finviz/website/../charts/app/overlays/sma2.ts","webpack://@finviz/website/../charts/app/overlays/configs/str.ts","webpack://@finviz/website/../charts/app/overlays/str.ts","webpack://@finviz/website/../charts/app/overlays/configs/vp.ts","webpack://@finviz/website/../charts/app/overlays/vp.ts","webpack://@finviz/website/../charts/app/overlays/configs/vwap.ts","webpack://@finviz/website/../charts/app/indicator-calculation/vwap.ts","webpack://@finviz/website/../charts/app/overlays/vwap.ts","webpack://@finviz/website/../charts/app/overlays/overlays.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/abort_controller.ts","webpack://@finviz/website/../charts/app/utils/async-modules-utils.ts","webpack://@finviz/website/../charts/app/utils/canvas.ts","webpack://@finviz/website/../charts/app/utils/chart-events-utils.ts","webpack://@finviz/website/../charts/app/utils/chart-grid-render-utils.ts","webpack://@finviz/website/../charts/app/utils/chart.ts","webpack://@finviz/website/../charts/app/utils/colors.ts","webpack://@finviz/website/../charts/app/utils/cursor.ts","webpack://@finviz/website/../charts/app/utils/draw_in_visible_area.ts","webpack://@finviz/website/../charts/app/utils/fetch_api.ts","webpack://@finviz/website/../charts/app/utils/force-update.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../charts/app/utils/hlc.ts","webpack://@finviz/website/../charts/app/utils/useChartLayoutGlobalModelAsync.ts","webpack://@finviz/website/../charts/types/shared.ts"],"sourcesContent":["import Spine from '@finviz/spine'\r\n\r\n// eslint-disable-next-line no-extend-native\r\nArray.prototype.last = function () {\r\n return this[this.length - 1]\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.padLeft = function (paddingValue) {\r\n return String(paddingValue + this).slice(-paddingValue.length)\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.startsWith = function (str) {\r\n return this.indexOf(str) === 0\r\n}\r\n\r\ninterface CallbackCacheItem {\r\n newCb: (...args: any[]) => any\r\n origCb: (...args: any[]) => any\r\n}\r\n\r\nconst _callbackCache: CallbackCacheItem[] = []\r\nSpine.Collection.prototype.bind = function (ev, callback) {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this\r\n const cb = (record: Spine.Model, ...rest: any[]) => {\r\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\r\n return callback(record, ...rest)\r\n }\r\n }\r\n _callbackCache.push({ newCb: cb, origCb: callback })\r\n this.model.bind(ev, cb)\r\n return this\r\n}\r\n\r\nSpine.Collection.prototype.unbind = function (ev, callback) {\r\n let cb\r\n for (const item of _callbackCache) {\r\n if (item.origCb === callback) {\r\n cb = item.newCb\r\n break\r\n }\r\n }\r\n return this.model.unbind(ev, cb)\r\n}\r\n\r\nSpine.Model.findIndex = function (element) {\r\n const iterable = this.all()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const el = iterable[index]\r\n if (element.eql(el)) {\r\n return index\r\n }\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nexport const defaults = {\r\n enabled: false,\r\n collapsed: true,\r\n duration: false,\r\n timestamp: true,\r\n logErrors: true,\r\n withStackTrace: false,\r\n level: 'log',\r\n logger: console,\r\n filterChanges: (model, attrs) => {\r\n const props = Object.keys(attrs)\r\n return (\r\n model.constructor.name === 'Mouse' ||\r\n model.constructor.name === 'Quote' ||\r\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\r\n )\r\n },\r\n errorTransformer: (error) => error,\r\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\r\n const parts = ['model']\r\n parts.push(`%c${String(title)}`)\r\n if (timestamp) {\r\n parts.push(`%c@ ${time}`)\r\n }\r\n if (duration) {\r\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\r\n }\r\n return parts.join(' ')\r\n },\r\n colors: {\r\n title: () => 'inherit',\r\n prevState: () => '#9E9E9E',\r\n action: () => '#03A9F4',\r\n nextState: () => '#4CAF50',\r\n error: () => '#F20404',\r\n },\r\n}\r\n\r\nconst repeat = (str, times) => new Array(times + 1).join(str)\r\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\r\nconst formatTime = (time) =>\r\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\r\n\r\nexport const printLogEntry = (logEntry, options = {}) => {\r\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\r\n ...defaults,\r\n ...options,\r\n }\r\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\r\n\r\n const formattedTime = formatTime(startedTime)\r\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\r\n const headerCSS = ['color: gray; font-weight: lighter;']\r\n headerCSS.push(titleCSS)\r\n if (timestamp) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n if (duration) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\r\n\r\n try {\r\n if (collapsed) {\r\n if (colors.title) {\r\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.groupCollapsed(formattedTitle)\r\n }\r\n } else if (colors.title) {\r\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.group(formattedTitle)\r\n }\r\n } catch {\r\n logger.log(formattedTitle)\r\n }\r\n\r\n if (colors.prevState) {\r\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\r\n logger[level]('%c prev state', styles, prevState)\r\n } else {\r\n logger[level]('prev state', prevState)\r\n }\r\n\r\n if (colors.action) {\r\n const styles = `color: ${colors.action(data)}; font-weight: bold`\r\n logger[level]('%c arguments ', styles, data)\r\n } else {\r\n logger[level]('arguments ', data)\r\n }\r\n\r\n if (error && logErrors) {\r\n if (colors.error) {\r\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\r\n logger['error']('%c error ', styles, error)\r\n } else {\r\n logger['error']('error ', error)\r\n }\r\n }\r\n\r\n if (colors.nextState) {\r\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\r\n logger[level]('%c next state', styles, nextState)\r\n } else {\r\n logger[level]('next state', nextState)\r\n }\r\n\r\n if (withStackTrace) {\r\n logger.groupCollapsed('TRACE')\r\n logger.trace()\r\n logger.groupEnd()\r\n }\r\n\r\n try {\r\n logger.groupEnd()\r\n } catch {\r\n logger.log('—— log end ——')\r\n }\r\n}\r\n\r\nexport const initialize = () => {\r\n window['logger'] = defaults\r\n\r\n const protoModelLoad = Spine.Model.prototype.load\r\n Spine.Model.prototype.load = function (attrs) {\r\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\r\n const started = Date.now()\r\n const logEntry = {\r\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\r\n started: started,\r\n startedTime: new Date(started),\r\n prevState: this.attributes(),\r\n data: attrs,\r\n }\r\n\r\n let returnedValue\r\n try {\r\n returnedValue = protoModelLoad.apply(this, arguments)\r\n } catch (e) {\r\n logEntry.error = e\r\n }\r\n\r\n logEntry.nextState = this.attributes()\r\n logEntry.took = Date.now() - logEntry.started\r\n\r\n printLogEntry(logEntry)\r\n return returnedValue\r\n } else {\r\n return protoModelLoad.apply(this, arguments)\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { Theme } from '../../types/shared'\r\nimport ChartEvent from '../chart-events/chart-event'\r\nimport { ChartEventBadgeType } from '../constants/common'\r\nimport { chartEventsAsyncModule } from '../controllers/chart-events/async-modules'\r\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils/chart-events-utils'\r\nimport { captureException } from '../utils/helpers'\r\nimport { CHART_EVENT_BADGE_SIZE } from './constants'\r\nimport ElementModel from './element'\r\nimport Pane from './pane'\r\n\r\nlet badgeImages: ObjectHash<{ image: HTMLImageElement; isLoaded?: boolean }, string> | null = null\r\n\r\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\r\n\r\nfunction getSvgImageCacheKey(props: Pick) {\r\n return `${props.badgeType}-${props.theme}-${props.state}`\r\n}\r\n\r\nasync function fetchAndCacheChartEventBadges({ onBadgeInitLoad }: { onBadgeInitLoad: () => void }) {\r\n // Currently node charts don't render badges and if the code below is executed on server it will crash because of missing file which is not transpiled\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n if (badgeImages === null) {\r\n badgeImages = {}\r\n } else {\r\n // Early return if cache was already initialized\r\n return\r\n }\r\n\r\n // Temp workaround to prevent node charts from crashing\r\n const { importWithRetry } = await import('@finviz/website')\r\n const { chartBadgeSvgByType } = await importWithRetry(chartEventsAsyncModule.importFn)\r\n\r\n const handleImageResolve = () => {\r\n const hasSomeUnresolvedImages = Object.values(badgeImages!).some(({ isLoaded }) => isLoaded === undefined)\r\n if (!hasSomeUnresolvedImages) {\r\n onBadgeInitLoad()\r\n }\r\n }\r\n\r\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\r\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\r\n Object.values(Theme).forEach((theme) => {\r\n const cacheKey = getSvgImageCacheKey({\r\n badgeType,\r\n state: badgeState,\r\n theme,\r\n })\r\n const svgHTML = chartBadgeSvgByType[badgeType]({\r\n state: badgeState,\r\n theme,\r\n width: CHART_EVENT_BADGE_SIZE,\r\n })\r\n const img = new Image()\r\n img.onload = () => {\r\n badgeImages![cacheKey].isLoaded = true\r\n handleImageResolve()\r\n }\r\n img.onerror = () => {\r\n badgeImages![cacheKey].isLoaded = false\r\n handleImageResolve()\r\n captureException(new Error(`Image with cache key ${cacheKey} is invalid`), { extra: { src: img.src } })\r\n }\r\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\r\n badgeImages![cacheKey] = {\r\n image: img,\r\n }\r\n })\r\n })\r\n })\r\n}\r\n\r\nclass ChartEventElement extends ElementModel {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: ChartEvent\r\n yIndex = 0\r\n\r\n getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\r\n const cacheKey = getSvgImageCacheKey(props)\r\n const badgeImage = badgeImages?.[cacheKey]\r\n if (badgeImage) {\r\n // Possible fix for https://finvizcom.sentry.io/issues/4737062163\r\n if (badgeImage.isLoaded && badgeImage.image.width > 0 && badgeImage.image.height > 0) {\r\n return badgeImage.image\r\n }\r\n return undefined\r\n }\r\n\r\n void fetchAndCacheChartEventBadges({\r\n onBadgeInitLoad: () => this.trigger('change', this),\r\n })\r\n }\r\n\r\n getChartEventData() {\r\n return this.instance.model\r\n .chart()\r\n .quote()\r\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...super.toObject(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...super.toConfig(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n}\r\n\r\nexport default ChartEventElement\r\n","import Spine from '@finviz/spine'\r\n\r\nimport Chart from './chart'\r\n\r\nclass Indicator extends Spine.Model {\r\n static initClass(chartModel: typeof Chart) {\r\n this.configure('Indicator', 'instance')\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare chart: () => Chart\r\n\r\n // instance - todo - not sure what instance type to put here\r\n}\r\n\r\nexport default Indicator\r\n","import Spine from '@finviz/spine'\r\n\r\nimport Chart from './chart'\r\n\r\nclass Overlay extends Spine.Model {\r\n static initClass(chartModel: typeof Chart) {\r\n this.configure('Overlay', 'overlay')\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare overlay: any\r\n declare chart: () => Chart\r\n}\r\n\r\nexport default Overlay\r\n","/**\r\n * This file sets up the relationships between models and solves circular dependencies\r\n * This file needs to be imported in the index file so that the relationships are\r\n * called in time for instantiation.\r\n */\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport ChartLayout from './chart_layout'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Element from './element'\r\nimport Indicator from './indicator'\r\nimport Overlay from './overlay'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\n\r\nChart.initClass(Pane, Quote, ChartLayout)\r\nChartLayout.initClass(Chart, DrawingsInternalStore)\r\nDrawingsInternalStore.initClass()\r\nElement.initClass(Pane)\r\nChartEventElement.initClass(Pane)\r\nIndicator.initClass(Chart)\r\nOverlay.initClass(Chart)\r\nPane.initClass(Element, ChartEventElement, Chart)\r\n","import './lib/shims'\r\nimport { initialize } from './logger'\r\nimport './models/relationships'\r\n\r\nif (document.location.hostname === 'localhost') {\r\n initialize()\r\n}\r\n","import { Button } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport Utils, { getExitFullscreen, getFullscreenStatus, getRequestFullscreen } from '../../utils'\r\n\r\nconst isIPad = Utils.isIPad()\r\nconst IPAD_FULLSCREEN_CLASS = 'is-ipad-fullscreen'\r\n\r\nexport function FullscreenButton() {\r\n const [isFullscreen, setIsFullscreen] = React.useState(getFullscreenStatus())\r\n const requestFullscreen = getRequestFullscreen(document.documentElement)\r\n const exitFullscreen = getExitFullscreen()\r\n\r\n const onClick = React.useRef(() => {\r\n if (getFullscreenStatus()) {\r\n exitFullscreen.call(document)\r\n } else {\r\n requestFullscreen.call(document.documentElement)\r\n }\r\n })\r\n\r\n React.useEffect(() => {\r\n const checkFullscreen = () => {\r\n if (isIPad) {\r\n if (getFullscreenStatus()) {\r\n document.body.classList.add(IPAD_FULLSCREEN_CLASS)\r\n } else {\r\n document.body.classList.remove(IPAD_FULLSCREEN_CLASS)\r\n }\r\n }\r\n setIsFullscreen(getFullscreenStatus())\r\n }\r\n\r\n document.addEventListener('webkitfullscreenchange', checkFullscreen)\r\n document.addEventListener('fullscreenchange', checkFullscreen)\r\n return () => {\r\n document.removeEventListener('webkitfullscreenchange', checkFullscreen)\r\n document.removeEventListener('fullscreenchange', checkFullscreen)\r\n }\r\n }, [])\r\n\r\n if (!requestFullscreen) return null\r\n\r\n return (\r\n \r\n {isFullscreen ? 'Exit Full screen' : 'Full screen'}\r\n \r\n )\r\n}\r\n","import { Button, Dropdown, DropdownItem, Icon, IconNameType, MenuGroup, Paragraph } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { LAYOUTS } from '../../constants/common'\r\nimport { sortObjects } from '../../helpers/sorter'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncableParts } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString } from '../../utils/query_string'\r\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\r\n\r\nconst SORTED_LAYOUT_KEYS = sortObjects(\r\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\r\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\r\n).map(({ key }) => key)\r\n\r\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const parsedQuery = decodeQueryString(location.search)\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\r\n\r\n return (\r\n \r\n Layout\r\n \r\n }\r\n >\r\n
\r\n
\r\n {SORTED_LAYOUT_KEYS.map((layout) => (\r\n {\r\n navigate(getChartsToPath({ layout }))\r\n }}\r\n >\r\n \r\n \r\n ))}\r\n
\r\n \r\n
\r\n
\r\n Sync:\r\n
\r\n {ChartSyncableParts.map(({ value, label }) => {\r\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\r\n return (\r\n {\r\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\r\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n
\r\n \r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { SORT_DIRECTION } from '../constants/common'\r\n\r\nexport function sortObjects(\r\n arr: ObjectHash[],\r\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\r\n) {\r\n return arr.sort((a, b) =>\r\n options.reduce((acc, option) => {\r\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\r\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\r\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\r\n }, 0)\r\n )\r\n}\r\n","import { Button, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { updateSettings } from '../../models/settings'\r\n\r\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\r\n const isDarkMode = model.theme === 'dark'\r\n\r\n const onClick = () => {\r\n const theme = isDarkMode ? 'light' : 'dark'\r\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\r\n chartLayoutModel.trigger('theme', chartLayoutModel)\r\n setCookieRequest('chartsTheme', theme).catch(() => {})\r\n\r\n if (isDarkMode) {\r\n document.documentElement.classList.remove('dark')\r\n } else {\r\n document.documentElement.classList.add('dark')\r\n }\r\n }\r\n\r\n if (!chartLayoutModel) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, Time, TimeBreakpoint } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { FullscreenButton } from './fullscreen_button'\r\nimport { IdeasDropdown } from './ideas_dropdown'\r\nimport { ChartLayoutDropdown } from './layout_dropdown'\r\nimport { Publish } from './publish'\r\nimport { ThemeToggleButton } from './theme_toggle_button'\r\nimport { TourButton } from './tour_button'\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\ninterface ChartLayoutHeaderProps {\r\n model: ChartLayout\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\r\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\r\n\r\n return (\r\n <>\r\n
\r\n \r\n Ideas\r\n \r\n
\r\n
\r\n \r\n Chart tour\r\n \r\n \r\n \r\n {hasPublish && (\r\n \r\n Share\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutHeader = React.memo(\r\n ChartLayoutHeaderComponent,\r\n (prevProps, nextProps) =>\r\n prevProps.model === nextProps.model &&\r\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\r\n prevProps.hasPublish === nextProps.hasPublish\r\n)\r\n","import {\r\n ButtonSizeType,\r\n CustomDateRange,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n withSuspense,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\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 = values.dateRange\r\n ? getDateRangeTimeframe(values.dateRange)\r\n : { value: '', timeframe: chartModel!.timeframe }\r\n\r\n if (dateRangeTimeframe === null) {\r\n return\r\n } else if (dateRangeTimeframe.value) {\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (!isValid) {\r\n return\r\n }\r\n }\r\n\r\n onDialogSubmit(dateRangeTimeframe, onDateRangeSelect)\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n handleDateRangeSelect(value)\r\n onDateRangeSelect?.(value)\r\n }}\r\n onCustomDateRangeClick={() => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n }}\r\n onTimeframeSelect={onTimeframeSelect}\r\n onFavoriteTimeframeToggle={({ value }: { value: string }) => {\r\n toggleFavoriteTimeframe(value as TIMEFRAME)\r\n }}\r\n isDateRangeAvailable={isDateRangeAvailable}\r\n containerElement={document.body}\r\n className={className}\r\n isFavoritesEnabled={isPremium}\r\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\r\n />\r\n\r\n {chartModel && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\r\n","import { ChartConfigChartPane, Position, RootChartConfigObject } from '../../types/shared'\r\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\r\n\r\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\r\n return panes.some(({ elements }) =>\r\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\r\n )\r\n}\r\nfunction pushIndicators(\r\n panes: ChartConfigChartPane[],\r\n indicator: { name: string; parameters: string },\r\n options?: { COTs?: string[] }\r\n) {\r\n if (indicator.name === 'cot') {\r\n const cotKeys = options?.COTs ?? []\r\n if (cotKeys.length === 0) {\r\n cotKeys.push('')\r\n }\r\n cotKeys.forEach(function (code: string) {\r\n if (!hasPaneWithCOTCode(panes, code)) {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: IndicatorType.Cot,\r\n code,\r\n },\r\n ],\r\n })\r\n }\r\n })\r\n } else {\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.indicator,\r\n elements: [\r\n {\r\n type: ('indicators/' + indicator.name) as IndicatorType,\r\n period: indicator.parameters,\r\n },\r\n ],\r\n })\r\n }\r\n}\r\n\r\nfunction getChartTypeByTaConfigStyle(style: string) {\r\n const chartTypeMap = {\r\n candlestick: ChartElementType.CandleStick,\r\n heikinashi: ChartElementType.HeikinAshi,\r\n hollowcandlestick: ChartElementType.HollowCandleStick,\r\n line: ChartElementType.LineChart,\r\n ohlc: ChartElementType.OhlcChart,\r\n }\r\n return chartTypeMap[style as keyof typeof chartTypeMap]\r\n}\r\n\r\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\r\n const chartScaleMap = {\r\n linear: ScaleType.Linear,\r\n percentage: ScaleType.Percentage,\r\n logarithmic: ScaleType.Logarithmic,\r\n }\r\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\r\n}\r\n\r\n/*\r\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\r\n */\r\nexport const mergeChartAndTAConfig = function convertTA(\r\n chartConfig: RootChartConfigObject,\r\n taConfig: TaConfigObject,\r\n options?: { COTs: string[] }\r\n) {\r\n const panes = chartConfig.charts[0].panes\r\n const chart = chartConfig.charts[0]\r\n\r\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\r\n}\r\n\r\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\r\n const options = {}\r\n const panes: ChartConfigChartPane[] = []\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Above)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n const overlays = taConfig.overlays.map(function (overlay) {\r\n return {\r\n type: ('overlays/' + overlay.name) as OverlayType,\r\n period: overlay.parameters ?? '',\r\n color: overlay.color ?? '',\r\n }\r\n })\r\n panes.push({\r\n height: PANE_HEIGHT_DEFAULT.chart,\r\n elements: [\r\n {\r\n type: getChartTypeByTaConfigStyle(taConfig.style),\r\n overlays: overlays,\r\n },\r\n ],\r\n })\r\n\r\n taConfig.indicators\r\n .filter((indicator) => indicator.position === Position.Below)\r\n .forEach((indicator) => {\r\n pushIndicators(panes, indicator, options)\r\n })\r\n\r\n return panes\r\n}\r\n","export * from 'finviz-charts/app/lib-export'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","export const createAlertAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"create-alert\" */ './module-entry'),\r\n cacheKey: 'create-alert',\r\n}\r\n","export const saveToPortfolioAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"save-to-portfolio\" */ './module-entry'),\r\n cacheKey: 'save-to-portfolio',\r\n}\r\n","export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","export const portfolioWatchlistTableAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist-table\" */ './PortfolioWatchlistTable'),\r\n cacheKey: 'portfolio-watchlist-table',\r\n}\r\n","import logo from './app/shared/assets/logo.png'\r\nimport logo_light from './app/shared/assets/logo_light.png'\r\n\r\nexport * from './main/components'\r\n\r\nexport { getSanitizedTicker } from './app/shared/ticker-sanitizer'\r\nexport * from './app/queryString'\r\nexport * from './main/modules/portfolio/types'\r\n\r\nexport { getFormattedDateString } from './app/header/utils'\r\nexport { decodeQueryString, encodeQueryString } from './app/queryString'\r\nexport { createAlertAsyncModule } from './app/quote/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\nexport { intervalCallbackOnWindowVisible } from './app/shared/documentVisibility'\r\n\r\nexport const assets = { logo, logo_light }\r\n","import classnames from 'classnames'\r\nimport { ForwardedRef, HTMLProps, PropsWithChildren, ReactNode, forwardRef } from 'react'\r\n\r\nimport { Icon } from './icon'\r\n\r\nexport enum ColorVariant {\r\n violet = 'violet',\r\n emerald = 'emerald',\r\n orange = 'orange',\r\n teal = 'teal',\r\n pink = 'pink',\r\n lime = 'lime',\r\n purple = 'purple',\r\n green = 'green',\r\n yellow = 'yellow',\r\n blue = 'blue',\r\n red = 'red',\r\n gray = 'gray',\r\n default = 'default',\r\n dark = 'dark',\r\n}\r\n\r\nexport enum CheckboxSize {\r\n none = '', // Do not set fixed size\r\n small = 'min-h-6 text-2xs', // 24px\r\n regular = 'min-h-7 text-sm', // 28px\r\n}\r\nexport type CheckboxSizeType = keyof typeof CheckboxSize\r\n\r\ninterface CheckboxProps extends Omit, 'label' | 'size'> {\r\n /**\r\n * Text that gets displayed on the right side of the checkbox\r\n */\r\n label?: ReactNode\r\n\r\n checked: boolean\r\n\r\n /**\r\n * Size of the checkbox\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: CheckboxSizeType\r\n\r\n /**\r\n * Color of the checkbox\r\n *\r\n * @default \"default\"\r\n */\r\n color?: ColorVariant\r\n}\r\n\r\nfunction CheckboxComponent(\r\n {\r\n className,\r\n label,\r\n size = 'regular',\r\n color = ColorVariant.default,\r\n children,\r\n ...props\r\n }: PropsWithChildren,\r\n ref: ForwardedRef\r\n) {\r\n const checked = props.checked ?? props.defaultChecked\r\n\r\n return (\r\n \r\n
\r\n \r\n {checked && (\r\n \r\n )}\r\n
\r\n {label ?? children}\r\n \r\n )\r\n}\r\n\r\nexport const Checkbox = forwardRef(CheckboxComponent)\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, PropsWithChildren, memo, useCallback, useLayoutEffect, useRef, useState } from 'react'\r\n\r\nexport interface Interaction {\r\n left: number\r\n top: number\r\n}\r\n\r\n/**\r\n * Clamp value between two bounds\r\n */\r\nfunction clamp(num: number, min = 0, max = 1) {\r\n return num > max ? max : num < min ? min : num\r\n}\r\n\r\n/**\r\n * Check if an event was triggered by touch\r\n */\r\nfunction isTouch(event: MouseEvent | TouchEvent): event is TouchEvent {\r\n return 'touches' in event\r\n}\r\n\r\n/**\r\n * Returns a relative position of the pointer inside the node's bounding box\r\n */\r\nfunction getRelativePosition(node: HTMLDivElement, event: MouseEvent | TouchEvent): Interaction {\r\n const rect = node.getBoundingClientRect()\r\n\r\n // Get user's pointer position from `touches` array if it's a `TouchEvent`\r\n const pointer = isTouch(event) ? event.touches[0] : (event as MouseEvent)\r\n\r\n return {\r\n left: clamp((pointer.pageX - (rect.left + window.pageXOffset)) / rect.width),\r\n top: clamp((pointer.pageY - (rect.top + window.pageYOffset)) / rect.height),\r\n }\r\n}\r\n\r\n/**\r\n * Browsers introduced an intervention, making touch events passive by default.\r\n * This workaround removes `preventDefault` call from the touch handlers.\r\n * @see https://github.com/facebook/react/issues/19651\r\n */\r\nfunction preventDefaultMove(event: MouseEvent | TouchEvent) {\r\n !isTouch(event) && event.preventDefault()\r\n}\r\n\r\ninterface Props {\r\n onMove: (interaction: Interaction) => void\r\n onKey: (offset: Interaction) => void\r\n}\r\n\r\nfunction DraggablePickerComponent({\r\n onMove,\r\n onKey,\r\n className,\r\n ...props\r\n}: PropsWithChildren & HTMLProps) {\r\n const container = useRef(null)\r\n const hasTouched = useRef(false)\r\n const [isDragging, setDragging] = useState(false)\r\n\r\n /**\r\n * Prevent mobile browsers from handling mouse events (conflicting with touch ones).\r\n * If we detected a touch interaction before, we prefer reacting to touch events only.\r\n */\r\n const isValid = useRef((event: MouseEvent | TouchEvent): boolean => {\r\n if (hasTouched.current && !isTouch(event)) return false\r\n if (!hasTouched.current) hasTouched.current = isTouch(event)\r\n return true\r\n })\r\n\r\n const handleMove = useCallback(\r\n (event: MouseEvent | TouchEvent) => {\r\n preventDefaultMove(event)\r\n\r\n // If user moves the pointer outside of the window or iframe bounds and release it there,\r\n // `mouseup`/`touchend` won't be fired. In order to stop the picker from following the cursor\r\n // after the user has moved the mouse/finger back to the document, we check `event.buttons`\r\n // and `event.touches`. It allows us to detect that the user is just moving his pointer\r\n // without pressing it down\r\n const isDown = isTouch(event) ? event.touches.length > 0 : event.buttons > 0\r\n\r\n if (isDown && container.current) {\r\n onMove(getRelativePosition(container.current, event))\r\n } else {\r\n setDragging(false)\r\n }\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleMoveStart = useCallback(\r\n ({ nativeEvent }: React.MouseEvent | React.TouchEvent) => {\r\n preventDefaultMove(nativeEvent)\r\n\r\n if (!isValid.current(nativeEvent)) return\r\n\r\n // The node/ref must actually exist when user start an interaction.\r\n // We won't suppress the ESLint warning though, as it should probably be something to be aware of.\r\n onMove(getRelativePosition(container.current!, nativeEvent))\r\n setDragging(true)\r\n },\r\n [onMove]\r\n )\r\n\r\n const handleKeyDown = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const keyCode = event.which || event.keyCode\r\n\r\n // Ignore all keys except arrow ones\r\n if (keyCode < 37 || keyCode > 40) return\r\n // Do not scroll page by arrow keys when document is focused on the element\r\n event.preventDefault()\r\n // Send relative offset to the parent component.\r\n // We use codes (37←, 38↑, 39→, 40↓) instead of keys ('ArrowRight', 'ArrowDown', etc)\r\n // to reduce the size of the library\r\n onKey({\r\n left: keyCode === 39 ? 0.05 : keyCode === 37 ? -0.05 : 0,\r\n top: keyCode === 40 ? 0.05 : keyCode === 38 ? -0.05 : 0,\r\n })\r\n },\r\n [onKey]\r\n )\r\n\r\n const handleMoveEnd = useCallback(() => setDragging(false), [])\r\n\r\n const toggleDocumentEvents = useCallback(\r\n (state: boolean) => {\r\n // add or remove additional pointer event listeners\r\n const toggleEvent = state ? window.addEventListener : window.removeEventListener\r\n toggleEvent(hasTouched.current ? 'touchmove' : 'mousemove', handleMove)\r\n toggleEvent(hasTouched.current ? 'touchend' : 'mouseup', handleMoveEnd)\r\n },\r\n [handleMove, handleMoveEnd]\r\n )\r\n\r\n useLayoutEffect(() => {\r\n toggleDocumentEvents(isDragging)\r\n return () => {\r\n isDragging && toggleDocumentEvents(false)\r\n }\r\n }, [isDragging, toggleDocumentEvents])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport const DraggablePicker = memo(DraggablePickerComponent)\r\n","interface PointerProps {\r\n className?: string\r\n top?: number\r\n left: number\r\n color: string\r\n}\r\n\r\nexport function Pointer({ color, left, top = 0.5 }: PointerProps) {\r\n return (\r\n \r\n
\r\n
\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `app/utils/colors.ts` in charts 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) {\r\n const isRgb = getIsRgb(strColor)\r\n\r\n if (isRgb) {\r\n return rgbaToHexString(rgbaStringToObject(strColor), true)\r\n }\r\n\r\n return strColor\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","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Alpha({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, a: 1 - pos.left }), [onChange, color])\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ ...color, a: 1 })\r\n const gradientTo = hsvaToHEXString({ ...color, a: 0 }, true)\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n // Don’t recalculate when alpha changes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [color.h, color.s, color.v])\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { Icon } from '../icon'\r\nimport { HSVA, hexStringToHSVA } from './util'\r\n\r\nconst DEFAULT_COLORS = [\r\n { title: 'Rose', value: '#f43f5e' },\r\n { title: 'Pink', value: '#db2777' },\r\n { title: 'Fuchsia', value: '#c026d3' },\r\n { title: 'Purple', value: '#9333ea' },\r\n { title: 'Violet', value: '#7c3aed' },\r\n { title: 'Indigo', value: '#4f46e5' },\r\n { title: 'Blue', value: '#2563eb' },\r\n { title: 'Light Blue', value: '#0284c7' },\r\n { title: 'Cyan', value: '#0891b2' },\r\n { title: 'Teal', value: '#0d9488' },\r\n { title: 'Emerald', value: '#059669' },\r\n { title: 'Green', value: '#16a34a' },\r\n { title: 'Lime', value: '#65a30d' },\r\n { title: 'Yellow', value: '#eab308' },\r\n { title: 'Amber', value: '#d97706' },\r\n { title: 'Red', value: '#dc2626' },\r\n]\r\n\r\ninterface ColorItem {\r\n /**\r\n * Name of the color\r\n */\r\n title: string\r\n\r\n /**\r\n * Hex value\r\n */\r\n value: string\r\n}\r\n\r\ninterface ColorPaletteProps {\r\n /**\r\n * Current selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * List of colors to display in the palette\r\n *\r\n * @default DEFAULT_COLORS\r\n */\r\n colors?: ColorItem[]\r\n\r\n /**\r\n * Callback when user picks a color\r\n */\r\n onChange: (color: string, originalColor: HSVA) => void\r\n}\r\n\r\nexport function ColorPalette({ color, colors = DEFAULT_COLORS, onChange }: ColorPaletteProps) {\r\n const lowerCaseColor = color.toLowerCase()\r\n\r\n return (\r\n
\r\n {colors.map((colorObj) => {\r\n const isSelected = lowerCaseColor.startsWith(colorObj.value)\r\n return (\r\n onChange(colorObj.value, hexStringToHSVA(colorObj.value))}\r\n >\r\n {isSelected && }\r\n
\r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface HueSaturationProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nfunction getPositionFromHSLA(color: HSVA) {\r\n return {\r\n left: color.h / 360,\r\n top: 1 - color.s,\r\n }\r\n}\r\n\r\nexport function HueSaturation({ color, onChange }: HueSaturationProps) {\r\n const position = useMemo(() => getPositionFromHSLA(color), [color])\r\n\r\n const colorPreview = useMemo(() => hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 }), [color.h, color.s])\r\n\r\n const changeSaturation = useCallback(\r\n (pos: Interaction) =>\r\n onChange({\r\n h: Math.round(pos.left * 360),\r\n s: 1 - pos.top,\r\n v: 1,\r\n a: color.a,\r\n }),\r\n [color.a, onChange]\r\n )\r\n\r\n return (\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import { useCallback, useMemo } from 'react'\r\n\r\nimport { DraggablePicker, Interaction } from './draggable'\r\nimport { Pointer } from './pointer'\r\nimport { HSVA, hsvaToHEXString } from './util'\r\n\r\ninterface LightnessProps {\r\n color: HSVA\r\n onChange: (color: HSVA) => void\r\n}\r\n\r\nexport function Lightness({ color, onChange }: LightnessProps) {\r\n const changeLightness = useCallback((pos: Interaction) => onChange({ ...color, v: 1 - pos.left }), [onChange, color])\r\n\r\n const colorPreview = useMemo(\r\n () => hsvaToHEXString({ h: color.h, s: color.s, v: color.v, a: 1 }),\r\n [color.h, color.s, color.v]\r\n )\r\n\r\n const gradientPreview = useMemo(() => {\r\n const gradientFrom = hsvaToHEXString({ h: color.h, s: color.s, v: 1, a: 1 })\r\n const gradientTo = hsvaToHEXString({ h: color.h, s: color.s, v: 0, a: 1 })\r\n\r\n return `linear-gradient(90deg, ${gradientFrom}, ${gradientTo})`\r\n }, [color.h, color.s])\r\n\r\n return (\r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\nimport { getIsColorTooLightOrTransparent, hexStringToRGBA } from './util'\r\n\r\ninterface ColorPreviewProps {\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * One or more colors to show in the preview\r\n */\r\n color: string | string[]\r\n\r\n /**\r\n * Wrapper classname\r\n */\r\n className?: string\r\n}\r\n\r\nexport function ColorPreview({ icon, color, className }: ColorPreviewProps) {\r\n const colors = Array.isArray(color) ? color : [color]\r\n const isTooLight = getIsColorTooLightOrTransparent(hexStringToRGBA(colors[0]))\r\n return (\r\n \r\n {icon && (\r\n
\r\n {isValidIconName(icon) ? (\r\n \r\n ) : (\r\n icon\r\n )}\r\n
\r\n )}\r\n {colors.map((color, index) => (\r\n //   has to be there because of a bug on safari which ignores h-full when empty element\r\n
\r\n  \r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ForwardedRef, useCallback, useEffect, useState } from 'react'\r\n\r\nimport { Input, InputComponentProps } from '../input'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPickerProps } from './picker'\r\nimport * as colorUtil from './util'\r\n\r\ninterface PickerInputProps extends Omit {\r\n color: ColorPickerProps['color']\r\n onChange: ColorPickerProps['onChange']\r\n\r\n /*\r\n * Is color preview square visible\r\n *\r\n * @default true\r\n * */\r\n hasColorPreview?: boolean\r\n}\r\nexport const PickerInput = React.forwardRef(\r\n (\r\n { color, inputClass, hasColorPreview = true, onChange, ...props }: PickerInputProps,\r\n ref: ForwardedRef\r\n ) => {\r\n const [colorInput, setColorInput] = useState(colorUtil.removeHashSymbol(color))\r\n const isRgba = colorUtil.getIsRgb(colorInput)\r\n\r\n useEffect(() => {\r\n setColorInput(colorUtil.removeHashSymbol(color))\r\n }, [color])\r\n\r\n const handleColorInputChange = useCallback(\r\n (event: React.KeyboardEvent) => {\r\n const value = colorUtil.removeHashSymbol(event.currentTarget.value)\r\n const isRgba = value.startsWith('rgba')\r\n const colorValue = isRgba ? value : `#${value}`\r\n\r\n setColorInput(value)\r\n if ((value.length >= 6 || (isRgba && value.length >= 16)) && colorUtil.isValidColor(colorValue)) {\r\n onChange(colorValue, colorUtil.hexStringToHSVA(colorValue))\r\n }\r\n },\r\n [onChange]\r\n )\r\n return (\r\n \r\n {hasColorPreview && (\r\n
\r\n \r\n
\r\n )}\r\n {!isRgba && #}\r\n
\r\n }\r\n onChange={handleColorInputChange}\r\n />\r\n )\r\n }\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport React, { ReactNode, useCallback, useEffect, useRef, useState } from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button } from '../button'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Alpha } from './alpha'\r\nimport { ColorPalette } from './color-palette'\r\nimport { HueSaturation } from './hue-saturation'\r\nimport { Lightness } from './lightness'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\nexport interface ColorPickerProps {\r\n /**\r\n * The selected color in HEX format (supports HEX8 for alpha)\r\n */\r\n color: string\r\n\r\n /**\r\n * Whether or not the user is able to select custom color\r\n *\r\n * @default true\r\n */\r\n canSelectCustom?: boolean\r\n\r\n /**\r\n * Whether or not the user is able to change alpha channel. Only applicable\r\n * when `canSelectCustom` is true\r\n *\r\n * @default true\r\n */\r\n canSelectAlpha?: boolean\r\n\r\n /**\r\n * Sets the output format for the color picker\r\n *\r\n * @default 'hex'\r\n */\r\n outputFormat?: 'hex' | 'rgba'\r\n\r\n /**\r\n * Callback when user changes color. Use the second parameter to do color space\r\n * conversions otherwise the color could differ due to rounding\r\n */\r\n onChange: (color: string, originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Callback when user clicks on a palette item. Used to close popover\r\n */\r\n onPaletteItemClick?: () => void\r\n}\r\n\r\nexport function ColorPicker({\r\n color,\r\n canSelectCustom = true,\r\n canSelectAlpha = true,\r\n outputFormat = 'hex',\r\n onChange,\r\n onPaletteItemClick,\r\n}: ColorPickerProps) {\r\n const cachedColor = useRef(color)\r\n const [hsvaColor, setColor] = useState(colorUtil.getHSVAFromColor(color))\r\n const popover = Ariakit.usePopoverContext()\r\n const input = popover?.useState('disclosureElement')\r\n\r\n /**\r\n * Update state if the color from outside changed\r\n */\r\n useEffect(() => {\r\n const currentColor = colorUtil.removeHashSymbol(cachedColor.current)\r\n const newColor = colorUtil.removeHashSymbol(color)\r\n\r\n if (currentColor === newColor || !colorUtil.isValidColor(newColor)) return\r\n\r\n cachedColor.current = color\r\n setColor(colorUtil.getHSVAFromColor(color))\r\n }, [color])\r\n\r\n /**\r\n * Handle color change\r\n * 1. update cache so we can correctly check when outside color updates\r\n * 2. Update internal color representation\r\n * 3. call onChange with string color\r\n */\r\n const onChangeCallback = useCallback(\r\n (color: colorUtil.HSVA) => {\r\n const stringColor = colorUtil.stringifyHSVAColor(color, outputFormat, canSelectAlpha)\r\n cachedColor.current = stringColor\r\n onChange(stringColor, color)\r\n setColor(color)\r\n },\r\n [onChange, canSelectAlpha, outputFormat]\r\n )\r\n\r\n const onSetCustomCodeClick = useCallback(() => {\r\n const value = prompt('Enter a color code')?.trim()\r\n\r\n if (!value) return\r\n\r\n const isValid = colorUtil.isValidColor(value)\r\n\r\n if (!isValid) {\r\n return alert('The code is not a valid color')\r\n }\r\n\r\n onChangeCallback(colorUtil.getHSVAFromColor(value))\r\n }, [onChangeCallback])\r\n\r\n return (\r\n
\r\n {canSelectCustom && (\r\n <>\r\n {isMobile() && (\r\n \r\n )}\r\n \r\n \r\n\r\n {canSelectAlpha && }\r\n \r\n )}\r\n\r\n \r\n {\r\n input?.focus({ preventScroll: true })\r\n onPaletteItemClick?.()\r\n onChangeCallback({ ...orignalColor, a: hsvaColor.a })\r\n }}\r\n />\r\n
\r\n \r\n )\r\n}\r\n\r\ninterface InputColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for the input\r\n */\r\n label?: ReactNode\r\n inputDataTestId?: string\r\n}\r\n\r\nexport function InputColorPicker({ label, inputDataTestId, onChange, ...props }: InputColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const canSelectCustom = props.canSelectCustom !== false\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n \r\n }\r\n />\r\n \r\n \r\n {\r\n if (canSelectCustom) return\r\n popoverState.hide()\r\n }}\r\n />\r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Button, ButtonComponentProps, ButtonRounding, ButtonSizeType } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { IconNameType } from '../icon'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { ColorPreview } from './color-preview'\r\nimport { ColorPicker, ColorPickerProps } from './picker'\r\nimport { PickerInput } from './picker-input'\r\nimport * as colorUtil from './util'\r\n\r\ninterface MultiColorPickerProps extends ColorPickerProps {\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n}\r\n\r\nexport function MultiColorPicker({\r\n colorInputLabel,\r\n onChange,\r\n canSelectCustom = true,\r\n ...props\r\n}: MultiColorPickerProps) {\r\n const isMobileDevice = isMobile()\r\n\r\n return (\r\n <>\r\n {canSelectCustom && !isMobileDevice && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n {}} />\r\n \r\n \r\n )\r\n}\r\n\r\ninterface ColorTabButtonProps extends ButtonComponentProps {\r\n /*\r\n * Preview color\r\n * */\r\n color: string\r\n}\r\n\r\nexport function ColorTabButton({ color, children, ...props }: ColorTabButtonProps) {\r\n return (\r\n }\r\n {...props}\r\n >\r\n {children}\r\n \r\n )\r\n}\r\n\r\ntype ButtonColorProperties = { color: string; label: string }\r\n\r\ninterface ButtonColorPickerProps\r\n extends Omit {\r\n /**\r\n * Temporary prop to enable/disable multi picker funcionality,\r\n * in the future we'll only use secondaryColor prop to decide if the picker is multi picker or not\r\n *\r\n * @default undefined\r\n */\r\n isMultiPicker?: boolean\r\n\r\n /**\r\n * Button classname\r\n */\r\n className?: string\r\n\r\n /**\r\n * Array of objects with color and value\r\n */\r\n colors: ColorType[]\r\n\r\n /**\r\n * Color onchange callback\r\n */\r\n onChange: (colors: ColorType[], originalColor: colorUtil.HSVA) => void\r\n\r\n /**\r\n * Button size\r\n *\r\n * @default undefined\r\n */\r\n size?: ButtonSizeType\r\n /**\r\n * Label for color text input\r\n *\r\n * @default undefined\r\n */\r\n colorInputLabel?: string\r\n\r\n /**\r\n * Name of an icon or JSX.Element\r\n */\r\n icon?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Identifier for e2e testing\r\n *\r\n * @default undefined\r\n */\r\n buttonPickerDataTestId?: string\r\n}\r\n\r\nexport function ButtonColorPicker({\r\n size,\r\n icon,\r\n colors,\r\n className,\r\n onChange,\r\n buttonPickerDataTestId,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\r\n const isOpen = popoverState.useState('open')\r\n const isMultiPicker = !!props.isMultiPicker && colors.length > 1\r\n const [activeColorIndex, setActiveColorIndex] = React.useState(0)\r\n const handleColorChange = React.useCallback(\r\n (color: string, originalColor: colorUtil.HSVA) => {\r\n onChange(\r\n colors.map((colorObject, index) => (index === activeColorIndex ? { ...colorObject, color } : colorObject)),\r\n originalColor\r\n )\r\n },\r\n [activeColorIndex, colors, onChange]\r\n )\r\n return (\r\n <>\r\n \r\n color)}\r\n className={classnames('h-full w-full', ButtonRounding.small)}\r\n />\r\n \r\n \r\n {isMultiPicker && (\r\n
\r\n \r\n {colors.map(({ color, label }, index) => (\r\n setActiveColorIndex(index)}\r\n >\r\n {label}\r\n \r\n ))}\r\n \r\n
\r\n )}\r\n \r\n
\r\n \r\n )\r\n}\r\n","import copy from 'copy-to-clipboard'\r\nimport React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { InputProps, Textarea } from '../input'\r\n\r\ninterface Props extends Pick {\r\n className?: string\r\n text: string\r\n bottomLeftContent?: React.ReactNode\r\n}\r\n\r\nexport const CopyToClipboard: React.FC = ({ className, label, text, bottomLeftContent }) => {\r\n const [isCopied, setIsCopied] = React.useState(false)\r\n\r\n const handleCopyToClipboard = React.useCallback(() => {\r\n setIsCopied(true)\r\n copy(text)\r\n }, [text])\r\n\r\n React.useEffect(() => {\r\n let timeout: number\r\n const resetTimer = () => {\r\n if (!timeout) return\r\n clearTimeout(timeout)\r\n }\r\n if (isCopied) {\r\n resetTimer()\r\n timeout = window.setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { usePrevious } from '../../hooks/use-previous'\r\nimport { usePopoverPlacement } from '../../hooks/usePopoverPlacement'\r\nimport { blurWithoutScroll, focusWithoutScroll, preventDefault } from '../../util'\r\n\r\nenum DropdownRounding {\r\n none = '',\r\n regular = 'rounded-lg',\r\n}\r\n\r\nenum DropdownTheme {\r\n none = '',\r\n default = 'border border-primary bg-primary',\r\n}\r\n\r\ninterface StatelessDropdownProps\r\n extends Omit, 'ref'>,\r\n Pick {\r\n /**\r\n * Trigger button for the dropdown\r\n */\r\n trigger: JSX.Element | null\r\n\r\n /**\r\n * Disable interaction with other page elements when the dropdown is open\r\n *\r\n * @default true\r\n */\r\n modal?: boolean\r\n\r\n /**\r\n * When true, the dropdown will show when dropdown is hovered. Combine with\r\n * `backdrop={false}` to make the popover hide on mouse out\r\n */\r\n showOnHover?: boolean\r\n\r\n /**\r\n * Placement of the dropdown\r\n *\r\n */\r\n placement?: Ariakit.MenuProviderProps['placement']\r\n\r\n /**\r\n * Orientation in which the items are laid out. Changes which arrows control next/prev item\r\n *\r\n * @default vertical\r\n */\r\n orientation?: 'vertical' | 'horizontal'\r\n\r\n /**\r\n * Set rounding for the dropdown list\r\n *\r\n * @default regular\r\n */\r\n rounding?: keyof typeof DropdownRounding\r\n\r\n /**\r\n * Dropdown theme\r\n *\r\n * @default default\r\n */\r\n theme?: keyof typeof DropdownTheme\r\n\r\n /**\r\n * The amount of space between button and its popover\r\n *\r\n * @default 4\r\n */\r\n gutter?: number\r\n\r\n /**\r\n * Show backdrop on the dialog. Provide your own element if you want to add background or animation\r\n *\r\n */\r\n backdrop?: false | JSX.Element\r\n\r\n /**\r\n * Do not render the items when the popover is not visible\r\n *\r\n * @default true\r\n */\r\n unmountOnHide?: boolean\r\n\r\n /**\r\n * If true, the dropdown will overlay the trigger if necessary instead of going\r\n * out of bounds and overflowing\r\n */\r\n overlap?: boolean\r\n\r\n /**\r\n * Callback before the menu starts hiding. Event can be prevented which keeps the menu open\r\n * This callback isn’t called on backdrop click. Use `backdrop={
}` to react on backdrop clicks\r\n */\r\n onClose?: (ev: Event) => void\r\n\r\n /**\r\n * Used to provide virtual anchor, useful for context menu, etc\r\n */\r\n getAnchorRect?: () => { x: number; y: number }\r\n\r\n /**\r\n * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n */\r\n autoFocusOnShow?: false | ((element: HTMLElement) => boolean)\r\n\r\n /**\r\n * Set which element gets focus when the dialog visibility changes. If `false`, the focus stays on the previous element.\r\n * Defaults to focusing without scrolling the page or keeping the focus on trigger if input-like.\r\n */\r\n autoFocusOnHide?: false | ((element: HTMLElement) => boolean)\r\n\r\n /**\r\n * Callback which is called when the dialog opens and all animations complete\r\n */\r\n onFullyOpen?: () => void\r\n\r\n /**\r\n * Callback which is called when the dialog closes and all animations complete\r\n */\r\n onFullyClosed?: () => void\r\n}\r\n\r\nexport const StatelessDropdown = React.forwardRef(function DropdownComponent(\r\n {\r\n trigger,\r\n modal = true,\r\n rounding = 'regular',\r\n theme = 'default',\r\n gutter,\r\n unmountOnHide = true,\r\n children,\r\n backdrop,\r\n showOnHover,\r\n hideOnInteractOutside,\r\n autoFocusOnShow,\r\n autoFocusOnHide,\r\n onFullyOpen,\r\n onFullyClosed,\r\n ...props\r\n }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const store = Ariakit.useMenuContext()\r\n const { placement, zIndex, updatePosition } = usePopoverPlacement(store)\r\n const isOpen = store?.useState('open')\r\n const [isFullyOpen, setIsFullyOpen] = React.useState(false)\r\n const isMounted = store?.useState('mounted')\r\n const wasMounted = usePrevious(isMounted)\r\n const menuGutter = gutter ?? (store?.parent ? 6 : 4)\r\n\r\n React.useEffect(() => {\r\n if (wasMounted && !isMounted) {\r\n onFullyClosed?.()\r\n }\r\n // We want to call it only on isMounted change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isMounted])\r\n\r\n return (\r\n <>\r\n {trigger && (\r\n \r\n )}\r\n }\r\n // Update zIndex when popover position changes\r\n updatePosition={updatePosition}\r\n // E2E tests don’t wait for transitions to complete and it could lead to bugs with other popover components (ResizeObserver loop exceeded)\r\n // or visual diffs due a screenshot being captured while the dropdown still in transition\r\n // If you encounter this problem, just do `cy.get('[data-fully-open=true]').should('exist')` before continuing to wait for the dropdown\r\n data-fully-open={isFullyOpen}\r\n className={classNames(\r\n props.className,\r\n zIndex,\r\n DropdownRounding[rounding],\r\n DropdownTheme[theme],\r\n 'custom-scrollbar absolute flex flex-col overflow-hidden shadow-modal outline-none dark:shadow-modal-dark',\r\n // These are set by popper, we just need to make sure we don’t encroach on the safe insets\r\n 'min-w-[--popover-anchor-width] max-w-[--popover-available-width]',\r\n // Animations\r\n 'opacity-0 transition duration-[250ms] data-[enter]:translate-y-0 data-[enter]:opacity-100',\r\n {\r\n // When in combobox mode, the padding is smaller so we can render a gradient under the combobox input.\r\n // Change the custom scrollbar offset so the top of the first item fits the top of our scrollbar\r\n '[--scrollbar-radius:0]': DropdownRounding[rounding] === DropdownRounding.none,\r\n // Direction based styles\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-bottom))] motion-safe:-translate-y-1':\r\n placement?.startsWith('bottom'),\r\n 'max-h-[calc(var(--popover-available-height)-env(safe-area-inset-top))] motion-safe:translate-y-1':\r\n placement?.startsWith('top'),\r\n }\r\n )}\r\n onTransitionEnd={(ev) => {\r\n if (ev.target === ev.currentTarget && isOpen) {\r\n setIsFullyOpen(true)\r\n onFullyOpen?.()\r\n }\r\n }}\r\n >\r\n \r\n {children}\r\n
\r\n \r\n \r\n )\r\n})\r\n\r\nexport interface DropdownProps extends StatelessDropdownProps {\r\n state?: Ariakit.MenuStore\r\n}\r\n\r\nexport const Dropdown = React.forwardRef(\r\n (\r\n { state, placement, orientation = 'vertical', ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n ) => (\r\n \r\n \r\n \r\n )\r\n)\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { OptionButton, OptionButtonProps } from '../OptionButton'\r\nimport { BUTTON_DEFAULT_ELEMENT } from '../button'\r\nimport { PropsWithAs } from '../types'\r\n\r\ninterface DropdownItemProps extends OptionButtonProps {\r\n store?: Ariakit.MenuStore\r\n\r\n subtitle?: React.ReactNode\r\n\r\n /**\r\n * Whether clicking the item should also close the dropdown. Only applies to\r\n * items without a submenu\r\n *\r\n * @default true\r\n */\r\n hideOnClick?: boolean\r\n}\r\n\r\nfunction DropdownItemComponent(\r\n { as: asComponent, ...props }: PropsWithAs & DropdownItemProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return } />\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const DropdownItem = React.forwardRef(DropdownItemComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & DropdownItemProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as Ariakit from '@ariakit/react'\r\n\r\nexport const useDropdownState = Ariakit.useMenuStore\r\n","import * as React from 'react'\r\n\r\nimport { PartialBy } from '../../types'\r\nimport { MenuGroup } from '../MenuGroup'\r\nimport { Dropdown, DropdownItem, DropdownProps } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nexport interface IContextMenuOption {\r\n type?: never\r\n id: string\r\n label: React.ReactNode\r\n onClick?: () => void\r\n options?: ContextMenuItem[]\r\n gtag?: ObjectHash\r\n}\r\n\r\ninterface IContextMenuDivider {\r\n type: 'divider'\r\n label?: React.ReactNode\r\n}\r\n\r\nexport type ContextMenuItem = IContextMenuOption | IContextMenuDivider\r\n\r\ninterface ContextMenuInnerProps extends PartialBy {\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n}\r\n\r\nexport function ContextMenuInner(\r\n { trigger, items, onClose, ...props }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n return (\r\n ev.preventDefault()}\r\n >\r\n {items?.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return \r\n }\r\n\r\n if (item?.options !== undefined) {\r\n return (\r\n \r\n {item.label}\r\n \r\n }\r\n />\r\n )\r\n }\r\n\r\n return (\r\n {\r\n item.onClick?.()\r\n window.gtag?.('event', 'context-menu', Object.assign({ menu_option: item.id }, item.gtag))\r\n }}\r\n data-testid={`dropdown-menu-${item.id}`}\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nexport const ContextMenu = React.forwardRef(ContextMenuInner)\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\ninterface GridLayoutProps extends React.HTMLProps {\r\n /**\r\n * Number of columns\r\n */\r\n columns?: number\r\n\r\n /**\r\n * Number of rows\r\n */\r\n rows?: number\r\n\r\n /**\r\n * Whether or not a border is rendered between and around items. eg. charts\r\n * on HP won’t have a border\r\n *\r\n * @default false\r\n */\r\n border?: boolean\r\n}\r\n\r\nexport const ChartGridCell = React.forwardRef(\r\n ({ children, gridArea, className, ...props }, ref) => (\r\n \r\n {children}\r\n \r\n )\r\n)\r\n\r\ninterface ChartGridCellProps extends React.HTMLProps {\r\n /**\r\n * Css grid-area value\r\n */\r\n gridArea?: string\r\n}\r\n\r\nexport function GridLayout({ columns = 1, rows = 1, border = false, children, className, ...props }: GridLayoutProps) {\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\ninterface ChartGridProps extends GridLayoutProps {\r\n isResizable?: boolean\r\n}\r\n\r\nexport const ChartGrid: React.FC = (props) => \r\n","import * as React from 'react'\r\n\r\nimport { PropsWithAs, RequireByKey } from '../types'\r\n\r\nconst defaultValueAccessor: ValueAccessor = (data) => data\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst DEFAULT_VALUE_KEY = 'value'\r\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nconst DEFAULT_CHANGE_KEY = 'onChange'\r\n\r\ntype ValueAccessor<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n> = (...args: Parameters[ChangeKey]>) => React.ComponentProps[ValueKey]\r\n\r\nexport type InnerStateProps<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps,\r\n ChangeKey extends keyof React.ComponentProps,\r\n> = RequireByKey, 'as'> & {\r\n valueKey?: ValueKey\r\n changeKey?: ChangeKey\r\n valueAccessor?: ValueAccessor\r\n}\r\n\r\nexport function InnerState<\r\n TagType extends React.ElementType,\r\n ValueKey extends keyof React.ComponentProps = typeof DEFAULT_VALUE_KEY,\r\n ChangeKey extends keyof React.ComponentProps = typeof DEFAULT_CHANGE_KEY,\r\n>({\r\n as: asComponent,\r\n valueKey = 'value' as ValueKey,\r\n changeKey = 'onChange' as ChangeKey,\r\n valueAccessor = defaultValueAccessor,\r\n ...props\r\n}: InnerStateProps) {\r\n const { [valueKey]: value, [changeKey]: onChange } = props\r\n const [state, setState] = React.useState[ValueKey]>(value)\r\n\r\n const handleChange = React.useCallback>(\r\n (...args) => {\r\n setState(valueAccessor(...args))\r\n onChange(...args)\r\n },\r\n [onChange, valueAccessor]\r\n )\r\n\r\n return React.createElement(asComponent, {\r\n ...props,\r\n [valueKey]: state,\r\n [changeKey]: handleChange,\r\n })\r\n}\r\n","import classnames from 'classnames'\r\nimport { HTMLProps, ReactNode, useEffect, useMemo, useRef, useState } from 'react'\r\n\r\nimport { Label } from './typography'\r\n\r\nexport enum RangeSize {\r\n small = 'sm:h-6', // 24px height\r\n regular = 'sm:h-7', // 28px height\r\n medium = 'sm:h-8', // 32px height\r\n large = 'sm:h-9', // 36px height\r\n}\r\n\r\ntype InputProps = HTMLProps\r\n\r\ninterface RangeSliderProps extends Omit {\r\n /**\r\n * Label which is rendered above the select\r\n */\r\n label?: ReactNode\r\n\r\n /**\r\n * Range size. All inputs have forced height on mobile to avoid zoom\r\n *\r\n * @default regular\r\n */\r\n size?: keyof typeof RangeSize\r\n\r\n /**\r\n * Element which will be rendered on the left side of the slider\r\n */\r\n leftContent?: ReactNode\r\n\r\n /**\r\n * Element which will be rendered on the right side of the slider\r\n */\r\n rightContent?: ReactNode\r\n\r\n /**\r\n * Class name for the wrapper element\r\n */\r\n className?: string\r\n\r\n /**\r\n * Class name for the input element\r\n */\r\n inputClassName?: string\r\n\r\n /**\r\n * Min value for the input\r\n *\r\n * @default 0\r\n */\r\n min?: number\r\n\r\n /**\r\n * Max value for the input\r\n *\r\n * @default 100\r\n */\r\n max?: number\r\n\r\n /**\r\n * Step value for the input\r\n *\r\n * @default 1\r\n */\r\n step?: number\r\n\r\n /**\r\n * Current value\r\n */\r\n value: number\r\n\r\n /**\r\n * Callback when value changes\r\n */\r\n onChange: InputProps['onChange']\r\n}\r\n\r\nexport function RangeSlider({\r\n label,\r\n size = 'regular',\r\n leftContent,\r\n rightContent,\r\n min = 0,\r\n max = 100,\r\n step = 1,\r\n className,\r\n inputClassName,\r\n ...props\r\n}: RangeSliderProps) {\r\n const [hasTrack, setHasTrack] = useState(false)\r\n const trackRef = useRef(null)\r\n const thumbRef = useRef(null)\r\n\r\n useEffect(() => {\r\n setHasTrack(Boolean(trackRef.current && thumbRef.current))\r\n }, [])\r\n\r\n const thumbLeft = useMemo(() => {\r\n const track = trackRef.current\r\n const thumb = thumbRef.current\r\n const valuePercent = (props.value - min) / (max - min)\r\n\r\n if (!hasTrack || !track || !thumb) return\r\n\r\n const trackBox = track.getBoundingClientRect()\r\n const thumbBox = thumb.getBoundingClientRect()\r\n\r\n return ((valuePercent * (trackBox.width - thumbBox.width)) / trackBox.width) * 100\r\n }, [min, max, props.value, hasTrack])\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { ButtonRoundingType, ButtonThemeType } from '../button'\r\nimport { IconNameType } from '../icon'\r\n\r\nexport enum ToolbarTheme {\r\n chipTransparent, // (default)\r\n alternative,\r\n}\r\n\r\nexport enum ToolbarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n\r\nexport type ToolbarDirectionType = keyof typeof ToolbarDirection\r\n\r\nexport interface IButtonThemeSettings {\r\n className?: string\r\n theme: ButtonThemeType\r\n rounding: ButtonRoundingType\r\n}\r\n\r\nexport interface IToolbarItem {\r\n id: string\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 type ToolbarThemeType = keyof typeof ToolbarTheme\r\n","import * as React from 'react'\r\n\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\nexport interface IToolbarContext {\r\n direction: ToolbarDirection\r\n theme: ToolbarTheme\r\n isWrapped: boolean\r\n isStretched: boolean\r\n isMobile: boolean\r\n}\r\n\r\nexport const ToolbarContext = React.createContext({\r\n direction: ToolbarDirection.vertical,\r\n theme: ToolbarTheme.chipTransparent,\r\n isWrapped: false,\r\n isStretched: false,\r\n isMobile: false,\r\n})\r\n\r\nexport function useToolbarContext() {\r\n return React.useContext(ToolbarContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport throttle from 'lodash.throttle'\r\nimport React from 'react'\r\n\r\nimport { isSafariDesktop } from '../../../app/shared/isMobile'\r\nimport { StatelessDropdown } from '../dropdown'\r\nimport { IToolbarContext, ToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarDirectionType, ToolbarTheme, ToolbarThemeType } from './interfaces'\r\n\r\nconst getToolbarSettings = ({\r\n direction,\r\n isWrapped,\r\n isMobile,\r\n theme,\r\n}: IToolbarContext): React.HTMLProps => {\r\n switch (isWrapped) {\r\n case true:\r\n return {\r\n className: classnames('shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'flex flex-wrap justify-between': direction === ToolbarDirection.vertical,\r\n 'grid border border-gray-100 dark:border-gray-600 p-1.5 gap-1 border-box rounded-md grid-cols-2':\r\n FinvizSettings.hasRedesignEnabled,\r\n }),\r\n }\r\n\r\n default:\r\n return {\r\n className: classnames('flex shrink-0 items-center bg-white dark:bg-gray-800', {\r\n 'p-1.5': !isMobile,\r\n 'space-x-1.5 px-1.5': direction === ToolbarDirection.horizontal && FinvizSettings.hasRedesignEnabled,\r\n 'flex-col overflow-hidden overflow-y-auto [--inset-l:0.5rem] landscape-primary:pl-inset-left':\r\n direction === ToolbarDirection.vertical,\r\n 'space-y-2': direction === ToolbarDirection.vertical && !isMobile,\r\n 'pb-inset-bottom [--inset-b:0.5rem]': theme !== ToolbarTheme.alternative && !isMobile,\r\n 'w-screen space-x-2 overflow-hidden overflow-x-auto':\r\n direction === ToolbarDirection.horizontal && theme !== ToolbarTheme.alternative,\r\n 'overflow-x-hidden': theme === ToolbarTheme.alternative,\r\n }),\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarProps {\r\n /**\r\n * Toolbar direction\r\n *\r\n * @default vertical\r\n */\r\n direction?: ToolbarDirectionType\r\n\r\n /**\r\n * Toolbar buttons theme\r\n *\r\n * @default light\r\n */\r\n theme?: ToolbarThemeType\r\n\r\n /**\r\n * Charts mobile design\r\n *\r\n * @default false\r\n */\r\n isMobile?: boolean\r\n\r\n className?: string\r\n}\r\n\r\nexport function Toolbar({\r\n direction = 'vertical',\r\n theme = 'chipTransparent',\r\n isMobile = false,\r\n children,\r\n className,\r\n}: React.PropsWithChildren) {\r\n const hasFocusRings = React.useRef(false)\r\n const toolbarRef = React.useRef(null)\r\n const contextProviderValue = React.useMemo(\r\n () => ({\r\n direction: ToolbarDirection[direction],\r\n theme: ToolbarTheme[theme],\r\n isWrapped:\r\n ToolbarDirection[direction] === ToolbarDirection.vertical && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isStretched:\r\n ToolbarDirection[direction] === ToolbarDirection.horizontal && ToolbarTheme[theme] === ToolbarTheme.alternative,\r\n isMobile,\r\n }),\r\n [direction, theme, isMobile]\r\n )\r\n const toolbarSettings = getToolbarSettings(contextProviderValue)\r\n\r\n React.useLayoutEffect(() => {\r\n // Workaround for Safari scrollbar bug https://github.com/finvizhq/charts/issues/1038\r\n // Safari injects scrollbar after layout render and doesn't trigger reflow\r\n if (ToolbarTheme[theme] !== ToolbarTheme.alternative && isSafariDesktop()) {\r\n const forceReflow = throttle(() => {\r\n if (toolbarRef.current !== null) {\r\n const originalWidth = toolbarRef.current.style.width\r\n toolbarRef.current.style.width = '0'\r\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\r\n toolbarRef.current.offsetWidth\r\n toolbarRef.current.style.width = originalWidth\r\n }\r\n }, 200)\r\n\r\n forceReflow()\r\n window.addEventListener('resize', forceReflow)\r\n\r\n return () => {\r\n window.removeEventListener('resize', forceReflow)\r\n }\r\n }\r\n }, [theme])\r\n\r\n return (\r\n \r\n \r\n {children}\r\n {\r\n hasFocusRings.current = !!document.querySelector('[data-focus-visible]')\r\n return true\r\n }}\r\n autoFocusOnHide={(el: HTMLElement) => {\r\n // Only call focus when we previously had focus rings to prevent sticky focus rings\r\n if (hasFocusRings.current) el.focus({ preventScroll: true })\r\n hasFocusRings.current = false\r\n return false\r\n }}\r\n />\r\n \r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonHTMLProps, ButtonProps } from '../button'\r\nimport { Delayed } from '../delayed'\r\nimport { Icon } from '../icon'\r\nimport { Spinner } from '../spinner'\r\nimport { PropsWithAs } from '../types'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\n\r\nfunction getButtonThemeSettings({\r\n className,\r\n theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\r\n className: string\r\n theme: ToolbarTheme\r\n isStretched: boolean\r\n isActive?: boolean\r\n isInAction?: boolean\r\n}): Omit & ButtonProps {\r\n const includeRedesign = FinvizSettings.hasRedesignEnabled\r\n switch (theme) {\r\n case ToolbarTheme.alternative:\r\n return {\r\n className: classnames(\r\n className,\r\n {\r\n grow: isStretched,\r\n 'h-10 w-10': !isStretched && !includeRedesign,\r\n 'animate-pulse': isInAction,\r\n },\r\n\r\n !includeRedesign && {\r\n 'active:bg-white disabled:bg-white disabled:text-gray-300 disabled:hover:text-gray-300': true,\r\n 'border border-white text-gray-500 hover:border-gray-100 hover:text-gray-900': !isActive,\r\n 'border border-gray-900 text-gray-900': isActive,\r\n }\r\n ),\r\n theme: includeRedesign ? 'chipTransparent' : 'transparent',\r\n rounding: includeRedesign ? undefined : 'none',\r\n size: isStretched || includeRedesign ? undefined : 'none',\r\n }\r\n default:\r\n return {\r\n className: classnames(\r\n className,\r\n 'border dark:disabled:bg-gray-800 dark:disabled:text-gray-600 disabled:text-gray-300 disabled:bg-white dark:disabled:hover:bg-gray-800 dark:disabled:hover:text-gray-600 disabled:hover:text-gray-300 disabled:hover:bg-white',\r\n {\r\n 'animate-pulse': isInAction,\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !isActive,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-700 dark:text-white': isActive,\r\n }\r\n ),\r\n theme: 'transparent',\r\n rounding: 'small',\r\n }\r\n }\r\n}\r\n\r\nexport interface ToolbarButtonProps extends Omit {\r\n rowId?: number\r\n item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport const ToolbarButton = React.forwardRef(function ToolbarButton(\r\n { item, disabledTooltip, isInAction: isInActionProp, isLoading, ...props }: PropsWithAs & ToolbarButtonProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const context = Ariakit.useMenuContext()\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\r\n className: props.className,\r\n theme,\r\n isStretched,\r\n isActive: props.active,\r\n isInAction: isInAction,\r\n })\r\n\r\n const getMainIcon = () => (\r\n \r\n )\r\n\r\n return (\r\n }\r\n store={context?.menubar || undefined}\r\n blurOnHoverEnd\r\n render={\r\n \r\n {isLoading ? (\r\n \r\n \r\n \r\n ) : (\r\n <>\r\n {props.children ??\r\n (isInAction ? (\r\n \r\n \r\n \r\n ) : (\r\n getMainIcon()\r\n ))}\r\n \r\n )}\r\n \r\n }\r\n />\r\n )\r\n})\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { DropdownItem } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { NativeSelect } from '../select/NativeSelect'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { ToolbarButton } from './toolbar-button'\r\n\r\nconst isMobileBrowser = isMobile()\r\n\r\nexport interface ToolbarGroupProps {\r\n /**\r\n * Main button item\r\n */\r\n defaultItem: IToolbarItem\r\n\r\n /**\r\n * Shows spinner instead of icon\r\n */\r\n isLoading?: boolean\r\n\r\n /**\r\n * Current selected item id\r\n */\r\n isActive: boolean\r\n\r\n /**\r\n * Should indicate some action in progress\r\n */\r\n isInAction?: boolean\r\n\r\n /**\r\n * Array of items\r\n */\r\n groupItems: IToolbarItem[]\r\n\r\n /**\r\n * Expand group button label\r\n */\r\n groupTitle?: string\r\n\r\n /**\r\n * On item select callback\r\n */\r\n onChange: (id: string, trigger: 'button' | 'select' | 'group') => void\r\n\r\n /**\r\n * Use native select for mobile devices\r\n *\r\n * @default true\r\n */\r\n useNativeSelect?: boolean\r\n\r\n /**\r\n * Is item disabled\r\n */\r\n disabled?: boolean\r\n\r\n /**\r\n * Tooltip message if item is disabled\r\n */\r\n disabledTooltip?: string\r\n\r\n rowId?: number\r\n}\r\n\r\nexport const ToolbarGroup = React.forwardRef(function ToolbarGroup(\r\n {\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobileBrowser,\r\n disabled,\r\n disabledTooltip,\r\n rowId,\r\n }: ToolbarGroupProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const [selectedItem, setSelectedItem] = React.useState(defaultItem)\r\n const groupId = groupTitle?.replace(/\\s/g, '-').toLocaleLowerCase()\r\n const isAlternativeTheme = theme === ToolbarTheme.alternative\r\n\r\n // Setup states, pass Menubar context to this menu so we can control the shared menu\r\n const context = Ariakit.useMenuContext()\r\n const menu = Ariakit.useMenuStore({ store: context })\r\n\r\n // We have multiple menu triggers but just one shared menu so we need a way to know which button has been hovered\r\n const [menuButton, setMenuButton] = React.useState(null)\r\n const open = menu.useState((state) => state.mounted && state.anchorElement === menuButton)\r\n\r\n // Find the element to render the menu into using Portal\r\n const parentMenu = menu.useState('contentElement')\r\n const menuContentElement = React.useMemo(() => parentMenu?.querySelector('div'), [parentMenu])\r\n\r\n /**\r\n * Charts prevent bubling mouseover so we need to hide the menu manually\r\n */\r\n const hideMenu = menu.hide\r\n React.useEffect(() => {\r\n const onMouseLeave = () => hideMenu()\r\n\r\n parentMenu?.addEventListener('mouseleave', onMouseLeave)\r\n return () => parentMenu?.removeEventListener('mouseleave', onMouseLeave)\r\n }, [hideMenu, parentMenu])\r\n\r\n const showMenu = menu.show\r\n const handleMenuOpen = React.useCallback(\r\n (ev: React.SyntheticEvent) => {\r\n menu.setDisclosureElement(ev.currentTarget)\r\n menu.setAnchorElement(ev.currentTarget)\r\n showMenu()\r\n },\r\n [menu, showMenu]\r\n )\r\n\r\n const trigger = (\r\n \r\n \r\n \r\n \r\n )\r\n\r\n if (useNativeSelect) {\r\n return (\r\n \r\n {trigger}\r\n ({ value: item.id, label: item.title }))}\r\n onChange={(option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }}\r\n onClick={() => onChange(selectedItem.id, 'select')}\r\n />\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n ) => {\r\n // Preventing this means the dropdown will only open on hover not by a click\r\n ev.preventDefault()\r\n }}\r\n onPointerDown={(ev: React.PointerEvent) => {\r\n // Finally, pre-select the current group tool\r\n onChange(selectedItem.id, 'group')\r\n handleMenuOpen(ev)\r\n }}\r\n />\r\n {open && (\r\n // Render this menu's contents into the parent menu.\r\n }>\r\n {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n rounding={theme === ToolbarTheme.alternative && !FinvizSettings.hasRedesignEnabled ? 'none' : undefined}\r\n onPointerDown={() => {\r\n setSelectedItem(item)\r\n onChange(item.id, 'select')\r\n }}\r\n >\r\n {item.title}\r\n \r\n ))}\r\n \r\n )}\r\n \r\n )\r\n})\r\n","import { PartialBy } from '../../types'\r\nimport { ToolbarButton } from './toolbar-button'\r\nimport { ToolbarGroup, ToolbarGroupProps } from './toolbar-group'\r\n\r\nexport function ToolbarItem({\r\n defaultItem,\r\n isLoading,\r\n isActive,\r\n isInAction,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect,\r\n disabled,\r\n disabledTooltip,\r\n rowId,\r\n}: PartialBy) {\r\n const isItemActive = isActive && !disabled\r\n\r\n if (!!groupItems?.length) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n {\r\n onChange(defaultItem.id, 'button')\r\n }}\r\n />\r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useToolbarContext } from './hooks'\r\nimport { ToolbarDirection, ToolbarTheme } from './interfaces'\r\n\r\ntype ToolbarDividerProps = {\r\n className?: string\r\n}\r\n\r\nexport function ToolbarDivider({ className }: ToolbarDividerProps) {\r\n const { direction, theme } = useToolbarContext()\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Box } from '../box'\r\nimport { Heading, Paragraph } from '../typography'\r\nimport { TourStep } from './types'\r\n\r\nexport function StepContent({ step }: { step: TourStep }) {\r\n return (\r\n \r\n {step.title && (\r\n \r\n {step.title}\r\n \r\n )}\r\n {step.body && {step.body}}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as ReactDOM from 'react-dom/server'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport {\r\n BUTTON_BASE_CLASS,\r\n BUTTON_FOCUS_STYLES,\r\n ButtonPadding,\r\n ButtonRounding,\r\n ButtonSize,\r\n ButtonTheme,\r\n getButtonTheme,\r\n} from '../button'\r\nimport { StepContent } from './step-content'\r\nimport { TourDefinition, TourStep } from './types'\r\n\r\ntype ExcludesFalse = (x: T | false) => x is T\r\n\r\n/**\r\n * Async load Shepherd module when we need it\r\n */\r\nlet shepherdLibrary: typeof Shepherd\r\nexport async function loadShepherdLibrary(setLoading: (state: boolean) => void) {\r\n if (shepherdLibrary) return shepherdLibrary\r\n\r\n try {\r\n setLoading(true)\r\n const shepherdPromise = await import('shepherd.js')\r\n shepherdLibrary = shepherdPromise.default\r\n setLoading(false)\r\n\r\n return shepherdLibrary\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Get buttons based on index in the step array\r\n */\r\nconst buttonClasses = classnames(BUTTON_BASE_CLASS, BUTTON_FOCUS_STYLES, ButtonSize.regular, ButtonRounding.regular)\r\nfunction getStepButtons(tour: Shepherd.Tour, step: TourStep, index: number, arr: TourStep[]) {\r\n return [\r\n {\r\n action: tour.complete,\r\n classes: classnames(buttonClasses, 'mr-auto', getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: 'Exit',\r\n },\r\n index > 0 && {\r\n action: tour.back,\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.light).button, ButtonPadding.regular),\r\n text: step.backButton ?? 'Back',\r\n },\r\n {\r\n classes: classnames(buttonClasses, getButtonTheme(ButtonTheme.blue).button, ButtonPadding.regular),\r\n action: tour.next,\r\n text: step.nextButton ?? (index === arr.length - 1 ? 'Finish' : 'Next'),\r\n },\r\n ].filter(Boolean as unknown as ExcludesFalse)\r\n}\r\n\r\n/**\r\n * Convert tour steps to Shepherd steps\r\n */\r\nexport function processSteps(tour: Shepherd.Tour, steps: TourStep[]): Shepherd.Step.StepOptions[] {\r\n return steps.map((step, index) => ({\r\n attachTo: { element: step.target, on: step.placement ?? 'auto' },\r\n classes: 'z-dialog',\r\n // Add offset\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: step.offset ?? [0, 10],\r\n },\r\n },\r\n ],\r\n },\r\n // Render the body\r\n text: ReactDOM.renderToString(React.createElement(StepContent, { step })),\r\n // Add buttons\r\n buttons: getStepButtons(tour, step, index, steps),\r\n modalOverlayOpeningRadius: step.overlayRadius ?? 8,\r\n modalOverlayOpeningPadding: step.overlayPadding ?? 0,\r\n }))\r\n}\r\n\r\nexport function getTourKey() {\r\n return `tour${window.location.pathname.replace(/[/.]/g, '-')}`\r\n}\r\n\r\nexport function getStepsForUser(tours: TourDefinition[]) {\r\n const lastFinishedTour = localStorage?.getItem(getTourKey())\r\n const lastTourIndex = tours.findIndex((tour) => tour.id === lastFinishedTour)\r\n const allToursViewed = lastTourIndex === tours.length - 1 || tours.slice(lastTourIndex + 1).every((item) => item.skip)\r\n const toursToView = allToursViewed ? tours : tours.slice(lastTourIndex + 1)\r\n const userTour = toursToView.reduce(\r\n (acc, current) =>\r\n current.skip\r\n ? acc\r\n : {\r\n ...acc,\r\n id: current.id,\r\n steps: [...acc.steps, ...current.steps],\r\n },\r\n { id: 'tour', steps: [], initialTour: toursToView[0].id }\r\n )\r\n\r\n return { hasNewTours: !allToursViewed, tour: userTour }\r\n}\r\n\r\nexport function completeTour(key: string) {\r\n localStorage?.setItem(getTourKey(), key)\r\n}\r\n","import * as React from 'react'\r\nimport Shepherd from 'shepherd.js'\r\n\r\nimport { TourDefinition } from './types'\r\nimport * as tourUtils from './utils'\r\n\r\nexport const DEFAULT_OPTIONS = {\r\n exitOnEsc: true,\r\n useModalOverlay: true,\r\n}\r\n\r\n/**\r\n * Hook which controls shepherd.js. The library is lazy-loaded when the tour starts\r\n *\r\n * Returns:\r\n * - `isLoading`: state of the library loading\r\n * - `currentTour`: tour object, only defined after library has loaded\r\n * - `startTour`: load the library and start tour. Returns `currentTour`\r\n * - `getStepsForUser`: returns a list of tour steps based on tours the user finished\r\n * - `completeTour`: persists the last finished tour to local storage\r\n */\r\nexport function useTour(options?: Shepherd.Tour.TourOptions) {\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [currentTour, setTour] = React.useState(null)\r\n\r\n /**\r\n * We’re loading shepherd asynchronously and want to have loading state so we use\r\n * AbortController to check if the component is still mounted.\r\n */\r\n const controller = React.useRef('AbortController' in window ? new AbortController() : undefined)\r\n const loadingSetter = React.useRef((state: boolean) => {\r\n if (controller.current?.signal.aborted) return\r\n\r\n setIsLoading(state)\r\n })\r\n // Cleanup effect to abort the controller\r\n React.useEffect(() => () => controller.current?.abort(), [])\r\n\r\n const startTour = React.useCallback(\r\n async (definition: TourDefinition, setComplete = true) => {\r\n const shepherdLibrary = await tourUtils.loadShepherdLibrary(loadingSetter.current)\r\n\r\n if (shepherdLibrary && !controller.current?.signal.aborted) {\r\n const tour = currentTour ?? new shepherdLibrary.Tour({ ...DEFAULT_OPTIONS, ...options })\r\n\r\n if (!currentTour) setTour(tour)\r\n\r\n // Reset the tour steps in case they were updated\r\n Array.from(tour.steps).forEach((step) => tour.removeStep(step.id))\r\n\r\n const processedSteps = tourUtils.processSteps(tour, definition.steps)\r\n tour.addSteps(processedSteps)\r\n\r\n if (setComplete) {\r\n tourUtils.completeTour(definition.id)\r\n }\r\n\r\n tour.start()\r\n window.gtag?.('event', 'tour-start', { event_label: definition.initialTour ?? definition.id })\r\n\r\n return tour\r\n }\r\n },\r\n [currentTour, options]\r\n )\r\n\r\n return {\r\n isLoading,\r\n currentTour,\r\n startTour,\r\n getStepsForUser: tourUtils.getStepsForUser,\r\n completeTour: tourUtils.completeTour,\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\r\nimport * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps } from '../button'\r\nimport { Icon, IconNameType, isValidIconName } from '../icon'\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum TabSpacing {\r\n xxsmall = 'space-x-0.5', // 2px spacing\r\n xsmall = 'space-x-1', // 4px spacing\r\n none = 'space-x-1.5', // 6px spacing\r\n small = 'space-x-1.5', // 6px spacing\r\n regular = 'space-x-1.5', // 6px spacing\r\n medium = 'space-x-2', // 8px spacing\r\n large = 'space-x-2', // 8px spacing\r\n}\r\n\r\nfunction getRightContent(content: JSX.Element | IconNameType | undefined, isActive: boolean) {\r\n if (isValidIconName(content)) return \r\n else if (React.isValidElement(content))\r\n return React.cloneElement(content as React.ReactElement<{ active: boolean }>, {\r\n active: isActive,\r\n })\r\n else return content\r\n}\r\n\r\nconst InternalTab = React.forwardRef(function InternalTab<\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n {\r\n rounding = 'none',\r\n theme = 'tab',\r\n size = 'medium',\r\n 'aria-selected': ariaSelected,\r\n children,\r\n ...props\r\n }: Omit, 'theme'>,\r\n ref: React.ForwardedRef\r\n) {\r\n const spacing = TabSpacing[size]\r\n const active = Boolean(ariaSelected)\r\n const rightContent = getRightContent(props.rightContent, active)\r\n\r\n return (\r\n )}\r\n ref={ref}\r\n active={active}\r\n theme={theme}\r\n size={size}\r\n rounding={rounding}\r\n rightContent={undefined}\r\n className={classNames('group/badge', props.className)}\r\n contentClass={classNames(spacing, 'flex', props.contentClass)}\r\n >\r\n {children}\r\n {rightContent}\r\n \r\n )\r\n})\r\n\r\nexport function Tab(\r\n props: React.PropsWithChildren>\r\n) {\r\n return } />\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classNames from 'classnames'\r\n\r\nexport function TabList(props: Ariakit.TabListProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function TabPanel(props: Ariakit.TabPanelProps) {\r\n return \r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport React from 'react'\r\n\r\nexport function Tabs({ children }: React.PropsWithChildren) {\r\n return (\r\n \r\n
{children}
\r\n
\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nenum BadgeSize {\r\n small = 'h-4 min-w-4', // 16px height\r\n medium = 'h-5 min-w-5', // 20px height\r\n}\r\ntype BadgeSizeType = keyof typeof BadgeSize\r\n\r\nenum BadgePadding {\r\n small = 'px-[5px] py-0', // 16px height\r\n medium = 'px-1.5 py-0.5', // 20px height\r\n}\r\ntype BadgePaddingType = keyof typeof BadgePadding\r\n\r\ntype BadgeProps = {\r\n size?: BadgeSizeType\r\n padding?: BadgePaddingType\r\n active?: boolean\r\n}\r\n\r\nexport function Badge({ size = 'medium', padding = size, active, children }: React.PropsWithChildren) {\r\n const badgePadding = BadgePadding[padding]\r\n const badgeSize = BadgeSize[size]\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport * as React from 'react'\r\n\r\nimport { Input, InputComponentProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipProps, TooltipTrigger } from './tooltip'\r\n\r\ninterface TooltipSettingsProps\r\n extends Pick,\r\n Pick {\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\ninterface TooltipInputProps extends InputComponentProps {\r\n /**\r\n * Optimization to turn off the tooltip functionality if the input isn’t visible on screen\r\n *\r\n * @default true\r\n */\r\n isInteractive?: boolean\r\n\r\n /**\r\n * Settings for Tooltip component and useTooltipStore\r\n */\r\n tooltipSettings?: TooltipSettingsProps\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n { tooltipSettings, isInteractive = true, name, children, ...props }: React.PropsWithChildren,\r\n ref: React.ForwardedRef\r\n) {\r\n const { color, gutter, placement = 'bottom', isPointerEventsEnabled } = tooltipSettings ?? {}\r\n\r\n const input = \r\n\r\n if (!isInteractive || !children) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n \r\n \r\n {children}\r\n \r\n \r\n )\r\n}\r\n\r\nexport const TooltipInput = React.forwardRef(TooltipInputComponent)\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Notification, useNotification } from '../components/notification'\r\nimport { Paragraph } from '../components/typography'\r\nimport { useIsMounted } from '../hooks/use-is-mounted'\r\nimport { importWithRetry } from './import-with-retry'\r\n\r\nconst cache: any = {}\r\nconst errorsCache: any = {}\r\n\r\nenum ErrorSeverity {\r\n medium,\r\n high,\r\n}\r\n\r\nfunction defaultCaptureException(exception: Error, captureContext?: { extra: Record }) {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error(exception)\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport interface ControlledModuleConfig {\r\n /**\r\n * Suspense mode shouldn’t be used together with controlled loading as it could lead to bugs.\r\n * If you know what you’re doing, add an ignore comment explaining the decision\r\n */\r\n isSuspenseMode?: never\r\n shouldLoadModule?: boolean\r\n}\r\nexport interface SuspenseModuleConfig {\r\n /**\r\n * Controlled loading shouldn’t be used together with suspense mode as it could lead to bugs.\r\n * If you know what you’re doing, add an ignore comment explaining the decision\r\n */\r\n shouldLoadModule?: never\r\n isSuspenseMode?: SuspenseMode\r\n}\r\n\r\n/**\r\n * Hook used to asynchronously load a module\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\r\n */\r\nexport function useAsyncModule({\r\n importFn,\r\n onError,\r\n errorSeverity,\r\n cacheKey,\r\n captureException = defaultCaptureException,\r\n shouldLoadModule = false,\r\n isSuspenseMode = false as SuspenseMode,\r\n}: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n errorSeverity?: keyof typeof ErrorSeverity\r\n captureException?: typeof defaultCaptureException\r\n} & (ControlledModuleConfig | SuspenseModuleConfig)) {\r\n const notificationContext = useNotification()\r\n const [isLoading, setIsLoading] = React.useState(null)\r\n const [isError, setIsError] = React.useState(false)\r\n const getIsMounted = useIsMounted()\r\n\r\n const handleError = () => {\r\n onError?.()\r\n setIsError(true)\r\n\r\n if (errorSeverity === undefined) {\r\n return\r\n }\r\n\r\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.high) {\r\n window.handleScriptNotLoaded()\r\n window.renderScriptNotLoaded()\r\n }\r\n\r\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.medium) {\r\n notificationContext.show(\r\n \r\n \r\n One or more of the required application components couldn’t be loaded.
Please try to repeat the\r\n action or{' '}\r\n window.location.reload()}>\r\n refresh the page\r\n {' '}\r\n if the problem persists.\r\n
\r\n
\r\n )\r\n }\r\n }\r\n\r\n const loadModule = async () => {\r\n if (cache[cacheKey]) {\r\n return cache[cacheKey]\r\n }\r\n\r\n setIsLoading(true)\r\n\r\n try {\r\n cache[cacheKey] = await importWithRetry(importFn)\r\n } catch (error) {\r\n captureException(error as Error)\r\n handleError()\r\n } finally {\r\n if (getIsMounted()) {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return cache[cacheKey]\r\n }\r\n\r\n React.useEffect(() => {\r\n if (shouldLoadModule) {\r\n loadModule()\r\n }\r\n // We want to run it only on shouldLoadModule change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldLoadModule])\r\n\r\n const cachedModule = cache[cacheKey]\r\n if (isSuspenseMode) {\r\n if (errorsCache[cacheKey]) throw errorsCache[cacheKey]\r\n if (!cachedModule) {\r\n throw importFn()\r\n .then((mod) => (cache[cacheKey] = mod))\r\n .catch((err) => {\r\n handleError()\r\n errorsCache[cacheKey] = err\r\n })\r\n }\r\n }\r\n\r\n return [cachedModule ?? null, { isLoading: !!cachedModule ? false : isLoading, loadModule, isError }] as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n}\r\n\r\n/**\r\n * HOC which wraps component in React.Suspense\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\r\n */\r\nexport function withSuspense

>(\r\n Component: React.ComponentType

,\r\n fallback: React.ReactNode = null\r\n) {\r\n return function WrappedComponent(props: P) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n","const NUM_OF_RETRIES = 3\r\n\r\nexport function importWithRetry(importFn: () => Promise, retries = 0) {\r\n const result = importFn().catch(async (err) => {\r\n if (retries > NUM_OF_RETRIES) {\r\n throw err\r\n }\r\n\r\n await new Promise((r) => setTimeout(r, 1000 * retries))\r\n\r\n return importWithRetry(importFn, retries + 1)\r\n }) as Promise\r\n\r\n return result\r\n}\r\n","export default class ElementBaseConfig {\r\n static type: string\r\n static abbreviation: string\r\n static label: string\r\n static shortLabel: string\r\n static optionsOrder: readonly string[]\r\n static optionsLabels: { [key: string]: string }\r\n static inputsOrder: readonly string[]\r\n static inputsLabels: { [key: string]: string }\r\n static calculatedValuesOrder: readonly string[]\r\n static calculatedValuesLabels: { [key: string]: string }\r\n static defaultCalculatedValueOption?: string\r\n\r\n static getShortLabelWithAttrs: (attrs: ObjectHash) => string\r\n static getDefaultCalculatedValues: () => { [key: string]: number[] }\r\n\r\n get type() {\r\n return (this.constructor as typeof ElementBaseConfig).type\r\n }\r\n\r\n get abbreviation() {\r\n return (this.constructor as typeof ElementBaseConfig).abbreviation\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof ElementBaseConfig).label\r\n }\r\n\r\n get shortLabel() {\r\n return (this.constructor as typeof ElementBaseConfig).shortLabel\r\n }\r\n\r\n get optionsOrder() {\r\n return (this.constructor as typeof ElementBaseConfig).optionsOrder\r\n }\r\n\r\n get optionsLabels() {\r\n return (this.constructor as typeof ElementBaseConfig).optionsLabels\r\n }\r\n\r\n get inputsOrder() {\r\n return (this.constructor as typeof ElementBaseConfig).inputsOrder\r\n }\r\n\r\n get inputsLabels() {\r\n return (this.constructor as typeof ElementBaseConfig).inputsLabels\r\n }\r\n\r\n get calculatedValuesOrder() {\r\n return (this.constructor as typeof ElementBaseConfig).calculatedValuesOrder\r\n }\r\n\r\n get calculatedValuesLabels() {\r\n return (this.constructor as typeof ElementBaseConfig).calculatedValuesLabels\r\n }\r\n\r\n get defaultCalculatedValueOption() {\r\n return (this.constructor as typeof ElementBaseConfig).defaultCalculatedValueOption\r\n }\r\n\r\n get getShortLabelWithAttrs() {\r\n return (this.constructor as typeof ElementBaseConfig).getShortLabelWithAttrs\r\n }\r\n\r\n get getDefaultCalculatedValues() {\r\n return (this.constructor as typeof ElementBaseConfig).getDefaultCalculatedValues\r\n }\r\n}\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IArrowAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Arrow extends Element {\r\n static type = CanvasElementType.arrow\r\n\r\n declare scaled: Pick\r\n name = 'Arrow'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 3,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineCap', 'round')\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const angle = Math.PI / 8\r\n const d = 20\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\r\n const h = Math.abs(d / Math.cos(angle))\r\n\r\n const angle1 = lineAngle + angle\r\n const topx = roundedXY.x1 + Math.cos(angle1) * h\r\n const topy = roundedXY.y1 + Math.sin(angle1) * h\r\n const angle2 = lineAngle - angle\r\n const botx = roundedXY.x1 + Math.cos(angle2) * h\r\n const boty = roundedXY.y1 + Math.sin(angle2) * h\r\n\r\n context.beginPath()\r\n context.moveTo(topx, topy)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(botx, boty)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nArrow.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Arrow\r\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element, { EdgeValues } from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport type BrushPoints = Array<[x: number, y: number]>\r\n\r\nexport interface IBrushAttrs {\r\n points: BrushPoints\r\n fill: string\r\n border: DrawingBorder\r\n isPolyLineClosed: boolean\r\n positionPointsTimestamps: BrushPoints\r\n}\r\n\r\nclass Brush extends Element {\r\n static type = CanvasElementType.brushV1\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n\r\n name = 'Brush'\r\n\r\n brushPath: Path2D | null = null\r\n\r\n cachedFill = {\r\n previousFill: '',\r\n shouldRenderFill: false,\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this.setFillCache()\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultTransparentFill,\r\n border: {\r\n width: 3,\r\n color: ElementSettings.Colors.border,\r\n },\r\n isPolyLineClosed: false,\r\n } as Partial\r\n }\r\n\r\n setFillCache() {\r\n this.cachedFill.previousFill = this.attrs.fill\r\n if (this.attrs.fill.length === 9) {\r\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\r\n } else {\r\n this.cachedFill.shouldRenderFill = true\r\n }\r\n }\r\n\r\n getShouldRenderFill() {\r\n if (this.attrs.fill !== this.cachedFill.previousFill) {\r\n this.setFillCache()\r\n }\r\n return this.cachedFill.shouldRenderFill\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (this.attrs.border != null) {\r\n context.set('strokeStyle', this.attrs.border.color)\r\n }\r\n context.set('lineCap', 'round')\r\n context.set('lineJoin', 'round')\r\n\r\n const brushPath = new Path2D()\r\n const { points } = this.attrs\r\n context.beginPath()\r\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\r\n let i\r\n if (points.length > 3) {\r\n for (i = 0; i < points.length - 2; i++) {\r\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\r\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\r\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\r\n }\r\n brushPath.quadraticCurveTo(\r\n this.fx(points[i][0]),\r\n this.fy(points[i][1]),\r\n this.fx(points[i + 1][0]),\r\n this.fy(points[i + 1][1])\r\n )\r\n } else {\r\n for (const point of points) {\r\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\r\n }\r\n }\r\n\r\n if (this.attrs.isPolyLineClosed) {\r\n brushPath.closePath()\r\n }\r\n this.brushPath = brushPath\r\n if (this.attrs.fill && this.getShouldRenderFill()) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.fill(brushPath)\r\n }\r\n if (this.attrs?.border?.width) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.stroke(brushPath)\r\n }\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n const [firstX, firstY] = this.attrs.points[0]\r\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\r\n\r\n return [\r\n new Thumb(\r\n 'first',\r\n () => firstX,\r\n () => firstY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'last',\r\n () => lastX,\r\n () => lastY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n moveByThumb = ({ difX, difY }: RequireByKey) => {\r\n this.moveBy(difX, difY)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n if (this.getIsCreator()) return\r\n for (const point of this.attrs.points) {\r\n point[0] += x\r\n point[1] += y\r\n }\r\n }\r\n\r\n onMouseUp() {\r\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\r\n for (const point of this.attrs.points) {\r\n point[0] = this.roundToFixed(point[0], 2)\r\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\r\n }\r\n super.onMouseUp()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { points } = this.attrs\r\n if (\r\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\r\n this.brushPath &&\r\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\r\n ) {\r\n return true\r\n } else if (points.length > 1) {\r\n for (let i = 0; i < points.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(points[i][0]),\r\n y1: this.fy(points[i][1]),\r\n x2: this.fx(points[i + 1][0]),\r\n y2: this.fy(points[i + 1][1]),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionPointsTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\r\n this.set({ points } as Partial)\r\n }\r\n\r\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\r\n\r\n roundY = (y: number, domainDiff: number) => {\r\n if (domainDiff < 1) {\r\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\r\n if (numberOfLeadingZeros > 0) {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\r\n } else {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\r\n }\r\n } else if (domainDiff < 10) {\r\n return this.roundToFixed(y, 3)\r\n }\r\n return this.roundToFixed(y, 2)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(([x, y]) => {\r\n edgeXYValues.minX = Math.min(x, edgeXYValues.minX ?? x)\r\n edgeXYValues.minY = Math.min(y, edgeXYValues.minY ?? y)\r\n edgeXYValues.maxX = Math.max(x, edgeXYValues.maxX ?? x)\r\n edgeXYValues.maxY = Math.max(y, edgeXYValues.maxY ?? y)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nBrush.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\r\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\r\n ],\r\n}\r\n\r\nexport default Brush\r\n","import math from '../../helpers/math'\r\n\r\ninterface ICoordinates {\r\n x: number\r\n y: number\r\n}\r\nexport interface IRectangleSidesCoordinates {\r\n topLeft: ICoordinates\r\n topRight: ICoordinates\r\n rightTop: ICoordinates\r\n rightBottom: ICoordinates\r\n bottomRight: ICoordinates\r\n bottomLeft: ICoordinates\r\n leftBottom: ICoordinates\r\n leftTop: ICoordinates\r\n}\r\n\r\nexport interface ITailCoordinates {\r\n tailRoot: ICoordinates\r\n tailTip: ICoordinates\r\n}\r\n\r\nexport enum TailDirection {\r\n noTail,\r\n topLeftCorner,\r\n topRightCorner,\r\n bottomLeftCorner,\r\n bottomRightCorner,\r\n topSide,\r\n rightSide,\r\n bottomSide,\r\n leftSide,\r\n}\r\n\r\nexport const getRectangleSidesCoordinates = ({\r\n padding,\r\n radius,\r\n x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n}: {\r\n padding: number\r\n radius: number\r\n x2: number\r\n y2: number\r\n textWidth: number\r\n measuredHeight: number\r\n}): IRectangleSidesCoordinates => ({\r\n topLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 - padding,\r\n },\r\n topRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 - padding,\r\n },\r\n rightTop: {\r\n x: x2 + textWidth + padding,\r\n y: y2 - padding + radius,\r\n },\r\n rightBottom: {\r\n x: x2 + textWidth + padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n bottomRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n bottomLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n leftBottom: {\r\n x: x2 - padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n leftTop: {\r\n x: x2 - padding,\r\n y: y2 - padding + radius,\r\n },\r\n})\r\n\r\nexport const getTailCoordinates = ({\r\n rectangleSides,\r\n x1,\r\n y1,\r\n}: {\r\n rectangleSides: IRectangleSidesCoordinates\r\n x1: number\r\n y1: number\r\n}): ITailCoordinates => ({\r\n tailRoot: {\r\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\r\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\r\n },\r\n tailTip: {\r\n x: x1,\r\n y: y1,\r\n },\r\n})\r\n\r\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\r\n const dist = math.distance(p1, p2)\r\n if (dist < halfWidth * 2) {\r\n return dist / 2\r\n } else {\r\n return halfWidth\r\n }\r\n}\r\n\r\nexport const getTailToSideIntersection = ({\r\n tail,\r\n rectangleSides,\r\n}: {\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n}): TailDirection => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\r\n return TailDirection.topLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\r\n return TailDirection.topRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\r\n return TailDirection.bottomLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\r\n return TailDirection.bottomRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\r\n return TailDirection.topSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\r\n return TailDirection.rightSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\r\n return TailDirection.bottomSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\r\n return TailDirection.leftSide\r\n } else {\r\n return TailDirection.noTail\r\n }\r\n}\r\n\r\ninterface IRenderCallout {\r\n context: any\r\n radius: number\r\n requiredTailHalfWidth: number\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n tailDirection: TailDirection\r\n}\r\n\r\nexport const renderCallout = ({\r\n context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n}: IRenderCallout): void => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n\r\n // draw rounded rectangle from top left corner clockwise\r\n // !!! ORDER OF RENDER MATTERS !!!\r\n\r\n // renderTopLeftCorner\r\n if (tailDirection === TailDirection.topLeftCorner) {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x, topLeft.y)\r\n } else {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\r\n }\r\n\r\n // renderTopLine\r\n if (tailDirection === TailDirection.topSide) {\r\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\r\n if (!tailLineToTopLineIntersection) {\r\n context.lineTo(topRight.x, topRight.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\r\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\r\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n } else {\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n\r\n // renderTopRightCorner\r\n if (tailDirection === TailDirection.topRightCorner) {\r\n context.lineTo(topRight.x, topRight.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y)\r\n } else {\r\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\r\n }\r\n\r\n // renderRightLine\r\n if (tailDirection === TailDirection.rightSide) {\r\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\r\n if (!tailLineToRightLineIntersection) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\r\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\r\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\r\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n } else {\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n } else {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n\r\n // renderBottomRightCorner\r\n if (tailDirection === TailDirection.bottomRightCorner) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x, bottomRight.y)\r\n } else {\r\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\r\n }\r\n\r\n // renderBottomLine\r\n if (tailDirection === TailDirection.bottomSide) {\r\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\r\n tailTip,\r\n tailRoot,\r\n bottomLeft,\r\n bottomRight\r\n )\r\n if (!tailLineToBottomLineIntersection) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\r\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\r\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n } else {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n\r\n // renderBottomLeftCorner\r\n if (tailDirection === TailDirection.bottomLeftCorner) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y)\r\n } else {\r\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\r\n }\r\n\r\n // renderLeftLine\r\n if (tailDirection === TailDirection.leftSide) {\r\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\r\n if (!tailLineToLeftLineIntersection) {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\r\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\r\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\r\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n } else {\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n } else {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n}\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\r\nimport { PADDING } from '../../constants/common'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\nimport {\r\n getRectangleSidesCoordinates,\r\n getTailCoordinates,\r\n getTailToSideIntersection,\r\n renderCallout,\r\n} from './callout_utils'\r\n\r\nexport interface ICalloutAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\r\n\r\nclass Callout extends Text {\r\n static type = CanvasElementType.calloutV1\r\n\r\n name = 'Callout'\r\n\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare isActualBoundingBoxAvailable: boolean\r\n declare lastAttrs: Attrs\r\n declare scaled: Pick\r\n declare measuredHeight: number\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tail',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n },\r\n ],\r\n }\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n text: '',\r\n font: {\r\n size: 15,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n fillStyle: ElementSettings.Colors.textWithoutBackground,\r\n lineHeight: 15,\r\n // left | right | center | start | end\r\n textAlign: 'left',\r\n // top | middle | alphabetic | bottom\r\n textBaseline: 'alphabetic',\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n background: ElementSettings.defaultFill,\r\n border: { color: ElementSettings.Colors.line, width: 1 },\r\n } as Partial\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y2 + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\r\n this.context.fillText(this.lines[i].text, this.scaled.x2 + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n getCalloutProperties() {\r\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\r\n const requiredTailHalfWidth = this.attrs.font.size * 0.5\r\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\r\n const radius = textWidth < requiredTailHalfWidth ? textWidth / 2 : requiredTailHalfWidth\r\n\r\n const measuredHeight = this.measuredHeight < requiredTailHalfWidth ? radius * 2 : this.measuredHeight\r\n const y2 = this.scaled.y2 - (this.lines?.[0]?.metrics.actualBoundingBoxAscent || measuredHeight)\r\n\r\n // Points diagram\r\n //.......X-----------------X.......\r\n //.................................\r\n //...X.........................X...\r\n //...|.........................|...\r\n //...|.........................|...\r\n //...X.........................X...\r\n //.................................\r\n //.......X-----------------X.......\r\n\r\n const rectangleSides = getRectangleSidesCoordinates({\r\n padding,\r\n radius,\r\n x2: this.scaled.x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n })\r\n const tail = getTailCoordinates({ rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\r\n const tailDirection = getTailToSideIntersection({ tail, rectangleSides })\r\n\r\n return {\r\n radius,\r\n requiredTailHalfWidth,\r\n rectangleSides,\r\n tail,\r\n tailDirection,\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { radius, requiredTailHalfWidth, tail, tailDirection, rectangleSides } = this.getCalloutProperties()\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.lineJoin = 'round'\r\n renderCallout({\r\n context: this.context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n })\r\n this.context.closePath()\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // is in rectangle\r\n const { tail, rectangleSides, requiredTailHalfWidth } = this.getCalloutProperties()\r\n if (\r\n this.lines &&\r\n rectangleSides &&\r\n rectangleSides.leftTop.x < area.scaled.x &&\r\n rectangleSides.topLeft.y < area.scaled.y &&\r\n rectangleSides.rightBottom.x > area.scaled.x &&\r\n rectangleSides.bottomRight.y > area.scaled.y\r\n ) {\r\n return true\r\n }\r\n // is in tail\r\n if (tail) {\r\n const tailP1 = math.perpendicularPointToLine({\r\n distance: requiredTailHalfWidth,\r\n line: { x1: tail.tailTip.x, y1: tail.tailTip.y, x2: tail.tailRoot.x, y2: tail.tailRoot.y },\r\n })\r\n const pointOffsetX = tailP1.x - tail.tailRoot.x\r\n const pointOffsetY = tailP1.y - tail.tailRoot.y\r\n const tailP2 = { x: tail.tailRoot.x + -1 * pointOffsetX, y: tail.tailRoot.y + -1 * pointOffsetY }\r\n const polygon = [tail.tailTip, tailP1, tailP2]\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tail') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n }\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator() || !this.lines) {\r\n return true\r\n }\r\n\r\n const { tail, rectangleSides } = this.getCalloutProperties()\r\n\r\n return [...Object.values(rectangleSides), tail.tailRoot, tail.tailTip].some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n )\r\n }\r\n}\r\n\r\nexport default Callout\r\n","import { Bezier } from 'bezier-js'\r\n\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ICurveAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Curve extends Element {\r\n static type = CanvasElementType.curve\r\n\r\n name = 'Curve'\r\n declare scaled: Pick\r\n declare curve: Bezier\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3 || this.attrs.x2,\r\n () => this.attrs.y3 || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\r\n const { points } = curve\r\n context.beginPath()\r\n context.moveTo(points[0].x, points[0].y)\r\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\r\n context.stroke()\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if (!x3 || !y3) {\r\n context.beginPath()\r\n context.moveTo(x1, y1)\r\n context.lineTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n context.stroke()\r\n } else {\r\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\r\n this.drawQuadraticCurve(context, this.curve)\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.x3 += x\r\n this.attrs.cp1x += x\r\n this.attrs.cp2x += x\r\n\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n this.attrs.y3 += y\r\n this.attrs.cp1y += y\r\n this.attrs.cp2y += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n if (!x3 || !y3) {\r\n return true\r\n }\r\n const isInView =\r\n Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5).points.some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n ) ?? true\r\n\r\n return isInView\r\n }\r\n}\r\n\r\nCurve.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Curve\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n width: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface ICoordinates {\r\n topCenterX: number\r\n topCenterY: number\r\n topRightX: number\r\n topRightY: number\r\n topLeftX: number\r\n topLeftY: number\r\n centerLeftX: number\r\n centerLeftY: number\r\n centerRightX: number\r\n centerRightY: number\r\n bottomCenterX: number\r\n bottomCenterY: number\r\n bottomLeftX: number\r\n bottomLeftY: number\r\n bottomRightX: number\r\n bottomRightY: number\r\n}\r\n\r\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current Ellipse tool located in ellipse folder\r\nclass Ellipse extends Element {\r\n static type = CanvasElementType.ellipse\r\n\r\n name = 'Ellipse'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'x1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'x2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'lw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const c = this.getCoordinates()\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\r\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\r\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\r\n context.closePath()\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'x1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'x2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'lw':\r\n this.attrs.width += difX\r\n break\r\n case 'rw':\r\n this.attrs.width -= difX\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getCoordinates(): ICoordinates {\r\n // TODO cache?\r\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\r\n const rotationAngle =\r\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\r\n\r\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\r\n const radiusX = this.scaled.width / 2\r\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\r\n if (this.scaled.y1 === this.scaled.y2) {\r\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\r\n }\r\n\r\n const width_two_thirds = (radiusX * 4) / 3\r\n\r\n const dx1 = Math.sin(rotationAngle) * radiusY\r\n const dy1 = Math.cos(rotationAngle) * radiusY\r\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\r\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\r\n\r\n const x = this.scaled.x1 + dx1\r\n const y = this.scaled.y1 - dy1\r\n\r\n const topCenterX = x - dx1\r\n const topCenterY = y + dy1\r\n const topRightX = topCenterX + dx2\r\n const topRightY = topCenterY + dy2\r\n const topLeftX = topCenterX - dx2\r\n const topLeftY = topCenterY - dy2\r\n\r\n const bottomCenterX = x + dx1\r\n const bottomCenterY = y - dy1\r\n const bottomRightX = bottomCenterX + dx2\r\n const bottomRightY = bottomCenterY + dy2\r\n const bottomLeftX = bottomCenterX - dx2\r\n const bottomLeftY = bottomCenterY - dy2\r\n\r\n const centerRightX = x + dx2\r\n const centerRightY = y + dy2\r\n const centerLeftX = x - dx2\r\n const centerLeftY = y - dy2\r\n\r\n return {\r\n topCenterX,\r\n topCenterY,\r\n topRightX,\r\n topRightY,\r\n topLeftX,\r\n topLeftY,\r\n centerLeftX,\r\n centerLeftY,\r\n centerRightX,\r\n centerRightY,\r\n bottomCenterX,\r\n bottomCenterY,\r\n bottomLeftX,\r\n bottomLeftY,\r\n bottomRightX,\r\n bottomRightY,\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const c = this.getCoordinates()\r\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\r\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\r\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\r\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipse.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Ellipse\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\r\n\r\nexport interface IRotatedRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n height: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current RotatedRectangle tool located in rotated_rectangle folder\r\nclass RotatedRectangle extends Element {\r\n static type = CanvasElementType.rotatedRectangle\r\n\r\n name = 'Rotated rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n const x = this.model.scale.x.invert\r\n const y = this.model.scale.y.invert\r\n this._thumbs = [\r\n new Thumb(\r\n 'ml',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'mr',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => x(this.getRectCoordinates()[0][0]),\r\n () => y(this.getRectCoordinates()[0][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tr',\r\n () => x(this.getRectCoordinates()[1][0]),\r\n () => y(this.getRectCoordinates()[1][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bl',\r\n () => x(this.getRectCoordinates()[2][0]),\r\n () => y(this.getRectCoordinates()[2][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => x(this.getRectCoordinates()[3][0]),\r\n () => y(this.getRectCoordinates()[3][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n const coords = this.getRectCoordinates()\r\n for (const point of coords) {\r\n context.lineTo(point[0], point[1])\r\n }\r\n context.lineTo(coords[0][0], coords[0][1])\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(): RotatedRectangleCoordiantes {\r\n const mx1 = this.scaled.x1\r\n const mx2 = this.scaled.x2\r\n const my1 = this.scaled.y1\r\n const my2 = this.scaled.y2\r\n const { height } = this.scaled\r\n\r\n const k = (my2 - my1) / (mx2 - mx1)\r\n const nk = -1 / k\r\n\r\n const sign = my1 > my2 ? 1 : -1\r\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\r\n const dy = nk * dx\r\n\r\n let x1 = mx1 - dx\r\n let y1 = my1 - dy\r\n let x2 = mx2 - dx\r\n let y2 = my2 - dy\r\n\r\n let x3 = mx2 + dx\r\n let y3 = my2 + dy\r\n let x4 = mx1 + dx\r\n let y4 = my1 + dy\r\n\r\n if (my1 === my2) {\r\n x1 = mx1\r\n y1 = my1 - height / 2\r\n x2 = mx2\r\n y2 = my2 - height / 2\r\n\r\n x3 = mx2\r\n y3 = my2 + height / 2\r\n x4 = mx1\r\n y4 = my1 + height / 2\r\n }\r\n\r\n return [\r\n [x1, y1],\r\n [x2, y2],\r\n [x3, y3],\r\n [x4, y4],\r\n ]\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'ml':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'mr':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'tl':\r\n case 'tr':\r\n this.attrs.height += difY\r\n break\r\n case 'bl':\r\n case 'br':\r\n this.attrs.height -= difY\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coords = this.getRectCoordinates()\r\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangle\r\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ISymbolAttrs {\r\n x1: number\r\n scaleX: number\r\n y1: number\r\n scaleY: number\r\n angle: number\r\n fill: string\r\n symbol: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass SymbolElement extends Element {\r\n static type = CanvasElementType.symbol\r\n\r\n name = 'Symbol'\r\n\r\n declare textWidth: number\r\n declare textHeight: number\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n const sx = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\r\n const sy = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\r\n this._thumbs = [\r\n new Thumb(\r\n 'xr',\r\n () => this.model.scale.x.invert(sx(+1).x),\r\n () => this.model.scale.y.invert(sx(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'xl',\r\n () => this.model.scale.x.invert(sx(-1).x),\r\n () => this.model.scale.y.invert(sx(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yt',\r\n () => this.model.scale.x.invert(sy(+1).x),\r\n () => this.model.scale.y.invert(sy(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yb',\r\n () => this.model.scale.x.invert(sy(-1).x),\r\n () => this.model.scale.y.invert(sy(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.attrs.angle = this.attrs.angle || 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('font', '36px FontAwesome')\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('textAlign', 'left')\r\n context.set('textBaseline', 'top')\r\n\r\n this.textWidth = context.measureText(this.attrs.symbol).width\r\n this.textHeight = 36\r\n const xScale = this.attrs.scaleX\r\n const yScale = this.attrs.scaleY\r\n\r\n const xOffset = this.textWidth / -2\r\n const yOffset = this.textHeight / -2\r\n\r\n context.save()\r\n context.translate(this.scaled.x1, this.scaled.y1)\r\n context.rotate(this.attrs.angle)\r\n context.scale(xScale, yScale)\r\n context.fillText(this.attrs.symbol, xOffset, yOffset)\r\n context.restore()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRotatedCoordinates(x: number, y: number) {\r\n const cx = this.scaled.x1\r\n const cy = this.scaled.y1\r\n const dx = x - cx\r\n const dy = y - cy\r\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\r\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\r\n return { x: cx + rx, y: cy + ry }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n return (this.attrs.y1 += y)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'xl':\r\n this.attrs.scaleX -= difX\r\n break\r\n case 'xr':\r\n this.attrs.scaleX += difX\r\n break\r\n case 'yt':\r\n this.attrs.scaleY -= difY\r\n break\r\n case 'yb':\r\n this.attrs.scaleY += difY\r\n break\r\n case 'c':\r\n this.attrs.angle += difX / 5\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\r\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\r\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\r\n\r\nSymbolElement.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\r\n}\r\n\r\nexport default SymbolElement\r\n","import { CanvasElementType } from '../constants/common'\r\nimport arrow from './arrow'\r\nimport brush_v1 from './brush/brush_v1'\r\nimport callout_v1 from './callout/callout_v1'\r\nimport curve from './curve'\r\nimport element from './element'\r\nimport elliottWaves from './elliott_waves/elliott_waves'\r\nimport ellipse from './ellipse'\r\nimport ellipse_v1 from './ellipse/ellipse_v1'\r\nimport fibonacci from './fibonacci_retracements'\r\nimport horizontalLine from './horizontal_line'\r\nimport line from './line'\r\nimport measure from './measure'\r\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\r\nimport polygon from './polygon'\r\nimport position from './position'\r\nimport rectangle from './rectangle'\r\nimport rotatedRectangle from './rotated_rectangle'\r\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\r\nimport scaledLine from './scaled_line'\r\nimport scaledText from './scaled_text'\r\nimport symbolElement from './symbol'\r\nimport text from './text'\r\nimport triangle from './triangle'\r\nimport verticalLine from './vertical_line'\r\nimport xabcd from './xabcd'\r\n\r\nexport const drawingToolsByType = Object.freeze({\r\n [CanvasElementType.element]: element,\r\n [CanvasElementType.arrow]: arrow,\r\n [CanvasElementType.brushV1]: brush_v1,\r\n [CanvasElementType.calloutV1]: callout_v1,\r\n [CanvasElementType.curve]: curve,\r\n [CanvasElementType.elliottWaves]: elliottWaves,\r\n [CanvasElementType.ellipse]: ellipse,\r\n [CanvasElementType.ellipseV1]: ellipse_v1,\r\n [CanvasElementType.fibonacciRetracements]: fibonacci,\r\n [CanvasElementType.horizontalLine]: horizontalLine,\r\n [CanvasElementType.line]: line,\r\n [CanvasElementType.measure]: measure,\r\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\r\n [CanvasElementType.polygon]: polygon,\r\n [CanvasElementType.position]: position,\r\n [CanvasElementType.rectangle]: rectangle,\r\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\r\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\r\n [CanvasElementType.scaledLine]: scaledLine,\r\n [CanvasElementType.scaledText]: scaledText,\r\n [CanvasElementType.symbol]: symbolElement,\r\n [CanvasElementType.text]: text,\r\n [CanvasElementType.triangle]: triangle,\r\n [CanvasElementType.verticalLine]: verticalLine,\r\n [CanvasElementType.xabcd]: xabcd,\r\n})\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\nimport mergewith from 'lodash.mergewith'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IVisibility,\r\n IndicatorType,\r\n MacroTimeframe,\r\n MicroMacroTimeframe,\r\n OverlayType,\r\n SetVisibilityTo,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isInRange } from '../utils/helpers'\r\nimport ElementBaseConfig from './ElementBaseConfig'\r\nimport Thumb from './thumb'\r\n\r\nexport type TodoModalConfig = TodoObjectHashAnyType\r\ntype TodoPositionTimestamps = TodoObjectHashAnyType\r\n\r\nexport interface DefaultAttrs extends ObjectHash {\r\n positionTimestamps?: TodoPositionTimestamps\r\n visibility?: IVisibility\r\n}\r\n\r\nexport type EdgeValues = { minX?: number; maxX?: number; minY?: number; maxY?: number }\r\n\r\nclass Element extends Spine.Module {\r\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\r\n CanvasElementType.element\r\n\r\n static fromObject(obj: T['attrs'], model: T['model']) {\r\n return new this(obj, model) as T\r\n }\r\n\r\n static getNumOfBarsBuffer(\r\n _?: RequireByKey | RequireByKey\r\n ) {\r\n return 0\r\n }\r\n\r\n isCreator = false\r\n isCreatorDialogOpen = false\r\n attrs: Attrs = {} as Attrs\r\n declare static config: ElementBaseConfig\r\n\r\n model: any\r\n _thumbs: Thumb[]\r\n\r\n getDefaults?(): Partial\r\n renderCross?(ctx: RenderingContext2DType): void\r\n renderCrossText?(\r\n ctx: RenderingContext2DType,\r\n crossIndex: number,\r\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\r\n ): void\r\n\r\n renderContent?(ctx: RenderingContext2DType): void\r\n renderGrid?(ctx: RenderingContext2DType): void\r\n renderLabels?(ctx: RenderingContext2DType): void\r\n declare defaults?: Partial\r\n getModalConfigBase?(): TodoModalConfig\r\n declare modalConfig?: TodoModalConfig\r\n getMinMax?(): { min: number; max: number }\r\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\r\n\r\n activeThumb: Thumb | null = null\r\n isMouseDown = false\r\n isSelected = false\r\n isHovered = false\r\n isEditInProgress = false\r\n edgeXYValues: EdgeValues | null = null\r\n declare scaled?: ObjectHash | Partial\r\n\r\n declare toolsCallback: () => void\r\n\r\n constructor(values: Partial, model: Model) {\r\n super(values, model)\r\n this.model = model\r\n if (this.getDefaults) {\r\n this.set(this.getDefaults() || {})\r\n } else {\r\n this.set(this.defaults || {})\r\n }\r\n this.set(values)\r\n this._thumbs = []\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this)\r\n this.onMouseMove = this.onMouseMove.bind(this)\r\n this.onMouseUp = this.onMouseUp.bind(this)\r\n this.bind('mousedown', this.onMouseDown)\r\n this.bind('mousemove', this.onMouseMove)\r\n this.bind('mouseup', this.onMouseUp)\r\n this.bind('change', () => {\r\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\r\n const element = this.getIsChartEvent()\r\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\r\n : this.model.elements?.()?.findByAttribute('instance', this)\r\n\r\n element?.trigger('change', element)\r\n })\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Element).type\r\n }\r\n\r\n getThumbs() {\r\n return this._thumbs\r\n }\r\n\r\n moveBy(_: number, __: number) {}\r\n\r\n setIsEditInProgress(isEditInProgress: boolean, shouldTriggerChange = true) {\r\n this.isEditInProgress = isEditInProgress\r\n if (shouldTriggerChange) {\r\n this.trigger('change', this)\r\n }\r\n }\r\n\r\n setIsSelected(isSelected: boolean) {\r\n this.isSelected = isSelected\r\n this.trigger('change')\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n this.isHovered = isHovered\r\n this.trigger('change')\r\n }\r\n\r\n getShouldRenderThumbs() {\r\n return this.isSelected || this.isHovered\r\n }\r\n\r\n getIsPaneSelection(): boolean {\r\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\r\n return paneModel?.selection === this\r\n }\r\n\r\n set(obj: Partial) {\r\n const attrsSubset = Object.keys(obj).reduce(\r\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\r\n {} as Partial\r\n )\r\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\r\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\r\n if (this.getIsDrawing() && key === 'visibility') {\r\n return srcValue ?? {}\r\n }\r\n }\r\n mergewith(this.attrs, obj, customizer)\r\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n this.edgeXYValues = null\r\n return this\r\n }\r\n\r\n get(key: T) {\r\n return this.attrs[key]\r\n }\r\n\r\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\r\n\r\n fx = (x: number) => this.model.scale.x(x)\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n scale({ x, y }: { x: string[]; y: string[] }) {\r\n this.scaled = {}\r\n x.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fx(this.attrs[el]),\r\n })\r\n })\r\n\r\n y.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fy(this.attrs[el]),\r\n })\r\n })\r\n }\r\n\r\n render(_: RenderingContext2DType) {}\r\n\r\n renderThumbs(context: CanvasRenderingContext2D) {\r\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\r\n if (isHoveredThumbStyle) {\r\n context.globalAlpha = 0.5\r\n }\r\n this.getThumbs().map((thumb) => thumb.render(context))\r\n context.globalAlpha = 1\r\n }\r\n\r\n onMouseDown(area: PaneArea) {\r\n this.isMouseDown = true\r\n this.setIsEditInProgress(true, false)\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n this.activeThumb = thumb\r\n this.activeThumb.startEditing(area)\r\n return\r\n }\r\n }\r\n }\r\n\r\n onMouseMove(area: PaneArea) {\r\n if (!area.mouseDown) {\r\n return\r\n }\r\n if (this.activeThumb != null) {\r\n this.activeThumb.moveTo(area)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n onMouseUp(_?: PaneArea) {\r\n this.isMouseDown = false\r\n this.setIsEditInProgress(false, false)\r\n this.activeThumb = null\r\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const { x: xPointKeys } = this.getBoundingPointKeys()!\r\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\r\n const positionX = this.attrs[key]\r\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\r\n return {\r\n ...acc,\r\n [key]: timeStamp,\r\n }\r\n }, {}) as TodoPositionTimestamps\r\n this.set({ positionTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionTimestamps } = this.attrs\r\n if (!quote || !positionTimestamps) {\r\n // positionTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\r\n (acc, [key, timestamp]) => ({\r\n ...acc,\r\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\r\n }),\r\n {}\r\n )\r\n this.set(pointPoitionsFromTimestamp)\r\n }\r\n\r\n thumbsAreInArea(area: PaneArea) {\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n isDrawingElementLockedOrInvisible() {\r\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\r\n }\r\n\r\n getModalConfig() {\r\n let config\r\n if (this.getModalConfigBase) {\r\n config = merge({}, this.getModalConfigBase())\r\n } else {\r\n config = merge({}, this.modalConfig)\r\n }\r\n if (this.getIsDrawing()) {\r\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\r\n }\r\n if (config.title == null) {\r\n config.title = this.name\r\n }\r\n for (const input of config.inputs) {\r\n if (input.default != null) {\r\n input.value = input.default\r\n }\r\n if (this.attrs[input.name] != null) {\r\n input.value = this.attrs[input.name]\r\n }\r\n }\r\n return config\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return this.toObject()\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\r\n }\r\n\r\n toAutosaveConfig() {\r\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\r\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\r\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\r\n }\r\n\r\n replaceMyself(element: Element) {\r\n setTimeout(() => {\r\n element.cachePointPositionTimestamp()\r\n const el = this.model.elements().findByAttribute('instance', this)\r\n if (!el) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('element.ts replaceMyself', {\r\n extra: {\r\n oldElement: {\r\n type: this?.type,\r\n isCreator: this?.isCreator,\r\n isMouseDown: this?.isMouseDown,\r\n isSelected: this?.isSelected,\r\n isHovered: this?.isHovered,\r\n isEditInProgress: this?.isEditInProgress,\r\n },\r\n newElement: {\r\n type: element?.type,\r\n isCreator: element?.isCreator,\r\n isMouseDown: element?.isMouseDown,\r\n isSelected: element?.isSelected,\r\n isHovered: element?.isHovered,\r\n isEditInProgress: element?.isEditInProgress,\r\n },\r\n },\r\n })\r\n } else {\r\n el.replace(element)\r\n }\r\n })\r\n }\r\n\r\n toString() {\r\n return this.name\r\n }\r\n\r\n getIsCreator() {\r\n return this.isCreator\r\n }\r\n\r\n getIsCreatorDialogOpen() {\r\n return this.isCreatorDialogOpen\r\n }\r\n\r\n release() {\r\n this.cachePointPositionTimestamp()\r\n this.unbind()\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n getIsDrawing() {\r\n return !!this.type.startsWith('canvas/')\r\n }\r\n\r\n getIsChartEvent() {\r\n return !!this?.type.startsWith('chartEvent/')\r\n }\r\n\r\n getIsVisible() {\r\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const visibility = this.attrs.visibility?.[macro]\r\n\r\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\r\n if (visibility === undefined) return true\r\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\r\n if (Object.keys(visibility).length === 0) return false\r\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\r\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\r\n }\r\n\r\n setVisibilityTo(setTo: SetVisibilityTo) {\r\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\r\n\r\n let timeframesToSet: string[] = []\r\n let attrsToSet: { from?: number; to?: number } = {}\r\n\r\n switch (setTo) {\r\n case SetVisibilityTo.currentAndAbove: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\r\n attrsToSet = { from: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentAndBelow: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\r\n attrsToSet = { to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentOnly: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\r\n attrsToSet = { from: micro, to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.all:\r\n default: {\r\n this.set({ visibility: {} } as Partial)\r\n return\r\n }\r\n }\r\n\r\n this.set({\r\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\r\n } as Partial)\r\n }\r\n\r\n getEdgeXYValues() {\r\n const { x: xPoints, y: yPoints } = this.getBoundingPointKeys() ?? {}\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n xPoints?.forEach((key) => {\r\n const positionX = this.attrs[key]\r\n if (positionX !== undefined) {\r\n edgeXYValues.minX = Math.min(positionX, edgeXYValues.minX ?? positionX)\r\n edgeXYValues.maxX = Math.max(positionX, edgeXYValues.maxX ?? positionX)\r\n }\r\n })\r\n yPoints?.forEach((key) => {\r\n const positionY = this.attrs[key]\r\n if (positionY !== undefined) {\r\n edgeXYValues.minY = Math.min(positionY, edgeXYValues.minY ?? positionY)\r\n edgeXYValues.maxY = Math.max(positionY, edgeXYValues.maxY ?? positionY)\r\n }\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n\r\n getIsInChartView(chart: Chart, options?: { omitX?: boolean; omitY?: boolean }) {\r\n const { minX, maxX, minY, maxY } = this.getEdgeXYValues()\r\n\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!options?.omitX) {\r\n const isMaxXInvalid = maxX === undefined || isNaN(maxX)\r\n const isMinXInvalid = minX === undefined || isNaN(minX)\r\n if (\r\n !isMaxXInvalid &&\r\n !isMinXInvalid &&\r\n !(this.fx(maxX) >= -chart.leftOffset && this.fx(minX) <= -chart.leftOffset + chart.width)\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (!options?.omitY) {\r\n if (minY === undefined || maxY === undefined) {\r\n return true\r\n }\r\n\r\n const topBound = this.model.scale.y.invert(0)\r\n const bottomBound = this.model.scale.y.invert(this.model.height)\r\n return topBound >= minY && bottomBound <= maxY\r\n }\r\n\r\n // If all checks fall through, render element\r\n return true\r\n }\r\n}\r\n\r\nexport default Element\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IElliottWavesAttrs {\r\n waves: Array<{ x: number; y: number }>\r\n positionWavesTimestamps?: Array<{ x: number; y: number }>\r\n border: DrawingBorder\r\n}\r\n\r\nclass ElliottWaves extends Element {\r\n static type = CanvasElementType.elliottWaves\r\n\r\n name = 'Elliott Wave'\r\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 2,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\r\n for (const p of this.attrs.waves.slice(1)) {\r\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\r\n }\r\n context.stroke()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.center,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n this.model\r\n )\r\n for (let i = 0; i < this.attrs.waves.length; i++) {\r\n let y\r\n const p = this.attrs.waves[i]\r\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\r\n y = this.fy(p.y) + 8\r\n } else {\r\n y = this.fy(p.y) - 8\r\n }\r\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.waves.map(\r\n (wave, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => wave.x,\r\n () => wave.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\r\n ...wave,\r\n x: quote.getTimestampFomPositionX(wave.x),\r\n }))\r\n\r\n this.set({ positionWavesTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionWavesTimestamps } = this.attrs\r\n if (!quote || !positionWavesTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const waves = positionWavesTimestamps.map((wave) => ({\r\n ...wave,\r\n x: quote.getPositionXFromTimestamp(wave.x),\r\n }))\r\n this.set({ waves } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.waves) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs.waves[+type].x += difX\r\n this.attrs.waves[+type].y += difY\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const waves = this.attrs.waves\r\n for (let i = 0; i < waves.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(waves[i].x),\r\n y1: this.fy(waves[i].y),\r\n x2: this.fx(waves[i + 1].x),\r\n y2: this.fy(waves[i + 1].y),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['waves']\r\n }\r\n}\r\n\r\nElliottWaves.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ElliottWaves\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface Coordinates {\r\n P1: Point\r\n P2: Point\r\n P3: Point\r\n P4: Point\r\n CP1: Point\r\n CP2: Point\r\n CP3: Point\r\n CP4: Point\r\n}\r\n\r\nclass EllipseV1 extends Element {\r\n static type = CanvasElementType.ellipseV1\r\n\r\n name = 'Ellipse'\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n declare ellipsePath: Path2D\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this._thumbs = [\r\n new Thumb(\r\n 'left',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'right',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'top',\r\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\r\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottom',\r\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\r\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const coordinates = this.getEllipsePoints() as Coordinates\r\n const ellipse = new Path2D()\r\n context.set('fillStyle', this.attrs.fill)\r\n context.beginPath()\r\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\r\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\r\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\r\n } else {\r\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\r\n ellipse.bezierCurveTo(\r\n coordinates.CP4.x,\r\n coordinates.CP4.y,\r\n coordinates.CP1.x,\r\n coordinates.CP1.y,\r\n coordinates.P2.x,\r\n coordinates.P2.y\r\n )\r\n ellipse.bezierCurveTo(\r\n coordinates.CP2.x,\r\n coordinates.CP2.y,\r\n coordinates.CP3.x,\r\n coordinates.CP3.y,\r\n coordinates.P4.x,\r\n coordinates.P4.y\r\n )\r\n ellipse.closePath()\r\n this.ellipsePath = ellipse\r\n context.fill(ellipse)\r\n }\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke(ellipse)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getEllipsePoints(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n\r\n const P1 = { x: x2, y: y2 }\r\n const P3 = { x: x1, y: y1 }\r\n\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: P3,\r\n P2: P1,\r\n P3: P1,\r\n P4: P3,\r\n }\r\n }\r\n\r\n const lineCenterX = (P1.x + P3.x) / 2\r\n const lineCenterY = (P1.y + P3.y) / 2\r\n const pointOffsetX = perpendicularPoint.x - P1.x\r\n const pointOffsetY = perpendicularPoint.y - P1.y\r\n\r\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\r\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n\r\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\r\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\r\n\r\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\r\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\r\n\r\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\r\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\r\n\r\n const CP1 = {\r\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\r\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\r\n }\r\n const controlPointOffsetX = CP1.x - P1WithOffsetX\r\n const controlPointOffsetY = CP1.y - P1WithOffsetY\r\n\r\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\r\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\r\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\r\n\r\n return {\r\n P1,\r\n P2,\r\n P3,\r\n P4,\r\n CP1,\r\n CP2,\r\n CP3,\r\n CP4,\r\n }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: { x: number; y: number }\r\n pointToRotate: { x: number; y: number }\r\n oldLinePoint: { x: number; y: number }\r\n newLinePoint: { x: number; y: number }\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'left':\r\n const newLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newLeftPoint.x,\r\n y1: newLeftPoint.y,\r\n cursorTargetX: leftRotatedCursorPoint.x,\r\n cursorTargetY: leftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'right':\r\n const newRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newRightPoint.x,\r\n y2: newRightPoint.y,\r\n cursorTargetX: rightRotatedCursorPoint.x,\r\n cursorTargetY: rightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'top':\r\n case 'bottom':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipseV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default EllipseV1\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ntype Coefficients = string\r\n\r\nexport interface IFibonacciRetracementsAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n coefficients: Coefficients\r\n border: DrawingBorder\r\n}\r\n\r\nclass FibonacciRetracements<\r\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\r\n> extends Element {\r\n static type = CanvasElementType.fibonacciRetracements\r\n\r\n name = 'Fibonacci Retracements'\r\n declare coefficients: { default: string; parsed: number[]; max: number; min: number }\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'oneCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'oneCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.parseCoefficients(this.attrs.coefficients)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n parseCoefficients(coefficients: Coefficients) {\r\n if (!this.coefficients || coefficients !== this.coefficients.default) {\r\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\r\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed), min: Math.min(...parsed) }\r\n }\r\n }\r\n\r\n getMaxCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\r\n }\r\n\r\n getMinCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.min * (this.scaled.y2 - this.scaled.y1))\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n this.parseCoefficients(this.attrs.coefficients)\r\n\r\n const height = this.attrs.y2 - this.attrs.y1\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n for (const p of this.coefficients.parsed) {\r\n const y = Math.round(this.fy(this.attrs.y2 - p * height))\r\n context.moveTo(roundedXY.x1, y)\r\n context.lineTo(roundedXY.x2, y)\r\n }\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n const text = new Text(\r\n {\r\n x: roundedXY.x1,\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.bottom,\r\n fillStyle: this.attrs.border.color,\r\n textAlign: TextAlign.left,\r\n },\r\n this.model\r\n )\r\n if (roundedXY.x1 > roundedXY.x2) {\r\n text.set({ textAlign: TextAlign.right })\r\n }\r\n\r\n for (const p of this.coefficients.parsed) {\r\n const y = this.attrs.y2 - p * height\r\n text.set({\r\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\r\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\r\n } as Partial)\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n if (this.coefficients.max > 1 && !this._thumbs.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'maxCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'maxCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.max <= 1 && this._thumbs.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('maxCoefficient'))\r\n }\r\n\r\n if (this.coefficients.min < 0 && !this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'minCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'minCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.min >= 0 && this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('minCoefficient'))\r\n }\r\n\r\n return this._thumbs\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'oneCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'oneCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'zeroCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'zeroCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'maxCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'maxCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'minCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n case 'minCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\r\n const minCoefficientY = this.coefficients.min < 0 && this.getMinCoefficientUnscaledY()\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const allYValues = [this.attrs.y1, this.attrs.y2, maxCoefficientY, minCoefficientY].filter((item) => item !== false)\r\n const top = Math.min(...allYValues)\r\n const bottom = Math.max(...allYValues)\r\n\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getEdgeXYValues() {\r\n this.edgeXYValues = super.getEdgeXYValues()\r\n\r\n // Because minY, maxY can go outside of control points boundaries [0,1] we need to compensate\r\n // for that in getEdgeXYValues(), otherwise getIsInChartView() hide drawings sooner than it should\r\n const min = this.getMinCoefficientUnscaledY()\r\n const max = this.getMaxCoefficientUnscaledY()\r\n\r\n if (!isNaN(min) && !isNaN(max)) {\r\n this.edgeXYValues.minY = Math.min(min, max)\r\n this.edgeXYValues.maxY = Math.max(min, max)\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nFibonacciRetracements.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\r\n ],\r\n}\r\n\r\nexport default FibonacciRetracements\r\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\nimport Text from './text'\r\n\r\nconst DEFAULT_DECIMAL_PLACES = 2\r\n\r\nclass HorizontalLine extends ScaledLine {\r\n static type = CanvasElementType.horizontalLine\r\n\r\n name = 'Horizontal line'\r\n decimalPlaces = DEFAULT_DECIMAL_PLACES\r\n declare scaled: Pick\r\n declare model: PaneModel\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.updateDecimalPlaces()\r\n\r\n if (this.attrs.y1) {\r\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\r\n }\r\n if (this.modalConfig) {\r\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\r\n this.modalConfig.inputs[1] = {\r\n ...this.modalConfig.inputs[1],\r\n step,\r\n min: Number(step),\r\n }\r\n }\r\n this.renderContent = this.renderContent.bind(this)\r\n this._thumbs = []\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n updateDecimalPlaces() {\r\n const quote = this.model.chart().quote()\r\n this.decimalPlaces = quote\r\n ? math.getInstrumentDecimalPlaces({\r\n instrument: quote.instrument,\r\n value: quote.lastClose,\r\n })\r\n : DEFAULT_DECIMAL_PLACES\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n this.attrs.y2 = this.attrs.y1\r\n // mixing scaled and unscaled values, do not copy paste as solution\r\n this.attrs.x1 = ChartSettings.left.width * -1\r\n this.attrs.x2 =\r\n this.model\r\n .chart()\r\n .quote()\r\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\r\n super.renderContent(context)\r\n }\r\n\r\n renderLabels(context: CanvasRenderingContext2D) {\r\n if (this.attrs.y1) {\r\n this.updateDecimalPlaces()\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const isIndicatorPane = this.model\r\n .elements()\r\n .all()\r\n .some((element) => element.isIndicator())\r\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\r\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\r\n new Text(\r\n {\r\n x: 6,\r\n y: this.scaled.y1,\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n fillStyle: '#fff',\r\n background: '#000',\r\n textBaseline: TextBaseline.middle,\r\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n }\r\n\r\n moveBy(x: Maybe, y: number) {\r\n this.attrs.y1 += y\r\n }\r\n\r\n resize({ difY }: RequireByKey) {\r\n this.moveBy(0, difY)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitX: true })\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\r\n ],\r\n}\r\n\r\nexport default HorizontalLine\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ninterface ILineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n}\r\n\r\nclass Line extends Element {\r\n static type = CanvasElementType.line\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n lineWidth: 1,\r\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { x1, y1, x2, y2, lineWidth } = this.attrs\r\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.lineWidth)\r\n context.set('strokeStyle', this.attrs.strokeStyle)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([])\r\n }\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area, this.attrs) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nexport default Line\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport { numberToStringWithUnitsSuffix } from '../utils'\r\nimport { getRoundedString } from '../utils/helpers'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IMeasureAttrs extends Coordinates {\r\n fill: string\r\n}\r\n\r\nclass Measure extends Element {\r\n static type = CanvasElementType.measure\r\n\r\n name = 'Measure'\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n startingX1: number\r\n startingX2: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getVolumeSumString = () => {\r\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\r\n const roundedX1 = Math.round(this.attrs.x1)\r\n const roundedX2 = Math.round(this.attrs.x2)\r\n // min/max values are offset by 1 so there's no value on such index\r\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\r\n const minIndexLimit = barIndex[0] - 1\r\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\r\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n\r\n let volumeSum = 0\r\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\r\n const volumeIndex = barIndex.indexOf(i)\r\n if (volumeIndex >= 0) {\r\n volumeSum += volume[volumeIndex]\r\n }\r\n }\r\n\r\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n context.fillRect(x1, roundedXY.y1, width, height)\r\n\r\n const priceDif = this.attrs.y2 - this.attrs.y1\r\n const percentage = (100 / this.attrs.y1) * priceDif\r\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\r\n\r\n const text = new Text(\r\n {\r\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\r\n fillStyle: '#333',\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n const baseX = x1 + width / 2\r\n const baseY = roundedXY.y1 + height / 2\r\n let textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY - text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: heightStr })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY,\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: this.getVolumeSumString() })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY + text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n this.attrs.y1 += difs.y1 || 0\r\n this.attrs.y2 += difs.y2 || 0\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n\r\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\r\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x1 - newX1 !== 0) {\r\n this.attrs.x1 = newX1\r\n }\r\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x2 - newX2 !== 0) {\r\n this.attrs.x2 = newX2\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n y1: y,\r\n x2: x,\r\n y2: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.addToCoordinates({ x1: difX, y1: difY })\r\n } else {\r\n this.addToCoordinates({ x2: difX, y2: difY })\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n onMouseDown(paneArea: PaneArea) {\r\n super.onMouseDown(paneArea)\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n onMouseUp(paneArea?: PaneArea) {\r\n super.onMouseUp(paneArea)\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n}\r\n\r\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\r\n\r\nMeasure.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Measure\r\n","import { Point } from '../../../types/shared'\r\nimport { getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { ITrendAttrs } from './pitchfork_v1'\r\n\r\ninterface IGetEdgeIntersectionPointArguments {\r\n sides: { x: number; y: number }[][]\r\n rayOrigin: Point\r\n rayDirection: Point\r\n}\r\n\r\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\r\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\r\n\r\n let intersection = rayDirection\r\n let intersectionDistance = 0\r\n for (let index = 0; index < sides.length; index++) {\r\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\r\n rayOrigin,\r\n rayDirection,\r\n sides[index][0],\r\n sides[index][1]\r\n )\r\n if (rayToLineIntersection) {\r\n const distance = math.distance(rayToLineIntersection, rayOrigin)\r\n if (distance > intersectionDistance && isInRange({ value: distance })) {\r\n intersectionDistance = distance\r\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\r\n }\r\n }\r\n }\r\n\r\n return intersection\r\n}\r\n\r\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\r\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\r\n const { leftOffset, width } = paneModel.chart()\r\n\r\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\r\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\r\n const chartVisibleAreaTopY = 0\r\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\r\n\r\n const chartVisibleAreaTopLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaTopRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaBottomLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const chartVisibleAreaBottomRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\r\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\r\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\r\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\r\n\r\n const sides = [topSide, rightSide, bottomSide, leftSide]\r\n\r\n return sides\r\n}\r\n\r\ninterface IGetPitchforkCoordinates {\r\n paneModel: PaneModel\r\n rayOrigin: Point\r\n rayDirectionControlPoint1: Point\r\n rayDirectionControlPoint2?: Point\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\ninterface ILineSegment {\r\n P1: Point\r\n P2: Point\r\n}\r\n\r\ninterface ICoordinates {\r\n medianRay: ILineSegment\r\n trend1Ray1: ILineSegment | undefined\r\n trend1Ray2: ILineSegment | undefined\r\n trend2Ray1: ILineSegment | undefined\r\n trend2Ray2: ILineSegment | undefined\r\n}\r\n\r\nexport const getPitchforkCoordinates = ({\r\n paneModel,\r\n rayOrigin,\r\n rayDirectionControlPoint1,\r\n rayDirectionControlPoint2,\r\n trend1,\r\n trend2,\r\n}: IGetPitchforkCoordinates) => {\r\n const sides = getChartVisibleAreaBoundaries(paneModel)\r\n\r\n const coordinates: ICoordinates = {\r\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\r\n trend1Ray1: undefined,\r\n trend2Ray1: undefined,\r\n trend1Ray2: undefined,\r\n trend2Ray2: undefined,\r\n }\r\n\r\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\r\n if (!rayDirectionControlPoint2) {\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: rayDirectionControlPoint1,\r\n })\r\n ),\r\n }\r\n return coordinates\r\n }\r\n\r\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\r\n const rayOriginToRayDirectionVector = {\r\n x: medianRayDirectionPoint.x - rayOrigin.x,\r\n y: medianRayDirectionPoint.y - rayOrigin.y,\r\n }\r\n\r\n const rayDirectionControlPoint1ToPoint2Vector = {\r\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\r\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\r\n }\r\n\r\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\r\n rayDirectionControlPoint1ToPoint2Vector\r\n )\r\n\r\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\r\n medianRayDirectionPoint,\r\n rayDirectionControlPoint1\r\n )\r\n\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: medianRayDirectionPoint,\r\n })\r\n ),\r\n }\r\n if (trend1.active) {\r\n const trend1Ray = getTrendRayCoordinates({\r\n trend: trend1.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend1Ray1 = trend1Ray.trendRay1\r\n coordinates.trend1Ray2 = trend1Ray.trendRay2\r\n }\r\n if (trend2.active) {\r\n const trend2Ray = getTrendRayCoordinates({\r\n trend: trend2.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend2Ray1 = trend2Ray.trendRay1\r\n coordinates.trend2Ray2 = trend2Ray.trendRay2\r\n }\r\n\r\n return coordinates\r\n}\r\n\r\ninterface IGetTrendRayCoordinates {\r\n trend: number\r\n medianToControlPointDistance: number\r\n normalizedControlToControlPointVector: Point\r\n rayOriginToRayDirectionVector: Point\r\n medianRayDirectionPoint: Point\r\n sides: Point[][]\r\n}\r\n\r\nconst getTrendRayCoordinates = ({\r\n trend,\r\n medianToControlPointDistance,\r\n normalizedControlToControlPointVector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n}: IGetTrendRayCoordinates) => {\r\n const medianToTrendLineDistance = medianToControlPointDistance * trend\r\n\r\n const trendRayPoint1Origin = math.addPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n\r\n const trendRayPoint1DirectionPoint = {\r\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\r\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\r\n }\r\n const trendPoint2RayDirectionPoint = {\r\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\r\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\r\n }\r\n\r\n return {\r\n trendRay1: {\r\n P1: getRoundedObject(trendRayPoint1Origin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendRayPoint1Origin,\r\n rayDirection: trendRayPoint1DirectionPoint,\r\n })\r\n ),\r\n },\r\n trendRay2: {\r\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendPoint2RayOriginPoint2,\r\n rayDirection: trendPoint2RayDirectionPoint,\r\n })\r\n ),\r\n },\r\n }\r\n}\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\nimport { getPitchforkCoordinates } from './pitchfork_utils'\r\n\r\nexport interface ITrendAttrs {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\nexport interface IPitchforkAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n x3: number\r\n y3: number\r\n median: { color: string; width: number }\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\nclass Pitchfork extends Element {\r\n static type = CanvasElementType.pitchforkV1\r\n\r\n declare scaled: Pick\r\n name = 'Pitchfork'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'medianRayOrigin',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint1',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint2',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n median: { color: '#e72f2f', width: 1 },\r\n trend1: {\r\n color: '#004ad31c',\r\n active: true,\r\n trend: 1,\r\n },\r\n trend2: {\r\n color: '#00ca4e1f',\r\n active: true,\r\n trend: 0.5,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\r\n context.translate(offset, offset)\r\n\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n\r\n context.set('lineWidth', this.attrs.median.width)\r\n\r\n const trendLines = [\r\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\r\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\r\n ].sort((a, b) => {\r\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\r\n return -1\r\n }\r\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n\r\n // Draw trend lines and fill\r\n trendLines.forEach((trendLine, trendLineIndex) => {\r\n if (trendLine.line1 && trendLine.line2) {\r\n const { line1, line2 } = trendLine\r\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\r\n const nextTrendLine = trendLines[trendLineIndex + 1]\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\r\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\r\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\r\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\r\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\r\n }\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.lineTo(line2.P1.x, line2.P1.y)\r\n context.closePath()\r\n context.set('fillStyle', trendLine.trend.color)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n context.moveTo(line2.P1.x, line2.P1.y)\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.set('strokeStyle', solidTrendColor)\r\n context.stroke()\r\n }\r\n })\r\n\r\n // Draw median ray line\r\n context.beginPath()\r\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\r\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\r\n\r\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\r\n const outerTrendLines =\r\n trendLines.filter(\r\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\r\n )[0] ?? {}\r\n\r\n if (outerTrendLines.line1 && outerTrendLines.line2) {\r\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\r\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\r\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\r\n context.moveTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n }\r\n\r\n context.set('strokeStyle', this.attrs.median.color)\r\n context.stroke()\r\n\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'medianRayOrigin':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'rayDirectionControlPoint1':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'rayDirectionControlPoint2':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n const outerTrendLines =\r\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\r\n ? { line1: trend1Ray1, line2: trend1Ray2 }\r\n : { line1: trend2Ray1, line2: trend2Ray2 }\r\n\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: medianRay.P1.x,\r\n y1: medianRay.P1.y,\r\n x2: medianRay.P2.x,\r\n y2: medianRay.P2.y,\r\n }) <= 10\r\n ) {\r\n // cursor is near median ray\r\n return true\r\n } else if (\r\n !Number.isNaN(x3) &&\r\n !Number.isNaN(y3) &&\r\n math.distanceToSegment(area.scaled, {\r\n x1: x2,\r\n y1: y2,\r\n x2: x3,\r\n y2: y3,\r\n }) <= 10\r\n ) {\r\n // cursor is near line connecting direction control points\r\n return true\r\n } else if (\r\n outerTrendLines.line1 &&\r\n outerTrendLines.line2 &&\r\n math.pointInPolygon(area.scaled, [\r\n outerTrendLines.line1.P1,\r\n outerTrendLines.line1.P2,\r\n outerTrendLines.line2.P2,\r\n outerTrendLines.line2.P1,\r\n ])\r\n ) {\r\n // cursor is on polygon created by outer trend lines\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n}\r\n\r\nPitchfork.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'median' },\r\n { type: 'trend', name: 'trend1' },\r\n { type: 'trend', name: 'trend2' },\r\n ],\r\n}\r\n\r\nexport default Pitchfork\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element, { EdgeValues } from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype Points = Array<{ x: number; y: number }>\r\n\r\nexport interface IPolygonAttrs {\r\n points: Points\r\n fill: string\r\n border: DrawingBorder\r\n positionPointsTimestamps?: Points\r\n}\r\n\r\nclass Polygon extends Element {\r\n static type = CanvasElementType.polygon\r\n\r\n name = 'Polygon'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n const { points } = this.attrs\r\n context.beginPath()\r\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\r\n for (const p of points.slice(1)) {\r\n context.lineTo(this.fx(p.x), this.fy(p.y))\r\n }\r\n\r\n if (this.isPolygon()) {\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.points.map(\r\n (point, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => point.x,\r\n () => point.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\r\n ...point,\r\n x: quote.getTimestampFomPositionX(point.x),\r\n }))\r\n\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map((point) => ({\r\n ...point,\r\n x: quote.getPositionXFromTimestamp(point.x),\r\n }))\r\n this.set({ points } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.points) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const last = this.attrs.points.length - 1\r\n if (this.isPolygon() && (+type === 0 || +type === last)) {\r\n this.attrs.points[0].x += difX\r\n this.attrs.points[0].y += difY\r\n this.attrs.points[last].x += difX\r\n this.attrs.points[last].y += difY\r\n } else {\r\n this.attrs.points[+type].x += difX\r\n this.attrs.points[+type].y += difY\r\n }\r\n }\r\n\r\n isPolygon() {\r\n return (\r\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\r\n )\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const scaledPoints = this.attrs.points.map((p) => ({\r\n x: this.fx(p.x),\r\n y: this.fy(p.y),\r\n }))\r\n if (this.isPolygon()) {\r\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\r\n return true\r\n }\r\n } else {\r\n for (let i = 0; i < scaledPoints.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: scaledPoints[i].x,\r\n y1: scaledPoints[i].y,\r\n x2: scaledPoints[i + 1].x,\r\n y2: scaledPoints[i + 1].y,\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(({ x, y }) => {\r\n const xPoint = x\r\n const yPoint = y\r\n edgeXYValues.minX = Math.min(xPoint, edgeXYValues.minX ?? xPoint)\r\n edgeXYValues.minY = Math.min(yPoint, edgeXYValues.minY ?? yPoint)\r\n edgeXYValues.maxX = Math.max(xPoint, edgeXYValues.maxX ?? xPoint)\r\n edgeXYValues.maxY = Math.max(yPoint, edgeXYValues.maxY ?? yPoint)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nPolygon.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Polygon\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IPositionAttrs extends Coordinates {\r\n targetColor: string\r\n stopColor: string\r\n targetY: number\r\n centerY: number\r\n stopY: number\r\n}\r\n\r\nclass Position extends Element {\r\n static type = CanvasElementType.position\r\n\r\n name = 'Position'\r\n\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 't1',\r\n () => this.attrs.x1,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 't2',\r\n () => this.attrs.x2,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's1',\r\n () => this.attrs.x1,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's2',\r\n () => this.attrs.x2,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c1',\r\n () => this.attrs.x1,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c2',\r\n () => this.attrs.x2,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, targetY, centerY, stopY } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\r\n let sign, stopBaseline, targetBaseline\r\n const width = roundedXY.x2 - roundedXY.x1\r\n\r\n context.set('fillStyle', this.attrs.targetColor)\r\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\r\n\r\n context.set('fillStyle', this.attrs.stopColor)\r\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\r\n\r\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\r\n const targetPerc = (100 / this.attrs.centerY) * targetDif\r\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\r\n\r\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\r\n const stopPerc = (100 / this.attrs.centerY) * stopDif\r\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\r\n\r\n if (this.attrs.targetY > this.attrs.centerY) {\r\n sign = 1\r\n targetBaseline = TextBaseline.bottom\r\n stopBaseline = TextBaseline.top\r\n } else {\r\n sign = -1\r\n targetBaseline = TextBaseline.top\r\n stopBaseline = TextBaseline.bottom\r\n }\r\n\r\n const text = new Text(\r\n {\r\n text: targetStr,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n y: roundedXY.targetY - sign * 4,\r\n textBaseline: targetBaseline,\r\n },\r\n this.model\r\n )\r\n let textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n text.set({\r\n text: stopStr,\r\n y: roundedXY.stopY + sign * 4,\r\n textBaseline: stopBaseline,\r\n })\r\n textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n let middle, middle1, result\r\n if (difs.targetY) {\r\n result = this.attrs.targetY + difs.targetY\r\n if (\r\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.targetY = result\r\n }\r\n\r\n if (difs.stopY) {\r\n result = this.attrs.stopY + difs.stopY\r\n if (\r\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.stopY = result\r\n }\r\n\r\n if (\r\n difs.centerY &&\r\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\r\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\r\n ) {\r\n this.attrs.centerY += difs.centerY\r\n }\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\r\n if (roundDif !== 0) {\r\n if (difs.x1 != null) {\r\n this.attrs.x1 += roundDif\r\n }\r\n if (difs.x2 != null) {\r\n this.attrs.x2 += roundDif\r\n }\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n x2: x,\r\n targetY: y,\r\n centerY: y,\r\n stopY: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const [coordType, coordIndex] = (type as string).split('')\r\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\r\n const obj: Partial = {\r\n [`x${coordIndex}`]: difX,\r\n [yPoints[coordType]]: difY,\r\n }\r\n return this.addToCoordinates(obj)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\r\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nPosition.prototype.defaults = {\r\n targetColor: 'rgba(0,200,0,0.3)',\r\n stopColor: 'rgba(200,0,0,0.3)',\r\n}\r\n\r\nPosition.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'targetColor' },\r\n { type: 'background', name: 'stopColor' },\r\n ],\r\n}\r\n\r\nexport default Position\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass Rectangle extends Element {\r\n static type = CanvasElementType.rectangle\r\n\r\n name = 'Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\r\n\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n\r\n // @todo - Live sync of elements while they are being moved around\r\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\r\n // this.set(this.attrs)\r\n // this.trigger('change', this)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.attrs.x1 += difX\r\n return (this.attrs.y1 += difY)\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Rectangle\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IRotatedRectangleV1Attrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass RotatedRectangleV1 extends Element {\r\n static type = CanvasElementType.rotatedRectangleV1\r\n\r\n name = 'New Rotated Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'middleLeft',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'middleRight',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topRight',\r\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topLeft',\r\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomLeft',\r\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomRight',\r\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\r\n const roundedXY = {\r\n P1: getRoundedObject(P1),\r\n P2: getRoundedObject(P2),\r\n P3: getRoundedObject(P3),\r\n P4: getRoundedObject(P4),\r\n }\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n } else {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\r\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: { x: x2, y: y2 },\r\n P2: { x: x1, y: y1 },\r\n P3: { x: x1, y: y1 },\r\n P4: { x: x2, y: y2 },\r\n }\r\n }\r\n\r\n const pointOffsetX = perpendicularPoint.x - x2\r\n const pointOffsetY = perpendicularPoint.y - y2\r\n\r\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\r\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\r\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\r\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\r\n\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n return { P1, P2, P3, P4 }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: Point\r\n pointToRotate: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'middleLeft':\r\n const newMiddleLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newMiddleLeftPoint.x,\r\n y1: newMiddleLeftPoint.y,\r\n cursorTargetX: middleLeftRotatedCursorPoint.x,\r\n cursorTargetY: middleLeftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'middleRight':\r\n const newMiddleRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newMiddleRightPoint.x,\r\n y2: newMiddleRightPoint.y,\r\n cursorTargetX: middleRightRotatedCursorPoint.x,\r\n cursorTargetY: middleRightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'topRight':\r\n case 'topLeft':\r\n case 'bottomLeft':\r\n case 'bottomRight':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coordinates = this.getRectCoordinates()\r\n const polygon = Object.keys(coordinates).map((point) => ({\r\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\r\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangleV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangleV1\r\n","import { DrawingBorder, PaneArea } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Line from './line'\r\n\r\nexport interface IScaledLineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass ScaledLine extends Line {\r\n static type = CanvasElementType.scaledLine\r\n\r\n name = 'Line'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n}\r\n\r\nScaledLine.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ScaledLine\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea } from '../../types/shared'\r\nimport { PADDING } from '../constants/common'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Text, { ITextAttrs } from './text'\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\nclass ScaledText extends Text {\r\n static type = CanvasElementType.scaledText\r\n\r\n name = 'Text'\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare lastAttrs: Attrs\r\n declare scaled: Partial\r\n declare measuredHeight: number\r\n\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale({ x: ['x'], y: ['y'] })\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n // private\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle!)\r\n context.set('textAlign', this.attrs.textAlign!)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n // private\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y! + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\r\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n // private\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n\r\n this.context.beginPath()\r\n this.context.rect(\r\n this.scaled.x! - padding,\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\r\n this.width + padding * 2,\r\n this.measuredHeight + padding * 2\r\n )\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle!)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // TODO\r\n // if @attrs.textBaseline == 'middle'\r\n // rect.y = @attrs.y - rect.height/2\r\n if (\r\n this.lines &&\r\n this.scaled.x! < area.scaled.x &&\r\n area.scaled.x < this.scaled.x! + this.width &&\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\r\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\r\n ) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!this.lines) {\r\n return true\r\n }\r\n\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n const textBoxX = this.scaled.x! - padding\r\n const textBoxY = this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding\r\n const textBoxWidth = this.width + padding * 2\r\n const textBoxHeight = this.measuredHeight + padding * 2\r\n\r\n if (\r\n textBoxX <= -chart.leftOffset + chart.width &&\r\n textBoxX + textBoxWidth >= -chart.leftOffset &&\r\n textBoxY <= this.model.height &&\r\n textBoxY + textBoxHeight >= 0\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += x\r\n this.attrs.y! += y\r\n }\r\n}\r\n\r\nexport default ScaledText\r\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport Element, { TodoModalConfig } from './element'\r\n\r\nexport interface Area {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type ITextAttrs = RequireByKey & Partial\r\n\r\nconst DEFAULTS: Partial = {\r\n text: '',\r\n font: {\r\n size: 20,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n lineHeight: 20,\r\n // left | right | center | start | end\r\n textAlign: TextAlign.left,\r\n // top | hanging | middle | alphabetic | ideographic | bottom\r\n textBaseline: TextBaseline.alphabetic,\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n}\r\n\r\nclass Text extends Element {\r\n static type = CanvasElementType.text\r\n\r\n static getMergedPropsWithDefaults>(\r\n propKey: T,\r\n props: Partial = {}\r\n ) {\r\n return {\r\n ...DEFAULTS[propKey],\r\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\r\n }\r\n }\r\n\r\n name = 'Anchored text'\r\n declare context?: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare font: string\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\r\n if (this.context) {\r\n this.setupContext(this.context)\r\n }\r\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const count = this.getLines().length\r\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'font', {\r\n get() {\r\n const f = this.attrs.font\r\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\r\n },\r\n })\r\n }\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n default: { color: 'rgba(0,0,0)', width: 0 },\r\n },\r\n ],\r\n } as unknown as TodoModalConfig\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n ...DEFAULTS,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (obj.font?.size && !obj.lineHeight) {\r\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\r\n }\r\n return this\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.setupContext(context)\r\n if (this.attrs.angle && this.context) {\r\n // TODO background & multiline text\r\n this.context.save()\r\n this.context.translate(this.attrs.x!, this.attrs.y!)\r\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\r\n this.context.fillText(this.attrs.text, 0, 0)\r\n this.context.restore()\r\n } else {\r\n this.renderBackground()\r\n this.renderText()\r\n }\r\n }\r\n\r\n measure(context?: CanvasRenderingContext2D) {\r\n if (context) {\r\n this.setupContext(context)\r\n }\r\n const lines = this.getLines()\r\n let max = 0\r\n for (const line of lines) {\r\n max = Math.max(this.context?.measureText(line).width ?? Number.MIN_SAFE_INTEGER, max)\r\n }\r\n return ~~max\r\n }\r\n\r\n isInArea(testArea: PaneArea) {\r\n const area = this.convertArea(testArea)\r\n // TODO iny align\r\n if (\r\n this.attrs.x! < area.x &&\r\n area.x < this.attrs.x! + this.width &&\r\n this.attrs.y! - this.attrs.font.size < area.y &&\r\n area.y < this.attrs.y! - this.attrs.font.size + this.height\r\n ) {\r\n return true\r\n }\r\n return super.isInArea(testArea)\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n }\r\n\r\n getLines() {\r\n return this.attrs.text.toString().split('\\n')\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let { y } = this.attrs // + @attrs.padding.top\r\n for (const line of this.getLines()) {\r\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\r\n y! += this.attrs.lineHeight\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { width } = this\r\n const { height } = this\r\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\r\n const { x } = this.attrs\r\n let y = this.attrs.y! - height\r\n\r\n const getFontHeight = () => {\r\n // @todo - This is needed to be able to verticaly center background behind the text, the better would be to always use TextBaseline.middle and in case of options having different TextBaseline we should move text manually on y axis\r\n const { fontBoundingBoxAscent = 0, fontBoundingBoxDescent = 0 } = this.context?.measureText(this.attrs.text) ?? {}\r\n return fontBoundingBoxAscent + fontBoundingBoxDescent\r\n }\r\n\r\n if (this.attrs.textBaseline === TextBaseline.bottom) {\r\n y = this.attrs.y! - (height - (height - getFontHeight()) / 2)\r\n } else if (this.attrs.textBaseline === TextBaseline.top) {\r\n y = this.attrs.y! - this.attrs.padding.top - 1 - (height - getFontHeight()) / 2\r\n } else if (this.attrs.textBaseline === TextBaseline.middle) {\r\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\r\n } else if (this.attrs.textBaseline === TextBaseline.alphabetic) {\r\n y = this.attrs.y! - this.attrs.lineHeight\r\n }\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.rect(x!, y, width, height)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n renderBorder() {\r\n const { lineWidth = 0, strokeStyle, border } = this.attrs\r\n const borderWidth = border?.width ?? 0\r\n\r\n if ((lineWidth || this.attrs.strokeStyle || borderWidth > 0) && this.context) {\r\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\r\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n private convertArea(area: PaneArea) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n return {\r\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\r\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += this.model.scale.x(x) + 1\r\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\r\n }\r\n\r\n getHeight() {\r\n return this.height\r\n }\r\n}\r\n\r\nText.initClass()\r\n\r\nexport default Text\r\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\n\r\ntype Area = PaneArea\r\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\r\ntype ScaleFunc = () => number\r\n\r\nclass Thumb {\r\n type: ThumbType\r\n lastX = 0\r\n lastY = 0\r\n fx: ScaleFunc\r\n fy: ScaleFunc\r\n resize: ResizeFunc\r\n model: PaneModel\r\n\r\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\r\n this.type = type\r\n this.fx = fx\r\n this.fy = fy\r\n this.resize = resize\r\n this.model = model\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n context.set('fillStyle', ThumbSettings.color)\r\n context.set('strokeStyle', ThumbSettings.borderColor)\r\n context.set('lineWidth', ThumbSettings.borderWidth)\r\n const x = ~~this.x()\r\n const y = ~~this.y()\r\n const thumbWidth = this.getThumbWidth()\r\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\r\n context.beginPath()\r\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n startEditing(area: Area) {\r\n this.lastX = area.x\r\n return (this.lastY = area.y)\r\n }\r\n\r\n moveTo(area: Area) {\r\n const difX = area.x - this.lastX\r\n const difY = area.y - this.lastY\r\n this.resize({ type: this.type, difX, difY, area })\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n isInArea(area: Area) {\r\n const width = this.model.scale.x.invert(this.getThumbWidth())\r\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\r\n // +- width/2 because we have coordinates of a center\r\n if (\r\n this.fx() + width / 2 >= area.x &&\r\n this.fx() - width / 2 <= area.x &&\r\n this.fy() + height / 2 > area.y &&\r\n this.fy() - height / 2 < area.y\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getThumbWidth() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n }\r\n\r\n x() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\r\n }\r\n\r\n y() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\r\n }\r\n}\r\n\r\nexport default Thumb\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ITriangleAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n fill: string\r\n border: string\r\n}\r\n\r\nclass Triangle extends Element {\r\n static type = CanvasElementType.triangle\r\n\r\n declare scaled: Pick\r\n name = 'Triangle'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.lineTo(roundedXY.x3, roundedXY.y3)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.fill()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n context.set('strokeStyle', this.attrs.border)\r\n context.stroke()\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const polygon = [1, 2, 3].map((i) => ({\r\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\r\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nTriangle.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Triangle\r\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\n\r\nclass VerticalLine extends ScaledLine {\r\n static type = CanvasElementType.verticalLine\r\n\r\n name = 'Vertical line'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.renderContent = this.renderContent.bind(this)\r\n\r\n this.attrs.x2 = this.attrs.x1\r\n this._thumbs = [this._thumbs[0]]\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const domain = this.model.scale.y.domain()\r\n this.attrs.y1 = domain[0]\r\n this.attrs.y2 = domain[1]\r\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\r\n super.renderContent(context)\r\n }\r\n\r\n moveBy(x: number) {\r\n return (this.attrs.x1 = this.attrs.x2 += x)\r\n }\r\n\r\n resize({ difX }: RequireByKey) {\r\n return this.moveBy(difX)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitY: true })\r\n }\r\n}\r\n\r\nexport default VerticalLine\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IXABCDPositionAttrs {\r\n xx: number\r\n xy: number\r\n ax: number\r\n ay: number\r\n bx: number\r\n by: number\r\n cx: number\r\n cy: number\r\n dx: number\r\n dy: number\r\n}\r\n\r\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\r\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\r\n\r\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\r\n fill: string\r\n border: DrawingBorder\r\n lineWidth: number\r\n}\r\n\r\nclass XABCD extends Element {\r\n static type = CanvasElementType.xabcd\r\n\r\n name = 'XABCD pattern'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'x',\r\n () => this.attrs.xx,\r\n () => this.attrs.xy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.ax,\r\n () => this.attrs.ay,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.bx,\r\n () => this.attrs.by,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.cx,\r\n () => this.attrs.cy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'd',\r\n () => this.attrs.dx,\r\n () => this.attrs.dy,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n if (this.attrs.lineWidth == null) {\r\n this.attrs.lineWidth = 1\r\n }\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({\r\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\r\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\r\n })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\r\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.xx, roundedXY.xy)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.stroke()\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.start,\r\n fillStyle: '#ffffff',\r\n background: this.attrs.fill || '#000000',\r\n },\r\n this.model\r\n )\r\n\r\n for (const t of Array.from('xabcd')) {\r\n text\r\n .set({\r\n text: t.toUpperCase(),\r\n x: roundedXY[(t + 'x') as xPoints] - 6,\r\n y: roundedXY[(t + 'y') as yPoints] + 12,\r\n } as Partial)\r\n .render(context)\r\n }\r\n\r\n const retLabel = (y1: string, y2: string, y3: string) => {\r\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\r\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\r\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\r\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\r\n return text\r\n .set({\r\n text: ret.toFixed(3),\r\n x,\r\n y,\r\n })\r\n .render(context)\r\n }\r\n\r\n retLabel('x', 'a', 'b')\r\n retLabel('a', 'b', 'c')\r\n retLabel('b', 'c', 'd')\r\n retLabel('x', 'a', 'd')\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const t of Array.from('xabcd')) {\r\n this.attrs[(t + 'x') as xPoints] += x\r\n this.attrs[(t + 'y') as yPoints] += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs[(type + 'x') as xPoints] += difX\r\n return (this.attrs[(type + 'y') as yPoints] += difY)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n let t\r\n const xab = (() => {\r\n const result = []\r\n for (t of Array.from('xab')) {\r\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result\r\n })()\r\n const bcd = (() => {\r\n const result1 = []\r\n for (t of Array.from('bcd')) {\r\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result1\r\n })()\r\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nXABCD.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1 },\r\n ],\r\n}\r\n\r\nexport default XABCD\r\n","import Utils from '../utils'\r\nimport { getContextWithCache } from '../utils/canvas'\r\nimport { captureException, getIsSSr } from '../utils/helpers'\r\n\r\nclass Cache {\r\n constructor() {\r\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\r\n }\r\n\r\n set(callback, width, height) {\r\n this.callback = callback\r\n this.width = width\r\n this.height = height\r\n this.rendered = false\r\n }\r\n\r\n render(context, x, y) {\r\n if (x == null) {\r\n x = 0\r\n }\r\n if (y == null) {\r\n y = 0\r\n }\r\n if (!this.rendered) {\r\n this.refresh()\r\n }\r\n if (this.width < 1 || this.height < 1) {\r\n return\r\n }\r\n\r\n try {\r\n if (this.ratio >= 1 && this.canvas) {\r\n context.drawImage(\r\n this.canvas,\r\n 0,\r\n 0,\r\n ~~(this.width * this.ratio),\r\n ~~(this.height * this.ratio),\r\n x,\r\n y,\r\n this.width,\r\n this.height\r\n )\r\n } else {\r\n context.save()\r\n context.translate(x, y)\r\n this.callback(context)\r\n context.restore()\r\n }\r\n } catch (e) {\r\n captureException(\r\n e,\r\n this.canvas\r\n ? {\r\n extra: {\r\n width: this.width,\r\n height: this.height,\r\n ratio: this.ratio,\r\n cWidth: this.canvas.width,\r\n cHeight: this.canvas.height,\r\n sWidth: window.screen.width,\r\n sHeight: window.screen.height,\r\n },\r\n }\r\n : {}\r\n )\r\n }\r\n }\r\n\r\n refresh() {\r\n if (getIsSSr()) {\r\n return\r\n }\r\n this.canvas.width = this.width\r\n this.canvas.height = this.height\r\n this.context = getContextWithCache(this.canvas)\r\n this.ratio = Utils.getScaleRatio()\r\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\r\n this.context.scale(this.ratio, this.ratio)\r\n\r\n this.callback(this.context)\r\n this.rendered = true\r\n }\r\n}\r\n\r\nexport default Cache\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { TextAlign, TextBaseline } from '../../constants/common'\r\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\r\n\r\nexport enum OHLCType {\r\n singleLine = 'singleLine',\r\n dateOnly = 'dateOnly',\r\n timeOnly = 'timeOnly',\r\n}\r\n\r\nexport interface IMargin {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IPadding {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IGenericText {\r\n margin: IMargin\r\n font: IFont\r\n}\r\n\r\ninterface IFont {\r\n size?: number\r\n style?: string\r\n weight?: string\r\n family?: string\r\n lineHeight?: number\r\n padding?: IPadding\r\n baseline?: TextBaseline\r\n textAlign?: TextAlign\r\n}\r\n\r\ninterface ISettingsGeneralBase {\r\n Colors: IChartThemeColors\r\n}\r\n\r\nexport interface ISettingsCenterBase {\r\n barWidth: number\r\n barMargin: number\r\n border: number\r\n volumeHeight?: number\r\n}\r\n\r\ninterface ISettingsTopBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsBottomBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsLeftBase {\r\n width: number\r\n}\r\n\r\ninterface ISettingsRightBase {\r\n width: number\r\n}\r\n\r\nexport interface ISettings {\r\n ChartSettings: IChartSettings\r\n IndicatorSettings: IIndicatorSettings\r\n MarketSentimentSettings: IMarketSentimentChartSettings\r\n ColorsSettings: Array\r\n ThumbSettings: IThumbSettings\r\n ElementSettings: IElementSettings\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport interface IChartSettings {\r\n general: IChartGeneral\r\n center: ISettingsCenterBase\r\n top: IChartTop\r\n bottom: IChartBottom\r\n left: IChartLeft\r\n right: IChartRight\r\n}\r\n\r\ninterface IChartGeneral {\r\n settingsHeight: number\r\n tickerTimeframeChangeHeight: number\r\n Colors: IChartThemeColors & ObjectHash\r\n}\r\n\r\ninterface IChartTop extends ISettingsTopBase {\r\n baseline: TextBaseline\r\n ticker: IGenericText\r\n ohlc: IOHLC\r\n change: IGenericText\r\n}\r\n\r\ninterface IOHLC extends IGenericText {\r\n type?: OHLCType\r\n}\r\n\r\ninterface IChartBottom extends ISettingsBottomBase {\r\n baseline: TextBaseline\r\n axis: IGenericText\r\n}\r\n\r\ninterface IChartLeft extends ISettingsLeftBase {\r\n overlayLabel: IOverlayLabel\r\n timeframe: IGenericText\r\n volumeAxis: IGenericText\r\n}\r\n\r\ninterface IOverlayLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IChartRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\nexport interface IIndicatorSettings {\r\n general: IIndicatorGeneral\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: IIndicatorLeft\r\n right: IIndicatorRight\r\n}\r\n\r\ninterface IIndicatorRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\ninterface IIndicatorLeft extends ISettingsLeftBase {\r\n indicatorLabel: IIndicatorLabel\r\n}\r\n\r\ninterface IIndicatorLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IIndicatorGeneral {\r\n Colors: IIndicatorThemeColors\r\n height: number\r\n}\r\n\r\ninterface IMarketSentimentChartSettings {\r\n general: ISettingsGeneralBase\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: ISettingsLeftBase\r\n right: ISettingsRightBase\r\n}\r\n\r\ninterface IThumbSettings {\r\n size: number\r\n touchSize: number\r\n color: string\r\n borderWidth: number\r\n borderColor: string\r\n}\r\n\r\ninterface IElementSettings {\r\n Colors: IElementThemeColors\r\n defaultFill: string\r\n defaultTransparentFill: string\r\n}\r\n","export enum ChartMinWidthBreakpoints {\r\n xs = 0,\r\n s = 480,\r\n m = 768,\r\n l = 1024,\r\n}\r\n\r\nexport function getChartBreakpoints(chartWidthInPx: number) {\r\n return {\r\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\r\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\r\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\r\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n Instrument,\r\n Maybe,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Cache from '../canvas/cache'\r\nimport Element from '../canvas/element'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n CHART_MARGIN,\r\n FONT_SIZE,\r\n IndicatorType,\r\n LINE_HEIGHT,\r\n MONTHS,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAMES_WITH_PRE_MARKET,\r\n TextAlign,\r\n TextBaseline,\r\n getTimeframeLabel,\r\n} from '../constants/common'\r\nimport {\r\n getIsSmallIndexChart,\r\n getPercentageFromValue,\r\n getTranslate,\r\n getValueFromPercentage,\r\n} from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport { getColorOverwrites } from '../models/chart_settings'\r\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\r\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\r\nimport mouseModel from '../models/mouse'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Overlay from '../overlays/overlay'\r\nimport { overlaysByType } from '../overlays/overlays'\r\nimport utils, { isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\r\nimport {\r\n ITickerChange,\r\n getBarWithoutMarginWidth,\r\n getChangeColor,\r\n getHalfBarWidth,\r\n getShouldUseDarkerWickColors,\r\n getTickerChange,\r\n getTickerChangeFromCloseValues,\r\n getVirtualTimeframeTradedDates,\r\n renderCross,\r\n round,\r\n unmountCanvas,\r\n} from '../utils/chart'\r\nimport { renderFadeExtendedHours, renderXAxis } from '../utils/chart-grid-render-utils'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\r\nimport { setElementCursor } from '../utils/cursor'\r\nimport { drawInVisibleArea, getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getChartBreakpoints } from './utils'\r\n\r\nexport interface BaseChartAttrs {\r\n overlays: Required['overlays']\r\n}\r\n\r\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\r\n\r\ninterface LastOHLCAttrs {\r\n text: string\r\n x: number\r\n y: number\r\n width: number\r\n textBaseline: TextBaseline\r\n textAlign: TextAlign\r\n}\r\n\r\ninterface IRenderOHLCParameters {\r\n context: CanvasRenderingContext2D\r\n date: Maybe\r\n open?: Maybe\r\n high?: Maybe\r\n low?: Maybe\r\n close?: Maybe\r\n volume?: Maybe\r\n afterHour?: string\r\n isSmallIndexChart?: boolean\r\n isNewestOHLC?: boolean\r\n directRender?: boolean\r\n time?: string\r\n changePercentage?: Maybe\r\n}\r\n\r\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n const t =\r\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\r\n ':' +\r\n date.getMinutes().toString().padLeft('00') +\r\n (date.getHours() < 12 ? 'AM' : 'PM')\r\n dateString = `${MONTHS[month]} ${day} ${t}`\r\n break\r\n case TIMEFRAME.d:\r\n case TIMEFRAME.w:\r\n dateString = `${MONTHS[month]} ${day}`\r\n break\r\n case TIMEFRAME.m:\r\n dateString = `${MONTHS[month]} ${year}`\r\n break\r\n default:\r\n break\r\n }\r\n\r\n return dateString\r\n}\r\n\r\nfunction getClosestDifferentMinMaxValueIndices(\r\n currentMinIndex: number,\r\n currentMaxIndex: number,\r\n high: number[],\r\n low: number[]\r\n): { minIndex: number; maxIndex: number } {\r\n const hasPreviousIndex = currentMinIndex > 0\r\n const hasNextIndex = currentMaxIndex < high.length - 1\r\n let minIndex = currentMinIndex\r\n let maxIndex = currentMaxIndex\r\n if (hasPreviousIndex) {\r\n minIndex -= 1\r\n }\r\n if (hasNextIndex) {\r\n maxIndex += 1\r\n }\r\n\r\n if (low[minIndex] === high[maxIndex] && (hasPreviousIndex || hasNextIndex)) {\r\n return getClosestDifferentMinMaxValueIndices(minIndex, maxIndex, high, low)\r\n }\r\n\r\n return low[minIndex] < high[maxIndex] ? { minIndex, maxIndex } : { minIndex: maxIndex, maxIndex: minIndex }\r\n}\r\n\r\nconst gray300 = tailwindColors.gray[300]\r\n\r\nclass BaseChart extends Element {\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n if (!this.model.width) return 0\r\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n if (!this.paneModel.height) return 0\r\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\r\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\r\n }\r\n\r\n static label = 'Chart'\r\n static iconName = ''\r\n\r\n paneModel: PaneModel\r\n model: Chart\r\n data: Quote\r\n specificChartFunctionality: SpecificChartFunctionality\r\n tickerWidth = 0\r\n changeWidth = 0\r\n lastOhlc: Array> = []\r\n overlays: Overlay[] = []\r\n isLargeChart?: boolean\r\n shouldRenderVolume = true\r\n afterChange: {\r\n x: number\r\n y: number\r\n width: number\r\n } | null = null\r\n\r\n declare setupAxisTimeFrame: string\r\n declare volumeFY: d3.ScaleLinear\r\n declare tickerText: Text\r\n declare baseCache: Cache\r\n declare leftOffset: number\r\n declare context: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare isMobile: boolean\r\n\r\n constructor(values: Partial, paneModel: PaneModel) {\r\n super(values, paneModel)\r\n\r\n this.paneModel = paneModel\r\n this.model = this.paneModel.chart()\r\n this.data = this.model.quote()\r\n const chartLayoutModel = this.model.chart_layout()\r\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\r\n this.isLargeChart = chartLayoutModel.isLargeChart\r\n this.isMobile = utils.isMobile(true)\r\n\r\n this.overlays = []\r\n if (values.overlays) {\r\n for (const overlayDefinition of values.overlays) {\r\n // overlayDefinition.color coming from DB is always string however overlays\r\n // internaly didn't use format as in db (type, color, period) but rather\r\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\r\n // thus overlayDefinition.color might be undefined\r\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\r\n // but for now (!overlayDefinition.color) check solve issue as well\r\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\r\n {\r\n ...overlayDefinition,\r\n color:\r\n !overlayDefinition.color || overlayDefinition.color.includes('|')\r\n ? ''\r\n : convertColorToHEX(overlayDefinition.color),\r\n },\r\n this.paneModel\r\n )\r\n this.addOverlay(overlay)\r\n }\r\n delete values.overlays\r\n }\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n\r\n // this.paneModel.bind('update', this.setupAxis.bind(this))\r\n this.paneModel.bind('update', this.setupCache)\r\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\r\n this.model = this.paneModel.chart()\r\n // this.model.bind('change', this.setupAxis.bind(this))\r\n this.model.bind('change', this.setupCache)\r\n this.model.bind('change', this.trigger.bind(this, 'change'))\r\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n this.model.unbind('change', this.setupCache)\r\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n unmountCanvas(this.baseCache.canvas)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart_layout().bind('theme', this.setupCache)\r\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\r\n\r\n this.setupCache()\r\n }\r\n\r\n renderChart() {\r\n throw Error('Implement renderChart')\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n\r\n if (this.data.close.length === 0) {\r\n this.renderChartNotAvailable()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n return\r\n }\r\n\r\n this.context.save()\r\n this.clip()\r\n this.renderVolume()\r\n this.renderChart()\r\n this.renderOverlays()\r\n this.renderPrevClose()\r\n renderFadeExtendedHours({ context: this.context, paneModel: this.paneModel, quote: this.data })\r\n this.context.restore()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n }\r\n\r\n renderGrid(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n // text, xAxis, volumeAxis\r\n this.renderXAxis()\r\n this.baseCache.render(context)\r\n }\r\n\r\n renderTicker(context: CanvasRenderingContext2D) {\r\n if (this.tickerText) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.translate(ChartSettings.left.width, 0)\r\n this.tickerText.render(context)\r\n\r\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\r\n const { Colors } = ChartSettings.general\r\n new Text(\r\n {\r\n text: 'ETF',\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\r\n font: { size: FONT_SIZE.XXS },\r\n fillStyle: Colors.text,\r\n textBaseline: ChartSettings.top.baseline,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n context.translate(-ChartSettings.left.width, 0)\r\n }\r\n }\r\n\r\n renderTimeframe(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const quote = this.model.quote()\r\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\r\n\r\n return new Text(\r\n {\r\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\r\n x: ChartSettings.left.timeframe.margin.left,\r\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\r\n angle: -90,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n } else {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: { size: FONT_SIZE.L, style: 'bold' },\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n this.tickerWidth = this.tickerText.measure(context)\r\n\r\n // render watermark on backend chart\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n let yOffset = 0\r\n if (!isOurSiteRequest) {\r\n yOffset = this.isLargeChart ? -2 : -3\r\n }\r\n new Text(\r\n {\r\n text: '© finviz.com',\r\n x: this.width + ChartSettings.right.width - 2,\r\n y: 1 + yOffset,\r\n font: { size: isOurSiteRequest ? FONT_SIZE.XS : FONT_SIZE.M },\r\n textAlign: TextAlign.right,\r\n textBaseline: TextBaseline.top,\r\n fillStyle: isOurSiteRequest ? 'rgb(136, 193, 233)' : tailwindColors.finviz.blue,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderChange({ context })\r\n if (!this.lastOhlc[0]) {\r\n this.getOHLC({ context, directRender: false })\r\n }\r\n this.getOHLC({ context })\r\n }\r\n\r\n context.restore()\r\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderTimeframe(context)\r\n }\r\n }\r\n\r\n getOHLC({\r\n context,\r\n directRender = true,\r\n data,\r\n date,\r\n dateString = null,\r\n changePercentage = null,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n directRender?: boolean\r\n data?: {\r\n open?: string\r\n high?: string\r\n low?: string\r\n close?: string\r\n volume?: string\r\n }\r\n date?: Date\r\n dateString?: string | null\r\n changePercentage?: ITickerChange | null\r\n }) {\r\n if (!this.data.lastDate) return\r\n\r\n // modulo \"parsing\" is 100% faster than with str.slice()\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n isSmallIndexChart: true,\r\n isNewestOHLC: true,\r\n directRender,\r\n })\r\n } else if (data && date) {\r\n this.renderOHLC({\r\n context,\r\n date: getDateString({ date, timeframe: this.data.timeframe }),\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\r\n directRender,\r\n changePercentage,\r\n })\r\n } else if (dateString !== null) {\r\n this.renderOHLC({\r\n context,\r\n date: dateString,\r\n open: null,\r\n high: null,\r\n low: null,\r\n close: null,\r\n volume: null,\r\n directRender,\r\n })\r\n } else {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n afterHour:\r\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\r\n ? this.roundOhlc(this.data.afterClose)\r\n : undefined,\r\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\r\n isNewestOHLC: true,\r\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n }),\r\n directRender,\r\n ...this.getRoundedLastData(),\r\n })\r\n }\r\n }\r\n\r\n getRoundedLastData() {\r\n return {\r\n open: this.roundOhlc(this.data.lastOpen),\r\n high: this.roundOhlc(this.data.lastHigh),\r\n low: this.roundOhlc(this.data.lastLow),\r\n close: this.roundOhlc(this.data.lastClose),\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabelsQuotePage(context)\r\n } else if (this.data.close.length !== 0) {\r\n this.renderOverlaysLabelsChartsPage(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.overlayLabel.margin.left,\r\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n text\r\n .set({\r\n text: overlay.toString(),\r\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\r\n fillStyle: overlay.getLabelColor(),\r\n })\r\n .render(context)\r\n }\r\n }\r\n\r\n getYAxisLeftMargin() {\r\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\r\n return 3\r\n }\r\n return 8\r\n }\r\n\r\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\r\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\r\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\r\n }\r\n return this.round(lastClose)\r\n }\r\n\r\n renderYAxis(\r\n context: CanvasRenderingContext2D,\r\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\r\n renderLabels = true\r\n ) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y, lineTicks, textTicks, lastCloseLabel\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n translate.do()\r\n const tickCount = Math.floor(this.paneModel.height / 35)\r\n const minMax = this.getMinMax()\r\n const { firstVisibleClose } = minMax\r\n const height = this.height\r\n let stepPrice = 0\r\n let placesAxis\r\n\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n\r\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\r\n\r\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\r\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\r\n\r\n const percScale = d3.scaleLinear().range([0, this.height]).domain([maxPerc, minPerc]).nice(10)\r\n textTicks = percScale.ticks(Math.min(tickCount, 9))\r\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n break\r\n }\r\n case ScaleType.Logarithmic: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n lineTicks = [Math.floor(min)]\r\n const pixelGap = 30\r\n\r\n const negativeScale = []\r\n if (min < 0) {\r\n let previousNegativeTick = Math.min(0, max)\r\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\r\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\r\n if (previousNegativeTick === tick) {\r\n break\r\n }\r\n const range = d3.nice(-previousNegativeTick, -tick, 2)\r\n previousNegativeTick = -range[range.length - 1]\r\n negativeScale.unshift(previousNegativeTick)\r\n }\r\n }\r\n\r\n const positiveScale = []\r\n if (max > 0) {\r\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\r\n }\r\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\r\n const previousTick = positiveScale[positiveScale.length - 1]\r\n const positiveScaleY = this.paneModel.scale.y(positiveScale[positiveScale.length - 1])\r\n const tick = this.paneModel.scale.y.invert(positiveScaleY - pixelGap)\r\n if (previousTick === tick) {\r\n break\r\n }\r\n\r\n const range = d3.nice(previousTick, tick, 2)\r\n positiveScale.push(range[range.length - 1])\r\n }\r\n lineTicks = [...negativeScale, ...positiveScale]\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n break\r\n }\r\n default:\r\n // default to linear scale type\r\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n }\r\n\r\n if (textTicks.length >= 2) {\r\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\r\n }\r\n if (\r\n stepPrice > 10 ||\r\n (getIsSmallIndexChart(this.specificChartFunctionality) && Math.round(textTicks[0]).toString().length > 3) // if small index chart max tick is less than 999 (3 digits) allow for decimals in axis labels\r\n ) {\r\n placesAxis = 0\r\n }\r\n\r\n const getYLineText = (val: number, places?: number) => {\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage:\r\n return `${val}%`\r\n default:\r\n return this.round(val, places)\r\n }\r\n }\r\n\r\n const yTickText = new Text(\r\n {\r\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n\r\n let yTickLine = this.getYLine()\r\n const resetYTicksStyles = () => {\r\n yTickText.set({\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n })\r\n yTickLine = this.getYLine()\r\n }\r\n for (let i = 0; i < lineTicks.length; i++) {\r\n y = Math.round(this.fy(lineTicks[i]))\r\n if (y < 0 || y > height) continue\r\n yTickLine.set({ y1: y, y2: y })\r\n yTickText.set({\r\n text: getYLineText(textTicks[i], placesAxis),\r\n y,\r\n })\r\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\r\n yTickLine.set({ strokeStyle: Colors.text })\r\n yTickText.set({\r\n font: { weight: 'bold', size: yTickText.attrs.font.size },\r\n fillStyle: Colors.percentageZeroLineText,\r\n })\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n resetYTicksStyles()\r\n } else {\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n }\r\n }\r\n translate.undo()\r\n\r\n if (renderLabels) {\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\r\n // if (typeof this.data.afterClose === 'number') {\r\n // this.renderYAxisLabel({\r\n // context,\r\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n // mainLabelValue: lastClose,\r\n // secondaryLabelValue: this.data.afterClose,\r\n // }),\r\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\r\n // background: this.getSecondaryLabelBackgroundColor(),\r\n // })\r\n // }\r\n }\r\n }\r\n\r\n getSecondaryLabelBackgroundColor() {\r\n return stringifyHSVAColor(\r\n {\r\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\r\n s: 0.3,\r\n },\r\n 'hex'\r\n )\r\n }\r\n\r\n getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue,\r\n secondaryLabelValue,\r\n }: {\r\n mainLabelValue: number\r\n secondaryLabelValue: number\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\r\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\r\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\r\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\r\n const offsetedY = mainLabelValuePosition + offset * direction\r\n\r\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\r\n ? secondaryLabelValuePosition\r\n : offsetedY\r\n }\r\n\r\n renderYAxisLabel({\r\n context,\r\n yCoordinate,\r\n label,\r\n background,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n yCoordinate: number\r\n label: string\r\n background?: string\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n const { Colors } = ChartSettings.general\r\n const { size, lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n translate.do()\r\n new Text(\r\n {\r\n text: label,\r\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\r\n y: yCoordinate,\r\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\r\n lineHeight,\r\n padding,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle:\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\r\n background: background || Colors.currentBackground,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n this.context.save()\r\n if (\r\n this.data.getDrawDays() !== 1 &&\r\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\r\n this.data.instrument !== Instrument.MarketSentiment\r\n ) {\r\n this.clip(true)\r\n }\r\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\r\n const textRenderer = new Text(\r\n {\r\n y: this.height + ChartSettings.bottom.axis.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n\r\n renderXAxis({ context: this.context, quote: this.data, paneModel: this.paneModel, textRenderer, type: this.type })\r\n\r\n this.context.restore()\r\n }\r\n\r\n handleIndicatorsChange() {\r\n this.updateShouldRenderVolume()\r\n this.setupCache()\r\n this.trigger('change')\r\n }\r\n\r\n updateShouldRenderVolume() {\r\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\r\n }\r\n\r\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\r\n const maxCount = 5\r\n const minCount = 1\r\n if (count > maxCount) {\r\n count = maxCount\r\n }\r\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\r\n if (count <= minCount) {\r\n return [ticks[ticks.length - 1]]\r\n }\r\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\r\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\r\n // dynamically, we add 3px of space per tick gap\r\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\r\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\r\n }\r\n return ticks\r\n }\r\n\r\n renderVolumeAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n context.save()\r\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\r\n\r\n const x = 20\r\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\r\n const height = this.height * (0.5 * relativeVolume)\r\n\r\n const label = new Text(\r\n {\r\n x: 15,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n for (let i = 0.5; i <= 2; i += 0.5) {\r\n const y = Math.round(fy(i))\r\n label\r\n .set({\r\n text: i.toFixed(1),\r\n y: y,\r\n })\r\n .render(context)\r\n\r\n context.set('strokeStyle', 'rgb(130, 130, 130)')\r\n context.beginPath()\r\n context.setLineDash([2, 3])\r\n context.translate(0, 0.5)\r\n context.moveTo(x, y)\r\n context.lineTo(x + 7, y)\r\n context.translate(0, -0.5)\r\n context.stroke()\r\n }\r\n\r\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', Colors.grid)\r\n context.setLineDash([])\r\n\r\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\r\n context.translate(0.5, 0.5)\r\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\r\n context.translate(-0.5, -0.5)\r\n\r\n new Text(\r\n {\r\n text: 'RELATIVE\\nVOLUME',\r\n x: 33,\r\n y: ChartSettings.top.height + this.height + 6,\r\n font: { size: FONT_SIZE.XXS },\r\n lineHeight: LINE_HEIGHT.XS,\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n context.restore()\r\n return\r\n }\r\n const rangeMax = this.volumeFY.range()[1]\r\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\r\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\r\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\r\n const format = this.volumeFY.tickFormat(4, 's')\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.volumeAxis.margin.left,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n ticks.forEach((tick) =>\r\n text\r\n .set({\r\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\r\n })\r\n .render(context)\r\n )\r\n }\r\n\r\n renderVolume() {\r\n if (!this.shouldRenderVolume) return\r\n\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n // Return if the domain bounds are equal, this would put any value in the middle\r\n const [domainFrom, domainTo] = this.volumeFY.domain()\r\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height + this.height - 59,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n const barWidthWithoutMargin = getBarWithoutMarginWidth(this.model)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n // Skip render if the value is <= 0\r\n if (this.data.volume[i] <= 0) {\r\n return\r\n }\r\n\r\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.volumeFY(this.data.volume[i]))\r\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n renderOverlays() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n for (const overlay of this.overlays) {\r\n overlay.renderContent(this.context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n const isRendered = renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.paneModel,\r\n contentWidth: this.width,\r\n contentHeight: this.height,\r\n quote: this.data,\r\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\r\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\r\n })\r\n if (this.getIsRedesignedChart()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\r\n }\r\n\r\n if (isRendered !== undefined) {\r\n setElementCursor({\r\n elementId: this.model.chart_layout().getHTMLElementId(),\r\n cursor: isRendered ? 'crosshair' : 'default',\r\n conditionalCursor: 'grabbing',\r\n })\r\n }\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const n = this.data.getDataByBarIndex(key, crossIndex)\r\n if (n !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const crossClose = this.data.close[crossDataIndex] ?? null\r\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n if (Number.isNaN(crossIndex)) {\r\n this.getOHLC({ context })\r\n context.restore()\r\n return\r\n }\r\n }\r\n\r\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\r\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\r\n\r\n if (date === null) {\r\n const virtualTradedDates =\r\n this.data.date.length > 0\r\n ? getVirtualTimeframeTradedDates({\r\n dateStart: this.data.date[0],\r\n dateEnd: this.data.date[this.data.date.length - 1],\r\n quote: this.data,\r\n })\r\n : []\r\n this.getOHLC({\r\n context,\r\n dateString: virtualTradedDates[crossIndex]\r\n ? getDateString({\r\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\r\n timeframe: this.data.timeframe,\r\n })\r\n : null,\r\n })\r\n context.restore()\r\n return\r\n }\r\n\r\n this.getOHLC({\r\n context,\r\n date,\r\n data: {\r\n open: this.getDataByCrossIndex(crossIndex, 'open'),\r\n high: this.getDataByCrossIndex(crossIndex, 'high'),\r\n low: this.getDataByCrossIndex(crossIndex, 'low'),\r\n close: this.getDataByCrossIndex(crossIndex, 'close'),\r\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\r\n },\r\n changePercentage: this.getCrossIndexChange(crossIndex),\r\n })\r\n\r\n context.restore()\r\n }\r\n\r\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\r\n const CHANGE_SPACER = 10\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { ticker, change, ohlc } = ChartSettings.top\r\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\r\n\r\n if (!tickerChange) {\r\n return\r\n }\r\n\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n const finvizWatermarkOffset = !isOffscreen || isOurSiteRequest || this.isLargeChart ? 0 : 15\r\n const changeText = new Text(\r\n {\r\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\r\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\r\n ? this.width - ChartSettings.top.change.margin.right! - finvizWatermarkOffset\r\n : this.width,\r\n y: ChartSettings.top.change.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n this.changeWidth = changeText.measure(context)\r\n changeText.render(context)\r\n\r\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\r\n return\r\n }\r\n if (tickerAfterChange) {\r\n const afterChangeText = new Text(\r\n {\r\n text: tickerAfterChange?.string,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n const afterChangeTextWidth = afterChangeText.measure(context)\r\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\r\n\r\n if (\r\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\r\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\r\n y: ChartSettings.top.change.margin.top,\r\n })\r\n .render(context)\r\n this.afterChange = null\r\n this.changeWidth = oneLineAHChangeWidth\r\n } else if (\r\n this.lastOhlc[0] &&\r\n ChartSettings.left.width +\r\n this.tickerWidth +\r\n ticker.margin.left! +\r\n this.lastOhlc[0].width! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! <\r\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n })\r\n .render(context)\r\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\r\n this.afterChange = {\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n width: afterChangeTextWidth,\r\n }\r\n }\r\n }\r\n }\r\n\r\n renderOHLC(parameters: IRenderOHLCParameters) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOHLCQuotePage(parameters)\r\n } else {\r\n this.renderOHLCChartsPage(parameters)\r\n }\r\n }\r\n\r\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const OhlcText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n },\r\n this.paneModel\r\n )\r\n\r\n const dateElements = date ? [{ text: date, color: gray300 }] : []\r\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\r\n const oElements = open\r\n ? [\r\n { text: 'O', color: gray300 },\r\n { text: open, color: trendColor },\r\n ]\r\n : []\r\n const hElements = high\r\n ? [\r\n { text: 'H', color: gray300 },\r\n { text: high, color: trendColor },\r\n ]\r\n : []\r\n const lElements = low\r\n ? [\r\n { text: 'L', color: gray300 },\r\n { text: low, color: trendColor },\r\n ]\r\n : []\r\n const cElements = close\r\n ? [\r\n { text: 'C', color: gray300 },\r\n { text: close, color: trendColor },\r\n ]\r\n : []\r\n const volElements = volume\r\n ? [\r\n { text: 'Vol', color: gray300 },\r\n { text: volume, color: trendColor },\r\n ]\r\n : []\r\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\r\n\r\n const lines: OhlcLineElements[] = []\r\n\r\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\r\n lineElements.flatMap((elements, index) =>\r\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\r\n )\r\n if (chartBreakpoints.isM) {\r\n lines.push(\r\n getFlatLineArrayWithSpaces([\r\n dateElements,\r\n oElements,\r\n hElements,\r\n lElements,\r\n cElements,\r\n volElements,\r\n changeElements,\r\n ])\r\n )\r\n } else if (chartBreakpoints.isS) {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\r\n } else {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\r\n }\r\n\r\n const startX = OFFSET.M - ChartSettings.left.width\r\n let x = startX\r\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\r\n\r\n lines.forEach((line) => {\r\n x = startX\r\n line.forEach((lineElement, index, lineElements) => {\r\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\r\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\r\n if (index === 0) {\r\n padding.left = 5\r\n } else if (index === lineElements.length - 1) {\r\n padding.right = 5\r\n } else if (lineElement === 'space') {\r\n padding.left = 7\r\n padding.right = 7\r\n if (!chartBreakpoints.isS) {\r\n padding.left = 5\r\n padding.right = 5\r\n }\r\n }\r\n OhlcText.set({ text, fillStyle: color, x, y, padding })\r\n OhlcText.render(context)\r\n x += OhlcText.width\r\n })\r\n y += OhlcText.attrs.lineHeight\r\n })\r\n }\r\n\r\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const LabelsText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\r\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\r\n x: OFFSET.M - ChartSettings.left.width,\r\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\r\n },\r\n this.paneModel\r\n )\r\n\r\n let numberOfNewOhlcLines = 2\r\n if (chartBreakpoints.isM) {\r\n numberOfNewOhlcLines = 1\r\n } else if (chartBreakpoints.isS) {\r\n numberOfNewOhlcLines = 2\r\n }\r\n\r\n // We assume lineheight is the same as OHLC text\r\n const { lineHeight } = LabelsText.attrs\r\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\r\n\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n LabelsText.set({\r\n text: overlay.toString(),\r\n y,\r\n fillStyle: overlay.getLabelColor(),\r\n }).render(context)\r\n y += lineHeight\r\n }\r\n }\r\n\r\n renderOHLCQuotePage({\r\n context,\r\n date,\r\n open,\r\n high,\r\n low,\r\n close,\r\n volume,\r\n afterHour,\r\n isSmallIndexChart = false,\r\n isNewestOHLC = false,\r\n time,\r\n directRender = false,\r\n changePercentage,\r\n }: IRenderOHLCParameters) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { ohlc } = ChartSettings.top\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n if (isOffscreen && isGroupInstrument) {\r\n ohlc.type = OHLCType.dateOnly\r\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\r\n ohlc.type = OHLCType.timeOnly\r\n }\r\n\r\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\r\n const OHLCFontSize = ohlc.font.size!\r\n const centerXOffset =\r\n this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n (this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n this.changeWidth +\r\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\r\n 2\r\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\r\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\r\n const OHLC = hasOhlc\r\n ? {\r\n date: [date ?? ''],\r\n singleLine: [\r\n `${date} O:${open} H:${high} L:${low} C:${close}${\r\n afterHour ? ` AH:${afterHour}` : ''\r\n } Vol:${volume} `,\r\n /*\r\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\r\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\r\n * */\r\n changePercentage ? changePercentage.string : undefined,\r\n ].filter((value) => value !== undefined),\r\n }\r\n : {\r\n date: [date ?? ''],\r\n singleLine: [`${date ?? ''}`],\r\n }\r\n\r\n const OHLC_TEXT = new Text(\r\n {\r\n font: { size: OHLCFontSize },\r\n },\r\n this.paneModel\r\n )\r\n\r\n const getOHLCType = () => {\r\n if (!isSmallIndexChart) {\r\n return OHLCType.singleLine\r\n }\r\n return OHLCType.dateOnly\r\n }\r\n\r\n const getOHLCSettings = () => {\r\n switch (ohlc.type || getOHLCType()) {\r\n case OHLCType.singleLine:\r\n return {\r\n text: OHLC.singleLine,\r\n x: [leftXOffset, leftXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n case OHLCType.dateOnly:\r\n if (isOffscreen && isGroupInstrument) {\r\n const text = `${OHLC.date} Volume: ${volume}`\r\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\r\n return {\r\n text: [text],\r\n x: [\r\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\r\n ],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else if (isSmallIndexChart) {\r\n return {\r\n text: OHLC.date,\r\n x: [centerXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else {\r\n const isEnoughSpace =\r\n this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! +\r\n this.changeWidth +\r\n ChartSettings.top.change.margin.right!) >\r\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\r\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\r\n return {\r\n text: OHLC.date,\r\n x: [leftXOffset],\r\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\r\n }\r\n }\r\n case OHLCType.timeOnly:\r\n return {\r\n text: [time],\r\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\r\n y: [lineTopY],\r\n textAlign: TextAlign.center,\r\n textBaseline: [ohlc.font.baseline],\r\n }\r\n default:\r\n return\r\n }\r\n }\r\n\r\n if (!isNewestOHLC) {\r\n context.fillStyle = Colors.canvasFill\r\n this.lastOhlc.forEach((line) => {\r\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\r\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\r\n context.fillRect(\r\n x - PADDING.XXS,\r\n y - PADDING.XXS,\r\n PADDING.XXS + line.width! + PADDING.XXS,\r\n PADDING.XXS + OHLCFontSize + PADDING.XXS\r\n )\r\n })\r\n\r\n if (this.afterChange) {\r\n context.fillRect(\r\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\r\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\r\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\r\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\r\n )\r\n }\r\n } else {\r\n this.lastOhlc = []\r\n }\r\n\r\n const ohlcSettings = getOHLCSettings()\r\n\r\n const renderOHLCToCanvas = ({\r\n ohlcSet,\r\n render = true,\r\n }: {\r\n ohlcSet?: {\r\n text: (string | undefined)[]\r\n x: number[]\r\n y: (number | undefined)[]\r\n textAlign: TextAlign\r\n textBaseline: (TextBaseline | undefined)[]\r\n }\r\n render?: boolean\r\n }) => {\r\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\r\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\r\n let i = index\r\n let leftOffset = 0\r\n let fillStyle = Colors.text\r\n let text = line\r\n if (index > 0 && isSingleLineWithChange) {\r\n i -= 1\r\n leftOffset = OHLC_TEXT.measure(context)\r\n text = line\r\n\r\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\r\n }\r\n const options = {\r\n text,\r\n x: ohlcSet.x[i] + leftOffset,\r\n y: ohlcSet.y[i],\r\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\r\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\r\n fillStyle,\r\n }\r\n OHLC_TEXT.set(options)\r\n if (isNewestOHLC) {\r\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\r\n }\r\n if (render) {\r\n OHLC_TEXT.render(context)\r\n }\r\n })\r\n }\r\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\r\n\r\n return {\r\n ohlcSettings,\r\n renderOHLCToCanvas,\r\n }\r\n }\r\n\r\n shouldShowPrevClose() {\r\n const quote = this.model.quote()\r\n const isStock = quote.instrument === Instrument.Stock\r\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\r\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\n return isStock && (isIntradayWithPreMarket || isIndexChart)\r\n }\r\n\r\n renderPrevClose() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.shouldShowPrevClose()) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n let y = Math.round(this.fy(this.model.quote().prevClose))\r\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n\r\n new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.prevClose,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n translate.undo()\r\n }\r\n\r\n renderChartNotAvailable() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\r\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\r\n new Text(\r\n {\r\n text: 'Chart not available',\r\n x,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n\r\n // private\r\n setupCache() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n /*\r\n * Don't create new Cache instances, because Safari takes too long to free up memory\r\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n *\r\n * To further improve performance, cache.set shouldn't be called when unnecessary,\r\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\r\n */\r\n this.baseCache = this.baseCache || new Cache()\r\n\r\n this.baseCache.set(\r\n (context: CanvasRenderingContext2D) => {\r\n if (this.data.close.length === 0) {\r\n this.renderText(context)\r\n return\r\n }\r\n this.renderYAxis(context)\r\n this.renderText(context)\r\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\r\n this.renderVolumeAxis(context)\r\n }\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n }\r\n },\r\n this.width + ChartSettings.left.width + ChartSettings.right.width,\r\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\r\n )\r\n }\r\n\r\n // called by controllers/pane on recountScale\r\n setupAxis(fx: ScaleAxis) {\r\n this.data = this.model.quote()\r\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\r\n\r\n if (typeof fx !== 'function') {\r\n return\r\n }\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n const volumes = []\r\n if (areNoBarsVisible) {\r\n volumes.push(\r\n this.data.volume[firstBarToRenderIndex.index],\r\n Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)\r\n )\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n volumes.push(this.data.volume[i])\r\n }\r\n }\r\n\r\n const max = utils.max(volumes) ?? 0\r\n const rangeMax = volumeHeight || 60\r\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\r\n this.setupAxisTimeFrame = this.data.timeframe\r\n }\r\n\r\n // private\r\n clip(addMarginBottom?: boolean) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n if (addMarginBottom == null) {\r\n addMarginBottom = false\r\n }\r\n this.context.beginPath()\r\n let marginBottom = 0\r\n if (addMarginBottom) {\r\n marginBottom = ChartSettings.bottom.height\r\n }\r\n // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate,\r\n // to compensate for this we clip canvas 1px taller than chart height\r\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom + 1)\r\n this.context.clip()\r\n }\r\n\r\n addOverlay(overlay: Overlay) {\r\n overlay.chart = this\r\n this.overlays.push(overlay)\r\n return this.trigger('change')\r\n }\r\n\r\n setOverlays(overlays: Overlay[]) {\r\n this.overlays = overlays\r\n return this.trigger('change')\r\n }\r\n\r\n removeOverlay(overlay: Overlay) {\r\n for (let index = 0; index < this.overlays.length; index++) {\r\n const el = this.overlays[index]\r\n if (el === overlay) {\r\n this.attrs.overlays.splice(index, 1)\r\n this.overlays.splice(index, 1)\r\n this.trigger('change')\r\n break\r\n }\r\n }\r\n }\r\n\r\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\r\n this.data = this.model.quote()\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n let minIndex = -1\r\n let maxIndex = -1\r\n let firstVisibleClose = null\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n // If no bars are visible min/max are first available bar before visible and first after\r\n if (areNoBarsVisible) {\r\n min = this.data.low[firstBarToRenderIndex.index]\r\n max = this.data.high[Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)]\r\n if (min > max) {\r\n const prevMin = min\r\n min = max\r\n max = prevMin\r\n }\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (minIndex === -1 || this.data.low[minIndex] > this.data.low[i]) {\r\n minIndex = i\r\n }\r\n if (maxIndex === -1 || this.data.high[maxIndex] < this.data.high[i]) {\r\n maxIndex = i\r\n }\r\n }\r\n\r\n // If only a single bar is visible get min/max index range from closes values outside of visible area\r\n if (this.data.low[minIndex] === this.data.high[maxIndex]) {\r\n const closestMinMaxIndices = getClosestDifferentMinMaxValueIndices(\r\n minIndex,\r\n maxIndex,\r\n this.data.high,\r\n this.data.low\r\n )\r\n minIndex = closestMinMaxIndices.minIndex\r\n maxIndex = closestMinMaxIndices.maxIndex\r\n }\r\n\r\n min = this.data.low[minIndex]\r\n max = this.data.high[maxIndex]\r\n\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n }\r\n\r\n // Apply scale min & max buffer if min/max is the same\r\n if (min === max) {\r\n min *= 0.99\r\n max *= 1.01\r\n }\r\n\r\n // Update min/max so prevClose is in range and can be rendered if it should\r\n if (this.shouldShowPrevClose() && this.data.prevClose !== null) {\r\n min = Math.min(min, this.data.prevClose)\r\n max = Math.max(max, this.data.prevClose)\r\n }\r\n\r\n // Update min/max so lastClose is in range and can be rendered if it should\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\r\n min = Math.min(min, this.data.lastClose)\r\n max = Math.max(max, this.data.lastClose)\r\n }\r\n\r\n return { min, max, firstVisibleClose }\r\n }\r\n\r\n moveBy() {}\r\n\r\n isInArea() {\r\n return false\r\n }\r\n\r\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.paneModel.scale.y(y)\r\n\r\n round(n: number, overridePlaces?: number) {\r\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\r\n }\r\n\r\n roundOhlc(n: number) {\r\n const placesLastClose = this.getPlacesLastClose()\r\n return round({\r\n data: this.data,\r\n num: n,\r\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\r\n })\r\n }\r\n\r\n toObject() {\r\n const overlays = this.overlays.map((overlay) => overlay.toObject())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n toConfig() {\r\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n getPlacesLastClose(price?: number) {\r\n const { lastClose, instrument } = this.data\r\n const priceAbs = price && Math.abs(price)\r\n if (lastClose >= 100000) {\r\n return 0\r\n } else if (lastClose >= 10000) {\r\n return 1\r\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\r\n return 4\r\n } else if (lastClose === undefined) {\r\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n return 2\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n hasOverlay(type: string) {\r\n return this.overlays.some((x) => x.type === 'overlays/' + type)\r\n }\r\n\r\n getXLine(): Line {\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getYLine(): Line {\r\n return new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart_layout())\r\n }\r\n\r\n getIsMobileChartPage() {\r\n return (\r\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n )\r\n }\r\n\r\n getCandleLikeChartsRenderingColors() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { theme, specificChartFunctionality } = this.model.chart_layout()\r\n let colors = Colors\r\n const overwrittenColors = getColorOverwrites({\r\n colors,\r\n theme,\r\n })\r\n const overwrittenColorKeys = Object.keys(overwrittenColors)\r\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\r\n (colorKey) => overwrittenColorKeys.includes(colorKey)\r\n )\r\n\r\n const shouldUseDarkerColors =\r\n theme === Theme.light &&\r\n getShouldUseDarkerWickColors({\r\n specificChartFunctionality: specificChartFunctionality,\r\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\r\n })\r\n\r\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...darkerWickColors }\r\n }\r\n const isNodeChartWithThinBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\r\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\r\n }\r\n\r\n return colors\r\n }\r\n\r\n getIsRedesignedChart() {\r\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\r\n }\r\n}\r\n\r\nBaseChart.initClass()\r\n\r\nexport default BaseChart\r\n","import { RendererChartBarProps } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport utils from '../utils'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './base_chart'\r\n\r\nconst WICK_WIDTH = 1\r\n\r\nclass CandleStick extends Chart {\r\n static type = ChartElementType.CandleStick\r\n static label = 'Candle'\r\n static iconName = 'candleBarBasic'\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\r\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const trendColor = close < open ? trendDown : trendUp\r\n const wickColor = close < open ? wickDown : wickUp\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n barFillColor: trendColor,\r\n borderColor: close < open ? borderDown : borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n renderChart() {\r\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\r\n return\r\n }\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: this.model.chart_layout(),\r\n zoomFactor: this.model.zoomFactor,\r\n })\r\n const shouldRenderFillAndBorder =\r\n barFillWidth + barBorderWidth * 2 >= 2 &&\r\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n const translateForWick = getTranslate({\r\n context: this.context,\r\n xOffset: WICK_WIDTH / 2,\r\n yOffset: 0,\r\n })\r\n\r\n translate.do()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, center: number) => {\r\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\r\n index: i,\r\n chartSettingsColors: Colors,\r\n hasFillAndBorder: shouldRenderFillAndBorder,\r\n })\r\n\r\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\r\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\r\n const candleWickHigh = Math.round(this.fy(high))\r\n const candleWickLow = Math.round(this.fy(low))\r\n\r\n const candleBodyHeight = candleBodyLow - candleBodyHigh\r\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\r\n const halfBorderWidth = barBorderWidth / 2\r\n\r\n // TODO: revisit for better approach, this solve issue with candlesticks\r\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\r\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\r\n return\r\n }\r\n\r\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\r\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\r\n\r\n translateForWick.do()\r\n this.context.set('strokeStyle', wickColor)\r\n this.context.beginPath()\r\n this.context.moveTo(center, candleWickHigh)\r\n if (shouldRenderFillAndBorder) {\r\n this.context.lineTo(center, candleBodyHigh)\r\n this.context.moveTo(\r\n center,\r\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\r\n )\r\n }\r\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\r\n this.context.stroke()\r\n translateForWick.undo()\r\n\r\n if (shouldRenderFillAndBorder) {\r\n const hasBorder = barBorderWidth > 0\r\n if (hasBorder) {\r\n this.context.set('strokeStyle', borderColor)\r\n if (isBodyHeightGreaterOrEqualBorders) {\r\n this.context.set('lineWidth', barBorderWidth)\r\n this.context.strokeRect(\r\n candleBodyLeftX + halfBorderWidth,\r\n candleBodyHigh + halfBorderWidth,\r\n barFillWidth + 2 * halfBorderWidth,\r\n candleBodyHeight - 2 * halfBorderWidth\r\n )\r\n this.context.set('lineWidth', WICK_WIDTH)\r\n } else {\r\n this.context.beginPath()\r\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\r\n const hasFill = fillHeight > 0\r\n if (hasFill || !hasBorder) {\r\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\r\n this.context.fillRect(\r\n candleBodyLeftX + barBorderWidth,\r\n candleBodyHigh + barBorderWidth,\r\n barFillWidth,\r\n hasFill ? fillHeight : WICK_WIDTH\r\n )\r\n }\r\n }\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default CandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport CandleStick from './candle_stick'\r\n\r\nclass HollowCandleStick extends CandleStick {\r\n static type = ChartElementType.HollowCandleStick\r\n static label = 'Hollow Candle'\r\n static iconName = 'candleBarHollow'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const isHollow = close > open\r\n const generalTrendColor =\r\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\r\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n // hollow candles have transparend bodies that's why rgba is here\r\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\r\n borderColor: trendColor,\r\n wickColor: trendColor,\r\n }\r\n }\r\n\r\n toString() {\r\n return `Hollow Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HollowCandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType, ScaleType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\r\nimport CandleStick from './candle_stick'\r\n\r\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\r\n\r\nclass HeikinAshi extends CandleStick {\r\n static type = ChartElementType.HeikinAshi\r\n static label = 'Heikin Ashi'\r\n static iconName = 'candleBarHeikinAshi'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\r\n const haData = this.data.getHeikinAshiData()\r\n\r\n const open = haData.open[index]\r\n const close = haData.close[index]\r\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\r\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\r\n return {\r\n open,\r\n close,\r\n high: Math.max(this.data.high[index], open, close),\r\n low: Math.min(open, close, this.data.low[index]),\r\n barFillColor: trendColor,\r\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n getLastValues = () => {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const {\r\n open: lastOpen,\r\n close: lastClose,\r\n high: lastHigh,\r\n low: lastLow,\r\n } = this.getRenderChartBarProps({\r\n index: this.data.date.length - 1,\r\n chartSettingsColors: Colors,\r\n })\r\n\r\n return { lastOpen, lastClose, lastHigh, lastLow }\r\n }\r\n\r\n getRoundedLastData() {\r\n const lastOhlc = this.getLastValues()\r\n return {\r\n open: this.roundOhlc(lastOhlc.lastOpen),\r\n high: this.roundOhlc(lastOhlc.lastHigh),\r\n low: this.roundOhlc(lastOhlc.lastLow),\r\n close: this.roundOhlc(lastOhlc.lastClose),\r\n }\r\n }\r\n\r\n renderYAxis = (context: CanvasRenderingContext2D) => {\r\n const { lastClose } = this.getLastValues()\r\n super.renderYAxis(context, { lastClose }, false)\r\n\r\n const { firstVisibleClose } = this.getMinMax()\r\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\r\n\r\n const originalLatestClose = this.data.close[this.data.close.length - 1]\r\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\r\n\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\r\n\r\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\r\n\r\n this.renderYAxisLabel({\r\n context,\r\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue: lastClose,\r\n secondaryLabelValue: originalLatestClose,\r\n }),\r\n label: originalLatestCloseLabel,\r\n background: this.getSecondaryLabelBackgroundColor(),\r\n })\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n if (barIndex > -1) {\r\n let value = null\r\n if (['high', 'low', 'open', 'close'].includes(key)) {\r\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\r\n value = data[key as OhlcKeys]\r\n }\r\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\r\n if (value !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\r\n }\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const haData = this.data.getHeikinAshiData()\r\n const crossClose = haData.close[barIndex] ?? null\r\n const previousClose = haData.close[barIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n toString() {\r\n return `HA Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HeikinAshi\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass LineChart extends Chart {\r\n static type = ChartElementType.LineChart\r\n static label = 'Line'\r\n static iconName = 'lineChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let first: number | undefined, last: number | undefined\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n this.context.set('strokeStyle', Colors.line)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const y = Math.round(this.fy(this.data.close[i]))\r\n this.context.lineTo(x, y)\r\n last = x\r\n if (first === undefined) {\r\n first = x\r\n }\r\n },\r\n })\r\n if (first !== undefined && last !== undefined) {\r\n this.context.stroke()\r\n this.context.set('fillStyle', Colors.background)\r\n this.context.lineTo(last!, this.height)\r\n this.context.lineTo(first!, this.height)\r\n this.context.fill()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default LineChart\r\n","import Text from '../canvas/text'\r\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst interval = 3\r\nconst domainMin = -1\r\nconst domainMax = 1\r\nconst red = 'rgba(200, 0, 0, 0.392)'\r\nconst redLine = 'rgb(120, 0, 0)'\r\nconst green = 'rgba(0, 180, 0, 0.392)'\r\nconst greenLine = 'rgb(0, 100, 0)'\r\n\r\nclass MarketSentiment extends Chart {\r\n static type = ChartElementType.MarketSentiment\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n declare _data: number[]\r\n declare _dataLastIndex: number | null\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n }\r\n\r\n setupCache() {\r\n super.setupCache()\r\n if (!this.data) {\r\n return\r\n }\r\n const arr: number[] = []\r\n this.data.close.forEach((sum, i) => {\r\n arr[i] = sum / this.data.volume[i]\r\n })\r\n this._data = arr\r\n\r\n let lastIndex = null\r\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\r\n if (this.data.volume[i] !== 0) {\r\n lastIndex = i\r\n break\r\n }\r\n }\r\n this._dataLastIndex =\r\n lastIndex === null\r\n ? null\r\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\r\n }\r\n\r\n renderChart() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\r\n yOffset: MarketSentimentSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\r\n translate.undo()\r\n }\r\n\r\n renderLineBullBear(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n overbought: number\r\n ) {\r\n if (this._dataLastIndex === null) {\r\n return\r\n }\r\n const isRedesign = isRedesignEnabled()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const domain = [domainMax, domainMin]\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[1]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', red)\r\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[0]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(overbought)) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', green)\r\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n renderXAxis() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const { Colors } = MarketSentimentSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const xLine = this.getXLine()\r\n const text = new Text(\r\n {\r\n y: this.height + 12,\r\n font: { size: 7 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n let x\r\n\r\n x = this.fx(0)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10) + 2 /* remove overflow */\r\n text.set({ text: '10AM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 20)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 40)\r\n text.set({ text: '12PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 60)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 80)\r\n text.set({ text: '2PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 100)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 120 - 1)\r\n text.set({ text: '4PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText() {}\r\n\r\n renderCrossText() {}\r\n\r\n renderOverlaysLabels() {}\r\n\r\n _compute() {\r\n return { min: domainMin, max: domainMax }\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const isRedesign = isRedesignEnabled()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const yLine = this.getYLine()\r\n for (const tick of [domainMin, 0, domainMax]) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n }\r\n\r\n const text = new Text(\r\n {\r\n x: this.width + 27,\r\n font: { size: 8 },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n\r\n const fillUp = isRedesign ? Colors.marketUp : greenLine\r\n const fillDown = isRedesign ? Colors.marketDown : redLine\r\n const last = this._data[this._dataLastIndex!]\r\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\r\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\r\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\r\n\r\n translate.undo()\r\n }\r\n\r\n clip() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n this.context.beginPath()\r\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\r\n this.context.clip()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n toString() {\r\n return `Market sentiment chart`\r\n }\r\n}\r\nMarketSentiment.initClass()\r\n\r\nexport default MarketSentiment\r\n","import { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\ninterface MultiLineChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nclass MultiLineChart extends Chart {\r\n static type = ChartElementType.MultiLineChart\r\n tickersDimensions: number[] = []\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.set('lineWidth', 1)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n\r\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\r\n const ticker = this.attrs.tickers[index]\r\n const quote = quotes[ticker]\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\r\n // margin?\r\n continue\r\n }\r\n const y = Math.round(this.fy(quote.close[i]))\r\n this.context.lineTo(x, y)\r\n }\r\n this.context.stroke()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const text = this.attrs.label || ''\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n return this.renderCrossText(context, this.data.barToDataIndex.length - 1)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\r\n\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n const isLastDate = crossIndex === this.data.close.length - 1\r\n\r\n new Text(\r\n {\r\n text: `${months[month]} ${day} ${year} `,\r\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\r\n const ticker = this.attrs.tickers[index]\r\n const closeValue = quotes[ticker].close[crossIndex]\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\r\n x: ChartSettings.left.width,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n lineHeight: LINE_HEIGHT.M,\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n\r\n if (!this.tickersDimensions[index] && isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n\r\n if (this.tickersDimensions[index]) {\r\n context.set('fillStyle', Colors.canvasFill)\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n y - PADDING.XXXS,\r\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n }\r\n\r\n text.render(context)\r\n }\r\n }\r\n\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n getMinMax() {\r\n const quotes = this.getQuotes()\r\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\r\n if (typeof this.attrs.min !== 'undefined') {\r\n min = this.attrs.min\r\n }\r\n if (typeof this.attrs.max !== 'undefined') {\r\n max = this.attrs.max\r\n }\r\n return { min, max }\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default MultiLineChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { getBarWithoutMarginWidth } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass OHLCChart extends Chart {\r\n static type = ChartElementType.OhlcChart\r\n static label = 'OHLC'\r\n static iconName = 'ohlcChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const barWithoutMarginWidth = getBarWithoutMarginWidth(this.model)\r\n\r\n let lineWidth = 1\r\n if (barWithoutMarginWidth >= 40) {\r\n lineWidth = 4\r\n } else if (barWithoutMarginWidth >= 30) {\r\n lineWidth = 3\r\n } else if (barWithoutMarginWidth >= 15) {\r\n lineWidth = 2\r\n }\r\n const lineThickness = lineWidth / 2\r\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\r\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\r\n this.context.set('lineWidth', lineWidth)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const barX = ~~(x - 1) + lineOffset // move 1px to left so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\r\n\r\n this.context.beginPath()\r\n this.context.set(\r\n 'strokeStyle',\r\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\r\n )\r\n\r\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\r\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\r\n\r\n if (handleLengthFromWick >= 1) {\r\n const open = Math.round(this.fy(this.data.open[i]))\r\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\r\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\r\n\r\n const close = Math.round(this.fy(this.data.close[i]))\r\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\r\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\r\n }\r\n\r\n this.context.stroke()\r\n },\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `OHLC ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default OHLCChart\r\n","import { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\nconst NO_VALUE = ' - '\r\n\r\ninterface PerfChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n fromDate: string\r\n toDate: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nclass PerfChart extends Chart {\r\n static type = ChartElementType.PerfChart\r\n\r\n overlayLabelWidth: ObjectHash\r\n perf: ObjectHash> = {}\r\n dates: number[] = []\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.overlayLabelWidth = {}\r\n }\r\n\r\n fx = (i: number) => this.paneModel.scale.x(i)\r\n\r\n getCompleteChartNumOfBars() {\r\n return this.dates.length\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n // We don't need to calculate first/last visible bars because the data is already cropped\r\n for (let i = 0; i < this.perf[ticker].length; i++) {\r\n const value = this.perf[ticker][i]\r\n if (value !== null && Number.isFinite(value)) {\r\n this.context.lineTo(this.fx(i), Math.round(this.fy(value)))\r\n }\r\n }\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = (() => {\r\n switch (this.model.quote().timeframe) {\r\n case 'd':\r\n return 'DAILY'\r\n case 'w':\r\n return 'WEEKLY'\r\n case 'm':\r\n return 'MONTHLY'\r\n default:\r\n return\r\n }\r\n })()\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text: period,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const date = utils.dateFromUnixTimestamp(this.dates[crossIndex] ?? 0)\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (this.data.timeframe) {\r\n case 'd':\r\n case 'w':\r\n dateString = `${months[month]} ${day}`\r\n break\r\n case 'm':\r\n dateString = `${months[month]} ${year}`\r\n break\r\n default:\r\n return\r\n }\r\n\r\n let shouldRenderDate = false\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\r\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n const value = tickerData[crossIndex] ?? null\r\n const percentageText = value !== null ? `${value.toFixed(2)}%` : NO_VALUE\r\n shouldRenderDate = shouldRenderDate || value !== null\r\n new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n if (shouldRenderDate) {\r\n new Text(\r\n {\r\n text: `${dateString} `,\r\n x: ChartSettings.left.width + 132,\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n super.renderOverlaysLabels(context)\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n const lastCrossIndex = this.perf[ticker].findLastIndex((value) => value !== null)\r\n const value = tickerData[lastCrossIndex] ?? null\r\n const percentageText = value !== null ? `${value.toFixed(2)}%` : NO_VALUE\r\n\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\r\n text.render(context)\r\n }\r\n }\r\n }\r\n\r\n _compute() {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n this.perf = {}\r\n const quotes = this.getQuotes()\r\n\r\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\r\n const toDate = new Date(this.attrs.toDate + ' 23:59')\r\n this.dates = []\r\n for (const quote of quotes) {\r\n for (let i = 0; i < quote.date.length; i++) {\r\n const timestampe = quote.date[i]\r\n const date = utils.dateFromUnixTimestamp(timestampe)\r\n if (fromDate <= date && date <= toDate && this.dates.indexOf(timestampe) === -1) {\r\n this.dates.push(timestampe)\r\n }\r\n }\r\n }\r\n\r\n this.dates.sort((a, b) => a - b)\r\n\r\n for (const quote of quotes) {\r\n const ticker = quote.ticker\r\n this.perf[ticker] = []\r\n\r\n const dateToIndex = quote.getDateToIndex()\r\n let first = null\r\n let lastValue = null\r\n let dataIndex = -1\r\n for (let i = 0; i < this.dates.length; i++) {\r\n const timestamp = this.dates[i]\r\n dataIndex = dateToIndex[timestamp]\r\n\r\n if (typeof dataIndex === 'number') {\r\n first = first === null ? quote.close[dataIndex] : first\r\n const value = (quote.close[dataIndex] * 100) / (first ?? 0) - 100\r\n lastValue = Number.isFinite(value) ? value : null\r\n }\r\n\r\n this.perf[ticker][i] = lastValue\r\n\r\n if (lastValue !== null && min > lastValue) {\r\n min = lastValue\r\n }\r\n if (lastValue !== null && max < lastValue) {\r\n max = lastValue\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.paneModel.scale.y.ticks(10)\r\n const yLine = this.getYLine()\r\n const text = new Text(\r\n {\r\n x: this.width + 8,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n for (const tick of ticks) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n text.set({ text: tick.toFixed(2), y }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n y: this.height + 18,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n const textWidth = text.set({ text: '2020' }).measure(this.context)\r\n\r\n let date = new Date(this.dates[0] * 1000)\r\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n let monthsInData = 0\r\n this.dates.forEach((d, index) => {\r\n if (index < 1) {\r\n return\r\n }\r\n\r\n const date = new Date(d * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n monthsInData++\r\n }\r\n lastMonth = month\r\n })\r\n\r\n const availableTickSpots = ~~(this.width / textWidth)\r\n const monthsToAvail = monthsInData / availableTickSpots\r\n let renderMonth\r\n if (monthsToAvail <= 1) {\r\n renderMonth = () => true\r\n } else if (monthsToAvail <= 2) {\r\n renderMonth = (x: number) => x % 2 === 0\r\n } else if (monthsToAvail <= 3) {\r\n renderMonth = (x: number) => x % 3 === 0\r\n } else if (monthsToAvail <= 4) {\r\n renderMonth = (x: number) => x % 4 === 0\r\n } else if (monthsToAvail <= 6) {\r\n renderMonth = (x: number) => x % 6 === 0\r\n } else {\r\n renderMonth = (x: number) => x === 0\r\n }\r\n\r\n date = new Date(this.dates[0] * 1000)\r\n lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n const xLine = this.getXLine()\r\n\r\n for (let i = 0; i < this.dates.length; i++) {\r\n date = new Date(this.dates[i] * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n if (!renderMonth(date.getMonth())) {\r\n continue\r\n }\r\n\r\n text\r\n .set({\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\r\n x: x,\r\n })\r\n .render(this.context)\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Perf chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default PerfChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport candleStick from './candle_stick'\r\nimport hollowCandleStick from './candle_stick_hollow'\r\nimport heikinAshi from './heikin_ashi'\r\nimport lineChart from './line_chart'\r\nimport marketSentiment from './market_sentiment'\r\nimport multiLineCharts from './multi_line_chart'\r\nimport ohlcChart from './ohlc_chart'\r\nimport perfChart from './perf_chart'\r\n\r\nexport const chartsByType = Object.freeze({\r\n [ChartElementType.CandleStick]: candleStick,\r\n [ChartElementType.HeikinAshi]: heikinAshi,\r\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\r\n [ChartElementType.LineChart]: lineChart,\r\n [ChartElementType.MarketSentiment]: marketSentiment,\r\n [ChartElementType.MultiLineChart]: multiLineCharts,\r\n [ChartElementType.OhlcChart]: ohlcChart,\r\n [ChartElementType.PerfChart]: perfChart,\r\n})\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n Shrtfl = 'indicators/shrtfl',\r\n Shrtra = 'indicators/shrtra',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport enum QuoteFinancialAttachment {\r\n shortInterest = 'shortInterest',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 180000,\r\n Elite = Default,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\r\n","import { ChartConfigChartPane } from '../../../types/shared'\r\nimport { IndicatorType } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Element from '../../models/element'\r\nimport PaneModel from '../../models/pane'\r\nimport { HLC, compareHlc, incrementHlc, receiveHlc } from '../../utils/hlc'\r\nimport {\r\n AutoSaveChangeType,\r\n AutoSaveElement,\r\n AutoSaveElementDBRecord,\r\n DrawingChangeTimestamp,\r\n DrawingContainerType,\r\n} from './constants'\r\n\r\nexport function getContainerTypeFromPaneConfig(pane: ChartConfigChartPane) {\r\n const indicatorElement = pane.elements.find((el) => el.type.startsWith('indicators/'))\r\n if (indicatorElement) {\r\n return indicatorElement.type as DrawingContainerType\r\n }\r\n const chartElement = pane.elements.find((el) => el.type.startsWith('charts/'))\r\n if (chartElement) {\r\n return 'chart'\r\n }\r\n return null\r\n}\r\n\r\nexport function getContainerType(model: PaneModel) {\r\n const mainElement = model.mainElement()\r\n const indicatorType = mainElement?.instance?.type ?? null\r\n if (mainElement?.isIndicator() && indicatorType !== IndicatorType.None) {\r\n return indicatorType as DrawingContainerType\r\n }\r\n if (mainElement?.isChart()) {\r\n return 'chart'\r\n }\r\n return null\r\n}\r\n\r\nexport function updateInternalStoreWithChangedElement({\r\n element,\r\n changeType,\r\n currentInternalStore,\r\n lastUpdateTimestamp,\r\n}: {\r\n element: Element\r\n changeType: AutoSaveChangeType\r\n currentInternalStore: AutoSaveElement[]\r\n lastUpdateTimestamp: HLC\r\n}) {\r\n const paneModel = element.pane()\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const containerType = getContainerType(paneModel)\r\n if (ticker && paneModel && containerType && (!element.destroyed || changeType === 'destroy')) {\r\n const instanceJson = element.instance.toAutosaveConfig()\r\n const newDrawing: AutoSaveElement = {\r\n elementId: element.elementId!,\r\n zIndex: element.zIndex,\r\n ticker,\r\n lastChange: lastUpdateTimestamp,\r\n changeType,\r\n containerType,\r\n elementAttrs: JSON.stringify(instanceJson),\r\n }\r\n\r\n const newInternalStore = [...currentInternalStore]\r\n const updateDrawingIndex = newInternalStore.findIndex(\r\n (drawingElement) => drawingElement.elementId === newDrawing.elementId\r\n )\r\n\r\n let shouldSyncAndSave = false\r\n if (updateDrawingIndex > -1) {\r\n const updatedRecord = newInternalStore[updateDrawingIndex]\r\n const hasChangedZIndex = updatedRecord.zIndex !== newDrawing.zIndex\r\n const hasChangedType = updatedRecord.changeType !== newDrawing.changeType\r\n const hasChangedAttrs = updatedRecord.elementAttrs !== newDrawing.elementAttrs\r\n const hasChange = hasChangedType || hasChangedAttrs || hasChangedZIndex\r\n if (\r\n !element.instance.isEditInProgress &&\r\n updatedRecord.ticker === ticker &&\r\n hasChange &&\r\n updatedRecord.changeType !== 'destroy'\r\n ) {\r\n newInternalStore[updateDrawingIndex] = newDrawing\r\n shouldSyncAndSave = true\r\n }\r\n } else {\r\n newInternalStore.push(newDrawing)\r\n shouldSyncAndSave = true\r\n }\r\n\r\n return {\r\n newInternalStore,\r\n shouldSyncAndSave,\r\n newDrawing,\r\n }\r\n }\r\n}\r\n\r\nexport function getTickersAndContainerTypesInLayoutModel(chartLayout: ChartLayout) {\r\n const tickers: string[] = []\r\n const containerTypes: Array = ['note']\r\n\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const containerType = getContainerType(paneModel)\r\n if (ticker && !tickers.includes(ticker)) {\r\n tickers.push(ticker)\r\n }\r\n if (containerType && !containerTypes.includes(containerType)) {\r\n containerTypes.push(containerType)\r\n }\r\n })\r\n return { tickers, containerTypes }\r\n}\r\n\r\nexport function mergeUpdatedDrawingsToInternalStore({\r\n updatedDrawings,\r\n currentInternalStore,\r\n lastUpdateTimestamp,\r\n isRefetchAll,\r\n}: {\r\n updatedDrawings: AutoSaveElement[]\r\n currentInternalStore: AutoSaveElement[]\r\n lastUpdateTimestamp: DrawingChangeTimestamp\r\n isRefetchAll: boolean\r\n}) {\r\n let newLastUpdateTimestamp = lastUpdateTimestamp\r\n const newInternalStore = [...currentInternalStore]\r\n const updatedElementIds: string[] = []\r\n\r\n updatedDrawings.forEach((drawing) => {\r\n newLastUpdateTimestamp = receiveHlc(newLastUpdateTimestamp, drawing.lastChange)\r\n const drawingIndex = newInternalStore.findIndex(({ elementId }) => drawing.elementId === elementId)\r\n const currentDrawing = drawingIndex > -1 ? newInternalStore[drawingIndex] : null\r\n if (currentDrawing === null) {\r\n newInternalStore.push(drawing)\r\n updatedElementIds.push(drawing.elementId)\r\n } else if (currentDrawing.containerType === 'note' && isRefetchAll) {\r\n const currentNote = getElementNoteText(currentDrawing)\r\n const autoSavedNote = getElementNoteText(drawing)\r\n if (currentNote !== autoSavedNote) {\r\n newInternalStore[drawingIndex] = {\r\n ...drawing,\r\n lastChange: incrementHlc(receiveHlc(currentDrawing.lastChange, drawing.lastChange), Date.now()),\r\n elementAttrs: JSON.stringify({\r\n ...JSON.parse(drawing.elementAttrs),\r\n text: `${currentNote}\\r\\n${autoSavedNote}`,\r\n }),\r\n }\r\n }\r\n updatedElementIds.push(drawing.elementId)\r\n } else if (compareHlc(newInternalStore[drawingIndex].lastChange, drawing.lastChange) < 0) {\r\n newInternalStore[drawingIndex] = drawing\r\n updatedElementIds.push(drawing.elementId)\r\n }\r\n })\r\n return { newLastUpdateTimestamp, newInternalStore, updatedElementIds }\r\n}\r\n\r\nexport function getInitialStoreDrawings(): null | AutoSaveElement[] {\r\n const initialDrawings = (\r\n window.FinvizSettings?.initialDrawingsStore ?? window.FinvizChartsSettings?.initialDrawingsStore\r\n )?.drawings as null | AutoSaveElementDBRecord[]\r\n\r\n return initialDrawings?.map((item) => getAutosaveElementFromDBRecord(item)) ?? null\r\n}\r\n\r\nexport function handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n elementMethod: keyof Pick\r\n}) {\r\n chartLayoutModel.getAllElements().forEach((element) => {\r\n if (element.isDrawing()) {\r\n element[elementMethod]()\r\n }\r\n })\r\n}\r\n\r\nexport function getNoteElementId(ticker: string) {\r\n return `note-${ticker}`\r\n}\r\n\r\nexport function getElementNoteText(noteElement?: AutoSaveElement) {\r\n return (noteElement ? JSON.parse(noteElement.elementAttrs)?.text : '') ?? ''\r\n}\r\n\r\nexport function getTickerNoteText({ ticker, elements }: { ticker: string; elements: AutoSaveElement[] }) {\r\n const noteElement = elements.find(({ elementId }) => elementId === getNoteElementId(ticker))\r\n return getElementNoteText(noteElement)\r\n}\r\n\r\nexport function getAutosaveElementFromDBRecord(item: AutoSaveElementDBRecord): AutoSaveElement {\r\n return {\r\n elementId: item.elementId,\r\n ticker: item.ticker,\r\n zIndex: item.zIndex,\r\n changeType: item.changeType,\r\n containerType: item.containerType,\r\n elementAttrs: item.elementAttrs,\r\n lastChange: {\r\n ts: item.lastChangeTimestamp,\r\n count: item.lastChangeCounter,\r\n uuid: item.lastChangeNodeUUID,\r\n },\r\n }\r\n}\r\n\r\nexport function getDBRecordFromAutosaveElement(item: AutoSaveElement): Omit {\r\n return {\r\n elementId: item.elementId,\r\n ticker: item.ticker,\r\n zIndex: item.zIndex,\r\n changeType: item.changeType,\r\n containerType: item.containerType,\r\n elementAttrs: JSON.stringify(item.elementAttrs),\r\n lastChangeTimestamp: item.lastChange.ts,\r\n lastChangeCounter: item.lastChange.count,\r\n lastChangeNodeUUID: item.lastChange.uuid,\r\n }\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ConfirmationDialog,\r\n Delayed,\r\n DialogDismiss,\r\n Popover,\r\n PopoverPlacement,\r\n PopoverRounding,\r\n PopoverStateReturn,\r\n PopoverTheme,\r\n PopoverTrigger,\r\n Spinner,\r\n ZIndexContext,\r\n usePopoverState,\r\n} from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { CHART_ELEMENT_ID, CHART_SETTINGS_DIALOG_TEST_ID, SpecificChartFunctionality } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-settings-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-settings-button',\r\n [SpecificChartFunctionality.forexPage]: 'forex-settings-button',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-settings-button',\r\n}\r\n\r\ninterface ScrollableChartSettingsPopoverProps {\r\n isOpen: boolean\r\n state: PopoverStateReturn\r\n}\r\n\r\nexport function PopoverInner({ hidePopover }: { hidePopover: () => void }) {\r\n const [chartSettingsModule] = useAsyncModule({\r\n ...chartSettingsAsyncModule,\r\n isSuspenseMode: true,\r\n errorSeverity: 'medium',\r\n onError: () => hidePopover(),\r\n })\r\n\r\n const { ChartSettings } = chartSettingsModule ?? {}\r\n\r\n return \r\n}\r\n\r\nexport const ScrollableChartSettingsPopover = React.memo(function ScrollableChartSettingsPopover({\r\n state,\r\n isOpen,\r\n}: ScrollableChartSettingsPopoverProps) {\r\n const { forceGlobalRerender, getIsConfigChanged, chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const confirmationDialogState = usePopoverState()\r\n const hidePopover = state.hide\r\n\r\n const checkChangesAndOpenDiscard = React.useCallback(\r\n (ev: Event | React.MouseEvent) => {\r\n if (getIsConfigChanged()) {\r\n ev.preventDefault()\r\n confirmationDialogState.show()\r\n return\r\n }\r\n hidePopover()\r\n },\r\n [confirmationDialogState, getIsConfigChanged, hidePopover]\r\n )\r\n\r\n const discardChangesAndHide = React.useCallback(() => {\r\n forceGlobalRerender()\r\n // We need to defer the hide so that the rerender finishes first\r\n setTimeout(hidePopover)\r\n }, [forceGlobalRerender, hidePopover])\r\n\r\n const buttonPosition = React.useMemo(() => {\r\n const popoverContentElement = state.getState().disclosureElement\r\n const { top = 0, height = 32 } = popoverContentElement?.getBoundingClientRect() ?? {}\r\n return top + height + window.scrollY\r\n // Only recount on open\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isOpen])\r\n\r\n const chartHeight = React.useMemo(() => {\r\n const chartElement = document.getElementById(CHART_ELEMENT_ID)\r\n return chartElement?.clientHeight ?? 0\r\n // Only recount on open\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isOpen])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Discard changes\r\n \r\n \r\n }\r\n >\r\n Are you sure you want to discard changes?\r\n \r\n \r\n )\r\n})\r\n\r\ninterface ChartSettingsButtonProps extends ButtonComponentProps {\r\n isPremium: boolean\r\n placement?: PopoverPlacement\r\n model: ChartLayout\r\n}\r\n\r\nexport function ChartSettingsButton({\r\n isPremium,\r\n model,\r\n placement,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom' })\r\n const isOpen = settingsPopoverState.useState('open')\r\n\r\n const buttonProps = React.useMemo(() => {\r\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\r\n return {\r\n as: 'a',\r\n href: `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[model.specificChartFunctionality],\r\n })}`,\r\n } as ButtonComponentProps<'a'>\r\n }\r\n\r\n return {\r\n as: PopoverTrigger,\r\n state: settingsPopoverState,\r\n active: isOpen,\r\n } as ButtonComponentProps\r\n }, [model.specificChartFunctionality, isPremium, settingsPopoverState, isOpen])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { useModelRef } from '../../model-hooks/useModelRef'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport { getLeftOffset } from '../renderUtils'\r\n\r\nconst getQuoteRequestKey = (chartModel: Chart) =>\r\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\r\n\r\nexport function useChartControls({\r\n chartModel: unwatchedChartModel,\r\n isInteractive,\r\n}: {\r\n chartModel: Chart | null\r\n isInteractive: boolean\r\n}) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\r\n })\r\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\r\n watchProperties: ['idea', 'settings'],\r\n })\r\n const chartModelRef = useModelRef(chartModel)\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const abortControllerKeyRef = React.useRef('')\r\n const isIdeaChart = !!chartLayoutModel?.idea?.id\r\n\r\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\r\n const chart = chartModelRef.current\r\n if (!chart) {\r\n return\r\n }\r\n\r\n const chartLayoutModel = chart.chart_layout()\r\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\r\n\r\n chart.getAllPanes().forEach((pane) => {\r\n if (!!pane.getChartOrIndicatorElement()) {\r\n pane.updateAttribute('scaleRange', null)\r\n }\r\n })\r\n\r\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\r\n\r\n // Refetch all other chart quotes as the main one is already refetched so we can filter it out but other quotes (from perf for example) should be refetched as well\r\n chart\r\n .getAllQuotes()\r\n .filter((chartQuote) => !chartQuote.eql(quote))\r\n .forEach((quote) => {\r\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\r\n })\r\n\r\n const chartPane = chart.getChartPane()\r\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\r\n\r\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\r\n for (const element of elements) {\r\n const isDrawing = element.isDrawing()\r\n const isChartEvent = element.isChartEvent()\r\n if (isDrawing || isChartEvent) {\r\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\r\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\r\n element.instance.updateScales()\r\n } else {\r\n element.destroyCascade()\r\n }\r\n }\r\n }\r\n\r\n chart.setChartEvents(quote.chartEvents, true)\r\n\r\n chartPane?.updateChartEventsZIndexes()\r\n\r\n // The only dependency here is a ref , so no need to add it to dependencies\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const fetchQuote = React.useCallback(async () => {\r\n if (!isInteractive || !chartModel || isIdeaChart) {\r\n return\r\n }\r\n\r\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\r\n const { premarket, aftermarket } = Quote.first()\r\n const patterns = chartModel.getHasPatterns()\r\n const currentQuote = chartModel.quote()\r\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\r\n setIsLoading(true)\r\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\r\n const abortController = createRequestAbortController({\r\n key: abortControllerKeyRef.current,\r\n shouldAbortRunningRequest: !Quote.select(\r\n (quote) =>\r\n quote.ticker === ticker &&\r\n quote.timeframe === timeframe &&\r\n quote.isFetching &&\r\n chartModel.chart_layout().isIdeaId(quote.ideaID)\r\n ),\r\n })\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n financialAttachments: chartModel.getQuoteFinancialAttachments(),\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n abortController,\r\n })\r\n\r\n if (quote.wasFetchAborted) {\r\n // Check if the quote is also used in other chars, as the quote may be reused if we already have a quote with the same options\r\n const isQuoteUsedInOtherCharts = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .filter((chart) => !chartModel.eql(chart))\r\n .some((chart) => quote.eql(chart.quote()))\r\n\r\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\r\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\r\n quote.destroy()\r\n }\r\n } else if (quote.timeframe === chartModel.timeframe && quote.getRawTicker() === chartModel.ticker) {\r\n removeFromAbortCache(abortControllerKeyRef.current)\r\n updateChartModelWithNewQuote(quote)\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n chartModel?.id,\r\n chartModel?.ticker,\r\n chartModel?.timeframe,\r\n chartModel?.instrument,\r\n isIdeaChart,\r\n updateChartModelWithNewQuote,\r\n isInteractive,\r\n ])\r\n\r\n React.useEffect(() => {\r\n fetchQuote()\r\n }, [fetchQuote])\r\n\r\n // There are several ways how to turn off dateRange, e.g. moving the charts\r\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\r\n // Consider refactoring this part so we only update chart models on route changes not the other way around\r\n React.useEffect(() => {\r\n if (chartModel) {\r\n const decodedQueryString = decodeQueryString(location.search)\r\n const rangesArray = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .map((chart) => chart.dateRange)\r\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\r\n\r\n if (decodedQueryString.r !== ranges) {\r\n navigate({\r\n search: `?${encodeQueryString({\r\n ...decodedQueryString,\r\n r: ranges,\r\n })}`,\r\n })\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.dateRange])\r\n\r\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\r\n // React.useEffect(\r\n // () => () => {\r\n // if (isInteractive && abortControllerKeyRef.current !== '') {\r\n // abortRequest(abortControllerKeyRef.current)\r\n // }\r\n // },\r\n // [isInteractive]\r\n // )\r\n\r\n React.useEffect(() => {\r\n const chart = chartModelRef.current\r\n const quote = chart?.quote()\r\n\r\n let shouldRecalculateOnCharts = false\r\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\r\n const settings = chartLayoutModel?.settings\r\n const barWidth = 3\r\n const barMargin = 1\r\n if (settings) {\r\n const hasSameBarWidth = [\r\n settings.ChartSettings.center.barWidth,\r\n settings.IndicatorSettings.center.barWidth,\r\n ].every((value) => value === barWidth)\r\n const hasSameBarMargin = [\r\n settings.ChartSettings.center.barMargin,\r\n settings.IndicatorSettings.center.barMargin,\r\n ].every((value) => value === barMargin)\r\n\r\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\r\n if (shouldRecalculateOnCharts) {\r\n settings.ChartSettings.center.barWidth = barWidth\r\n settings.IndicatorSettings.center.barWidth = barWidth\r\n settings.ChartSettings.center.barMargin = barMargin\r\n settings.IndicatorSettings.center.barMargin = barMargin\r\n\r\n chartLayoutModel.updateAttributes({ settings })\r\n }\r\n }\r\n }\r\n\r\n const isQuoteOrQuoteFinancials =\r\n chartLayoutModel &&\r\n [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.quoteFinancials].includes(\r\n chartLayoutModel.specificChartFunctionality\r\n )\r\n\r\n if (chart && quote && (isQuoteOrQuoteFinancials || shouldRecalculateOnCharts) && !isIdeaChart) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\r\n chart.updateAttributes({ leftOffset })\r\n }\r\n // This effect should run only on timeframe change & idea change\r\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\r\n\r\n return { isLoading }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nexport function useModelRef(model: Model | null) {\r\n const modelRef = React.useRef(model)\r\n\r\n React.useEffect(() => {\r\n modelRef.current = model\r\n }, [model])\r\n\r\n return modelRef\r\n}\r\n","import {\r\n Notification,\r\n Paragraph,\r\n generatePathForTimeframeDateRange,\r\n getDateRangeGroupsWithHref,\r\n timeframeUtm,\r\n useNotification,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { SpecificChartFunctionality, TIMEFRAME, TimeframeAndIntradayType } from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { dateFromUnixTimestamp } from '../../utils'\r\nimport { getChartStartEndDates, getVisibleBarsNumber } from '../renderUtils'\r\nimport { useChartsPathLocation } from './use-charts-path-location'\r\nimport { getTimeframeGroupsWithHref } from './utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TimeframeAndIntradayType\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\nexport interface IDateRange {\r\n value: string\r\n timeframe: TIMEFRAME\r\n}\r\n\r\nexport function useChartModelCustomDateRangeValues({\r\n chartModel,\r\n isPremium,\r\n}: {\r\n chartModel: Chart | null\r\n isPremium: boolean\r\n}) {\r\n const notificationContext = useNotification()\r\n const location = useLocation()\r\n const [isFetching, setIsFetching] = React.useState(false)\r\n const chartLayoutModel = chartModel?.chart_layout() || null\r\n const chartIndex = chartLayoutModel?.getAllCharts().findIndex((chart) => chartModel!.eql(chart)) ?? -1\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel, chartIndex })\r\n const specificChartFunctionality = chartLayoutModel?.specificChartFunctionality ?? SpecificChartFunctionality.default\r\n\r\n const anchorDate = React.useMemo(() => {\r\n if (!chartModel) return new Date()\r\n const quote = chartModel.quote()\r\n return dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n }, [chartModel])\r\n\r\n const generateChartLayoutRouterPath = React.useCallback(\r\n ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n if (specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n return getChartsToPath({\r\n ticker: ticker,\r\n timeframe: timeframe as TIMEFRAME,\r\n dateRange: dateRange,\r\n })\r\n }\r\n\r\n return generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname: location.pathname,\r\n timeframe: timeframe,\r\n dateRange: dateRange,\r\n utmCampaign: timeframeUtm[specificChartFunctionality],\r\n })\r\n },\r\n [getChartsToPath, isPremium, specificChartFunctionality, location.pathname]\r\n )\r\n\r\n const timeframeGroupsWithHref = (isPremium: boolean) =>\r\n getTimeframeGroupsWithHref({\r\n isPremium,\r\n generatePath: (timeFrame) => generateChartLayoutRouterPath({ timeframe: timeFrame.value, dateRange: null }),\r\n })\r\n\r\n const dateRangeGroupsWithHref = ({\r\n isPremium,\r\n customRange,\r\n instrument,\r\n }: {\r\n isPremium: boolean\r\n customRange?: string\r\n instrument: Instrument\r\n }) =>\r\n getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n instrument,\r\n generatePath: (dateRange: { timeframe?: TIMEFRAME; value: string }) =>\r\n generateChartLayoutRouterPath({ timeframe: dateRange.timeframe!, dateRange: dateRange.value }),\r\n })\r\n\r\n const handleCustomDateRangeValidation = async (dateRangeState: { value: string | null; timeframe: TIMEFRAME }) => {\r\n if (dateRangeState.value !== null) {\r\n const { timeframe, ticker, instrument, premarket, aftermarket } = chartModel?.quote() || {}\r\n const patterns = !!chartModel?.getHasPatterns()\r\n if (!anchorDate || !instrument || !ticker || !timeframe || !dateRangeState.value) return false\r\n setIsFetching(true)\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe: dateRangeState.timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n })\r\n setIsFetching(false)\r\n\r\n const { numOfVisibleBars } = getVisibleBarsNumber({\r\n ...getChartStartEndDates({ dateRange: dateRangeState.value, quote }),\r\n quote,\r\n dateRange: dateRangeState.value,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n notificationContext.show(\r\n } timeoutInMs={6000}>\r\n \r\n There are no data for the selected date range. Try selecting different dates.\r\n \r\n \r\n )\r\n\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n return {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { ChartsPageQueryParams, LAYOUTS, LayoutType, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncablePart } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nexport function useChartsPathLocation({\r\n chartLayoutModel: unwatchedChartLayoutModel,\r\n chartIndex = -1,\r\n}: {\r\n chartLayoutModel: ChartLayout | null\r\n chartIndex?: number\r\n}) {\r\n const location = useLocation()\r\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, {\r\n watchProperties: ['syncChartParts'],\r\n })\r\n const hasSyncedTimeframe = React.useMemo(\r\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Timeframe),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [chartLayoutModel?.syncChartParts]\r\n )\r\n const hasSyncedTicker = React.useMemo(\r\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Ticker),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [chartLayoutModel?.syncChartParts]\r\n )\r\n\r\n const getChartsToPath = React.useCallback(\r\n ({\r\n ticker,\r\n timeframe,\r\n dateRange,\r\n layout,\r\n }: {\r\n timeframe?: TIMEFRAME\r\n dateRange?: string | null\r\n ticker?: string\r\n layout?: LayoutType\r\n }) => {\r\n if (!chartLayoutModel) {\r\n return {\r\n pathname: location.pathname,\r\n search: '',\r\n }\r\n }\r\n\r\n const decodedSearch = decodeQueryString(location.search)\r\n const { count } = LAYOUTS[(layout ?? chartLayoutModel.layout) as LayoutType]\r\n const urlTickers = decodedSearch.t?.split(',') ?? []\r\n const urlTimeframes = decodedSearch.p?.split(',') ?? []\r\n const urlDateRanges = decodedSearch.r?.split(',')\r\n\r\n const chartsArrayPlaceholder = Array.from({ length: count })\r\n const tickers = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentTicker = urlTickers[index] ?? urlTickers[urlTickers.length - 1]\r\n return (chartIndex === index || hasSyncedTicker) && ticker ? ticker : currentTicker\r\n })\r\n .join(',')\r\n const timeframes = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentTimeframe = urlTimeframes[index] ?? urlTimeframes[urlTimeframes.length - 1]\r\n return (chartIndex === index || hasSyncedTimeframe) && timeframe ? timeframe : currentTimeframe\r\n })\r\n .join(',')\r\n const ranges = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentDaterange = urlDateRanges\r\n ? (urlDateRanges[index] ?? urlDateRanges[urlDateRanges.length - 1])\r\n : undefined\r\n return (chartIndex === index || hasSyncedTimeframe) && dateRange !== undefined ? dateRange : currentDaterange\r\n })\r\n .join(',')\r\n\r\n return {\r\n pathname: location.pathname,\r\n search: `?${encodeQueryString({\r\n t: tickers,\r\n p: timeframes,\r\n r: ranges.split(',').some(Boolean) ? ranges : undefined,\r\n l: layout ?? chartLayoutModel.layout,\r\n sidebar: getIsMobilePortrait() ? undefined : decodedSearch.sidebar,\r\n })}`,\r\n }\r\n },\r\n [chartLayoutModel, chartIndex, location, hasSyncedTicker, hasSyncedTimeframe]\r\n )\r\n\r\n return { getChartsToPath }\r\n}\r\n","import { IconNameType, getTimeframeGroups } from '@finviz/website'\r\nimport { type To } from 'react-router-dom'\r\n\r\nimport { TimeframeAndIntradayType } from '../../constants/common'\r\n\r\ninterface ITimeFrame {\r\n value: TimeframeAndIntradayType\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\ninterface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\nexport function getTimeframeGroupsWithHref({\r\n isPremium,\r\n generatePath,\r\n}: {\r\n isPremium: boolean\r\n generatePath: (timeframe: ITimeFrame) => To\r\n}) {\r\n return getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\r\n label: timeFrameGroup.label,\r\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\r\n ...timeFrame,\r\n href: generatePath(timeFrame),\r\n })),\r\n }))\r\n}\r\n\r\nexport enum QuoteNodeChartTypes {\r\n candlesticksimple = 'candlesticksimple',\r\n candlestick = 'candlestick',\r\n line = 'line',\r\n ohlc = 'ohlc',\r\n heikinashi = 'heikinashi',\r\n hollowcandlestick = 'hollowcandlestick',\r\n}\r\n\r\nexport enum QuoteUrlChartTypes {\r\n cs = 'cs',\r\n c = 'c',\r\n l = 'l',\r\n o = 'o',\r\n ha = 'ha',\r\n hc = 'hc',\r\n}\r\n\r\nexport const QuoteShortToLongType = {\r\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\r\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\r\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\r\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\r\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\r\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\r\n} as const\r\n\r\nexport const QuoteLongToShortType = {\r\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\r\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\r\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\r\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\r\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\r\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\r\n} as const\r\n\r\nexport type TypeBaseOption = {\r\n label: string\r\n value: QuoteNodeChartTypes\r\n icon: IconNameType\r\n href?: string\r\n}\r\nexport const DEFAULT_TYPES: TypeBaseOption[] = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\r\n { icon: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\r\n { icon: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\r\n { icon: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\r\n { icon: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE: TypeBaseOption[] = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlesticksimple, label: 'Candle - simple' },\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle - advanced' },\r\n // Filter out the candle from DEFAULT_TYPES, we’re naming it differently\r\n ...DEFAULT_TYPES.filter((type) => type.value !== QuoteNodeChartTypes.candlestick),\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE_VALUES = ['candlesticksimple', 'candlestick', 'line']\r\n","export const chartEventsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-events\" */ './module-entry'),\r\n cacheKey: 'chart-events',\r\n}\r\n","export const chartSettingsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-settings\" */ './module-entry'),\r\n cacheKey: 'chart-settings',\r\n}\r\n\r\nexport const useChartLayoutGlobalModelAsyncModule = {\r\n importFn: () =>\r\n import(/* webpackChunkName: \"use-chart-layout-global-model\" */ './useChartLayoutGlobalModel/module-entry'),\r\n cacheKey: 'use-chart-layout-global-model',\r\n}\r\n\r\nexport const preventClosingUnsavedChangesAsyncModule = {\r\n importFn: () =>\r\n import(/* webpackChunkName: \"prevent-closing-unsaved-changes\" */ './PreventClosingUnsavedChanges/module-entry'),\r\n cacheKey: 'prevent-closing-unsaved-changes',\r\n}\r\n","import { InputColorPicker, convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\ninterface BackgroundInputProps {\r\n label: string\r\n value: string\r\n onChange: (color: string) => void\r\n}\r\n\r\nexport function BackgroundInput({ label = 'Background', value, onChange }: BackgroundInputProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import { InputColorPicker, Paragraph, RangeSlider } from '@finviz/website'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface ColorRangeRowInputProps {\r\n label: string\r\n colorValue: string\r\n colorTestId: string\r\n rangeValue: string\r\n rangeTestId: string\r\n rangeLabel: string\r\n rangeProps: ObjectHash\r\n onChange: (colorValue: string, value: string) => void\r\n}\r\n\r\nexport function ColorRangeRowInput({\r\n label,\r\n colorValue,\r\n colorTestId,\r\n rangeValue,\r\n rangeTestId,\r\n rangeLabel,\r\n rangeProps,\r\n onChange,\r\n}: ColorRangeRowInputProps) {\r\n const handleRangeChange = useCallback(\r\n (ev: React.ChangeEvent) => {\r\n const value = ev.currentTarget.value\r\n onChange(colorValue, value)\r\n },\r\n [onChange, colorValue]\r\n )\r\n const handleColorChange = useCallback(\r\n (color: string) => {\r\n onChange(color, rangeValue)\r\n },\r\n [onChange, rangeValue]\r\n )\r\n return (\r\n

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

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const context = React.useContext(ElementStyleDialogContext)\r\n\r\n return \r\n }\r\n}\r\n\r\nexport function ElementStyleDialogWrapper(props: { children: React.ReactNode }) {\r\n const [element, setElement] = React.useState(null)\r\n const [onSubmit, setOnSubmit] = React.useState(null)\r\n const [onDismiss, setOnDismiss] = React.useState(null)\r\n const dialog = useDialogState()\r\n\r\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\r\n if (onSubmit) {\r\n setOnSubmit(() => onSubmit)\r\n }\r\n if (onDismiss) {\r\n setOnDismiss(() => onDismiss)\r\n }\r\n\r\n setElement(element)\r\n dialog.show()\r\n }\r\n\r\n const onHide = () => {\r\n setElement(null)\r\n setOnSubmit(null)\r\n setOnDismiss(null)\r\n }\r\n\r\n return (\r\n \r\n {props.children}\r\n {element && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { HLC } from '../../utils/hlc'\r\n\r\nexport type DrawingChangeTimestamp = HLC\r\nexport type DrawingContainerType = IndicatorType | 'chart' | 'note' | null\r\nexport type AutoSaveChangeType = 'update' | 'destroy'\r\n\r\nexport interface AutoSaveElement {\r\n elementId: string\r\n ticker: string\r\n zIndex: number\r\n lastChange: DrawingChangeTimestamp\r\n changeType: AutoSaveChangeType\r\n containerType: DrawingContainerType\r\n elementAttrs: string\r\n}\r\n\r\nexport type AutoSaveElementDBRecord = Omit & { lastChange: string } & {\r\n lastChangeTimestamp: number\r\n lastChangeCounter: number\r\n lastChangeNodeUUID: string\r\n}\r\n\r\nexport const DRAWINGS_UPDATE_INTERVAL_MS = process.env.IS_E2E_TESTING ? 3000 : 15000\r\nexport const DRAWINGS_SAVE_INTERVAL_MS = 250\r\n","import { Notification, Paragraph, useNotification } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport fetchApi, {\r\n ContentType,\r\n ForbiddenError,\r\n GenericStatusCodeError,\r\n GoneError,\r\n InternalServerError,\r\n} from '../../utils/fetch_api'\r\nimport { HLC, compareHlc, incrementHlc } from '../../utils/hlc'\r\nimport { getByteLengthOfString } from '../../utils/string-byte-length'\r\nimport { AutoSaveElement, AutoSaveElementDBRecord, DrawingContainerType } from './constants'\r\nimport { getAutosaveElementFromDBRecord, getDBRecordFromAutosaveElement } from './utils'\r\n\r\nconst RETRY_LIMIT = 5\r\n\r\nexport function useDrawingAutoSaveApi() {\r\n const postRetryCountRef = React.useRef(0)\r\n const deleteRetryCountRef = React.useRef(0)\r\n const notificationContext = useNotification()\r\n\r\n const fetchDrawings = React.useCallback(\r\n async ({\r\n tickers,\r\n containerTypes,\r\n lastChange,\r\n }: {\r\n tickers: string[]\r\n containerTypes: DrawingContainerType[]\r\n lastChange: HLC\r\n }) => {\r\n try {\r\n const data = await fetchApi<{\r\n drawings: AutoSaveElementDBRecord[]\r\n }>({\r\n location: '/api/auto_save.ashx',\r\n queryParameters: {\r\n ticker: tickers.join(','),\r\n containerTypes: containerTypes.join(',') || undefined,\r\n lastChangeTimestamp: lastChange.ts,\r\n lastChangeCounter: lastChange.count,\r\n lastChangeNodeUUID: lastChange.uuid,\r\n },\r\n throwOnStatusCodes: [403, 404],\r\n })\r\n return data.drawings.map((drawing) => getAutosaveElementFromDBRecord(drawing))\r\n } catch {\r\n // ignore error\r\n }\r\n\r\n return []\r\n },\r\n []\r\n )\r\n\r\n const saveDrawings = React.useCallback(\r\n async (drawings: AutoSaveElement[]): Promise => {\r\n if (drawings.length === 0) {\r\n return undefined\r\n }\r\n\r\n try {\r\n const bodyJsonString = JSON.stringify(drawings.map((item) => getDBRecordFromAutosaveElement(item)))\r\n let keepalive = false\r\n try {\r\n keepalive = getByteLengthOfString(bodyJsonString) < 64000\r\n } catch (error: any) {\r\n window.Sentry?.captureException(error)\r\n }\r\n await fetchApi({\r\n location: '/api/auto_save.ashx',\r\n method: 'POST',\r\n throwOnStatusCodes: [400, 403, 404, 410, 500],\r\n contentType: ContentType.ApplicationJson,\r\n body: bodyJsonString,\r\n keepalive,\r\n })\r\n const [latestChangeHlc] = [...drawings].sort((a, b) => compareHlc(b.lastChange, a.lastChange))\r\n postRetryCountRef.current = 0\r\n return latestChangeHlc.lastChange\r\n } catch (error) {\r\n if (error instanceof InternalServerError) {\r\n // try again\r\n if (postRetryCountRef.current < RETRY_LIMIT) {\r\n postRetryCountRef.current = postRetryCountRef.current + 1\r\n await new Promise((r) => setTimeout(r, 1000))\r\n return saveDrawings(drawings)\r\n } else {\r\n // continue to report to Sentry\r\n postRetryCountRef.current = 0\r\n }\r\n } else if (error instanceof ForbiddenError) {\r\n // ignore error\r\n return undefined\r\n } else if (error instanceof GoneError) {\r\n const newTicker = (error.response as ObjectHash).newTicker\r\n const message = newTicker\r\n ? `Ticker \"${drawings[0].ticker}\" was renamed to \"${newTicker}\"`\r\n : `Ticker \"${drawings[0].ticker}\" no longer exists.`\r\n notificationContext.show(\r\n } timeoutInMs={6000}>\r\n {message}\r\n \r\n )\r\n return undefined\r\n }\r\n\r\n // report error to Sentry\r\n window.Sentry?.captureException(error, {\r\n extra: (error instanceof GenericStatusCodeError\r\n ? (error.response as ObjectHash).invalidItems\r\n : drawings\r\n ).reduce(\r\n (acc: ObjectHash, cur: ObjectHash, index: number) => ({ ...acc, [`item-${index}`]: JSON.stringify(cur) }),\r\n {} as ObjectHash\r\n ),\r\n })\r\n\r\n return undefined\r\n }\r\n },\r\n [notificationContext]\r\n )\r\n\r\n const deleteAllDrawings = React.useCallback(\r\n async ({ tickers, lastLocalChange }: { tickers: string[]; lastLocalChange: HLC }): Promise => {\r\n try {\r\n const newHlc = incrementHlc(lastLocalChange, Date.now())\r\n await fetchApi({\r\n location: `/api/auto_save.ashx?ticker=${tickers.join(',')}&lastChangeTimestamp=${\r\n newHlc.ts\r\n }&lastChangeCounter=${newHlc.count}&lastChangeNodeUUID=${newHlc.uuid}`,\r\n method: 'DELETE',\r\n throwOnStatusCodes: [403, 404, 500],\r\n keepalive: true,\r\n })\r\n deleteRetryCountRef.current = 0\r\n } catch (error) {\r\n if (error instanceof InternalServerError) {\r\n // try again\r\n if (deleteRetryCountRef.current < RETRY_LIMIT) {\r\n deleteRetryCountRef.current = deleteRetryCountRef.current + 1\r\n await new Promise((r) => setTimeout(r, 1000))\r\n return deleteAllDrawings({ tickers, lastLocalChange })\r\n } else {\r\n // continue to report to Sentry\r\n deleteRetryCountRef.current = 0\r\n }\r\n } else if (error instanceof ForbiddenError) {\r\n // ignore error\r\n return\r\n }\r\n\r\n // report error to Sentry\r\n window.Sentry?.captureException(error)\r\n }\r\n },\r\n []\r\n )\r\n\r\n return { fetchDrawings, saveDrawings, deleteAllDrawings }\r\n}\r\n","// byteLengthCharCode2 from https://stackoverflow.com/a/63893237\r\n\r\nexport function getByteLengthOfString(s: string) {\r\n //assuming the String is UCS-2(aka UTF-16) encoded\r\n let n = 0\r\n for (let i = 0, l = s.length; i < l; i++) {\r\n const hi = s.charCodeAt(i)\r\n if (hi < 0x0080) {\r\n n += 1\r\n } else if (hi < 0x0800) {\r\n n += 2\r\n } else if (hi < 0xd800) {\r\n n += 3\r\n } else if (hi < 0xdc00) {\r\n const lo = s.charCodeAt(++i)\r\n if (i < l && lo >= 0xdc00 && lo <= 0xdfff) {\r\n n += 4\r\n } else {\r\n throw new Error('UCS-2 String malformed')\r\n }\r\n } else if (hi < 0xe000) {\r\n throw new Error('UCS-2 String malformed')\r\n } else {\r\n n += 3\r\n }\r\n }\r\n return n\r\n}\r\n","import React from 'react'\r\n\r\nimport { DrawingSpineOptions, DrawingSpineOptionsEvent } from '../../../types/shared'\r\nimport ElementCanvas from '../../canvas/element'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getCanvasElementByType } from '../../helpers/get-canvas-element-by-type'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport Element from '../../models/element'\r\nimport { compareHlc, incrementHlc, initHlc, receiveHlc } from '../../utils/hlc'\r\nimport { AutoSaveChangeType, AutoSaveElement, DRAWINGS_SAVE_INTERVAL_MS } from './constants'\r\nimport { useDrawingAutoSaveApi } from './use-drawing-autosave-api'\r\nimport { useIsAutoSaveActive } from './use-is-auto-save-active'\r\nimport {\r\n getContainerType,\r\n getNoteElementId,\r\n getTickerNoteText,\r\n getTickersAndContainerTypesInLayoutModel,\r\n mergeUpdatedDrawingsToInternalStore,\r\n updateInternalStoreWithChangedElement,\r\n} from './utils'\r\n\r\nexport function useDrawingAutoSaveControls(chartLayout: ChartLayout) {\r\n const { fetchDrawings, saveDrawings, deleteAllDrawings } = useDrawingAutoSaveApi()\r\n const isAutoSaveActive = useIsAutoSaveActive(chartLayout)\r\n const drawingsInternalStore = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\r\n const saveTimeoutRef = React.useRef()\r\n\r\n React.useEffect(\r\n () => () => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current)\r\n }\r\n },\r\n []\r\n )\r\n\r\n const saveLatestChanges = React.useCallback(\r\n (\r\n withDelayInMs = DRAWINGS_SAVE_INTERVAL_MS,\r\n saveQueueExtraFilterCallback: ((item: AutoSaveElement) => boolean) | null = null\r\n ) => {\r\n if (saveTimeoutRef.current) {\r\n clearTimeout(saveTimeoutRef.current)\r\n }\r\n const saveQueue = drawingsInternalStore.elements.filter(\r\n (item) =>\r\n compareHlc(item.lastChange, drawingsInternalStore.latestLocalUpdateTimestamp) > 0 &&\r\n item.lastChange.uuid === drawingsInternalStore.instanceUUID &&\r\n (saveQueueExtraFilterCallback === null || saveQueueExtraFilterCallback(item))\r\n )\r\n if (saveQueue.length === 0) {\r\n return\r\n }\r\n\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Unsaved)\r\n\r\n const save = async () => {\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saving)\r\n const result = await saveDrawings(saveQueue)\r\n if (result) {\r\n drawingsInternalStore.updateAttributes({\r\n latestLocalUpdateTimestamp: receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, result),\r\n })\r\n }\r\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saved)\r\n\r\n return result\r\n }\r\n\r\n if (withDelayInMs === 0) {\r\n return save()\r\n }\r\n\r\n saveTimeoutRef.current = window.setTimeout(save, withDelayInMs)\r\n },\r\n [saveDrawings, drawingsInternalStore]\r\n )\r\n\r\n const syncChartLayoutDrawings = React.useCallback(\r\n (drawing: AutoSaveElement) => {\r\n if (drawing.containerType === 'note') {\r\n return\r\n }\r\n const isRemove = drawing.changeType === 'destroy'\r\n\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const paneContainerType = getContainerType(paneModel)\r\n if (!paneContainerType || drawing.ticker !== ticker) {\r\n return\r\n }\r\n const paneInternalStoreElements = drawingsInternalStore.elements.filter(\r\n (autoSaveElement) => autoSaveElement.ticker === ticker && autoSaveElement.containerType === paneContainerType\r\n )\r\n const paneElements = paneModel.getAllElements()\r\n let element: Element | undefined\r\n paneElements.forEach((paneElement) => {\r\n if (paneElement.isDrawing() && !paneElement.instance.isCreator) {\r\n const paneDrawing = paneInternalStoreElements.find(({ elementId }) => elementId === paneElement.elementId)\r\n if (!paneDrawing || paneDrawing.changeType === 'destroy') {\r\n paneElement.destroyCascade()\r\n } else if (paneElement.elementId && paneElement.elementId === drawing.elementId) {\r\n element = paneElement\r\n }\r\n }\r\n })\r\n\r\n const parsedElementAttrs = JSON.parse(drawing.elementAttrs)\r\n if (element) {\r\n if (drawing.elementAttrs !== JSON.stringify(element.instance.toAutosaveConfig())) {\r\n if (element.pane().selection !== element.instance && !element.hasOngoingInteraction()) {\r\n element.instance.set(parsedElementAttrs)\r\n element.instance.updateScales()\r\n }\r\n }\r\n if (drawing.zIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: drawing.zIndex })\r\n }\r\n if (isRemove || paneContainerType !== drawing.containerType) {\r\n element.destroyCascade()\r\n }\r\n } else if (!isRemove && paneContainerType === drawing.containerType) {\r\n const instance = getCanvasElementByType(parsedElementAttrs.type).fromObject(\r\n parsedElementAttrs,\r\n paneModel\r\n ) as ElementCanvas\r\n paneModel.elements().create({ elementId: drawing.elementId, instance, zIndex: drawing.zIndex })\r\n instance.updateScales()\r\n }\r\n })\r\n },\r\n [chartLayout, drawingsInternalStore]\r\n )\r\n\r\n const handleAutoSaveNoteChange = React.useCallback(\r\n (note: string, ticker?: string) => {\r\n if (ticker) {\r\n const newNoteElement: AutoSaveElement = {\r\n elementId: getNoteElementId(ticker),\r\n zIndex: 0,\r\n ticker: ticker,\r\n lastChange: incrementHlc(drawingsInternalStore.latestLocalUpdateTimestamp, Date.now()),\r\n changeType: 'update',\r\n containerType: 'note',\r\n elementAttrs: JSON.stringify({ text: note }),\r\n }\r\n\r\n drawingsInternalStore.updateAttributes({\r\n elements: [\r\n ...drawingsInternalStore.elements.filter(({ elementId }) => elementId !== newNoteElement.elementId),\r\n newNoteElement,\r\n ],\r\n })\r\n }\r\n },\r\n [drawingsInternalStore]\r\n )\r\n\r\n const handleIdeaNoteChange = React.useCallback(\r\n (note: string) => {\r\n if (chartLayout.idea?.note !== note && (chartLayout.idea || note)) {\r\n chartLayout.updateAttribute('idea', { ...chartLayout.idea, note })\r\n handleAutoSaveNoteChange(note, chartLayout.activeChart?.getQuoteRawTicker() ?? undefined)\r\n }\r\n },\r\n [chartLayout, handleAutoSaveNoteChange]\r\n )\r\n\r\n const checkDrawingUpdate = React.useCallback(\r\n async (isRefetchAll = false) => {\r\n const { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n if (isRefetchAll) {\r\n drawingsInternalStore.updateAttributes({\r\n latestRemoteUpdateTimestamp: initHlc(drawingsInternalStore.instanceUUID, 0),\r\n })\r\n }\r\n\r\n const updatedDrawings = await fetchDrawings({\r\n tickers,\r\n containerTypes,\r\n lastChange: drawingsInternalStore.latestRemoteUpdateTimestamp,\r\n })\r\n const { newLastUpdateTimestamp, updatedElementIds, newInternalStore } = mergeUpdatedDrawingsToInternalStore({\r\n updatedDrawings,\r\n currentInternalStore: drawingsInternalStore.elements,\r\n lastUpdateTimestamp: drawingsInternalStore.latestRemoteUpdateTimestamp,\r\n isRefetchAll,\r\n })\r\n\r\n drawingsInternalStore.updateAttributes({\r\n // Even if there are no changes in elements, newInternalStore is new array with the same content which may cause unnecessary rerenders\r\n ...(updatedElementIds.length > 0 ? { elements: newInternalStore } : {}),\r\n latestRemoteUpdateTimestamp: newLastUpdateTimestamp,\r\n latestLocalUpdateTimestamp:\r\n isRefetchAll && newInternalStore.length > 0\r\n ? receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, newLastUpdateTimestamp)\r\n : drawingsInternalStore.latestLocalUpdateTimestamp,\r\n })\r\n\r\n if (updatedElementIds.length > 0 || isRefetchAll) {\r\n saveLatestChanges(0)\r\n const allElements = chartLayout.getAllElements()\r\n updatedElementIds.forEach((elementId) => {\r\n const element = allElements.find((element) => element.elementId === elementId)\r\n\r\n if (element && element.isDrawing() && !element.hasOngoingInteraction()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n\r\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n paneModel.normalizeZIndexes()\r\n })\r\n\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage) {\r\n const activeTicker = chartLayout.activeChart?.getQuoteRawTicker() ?? ''\r\n handleIdeaNoteChange(getTickerNoteText({ ticker: activeTicker, elements: newInternalStore }))\r\n }\r\n }\r\n },\r\n [\r\n chartLayout,\r\n drawingsInternalStore,\r\n syncChartLayoutDrawings,\r\n fetchDrawings,\r\n handleIdeaNoteChange,\r\n saveLatestChanges,\r\n ]\r\n )\r\n\r\n const updateInternalStoreWithElement = React.useCallback(\r\n (element: Element, changeType: AutoSaveChangeType) => {\r\n const updateResult = updateInternalStoreWithChangedElement({\r\n element,\r\n changeType,\r\n currentInternalStore: drawingsInternalStore.elements,\r\n lastUpdateTimestamp: incrementHlc(\r\n receiveHlc(\r\n drawingsInternalStore.latestLocalUpdateTimestamp,\r\n drawingsInternalStore.latestRemoteUpdateTimestamp\r\n ),\r\n Date.now()\r\n ),\r\n })\r\n\r\n if (updateResult) {\r\n const { shouldSyncAndSave, newInternalStore, newDrawing } = updateResult\r\n if (shouldSyncAndSave) {\r\n drawingsInternalStore.updateAttributes({ elements: newInternalStore })\r\n syncChartLayoutDrawings(newDrawing)\r\n }\r\n }\r\n },\r\n [syncChartLayoutDrawings, drawingsInternalStore]\r\n )\r\n\r\n const deleteAllAutoSavedElements = React.useCallback(async () => {\r\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n\r\n await deleteAllDrawings({ tickers, lastLocalChange: drawingsInternalStore.latestLocalUpdateTimestamp })\r\n await checkDrawingUpdate()\r\n }, [chartLayout, deleteAllDrawings, drawingsInternalStore, checkDrawingUpdate])\r\n\r\n const onElementChange = React.useCallback(\r\n (element: Element, _?: any, options?: DrawingSpineOptions) => {\r\n const elementPane = element.pane()\r\n // This may happen if pane had been removed already, in most cases \"element.destroyed\" should be true,\r\n // but we would need to check if it was destroyed by delete drawing action or not, and checking if pane exists covers all cases\r\n if (!element.isDrawing() || element.instance.isCreator || !elementPane) {\r\n return\r\n }\r\n const elementContainerType = getContainerType(elementPane)\r\n const elementPaneTicker = elementPane.getQuoteRawTicker()\r\n const isElementInCurrentChartLayout = chartLayout\r\n .getAllPanes()\r\n .some(\r\n (model) => getContainerType(model) === elementContainerType && model.getQuoteRawTicker() === elementPaneTicker\r\n )\r\n if (isElementInCurrentChartLayout) {\r\n const isRemove = options?.eventType === DrawingSpineOptionsEvent.Remove\r\n updateInternalStoreWithElement(element, isRemove ? 'destroy' : 'update')\r\n }\r\n },\r\n [updateInternalStoreWithElement, chartLayout]\r\n )\r\n\r\n return {\r\n drawingsInternalStore,\r\n onElementChange,\r\n handleIdeaNoteChange,\r\n deleteAllAutoSavedElements,\r\n isAutoSaveActive,\r\n handleAutoSaveNoteChange,\r\n syncChartLayoutDrawings,\r\n saveLatestChanges,\r\n checkDrawingUpdate,\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\r\n\r\nexport function useIsAutoSaveActive(chartLayout: ChartLayout) {\r\n const chartLayoutModel = useModelState(chartLayout, {\r\n watchProperties: ['isInit', 'isPreserveDrawingsActive', 'idea'],\r\n })\r\n const { idea, isInit, isPreserveDrawingsActive } = chartLayoutModel\r\n return React.useMemo(\r\n () =>\r\n getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel) && isPreserveDrawingsActive && !!isInit && !idea?.id,\r\n [isPreserveDrawingsActive, isInit, idea?.id, chartLayoutModel]\r\n )\r\n}\r\n","import { intervalCallbackOnWindowVisible } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { CustomSpineEvents } from '../../../types/shared'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { AutoSaveState } from '../../models/constants'\r\nimport Element from '../../models/element'\r\nimport { usePrevious } from '../../utils/use-prev-state'\r\nimport { DRAWINGS_UPDATE_INTERVAL_MS } from './constants'\r\nimport { useDrawingAutoSaveControls } from './use-drawing-auto-save-controls'\r\nimport { getTickersAndContainerTypesInLayoutModel } from './utils'\r\n\r\nfunction useDrawingAutoSave(chartLayout: ChartLayout) {\r\n const {\r\n onElementChange,\r\n deleteAllAutoSavedElements,\r\n checkDrawingUpdate,\r\n syncChartLayoutDrawings,\r\n saveLatestChanges,\r\n isAutoSaveActive,\r\n } = useDrawingAutoSaveControls(chartLayout)\r\n\r\n const drawingsInternalStoreUnwatched = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\r\n const drawingsInternalStore = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['elements'] })\r\n const prevIsAutoSaveActive = usePrevious(isAutoSaveActive)\r\n\r\n const runInitialSaveAndRefetchUpdate = React.useCallback(async () => {\r\n chartLayout.getAllElements().forEach((element) => {\r\n // Adds drawings to internal store if isAutoSaveActive and they are not in the store yet\r\n if (!drawingsInternalStore.elements.some((drawing) => drawing.elementId === element.elementId)) {\r\n onElementChange(element)\r\n }\r\n })\r\n\r\n // We want to save everything except notes because saving notes can overwrite those already saved in db. Each drawing has different id but there is only one note per ticker\r\n // Notes are merged in checkDrawingUpdate fn\r\n await saveLatestChanges(0, (item) => item.containerType !== 'note')\r\n\r\n checkDrawingUpdate(true)\r\n }, [checkDrawingUpdate, chartLayout, onElementChange, drawingsInternalStore.elements, saveLatestChanges])\r\n\r\n React.useEffect(() => {\r\n if (isAutoSaveActive) {\r\n saveLatestChanges()\r\n }\r\n }, [saveLatestChanges, drawingsInternalStore.elements, isAutoSaveActive])\r\n\r\n React.useEffect(() => {\r\n if (!isAutoSaveActive) {\r\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Off)\r\n return\r\n }\r\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Saved)\r\n if (!prevIsAutoSaveActive && isAutoSaveActive) {\r\n runInitialSaveAndRefetchUpdate()\r\n }\r\n\r\n let { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n\r\n const onChartOrIndicatorChange = () => {\r\n const { tickers: newTickers, containerTypes: newContainerTypes } =\r\n getTickersAndContainerTypesInLayoutModel(chartLayout)\r\n if (\r\n JSON.stringify(tickers) !== JSON.stringify(newTickers) ||\r\n JSON.stringify(containerTypes) !== JSON.stringify(newContainerTypes)\r\n ) {\r\n tickers = newTickers\r\n containerTypes = newContainerTypes\r\n checkDrawingUpdate(true)\r\n }\r\n }\r\n\r\n ChartModel.bind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\r\n Element.bind('change', onElementChange)\r\n\r\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\r\n const checkDrawingUpdateSubscription = intervalCallbackOnWindowVisible(\r\n { interval: DRAWINGS_UPDATE_INTERVAL_MS },\r\n checkDrawingUpdate\r\n )\r\n\r\n const unregisterListeners = () => {\r\n checkDrawingUpdateSubscription()\r\n ChartModel.unbind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\r\n Element.unbind('change', onElementChange)\r\n }\r\n\r\n ChartLayout.bind('change', (model: ChartLayout) => {\r\n if (model.willDestroy) {\r\n unregisterListeners()\r\n }\r\n })\r\n\r\n return unregisterListeners\r\n }, [\r\n chartLayout,\r\n drawingsInternalStore,\r\n checkDrawingUpdate,\r\n onElementChange,\r\n syncChartLayoutDrawings,\r\n isAutoSaveActive,\r\n prevIsAutoSaveActive,\r\n runInitialSaveAndRefetchUpdate,\r\n ])\r\n\r\n return { deleteAllAutoSavedElements, isAutoSaveActive }\r\n}\r\n\r\ninterface Props {\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport const withDrawingsAutoSave = (Component: any) => (props: Props) => {\r\n const { deleteAllAutoSavedElements, isAutoSaveActive } = useDrawingAutoSave(props.chartLayoutModel)\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nexport function usePrevious(value: any) {\r\n const ref = React.useRef()\r\n React.useEffect(() => {\r\n ref.current = value\r\n }, [value])\r\n return ref.current\r\n}\r\n","import { 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 isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(model.specificChartFunctionality as SpecificChartFunctionality)\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 || !isQuoteOrQuoteFinancials ? DEFAULT_TYPES : FREE_TYPES_QUOTE\r\n\r\n return options.map((item) => ({\r\n ...item,\r\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\r\n reloadDocument: !isPremium,\r\n })) as TypeBaseOption[]\r\n }, [generateRouterPath, isPremium, isQuoteOrQuoteFinancials])\r\n\r\n 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} from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface SearchProps {\r\n ticker: string\r\n instrument: Instrument\r\n onTickerSelected: (ticker: string) => void\r\n chartIndex: number\r\n}\r\n\r\nexport default function Search({ ticker, instrument, onTickerSelected, chartIndex }: SearchProps) {\r\n const saveToPortfolioDialogState = useDialogState()\r\n const isSaveToPortfolioVisible = saveToPortfolioDialogState.useState('open')\r\n const createAlertDialogState = useDialogState()\r\n const isCreateAlertVisible = createAlertDialogState.useState('open')\r\n const [saveToPortfolioModule, { isLoading: isLoadingSaveToPortfolio }] = useAsyncModule({\r\n ...saveToPortfolioAsyncModule,\r\n shouldLoadModule: isSaveToPortfolioVisible,\r\n onError: () => saveToPortfolioDialogState.hide(),\r\n })\r\n const [createAlertModule, { isLoading: isLoadingCreateAlert }] = useAsyncModule({\r\n ...createAlertAsyncModule,\r\n shouldLoadModule: isCreateAlertVisible,\r\n onError: () => createAlertDialogState.hide(),\r\n })\r\n const SaveToPortfolio = saveToPortfolioModule?.SaveToPortfolio\r\n const CreateAlert = createAlertModule?.CreateAlert\r\n\r\n const detailLink = React.useMemo(() => {\r\n const formattedTicker = ticker.replace('@', '')\r\n\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return `/quote.ashx?t=${formattedTicker}`\r\n case Instrument.Futures:\r\n return `/futures_charts.ashx?t=${formattedTicker}`\r\n case Instrument.Forex:\r\n return `/forex_charts.ashx?t=${formattedTicker}`\r\n case Instrument.Crypto:\r\n return `/crypto_charts.ashx?t=${formattedTicker}`\r\n }\r\n }, [ticker, instrument])\r\n\r\n return (\r\n

\r\n }\r\n />\r\n }\r\n >\r\n {\r\n window.gtag?.('event', 'click', { event_category: 'open-stock-detail' })\r\n }}\r\n >\r\n {instrument === Instrument.Stock ? 'Open Stock Detail' : 'Open Detail'}\r\n \r\n {instrument === Instrument.Stock && (\r\n {\r\n saveToPortfolioDialogState.show()\r\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\r\n }}\r\n >\r\n Save to Portfolio\r\n \r\n )}\r\n {instrument === Instrument.Stock && (\r\n {\r\n createAlertDialogState.show()\r\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\r\n }}\r\n >\r\n Create Alert\r\n \r\n )}\r\n \r\n }\r\n />\r\n \r\n {isLoadingSaveToPortfolio && (\r\n
\r\n \r\n
\r\n )}\r\n {SaveToPortfolio && }\r\n
\r\n \r\n {isLoadingCreateAlert && (\r\n
\r\n \r\n
\r\n )}\r\n {CreateAlert && }\r\n
\r\n
\r\n )\r\n}\r\n","import {\r\n ButtonRoundingType,\r\n ButtonSizeType,\r\n CustomDateRange,\r\n Heading,\r\n TimeframeBar,\r\n ZIndexContext,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { IdeasDropdown } from '../header/ideas_dropdown'\r\nimport { Publish } from '../header/publish'\r\nimport { TourButton } from '../header/tour_button'\r\nimport { ChartTypesSelect } from './chart-type-select'\r\nimport { DailyChangeDisplay } from './daily-change-display'\r\nimport { DrawButton } from './draw-button'\r\nimport { FullscreenButton } from './fullscreen-button'\r\nimport Search from './search'\r\nimport { ChartSettingsButton } from './settings-button'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\ninterface SettingsComponentProps {\r\n chartModel: Chart\r\n chartIndex: number\r\n}\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\r\n\r\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\r\n const rounding: ButtonRoundingType | undefined = hasRedesignEnabled ? undefined : 'none'\r\n // This memo is required for publish, otherwise it ends up in a loop\r\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'quote', 'dateRange'],\r\n })\r\n const { instrument } = chartModel?.quote() || {}\r\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n const navigate = useNavigate()\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: true,\r\n })\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const handleTickerSelect = React.useCallback(\r\n (ticker: string) => {\r\n const upperCaseTicker = ticker.toUpperCase()\r\n\r\n navigate(\r\n generateChartLayoutRouterPath({\r\n ticker: upperCaseTicker,\r\n timeframe: chartModel.timeframe,\r\n dateRange: chartModel.dateRange,\r\n })\r\n )\r\n },\r\n [chartModel, generateChartLayoutRouterPath, navigate]\r\n )\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = values.dateRange\r\n ? getDateRangeTimeframe(values.dateRange)\r\n : { value: '', timeframe: chartModel.timeframe }\r\n\r\n if (dateRangeTimeframe === null) {\r\n return\r\n } else if (dateRangeTimeframe.value) {\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (!isValid) {\r\n return\r\n }\r\n }\r\n\r\n onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n const timeframeBarProps = React.useMemo(\r\n () => ({\r\n size: 'medium' as ButtonSizeType,\r\n chartIndex: chartIndex,\r\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\r\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\r\n selectedTimeframe: chartModel.timeframe,\r\n onTimeframeSelect: () => {},\r\n selectedDateRange: chartModel.dateRange,\r\n favoriteTimeframes: favoriteTimeframes,\r\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\r\n onDateRangeSelect: handleDateRangeSelect,\r\n onCustomDateRangeClick: () => {\r\n if (isPremium) customDateRangeDialogState.show()\r\n },\r\n isFavoritesEnabled: isPremium,\r\n onFavoriteTimeframeToggle: ({ value }: { value: TIMEFRAME | 'intraday' }) => {\r\n toggleFavoriteTimeframe(value)\r\n },\r\n }),\r\n [\r\n chartIndex,\r\n chartModel.dateRange,\r\n chartModel.timeframe,\r\n customDateRangeDialogState,\r\n dateRangeGroupsWithHref,\r\n favoriteTimeframes,\r\n handleDateRangeSelect,\r\n instrument,\r\n isLoading,\r\n timeframeGroupsWithHref,\r\n toggleFavoriteTimeframe,\r\n ]\r\n )\r\n\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n return (\r\n \r\n
\r\n {chartModel.chart_layout().canChangeTicker && (\r\n \r\n )}\r\n\r\n \r\n\r\n \r\n\r\n \r\n
\r\n
\r\n )\r\n }\r\n\r\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\r\n\r\n return (\r\n \r\n
\r\n {!isQuotePage && !isQuoteFinancials && (\r\n \r\n {chartModel.quote().name ?? chartModel.ticker}\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.tools) && (\r\n \r\n Draw\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.ideas) && (\r\n \r\n Ideas\r\n \r\n )}\r\n {!hasTimeframe && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n\r\n {hasTimeframe && (\r\n
\r\n
\r\n {!isQuoteFinancials && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n \r\n
\r\n
\r\n
\r\n )}\r\n\r\n \r\n {chartLayout.editors.includes(ChartEditorEnum.publish) && (\r\n \r\n Share\r\n \r\n )}\r\n {isQuotePage && (\r\n \r\n )}\r\n {!isQuoteFinancials && (\r\n \r\n {!isQuotePage && 'Fullscreen'}\r\n \r\n )}\r\n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\r\n \r\n {!isQuotePage && 'Settings'}\r\n \r\n )}\r\n {!isQuotePage && !isQuoteFinancials && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n )\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { ContextMenuItem } from '@finviz/website'\r\n\r\nexport type CallbacksType = {\r\n onFullyOpen: () => void\r\n onFullyClosed: () => void\r\n onBeforeItemClick: () => void\r\n}\r\n\r\nclass ContextMenu extends Spine.Model {\r\n static initClass() {\r\n this.configure('ContextMenu', 'shown', 'config', 'anchorRect', 'callbacks')\r\n }\r\n\r\n declare shown: boolean\r\n declare config: ContextMenuItem[]\r\n declare anchorRect: { x: number; y: number }\r\n declare callbacks: CallbacksType | undefined\r\n}\r\n\r\nContextMenu.initClass()\r\n\r\nconst contextMenu = ContextMenu.create() as ContextMenu\r\ncontextMenu.save()\r\n\r\nexport default contextMenu\r\n","import { ContextMenu as ContextMenuComponent, useDropdownState } from '@finviz/website'\r\nimport React from 'react'\r\nimport * as ReactDOM from 'react-dom/client'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport { useModelState } from '../model-hooks/use-model-state'\r\nimport model, { CallbacksType } from '../models/context_menu'\r\nimport { ready } from '../utils'\r\n\r\nfunction ContextMenu() {\r\n const watchedModel = useModelState(model, {\r\n watchProperties: ['shown', 'anchorRect', 'config', 'callbacks'],\r\n })\r\n const state = useDropdownState({ open: watchedModel.shown })\r\n\r\n return (\r\n ev.type !== 'contextmenu'}\r\n state={state}\r\n items={watchedModel.config?.map((item) => ({\r\n ...item,\r\n onClick: () => {\r\n watchedModel.callbacks?.onBeforeItemClick()\r\n if ('onClick' in item) {\r\n item.onClick?.()\r\n }\r\n },\r\n }))}\r\n getAnchorRect={() => watchedModel.anchorRect}\r\n onClose={() => model.updateAttribute('shown', false)}\r\n onFullyOpen={watchedModel.callbacks?.onFullyOpen}\r\n onFullyClosed={watchedModel.callbacks?.onFullyClosed}\r\n data-testid=\"charts-context-menu-body\"\r\n backdrop={\r\n {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n }}\r\n />\r\n }\r\n />\r\n )\r\n}\r\n\r\nready(() => {\r\n const rootEl = document.querySelector('.context-menu')\r\n if (rootEl) {\r\n const root = ReactDOM.createRoot(rootEl!)\r\n root.render()\r\n }\r\n})\r\n\r\nconst contextMenuControl = {\r\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash, callbacks: CallbacksType) => {\r\n model.updateAttributes({\r\n shown: true,\r\n config: config,\r\n callbacks,\r\n anchorRect: {\r\n x: event.clientX,\r\n y: event.clientY,\r\n },\r\n })\r\n },\r\n}\r\n\r\nexport default contextMenuControl\r\n","import { Delayed, DialogBody, Popover, PopoverAnchor, Spinner, usePopoverState } from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\nimport Utils from '../../utils'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { useClickAway } from '../../utils/use-click-away'\r\nimport { chartEventsAsyncModule } from '../chart-events/async-modules'\r\n\r\nconst isMobile = Utils.isMobile()\r\n\r\ninterface ChartEventPopoverWithStateProps {\r\n chartModel: ChartModel\r\n}\r\n\r\nexport function ChartEventPopoverWithState({ chartModel }: ChartEventPopoverWithStateProps) {\r\n const unwatchedChartLayout = React.useMemo(() => chartModel.chart_layout() ?? null, [chartModel])\r\n const { activeChartEvent, theme } = useModelState(unwatchedChartLayout, { watchProperties: ['activeChartEvent'] })\r\n const lastEventId = React.useRef(activeChartEvent?.id)\r\n const popoverState = usePopoverState({ placement: 'top' })\r\n const isPopoverMounted = popoverState.useState('mounted')\r\n const [style, setStyle] = React.useState({ top: 0, left: 0 })\r\n const [chartEventsModule] = useAsyncModule({\r\n ...chartEventsAsyncModule,\r\n shouldLoadModule: isPopoverMounted,\r\n errorSeverity: 'medium',\r\n onError: () => popoverState.hide(),\r\n })\r\n const isChartEventOfThisChart = activeChartEvent?.pane().chart().eql(chartModel)\r\n const [data, setData] = React.useState(null)\r\n const clickAwayRef = useClickAway(() => {\r\n const isAnyBadgeHovered = !!chartModel\r\n .getChartPane()\r\n ?.getAllChartEvents()\r\n .some((chartEvent) => chartEvent.instance.isHovered)\r\n\r\n if (!isAnyBadgeHovered && activeChartEvent && isChartEventOfThisChart) {\r\n activeChartEvent.instance.toggleIsOpen(false)\r\n }\r\n // Due to the fact that chart events logic depends heavily on hover state which isn't really present on touch devices\r\n // we need to mimic that state for touch devices, this enables chart event closed on click outside and counterpart in\r\n // chart-events.ts allow chart event to be open\r\n if (activeChartEvent && isMobile) {\r\n activeChartEvent.instance.setIsHovered(false)\r\n }\r\n }, !!activeChartEvent && isChartEventOfThisChart)\r\n // This is intentional, it doesn't need to be in useEffect, it would just call effect function which is redundant\r\n clickAwayRef.current = popoverState.useState('popoverElement')\r\n const popoverShow = popoverState.show\r\n const popoverHide = popoverState.hide\r\n\r\n React.useEffect(() => {\r\n lastEventId.current = activeChartEvent?.id\r\n if (!activeChartEvent?.instance.isOpen || !isChartEventOfThisChart) {\r\n if (!isPopoverMounted) {\r\n return setData(null)\r\n }\r\n return popoverHide()\r\n }\r\n if (!isChartEventOfThisChart) return\r\n const { top, left } = activeChartEvent.instance\r\n const newData = activeChartEvent.getChartEventData()\r\n if (newData?.elementId !== data?.elementId) {\r\n setData({\r\n ...newData,\r\n badgeType: activeChartEvent.instance.getChartEvenBadgeType(),\r\n })\r\n }\r\n\r\n if (style.top !== top || style.left !== left) {\r\n setStyle({ top, left })\r\n }\r\n if (!isPopoverMounted) {\r\n popoverShow()\r\n }\r\n }, [\r\n activeChartEvent,\r\n data?.elementId,\r\n isChartEventOfThisChart,\r\n isPopoverMounted,\r\n popoverHide,\r\n popoverShow,\r\n popoverState,\r\n style.left,\r\n style.top,\r\n ])\r\n\r\n return (\r\n <>\r\n \r\n {data && (\r\n \r\n \r\n {chartEventsModule ? (\r\n \r\n ) : (\r\n
\r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport Utils from '../utils'\r\n\r\nexport function useClickAway(callback: (event: MouseEvent | TouchEvent) => void, isListening = true) {\r\n const ref = React.useRef(null)\r\n const refCallback = React.useRef(callback)\r\n\r\n React.useLayoutEffect(() => {\r\n refCallback.current = callback\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isListening) {\r\n return\r\n }\r\n const isMobile = Utils.isMobile()\r\n const handler = (e: MouseEvent | TouchEvent) => {\r\n const element = ref.current\r\n if (element && e.target && !element.contains(e.target as HTMLElement)) {\r\n refCallback.current(e)\r\n }\r\n }\r\n\r\n document.addEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\r\n\r\n return () => {\r\n document.removeEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\r\n }\r\n }, [callback, isListening])\r\n\r\n return ref\r\n}\r\n","import { Button, ButtonGroup, Delayed, Icon, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { useIsMounted } from '../../utils/use-is-mounted'\r\n\r\ninterface LoadLatestDataButtonProps {\r\n chartModel: Chart\r\n}\r\n\r\nexport function LoadLatestDataButton({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\r\n const getIsMounted = useIsMounted()\r\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\r\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['isFetching'] })\r\n const [hasNewDataAvailable, setHasNewDataAvailable] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!chartModel.getRefreshInterval()) {\r\n // We will do a check here if we have correct new data\r\n chartModel\r\n .quote()\r\n .isPossibleToFetchSequentialData()\r\n .then((hasNewData) => {\r\n if (getIsMounted()) {\r\n setHasNewDataAvailable(hasNewData)\r\n }\r\n })\r\n }\r\n // We need to run it only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleLoadLatestData = async () => {\r\n const promises = chartModel\r\n .getAllQuotes()\r\n .map(async (quote) => quote.fetchData({ fetchType: QuoteFetchType.NewerData }))\r\n chartModel.updateAttributes({ refreshData: true })\r\n await Promise.all(promises)\r\n if (getIsMounted()) {\r\n setHasNewDataAvailable(false)\r\n window.gtag?.('event', 'load-latest-data', { event_category: 'ideas' })\r\n }\r\n }\r\n\r\n if (!hasNewDataAvailable) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n }>\r\n \r\n \r\n ) : (\r\n 'refresh'\r\n )\r\n }\r\n disabled={quoteModel?.isFetching}\r\n title=\"Load latest data\"\r\n onClick={handleLoadLatestData}\r\n data-testid=\"load-latest-data-button\"\r\n >\r\n Load latest data\r\n \r\n \r\n )\r\n}\r\n","// Copy if this file is in Website repo in Website/js/main/hooks/ folder\r\nimport * as React from 'react'\r\n\r\nexport function useIsMounted() {\r\n const isMountedRef = React.useRef(false)\r\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\r\n\r\n React.useEffect(() => {\r\n isMountedRef.current = true\r\n return () => {\r\n isMountedRef.current = false\r\n }\r\n }, [])\r\n\r\n return getIsMounted\r\n}\r\n","import { Button, ButtonGroup, ButtonSizeType, Icon } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport Utils from '../../utils'\r\nimport { getLeftOffset } from '../renderUtils'\r\nimport { LoadLatestDataButton } from './load-latest-data-button'\r\n\r\nexport const ZOOM_CONTROLS_ACTIVE_CLASS = 'is-active'\r\nexport const ZOOM_CONTROLS_IS_IN_AREA_CLASS = 'is-in-area'\r\n\r\nconst buttonCommonProps: { size: ButtonSizeType; className: string; contentClass: string } = {\r\n size: 'none',\r\n className: 'w-7 h-6',\r\n contentClass: 'flex justify-center',\r\n}\r\n\r\nconst isMobile = Utils.isMobile()\r\n\r\ninterface ZoomControlsProps {\r\n zoomControlsRef: React.RefObject\r\n isVisible: boolean\r\n chartModel: Chart\r\n onZoomIn: () => void\r\n onZoomOut: () => void\r\n onZoomReset: () => void\r\n}\r\n\r\nconst getDefaultLeftOffset = (chartModel: Chart) =>\r\n getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel,\r\n config: {},\r\n })\r\n\r\nexport function ZoomControls({\r\n zoomControlsRef,\r\n chartModel,\r\n isVisible,\r\n onZoomIn,\r\n onZoomOut,\r\n onZoomReset,\r\n}: ZoomControlsProps) {\r\n const chartLayoutModel = useModelState(chartModel.chart_layout(), { watchProperties: ['idea'] })\r\n const [isGoToRecentVisible, setIsGoToRecentVisible] = React.useState(\r\n () => chartModel.leftOffset !== getDefaultLeftOffset(chartModel)\r\n )\r\n const { defaultZoomFactor } = chartLayoutModel\r\n const [isZoomResetVisible, setIsZoomResetVisible] = React.useState(chartModel.zoomFactor !== defaultZoomFactor)\r\n const handleGoToMostRecent = React.useCallback(() => {\r\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\r\n }, [chartModel])\r\n\r\n React.useEffect(() => {\r\n const handleChartModelChangeDebounced = debounce(\r\n () => {\r\n setIsZoomResetVisible(chartModel.zoomFactor !== defaultZoomFactor)\r\n setIsGoToRecentVisible(chartModel.leftOffset !== getDefaultLeftOffset(chartModel))\r\n },\r\n 100,\r\n { maxWait: 333 }\r\n )\r\n chartModel.bind('change', handleChartModelChangeDebounced)\r\n return () => {\r\n handleChartModelChangeDebounced.cancel()\r\n chartModel.unbind('change', handleChartModelChangeDebounced)\r\n }\r\n }, [defaultZoomFactor, chartModel])\r\n\r\n return (\r\n \r\n {!isMobile && (\r\n
\r\n {isZoomResetVisible && (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n
\r\n )}\r\n\r\n
\r\n {!!chartLayoutModel.idea?.id && }\r\n\r\n {isGoToRecentVisible && (\r\n \r\n \r\n \r\n \r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { Button, Notification, NotificationContextType, Paragraph, withNotificationContext } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport Hammer from 'hammerjs'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { CustomSpineEvents, DrawingSpineOptionsEvent, EmptyObject, ObjectHash, PaneArea } from '../../../types/shared'\r\nimport CanvasElement from '../../canvas/element'\r\nimport ChartEvent from '../../chart-events/chart-event'\r\nimport { IndicatorType, ScaleType, SetVisibilityTo, SpecificChartFunctionality } from '../../constants/common'\r\nimport IndicatorElement from '../../indicators/indicator'\r\nimport { withElementStyleDialogState } from '../../modals/element_style'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartEventElement from '../../models/chart-event-element'\r\nimport ElementModel from '../../models/element'\r\nimport MouseModel from '../../models/mouse'\r\nimport PaneModel from '../../models/pane'\r\nimport Quote from '../../models/quote'\r\nimport { handleRemoveIndicatorPane } from '../../models/utils'\r\nimport Utils, { isRedesignedPage } from '../../utils'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport { getBarWidthWithMargin, unmountCanvas } from '../../utils/chart'\r\nimport { setElementCursor } from '../../utils/cursor'\r\nimport { getValueInRange, isPrimaryClick } from '../../utils/helpers'\r\nimport { getInitialStoreDrawings } from '../autosave/utils'\r\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from '../chart_layout/constants'\r\nimport ContextMenu from '../context_menu'\r\nimport { getMinMaxLeftOffset, getSettings, recountScale, renderPane } from '../renderUtils'\r\nimport { DrawingTool } from '../toolbar/interfaces'\r\nimport { getChartAlt } from '../utils'\r\nimport { ChartEventPopoverWithState } from './chart-event-popover-with-state'\r\nimport { withPaneModel } from './with-pane-model'\r\nimport { ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS, ZoomControls } from './zoom_controls'\r\n\r\n// Indicates how many time lower/higher can new scale be compared to original one\r\nconst ALLOWED_MIN_MAX_ZOOM = 10000\r\n\r\ninterface PaneProps {\r\n model: PaneModel\r\n chartModel: ChartModel\r\n activeTool: DrawingTool\r\n activeChartInteraction: string | null\r\n chartIndex: number\r\n paneIndex: number\r\n touchEventsDisabled: boolean\r\n onPaneClick?: (model: PaneModel) => void\r\n onZoomerReset: () => void\r\n onZoomerMouseDown: React.MouseEventHandler\r\n onZoomerTouchStart: React.TouchEventHandler\r\n onAddToZoomFactor: (data: { diff: number; shouldCalculateRightAlign: boolean }) => void\r\n onResizerMouseDown: (e: React.MouseEvent, model: PaneModel) => void\r\n onPaneDestroy: (paneId: string) => void\r\n setActiveChartInteraction: (value: string | null) => void\r\n openElementStyleDialog?: (element: CanvasElement | IndicatorElement) => void\r\n notificationContext: NotificationContextType\r\n}\r\n\r\ninterface PaneState {\r\n hasSeenCrossNotification: boolean\r\n}\r\n\r\nfunction toggleE2eRenderInProgress({ id, isInProgress }: { id: number; isInProgress: boolean }) {\r\n if (process.env.IS_E2E_TESTING) {\r\n window.rendersInProgress = window.rendersInProgress ?? []\r\n\r\n if (isInProgress) {\r\n window.isRenderInProgress = true\r\n window.rendersInProgress.push(id)\r\n } else {\r\n window.rendersInProgress = window.rendersInProgress.filter((progressId) => id !== progressId)\r\n\r\n if (window.rendersInProgress.length === 0) {\r\n window.isRenderInProgress = Date.now()\r\n }\r\n }\r\n }\r\n}\r\n\r\nclass Pane extends React.Component {\r\n rafId?: number | null = null\r\n crossRafId?: number | null = null\r\n quoteModel: Quote\r\n paneRef = React.createRef()\r\n scalerRef = React.createRef()\r\n zoomerRef = React.createRef()\r\n zoomControlsRef = React.createRef()\r\n canvasWrapperRef = React.createRef()\r\n canvasRef = React.createRef()\r\n crossCanvasRef = React.createRef()\r\n chartLayoutModel = this.props.chartModel.chart_layout()\r\n paneHammer!: HammerManager\r\n scalerHammer!: HammerManager\r\n zoomerHammer!: HammerManager\r\n canvasWrapperHammer!: HammerManager\r\n mouseDown = false\r\n lastClientX?: number\r\n lastClientY?: number\r\n currentViewRange: { min: number; max: number } | null = null\r\n lastX!: number\r\n lastY!: number\r\n lastActiveTool: DrawingTool\r\n scalerLastY: number | null = null\r\n isElementHovered = false\r\n hoveredElement: CanvasElement | null = null\r\n isMobile: boolean\r\n isDisableTouchCrossAvailable = true\r\n\r\n canvas: HTMLCanvasElement | null = null\r\n canvasCtx: CanvasRenderingContext2D | null = null\r\n crossCanvas: HTMLCanvasElement | null = null\r\n crossCanvasCtx: CanvasRenderingContext2D | null = null\r\n isIndicatorPane = false\r\n\r\n state: PaneState = {\r\n hasSeenCrossNotification: !!window.localStorage?.getItem('hasSeenCrossNotification'),\r\n }\r\n\r\n // expects chartModel, model, onResizerMouseDown, onPaneDestroy\r\n constructor(props: PaneProps) {\r\n super(props)\r\n\r\n this.quoteModel = this.props.chartModel.quote()\r\n props.model.updateAttribute('instance', this)\r\n props.model.bind('update', this.onModelUpdate)\r\n props.model\r\n .elements()\r\n .bind('create', this.onElementCreate)\r\n .bind('destroy', this.onElementDestroy)\r\n .bind('replace', this.onElementReplace)\r\n .bind('select', this.onElementSelect)\r\n .bind('makeClone', this.onElementClone)\r\n .bind('change', this.immediateRecountScaleOnChartIndicatorChange)\r\n .bind('change', debounce(this.recountScale, 50))\r\n props.model.bind(CustomSpineEvents.ManualChange, this.recountScale)\r\n\r\n props.model.chartEvents().bind('create', this.onElementCreate).bind('change', debounce(this.recountScale, 50))\r\n\r\n this.props.chartModel.bind('update', this.onChartUpdate)\r\n this.props.chartModel.bind(`change ${CustomSpineEvents.IndicatorsChange}`, this.recountScale)\r\n this.quoteModel.bind('change', this.recountScale)\r\n this.isMobile = !!Utils.isMobile()\r\n this.lastActiveTool = props.activeTool\r\n if (!MouseModel.pane()) {\r\n MouseModel.updateAttribute('pane', props.model)\r\n }\r\n this.isIndicatorPane = props.model.getIsIndicatorPane()\r\n this.recountScale()\r\n }\r\n\r\n componentDidMount() {\r\n const { model } = this.props\r\n this.chartLayoutModel.bind('theme', this.renderAll)\r\n this.chartLayoutModel.bind('theme', this.renderCross)\r\n\r\n const initialStoreDrawings = getInitialStoreDrawings() ?? []\r\n const elements = [...model.getAllElements(), ...model.getAllChartEvents(false)]\r\n elements.forEach((element) => {\r\n this.onElementCreate(element)\r\n if (element.isDrawing()) {\r\n const hasDrawingInInitialCache = initialStoreDrawings.some(({ elementId }) => element.elementId === elementId)\r\n if (hasDrawingInInitialCache) {\r\n element.instance?.updateScales()\r\n }\r\n element.instance.cachePointPositionTimestamp()\r\n } else if (element.isChartEvent()) {\r\n element.instance?.updateScales()\r\n }\r\n })\r\n\r\n model?.updateChartEventsZIndexes()\r\n\r\n this.canvas = this.canvasRef.current\r\n this.canvasCtx = getContextWithCache(this.canvasRef.current)\r\n this.crossCanvas = this.crossCanvasRef.current\r\n this.crossCanvasCtx = getContextWithCache(this.crossCanvasRef.current)\r\n\r\n this.paneHammer = new Hammer.Manager(this.paneRef.current!, { touchAction: 'none' })\r\n this.paneHammer.add(new Hammer.Press({ threshold: 5, time: 500 })) // chrome simulator \"long touch\" -> \"oncontextmenu\" is 680ms +- 2ms\r\n this.paneHammer.on('press', this.onPress)\r\n this.canvasWrapperHammer = new Hammer(this.canvasWrapperRef.current!, { touchAction: 'none' })\r\n this.canvasWrapperHammer.on('tap', this.onClick)\r\n this.canvasWrapperRef.current?.addEventListener('touchmove', this.onTouchMove, { passive: false })\r\n\r\n if (this.chartLayoutModel.scrollable || !this.isMobile) {\r\n if (this.scalerRef.current) {\r\n this.scalerHammer = new Hammer(this.scalerRef.current, { touchAction: 'none' })\r\n this.scalerHammer.on('doubletap', this.onScalerReset)\r\n }\r\n if (this.zoomerRef.current) {\r\n this.zoomerHammer = new Hammer(this.zoomerRef.current, { touchAction: 'none' })\r\n this.zoomerHammer.on('doubletap', this.props.onZoomerReset)\r\n }\r\n this.canvasWrapperHammer.on('doubletap', this.onDoubleClick)\r\n }\r\n\r\n this.onChartUpdate({ width: this.props.chartModel.width })\r\n this.onModelUpdate({ height: model.height })\r\n this.forceUpdate()\r\n this.chartLayoutModel.trigger(CHART_LAYOUT_CHILD_CHANGE_EVENT)\r\n }\r\n\r\n componentWillUnmount() {\r\n this.canvasWrapperRef.current?.removeEventListener('touchmove', this.onTouchMove)\r\n unmountCanvas(this.canvas)\r\n unmountCanvas(this.crossCanvas)\r\n this.props.chartModel.unbind('update', this.onChartUpdate)\r\n this.props.chartModel.unbind('change', this.recountScale)\r\n this.quoteModel.unbind('change', this.recountScale)\r\n }\r\n\r\n render() {\r\n const { activeTool, touchEventsDisabled, onPaneClick, paneIndex, chartIndex, model, chartModel } = this.props\r\n if (touchEventsDisabled) {\r\n this.paneHammer?.set({ touchAction: 'auto' })\r\n this.scalerHammer?.set({ touchAction: 'auto' })\r\n this.zoomerHammer?.set({ touchAction: 'auto' })\r\n this.canvasWrapperHammer?.set({ touchAction: 'auto' })\r\n } else {\r\n const touchAction = this.getIsHammerAllowScrollActive() ? 'auto' : 'none'\r\n this.scalerHammer?.set({ touchAction: 'none' })\r\n this.zoomerHammer?.set({ touchAction: 'none' })\r\n this.paneHammer?.set({ touchAction })\r\n this.canvasWrapperHammer?.set({ touchAction })\r\n }\r\n\r\n const isChartPane = model.getIsChartPane()\r\n\r\n return (\r\n onPaneClick?.(model)}\r\n onTouchStart={() => onPaneClick?.(model)}\r\n onContextMenu={this.onContextMenu}\r\n data-testid={`chart-${chartIndex}-pane-${paneIndex}`}\r\n >\r\n {isChartPane && }\r\n {paneIndex !== 0 && (\r\n this.props.onResizerMouseDown(e, model)}\r\n data-testid={`chart-${chartIndex}-pane-${paneIndex}-resizer`}\r\n />\r\n )}\r\n {this.chartLayoutModel.initialScrollable && (\r\n \r\n )}\r\n\r\n {this.chartLayoutModel.initialScrollable && isChartPane && (\r\n <>\r\n \r\n {\r\n this.props.onAddToZoomFactor({ diff: 0.1, shouldCalculateRightAlign: true })\r\n }}\r\n onZoomOut={() => {\r\n this.props.onAddToZoomFactor({ diff: -0.1, shouldCalculateRightAlign: true })\r\n }}\r\n onZoomReset={this.props.onZoomerReset}\r\n />\r\n \r\n )}\r\n \r\n {getChartAlt(this.quoteModel)}\r\n {this.chartLayoutModel.cross && }\r\n \r\n \r\n )\r\n }\r\n\r\n getIsHammerAllowScrollActive = () =>\r\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage &&\r\n !this.chartLayoutModel.isTouchCrossActive &&\r\n !this.chartLayoutModel.scrollable\r\n\r\n onElementCreate = (el: ElementModel | ChartEventElement) => {\r\n el.instance.bind('change', this.renderAll)\r\n this.renderAll()\r\n }\r\n\r\n onElementReplace = (el: ElementModel, oldElementInstance: CanvasElement) => {\r\n oldElementInstance.unbind('change', this.renderAll)\r\n el.instance.bind('change', this.renderAll)\r\n if (oldElementInstance === this.props.model.selection && !this.chartLayoutModel.isDrawingModeContinuousActive) {\r\n this.setSelection(el.instance)\r\n } else {\r\n this.setSelection(null)\r\n }\r\n this.renderAll()\r\n }\r\n\r\n onElementDestroy = (el: ElementModel) => {\r\n const { type } = el.instance\r\n el.instance.unbind('change', this.renderAll)\r\n if (el.instance === this.props.model.selection) {\r\n this.setSelection(null)\r\n }\r\n if (type.startsWith('charts/') || type.startsWith('indicators/')) {\r\n this.props.onPaneDestroy(el['pane_id'])\r\n }\r\n this.renderAll()\r\n }\r\n\r\n onElementSelect = (el: ElementModel) => {\r\n this.setSelectedElement(el.instance)\r\n }\r\n\r\n onElementClone = (_: unknown, clonedElementInstance: CanvasElement) => {\r\n this.setSelectedElement(clonedElementInstance)\r\n }\r\n\r\n onModelUpdate = ({ height }: { height: number }) => {\r\n this.setCanvasSize({\r\n width: this.props.chartModel.width,\r\n height,\r\n })\r\n }\r\n\r\n onChartUpdate = ({ width }: { width: number }) => {\r\n const { model, chartModel } = this.props\r\n this.setCanvasSize({\r\n width,\r\n height: model.height,\r\n })\r\n const quote = chartModel.quote()\r\n if (!this.quoteModel.eql(quote)) {\r\n this.quoteModel.unbind('change', this.recountScale)\r\n if (quote) {\r\n this.quoteModel = quote\r\n this.quoteModel.bind('change', this.recountScale)\r\n }\r\n }\r\n }\r\n\r\n onZoomerMouseMove: React.MouseEventHandler = (e) => {\r\n if (!this.chartLayoutModel.scrollable || (this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) return\r\n const area = this.getArea(e)\r\n MouseModel.updateAttributes({\r\n position: { x: area.x, y: null },\r\n pane: this.props.model,\r\n })\r\n }\r\n\r\n onMouseMoveOnScrolling = (event: TouchEvent | MouseEvent) => {\r\n if (this.props.activeChartInteraction) {\r\n return\r\n }\r\n\r\n let { clientX, clientY } = event as MouseEvent\r\n const { model } = this.props\r\n\r\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\r\n if (isTouch && event.targetTouches?.length > 0) {\r\n clientX = event.targetTouches[0].clientX\r\n clientY = event.targetTouches[0].clientY\r\n }\r\n if (!model.selection && !this.chartLayoutModel.activeChartEvent) {\r\n if (this.lastClientX != null) {\r\n const dif = this.lastClientX - clientX\r\n this.addToLeftOffset(-dif)\r\n }\r\n if (model.scaleRange && this.lastClientY != null) {\r\n let { min, max } = model.scaleRange\r\n let difY\r\n switch (this.props.chartModel.scale) {\r\n case ScaleType.Logarithmic: {\r\n difY = this.lastClientY - clientY\r\n min = model.scale.y.invert(model.scale.y(min) + difY)\r\n max = model.scale.y.invert(model.scale.y(max) + difY)\r\n break\r\n }\r\n default: {\r\n difY = (this.lastClientY - clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\r\n min -= difY\r\n max -= difY\r\n break\r\n }\r\n }\r\n\r\n model.updateAttribute('scaleRange', { min, max })\r\n this.recountScale()\r\n this.currentViewRange = this.props.model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\r\n }\r\n }\r\n this.lastClientX = clientX\r\n this.lastClientY = clientY\r\n }\r\n\r\n onScalerTouchStart: React.TouchEventHandler = (e) => {\r\n if (!this.chartLayoutModel.scrollable || this.props.touchEventsDisabled) return\r\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\r\n this.onScalerMouseDown(e.targetTouches[0])\r\n }\r\n }\r\n\r\n onScalerTouchMove = (e: TouchEvent) => {\r\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\r\n this.onScalerMouseMove(e.targetTouches[0])\r\n }\r\n }\r\n\r\n onScalerTouchEnd = () => {\r\n if (this.chartLayoutModel.scrollable) {\r\n this.onScalerMouseUp()\r\n }\r\n }\r\n\r\n onScalerMouseEnter = () => {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n }\r\n\r\n onScalerMouseDown = (event: React.MouseEvent | React.Touch) => {\r\n const { activeChartInteraction, setActiveChartInteraction, model } = this.props\r\n if ((event instanceof MouseEvent && event.button) || activeChartInteraction || !this.chartLayoutModel.scrollable) {\r\n return\r\n }\r\n setActiveChartInteraction('scaler')\r\n\r\n this.scalerLastY = event.clientY\r\n // here we need current domain scale or former \"nice\" value\r\n const [currentDomainMax, currentDomainMin] = model.scale.y.domain()\r\n this.currentViewRange = { min: currentDomainMin, max: currentDomainMax }\r\n document.addEventListener<'mousemove'>('mousemove', this.onScalerMouseMove)\r\n document.addEventListener('mouseup', this.onScalerMouseUp)\r\n document.addEventListener('touchmove', this.onScalerTouchMove)\r\n document.addEventListener('touchend', this.onScalerTouchEnd)\r\n }\r\n\r\n onScalerMouseMove = (event: MouseEvent | Touch) => {\r\n const { model, chartModel } = this.props\r\n if (model.scaleRange === null && this.currentViewRange === null) {\r\n return\r\n }\r\n let { min, max } = model.scaleRange || this.currentViewRange!\r\n let difY\r\n switch (this.props.chartModel.scale) {\r\n case ScaleType.Logarithmic: {\r\n difY = this.scalerLastY! - event.clientY\r\n min = model.scale.y.invert(model.scale.y(min) - difY)\r\n max = model.scale.y.invert(model.scale.y(max) + difY)\r\n break\r\n }\r\n default: {\r\n difY = -(this.scalerLastY! - event.clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\r\n min -= difY\r\n max += difY\r\n break\r\n }\r\n }\r\n this.scalerLastY = event.clientY\r\n\r\n const originalMinMax = model.getChartOrIndicatorElement()?.instance?.getMinMax?.()\r\n if (originalMinMax) {\r\n const currentDiff = Math.abs(max - min)\r\n const originalDiff = Math.abs(originalMinMax.max - originalMinMax.min)\r\n\r\n if (currentDiff > originalDiff * ALLOWED_MIN_MAX_ZOOM || currentDiff < originalDiff / ALLOWED_MIN_MAX_ZOOM) {\r\n return\r\n }\r\n }\r\n\r\n model.updateAttribute('scaleRange', { min, max })\r\n chartModel.updateAttribute('dateRange', null)\r\n this.recountScale()\r\n }\r\n\r\n onScalerMouseUp = () => {\r\n this.scalerLastY = null\r\n\r\n document.removeEventListener('mousemove', this.onScalerMouseMove)\r\n document.removeEventListener('mouseup', this.onScalerMouseUp)\r\n document.removeEventListener('touchmove', this.onScalerTouchMove)\r\n document.removeEventListener('touchend', this.onScalerTouchEnd)\r\n this.props.setActiveChartInteraction(null)\r\n }\r\n\r\n onScalerReset = () => {\r\n const { model, chartModel } = this.props\r\n if (!this.chartLayoutModel.scrollable) return\r\n chartModel.updateAttribute('dateRange', null)\r\n model.updateAttribute('scaleRange', null)\r\n this.recountScale()\r\n }\r\n\r\n addToLeftOffset = (n: number) => {\r\n const quote = this.props.chartModel.quote()\r\n const barWidth = getBarWidthWithMargin({\r\n chartLayout: this.chartLayoutModel,\r\n zoomFactor: this.props.chartModel.zoomFactor,\r\n })\r\n const leftOffset = getMinMaxLeftOffset({\r\n newLeftOffset: this.props.chartModel.leftOffset + n,\r\n chartModel: this.props.chartModel,\r\n barWidth,\r\n barIndex: quote.barIndex[quote.open.length - 1],\r\n })\r\n\r\n if (leftOffset > barWidth) {\r\n quote.fetchOlderData()\r\n }\r\n this.props.chartModel.updateAttributes({\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n }\r\n\r\n onDoubleClick = (event: HammerInput) => {\r\n event.preventDefault()\r\n const area = this.getArea(event)\r\n const element = this.props.model.selection || this.getElement(area)\r\n if (element && element.type !== IndicatorType.Cot && !element.isCreator) {\r\n setTimeout(() => {\r\n this.props.openElementStyleDialog!(element)\r\n }, 0)\r\n element.trigger('dblclick', event)\r\n }\r\n }\r\n\r\n onPress = (e: ObjectHash) => {\r\n if (e.pointerType !== 'touch') return\r\n\r\n e.clientX = e.center.x\r\n e.clientY = e.center.y\r\n\r\n const el = this.props.model.selection || this.getElement(this.getArea(e))\r\n if (!this.chartLayoutModel.isTouchCrossActive) {\r\n if (!el) {\r\n this.onCanvasPress(e as React.MouseEvent)\r\n } else {\r\n this.onContextMenu(e as React.MouseEvent, el)\r\n }\r\n }\r\n }\r\n\r\n onContextMenu = (e: React.MouseEvent, element?: IndicatorElement | CanvasElement) => {\r\n e.preventDefault()\r\n const area = this.getArea(e)\r\n const elementInArea = this.getElement(area)\r\n const el = element ?? elementInArea\r\n if (!el || el.thumbsAreInArea(area)) {\r\n return\r\n }\r\n const elementModel = ElementModel.findByAttribute('instance', el)\r\n if (!elementModel) return\r\n const hasProperties =\r\n ['indicator', 'canvas'].some((type) => el.type.startsWith(type)) && el.type !== IndicatorType.Cot\r\n const isElementDrawing = elementModel.isDrawing()\r\n\r\n const onContextMenuFullyOpen = () => {\r\n this.setSelectedElement(el)\r\n if (el instanceof CanvasElement) {\r\n el.setIsEditInProgress(true)\r\n }\r\n }\r\n\r\n const onContextMenuClose = () => {\r\n if (el instanceof CanvasElement) {\r\n el.setIsEditInProgress(false)\r\n }\r\n }\r\n\r\n return ContextMenu.show(\r\n e,\r\n [\r\n hasProperties && {\r\n id: 'edit',\r\n label: 'Edit style',\r\n onClick: () => this.props.openElementStyleDialog!(el),\r\n },\r\n\r\n !(elementModel.isChart() || elementModel?.isIndicator()) && {\r\n id: 'clone',\r\n label: 'Clone',\r\n onClick: () => elementModel.makeClone(),\r\n },\r\n\r\n ...(isElementDrawing\r\n ? [\r\n { type: 'divider', label: 'Visibility' },\r\n\r\n {\r\n id: 'visibility-current-and-above',\r\n label: 'Current interval and above',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndAbove),\r\n },\r\n\r\n {\r\n id: 'visibility-current-and-below',\r\n label: 'Current interval and below',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndBelow),\r\n },\r\n\r\n {\r\n id: 'visibility-current-only',\r\n label: 'Current interval only',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentOnly),\r\n },\r\n\r\n {\r\n id: 'visibility-all-intervals',\r\n label: 'All intervals',\r\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.all),\r\n },\r\n ]\r\n : []),\r\n\r\n (isElementDrawing || hasProperties) && { type: 'divider' },\r\n\r\n {\r\n id: 'bring-to-front',\r\n label: 'Bring to Front',\r\n onClick: () => elementModel.bringToFront(),\r\n },\r\n {\r\n id: 'send-to-back',\r\n label: 'Send to Back',\r\n onClick: () => elementModel.sendToBack(),\r\n },\r\n {\r\n id: 'bring-forward',\r\n label: 'Bring Forward',\r\n onClick: () => elementModel.bringForward(),\r\n },\r\n {\r\n id: 'send-backward',\r\n label: 'Send Backward',\r\n onClick: () => elementModel.sendBackward(),\r\n },\r\n\r\n { type: 'divider' },\r\n\r\n {\r\n id: 'remove',\r\n label: 'Remove',\r\n onClick: () => {\r\n if (elementModel.isIndicator()) {\r\n handleRemoveIndicatorPane({ paneIndex: this.props.paneIndex, chartLayoutModel: this.chartLayoutModel })\r\n } else {\r\n elementModel.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\r\n this.props.model.normalizeZIndexes()\r\n }\r\n },\r\n },\r\n ]\r\n .filter(Boolean)\r\n .map((item) => ({ ...item, gtag: { element_type: el.type } })),\r\n { onFullyOpen: onContextMenuFullyOpen, onBeforeItemClick: onContextMenuClose, onFullyClosed: onContextMenuClose }\r\n )\r\n }\r\n\r\n immediateRecountScaleOnChartIndicatorChange = (element?: ElementModel) => {\r\n if (element?.isChart() || element?.isIndicator()) {\r\n this.recountScale()\r\n }\r\n }\r\n\r\n recountScale = (_?: unknown, updateType?: Spine.Event) => {\r\n const { model } = this.props\r\n const chartModel = model.chart()\r\n if (updateType === 'destroy' || !chartModel || !chartModel.quote()) {\r\n return\r\n }\r\n\r\n recountScale({ chartModel, paneModel: model })\r\n\r\n if (this.canvasCtx) {\r\n this.renderAll()\r\n }\r\n }\r\n\r\n onBlur = () => {\r\n if (this.props.model.selection?.getIsCreator?.()) {\r\n this.setSelection(null)\r\n } else {\r\n this.setSelectedElement(null)\r\n }\r\n if (this.hoveredElement) {\r\n this.hoveredElement.setIsHovered(false)\r\n this.hoveredElement = null\r\n }\r\n this.props.model.getAllElements().forEach((element) => {\r\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n }\r\n\r\n renderAll = (type?: string) => {\r\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = true\r\n\r\n if (type === 'cross' && this.chartLayoutModel.cross) {\r\n if (this.crossRafId === null) {\r\n const crossRafId = window.requestAnimationFrame(() => {\r\n this.renderCross()\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: crossRafId, isInProgress: false })\r\n }\r\n })\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: crossRafId, isInProgress: true })\r\n }\r\n this.crossRafId = crossRafId\r\n }\r\n } else if (this.rafId == null && this.canvasCtx) {\r\n const rafId = window.requestAnimationFrame(() => {\r\n this._renderAll()\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: rafId, isInProgress: false })\r\n }\r\n })\r\n if (process.env.IS_E2E_TESTING) {\r\n toggleE2eRenderInProgress({ id: rafId, isInProgress: true })\r\n }\r\n this.rafId = rafId\r\n }\r\n }\r\n\r\n _renderAll = () => {\r\n const { model } = this.props\r\n // _renderAll may be called after Chart was deleted because of requestAnimationFrame\r\n if (model.chart() === null || this.canvasRef.current === null || !this.canvasCtx) {\r\n return\r\n }\r\n if (this.getIsUpdatedDesign()) {\r\n if (this.crossRafId === null) {\r\n this.crossRafId = window.requestAnimationFrame(this.renderCross)\r\n }\r\n }\r\n this.rafId = undefined\r\n\r\n renderPane({\r\n chartLayoutModel: this.chartLayoutModel,\r\n chartModel: this.props.chartModel,\r\n paneModel: model,\r\n canvasCtx: this.canvasCtx,\r\n })\r\n }\r\n\r\n getIsUpdatedDesign() {\r\n const { specificChartFunctionality } = this.chartLayoutModel\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto = isRedesignedPage({ specificChartFunctionality })\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n renderCross = () => {\r\n const { model } = this.props\r\n const isMouseInPane = MouseModel.getShouldRenderCrossInPane(model)\r\n this.crossRafId = null\r\n if (!this.crossCanvasCtx) {\r\n return\r\n }\r\n this.crossCanvasCtx.clearRect(0, 0, this.props.chartModel.width, model.height)\r\n const isCrossDisabled =\r\n PaneModel.select((p) => !!p.selection && !p.selection.type.startsWith('indicators/')).length !== 0 ||\r\n this.props.chartModel.getIsDisabled() ||\r\n !isMouseInPane\r\n\r\n for (const { instance: elementInstance } of model.getAllElements()) {\r\n if (\r\n (!isCrossDisabled && elementInstance.renderCross != null) ||\r\n (isCrossDisabled && elementInstance.renderCrossText != null)\r\n ) {\r\n this.crossCanvasCtx.save()\r\n if (isCrossDisabled) {\r\n elementInstance.renderCrossText!(this.crossCanvasCtx, Number.NaN)\r\n } else {\r\n elementInstance.renderCross!(this.crossCanvasCtx)\r\n }\r\n this.crossCanvasCtx.restore()\r\n }\r\n }\r\n }\r\n\r\n getArea = (e: ObjectHash, additionalData?: T): PaneArea => {\r\n const { model } = this.props\r\n const clientX = e.clientX || additionalData?.clientX\r\n const clientY = e.clientY || additionalData?.clientY\r\n const Settings = getSettings(model)\r\n const areaRectangle = this.canvas!.getBoundingClientRect()\r\n const areaRectangleCursorX = clientX - areaRectangle.left\r\n const areaRectangleCursorY = clientY - areaRectangle.top\r\n const x = areaRectangleCursorX - model.chart().leftOffset - Settings.left.width\r\n const y = areaRectangleCursorY - Settings.top.height\r\n const scale = model.scale\r\n const chartLeftX = areaRectangle.left + Settings.left.width\r\n const chartRightX = areaRectangle.right - Settings.right.width\r\n return {\r\n ...(additionalData as T),\r\n // TODO: rewrite if canvas uses padding/border\r\n x: scale.x.invert(x),\r\n y: scale.y.invert(y),\r\n scaled: {\r\n x,\r\n y,\r\n },\r\n width: 1,\r\n height: 1,\r\n cursorX: areaRectangleCursorX,\r\n cursorY: areaRectangleCursorY,\r\n isCursorInChartWidthBoundaries: clientX > chartLeftX && clientX < chartRightX,\r\n }\r\n }\r\n\r\n setCanvasSize = ({ width, height }: { width: number; height: number }) => {\r\n const ratio = Utils.getScaleRatio()\r\n const canvasElement = this.canvasRef.current\r\n\r\n /**\r\n * It seems that value passed into element attr (e.g. height) is ceiled down,\r\n * so if you provide canvas element with height 100.5 we'll get integer 100 from canvasElement.height\r\n * If the difference in values between \"new height\" and canvasElement.height is less than 1, I treat it as the same value\r\n */\r\n if (\r\n this.canvasCtx &&\r\n canvasElement &&\r\n (Math.abs(height * ratio - canvasElement.height) >= 1 || Math.abs(width * ratio - canvasElement.width) >= 1)\r\n ) {\r\n Utils.setSizeOnCanvasElement({ canvasElement, width, height })\r\n this.canvasCtx.scale(ratio, ratio)\r\n if (this.chartLayoutModel.cross && this.crossCanvasCtx) {\r\n Utils.setSizeOnCanvasElement({\r\n canvasElement: this.crossCanvasRef.current,\r\n width,\r\n height,\r\n })\r\n this.crossCanvasCtx.scale(ratio, ratio)\r\n }\r\n setTimeout(() => {\r\n this.recountScale()\r\n })\r\n }\r\n }\r\n\r\n onClick = (event: HammerInput) => {\r\n const area = this.getArea(event, {\r\n clientX: event.center.x,\r\n clientY: event.center.y,\r\n })\r\n const element = this.props.model.selection || this.getElement(area)\r\n element?.trigger('click', area)\r\n\r\n if (!this.isDisableTouchCrossAvailable) {\r\n this.isDisableTouchCrossAvailable = true\r\n return\r\n }\r\n\r\n if (this.chartLayoutModel.isTouchCrossActive) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n this.chartLayoutModel.updateAttributes({\r\n scrollable: this.chartLayoutModel.initialScrollable,\r\n isTouchCrossActive: false,\r\n })\r\n } else if (\r\n this.isMobile &&\r\n !this.state.hasSeenCrossNotification &&\r\n this.lastActiveTool === DrawingTool.Mouse &&\r\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.smallIndex\r\n ) {\r\n const isChartsPage = this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n\r\n this.setState({ hasSeenCrossNotification: true })\r\n this.props.notificationContext.show(\r\n {\r\n this.props.notificationContext.hide()\r\n window.localStorage.setItem('hasSeenCrossNotification', 'true')\r\n }}\r\n theme=\"dark\"\r\n >\r\n Got it\r\n \r\n }\r\n >\r\n Long press the chart to show the crosshair.\r\n ,\r\n { inline: !isChartsPage }\r\n )\r\n }\r\n\r\n this.lastActiveTool = this.props.activeTool\r\n }\r\n\r\n onPaneMouseLeave = () => {\r\n // timout in onPaneMouseMove may cause racecondition where active class is added right after it's been removed\r\n setTimeout(() => {\r\n this.zoomControlsRef.current?.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n })\r\n if (this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n this.renderCross()\r\n }\r\n }\r\n\r\n onPaneMouseMove = (e: React.MouseEvent | React.Touch, isMouseDownIgnored = false) => {\r\n const { model, chartModel } = this.props\r\n const zoomControls = this.zoomControlsRef.current\r\n const paneHeight = model.height\r\n if (zoomControls) {\r\n const area = this.getArea<{ mouseDown: boolean; clientX: number; clientY: number }>(e, {\r\n mouseDown: !isMouseDownIgnored && this.mouseDown,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n })\r\n\r\n // timeout is needed here as adding a classname on parent element of a button where we are listening on a click is not working properly if done synchrnousely\r\n setTimeout(() => {\r\n // 103 is the destance between pane bottom and zoom-controls top\r\n // zoomer bottom (8 px) + zoomer height (20px) - 13px + zoom controls height (75px) = 90px\r\n const isInArea = model.height - 90 <= area.cursorY && paneHeight > 210\r\n\r\n if (\r\n isInArea &&\r\n !zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS) &&\r\n !chartModel.getIsDisabled()\r\n ) {\r\n zoomControls.classList.add(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n } else if (!isInArea && zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS)) {\r\n zoomControls.classList.remove(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\r\n }\r\n\r\n if (!area.mouseDown && !model.selection && isInArea && !chartModel.getIsDisabled()) {\r\n if (!zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\r\n zoomControls.classList.add(ZOOM_CONTROLS_ACTIVE_CLASS)\r\n }\r\n } else if (zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\r\n zoomControls.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS)\r\n }\r\n })\r\n }\r\n }\r\n\r\n onMouseLeave = () => {\r\n this.mouseDown = false\r\n }\r\n\r\n onTouchStart = (e: React.TouchEvent) => {\r\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\r\n const touchEvent = e.targetTouches[0]\r\n if (this.chartLayoutModel.scrollable) {\r\n this.onCanvasInteractionStart(touchEvent)\r\n } else if (this.chartLayoutModel.isTouchCrossActive) {\r\n this.lastClientX = touchEvent.clientX\r\n this.lastClientY = touchEvent.clientY\r\n if (!MouseModel.pane()?.eql(this.props.model)) {\r\n const area = this.getArea(touchEvent, {\r\n mouseDown: this.mouseDown,\r\n clientX: touchEvent.clientX,\r\n clientY: touchEvent.clientY,\r\n })\r\n this.setMousePosition(this.getMousePositionInBoundaries(area))\r\n this.isDisableTouchCrossAvailable = false\r\n }\r\n } else {\r\n const area = this.getArea(touchEvent, { isTouch: true }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\r\n const element = this.getElement(area)\r\n if (element?.getIsChartEvent?.() && this.props.activeTool === DrawingTool.Mouse) {\r\n const chartEventElement = element as ChartEvent\r\n chartEventElement.toggleIsOpen()\r\n }\r\n }\r\n this.onPaneMouseMove(touchEvent, true)\r\n }\r\n }\r\n\r\n onTouchMove = (e: TouchEvent) => {\r\n if (!this.props.touchEventsDisabled) {\r\n if (!this.getIsHammerAllowScrollActive()) {\r\n e.preventDefault()\r\n }\r\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\r\n this.onCanvasInteractionMove(e.targetTouches[0])\r\n }\r\n }\r\n }\r\n\r\n onTouchEnd = (e: React.TouchEvent) => {\r\n if (!this.props.touchEventsDisabled && this.chartLayoutModel.scrollable) {\r\n this.onCanvasInteractionEnd(e)\r\n }\r\n }\r\n\r\n onCanvasPress = (e: React.MouseEvent) => {\r\n if (this.chartLayoutModel.scrollable) {\r\n this.chartLayoutModel.updateAttribute('scrollable', false)\r\n document.removeEventListener('touchmove', this.onMouseMoveOnScrolling)\r\n }\r\n if (!this.chartLayoutModel.isTouchCrossActive) {\r\n this.chartLayoutModel.updateAttribute('isTouchCrossActive', true)\r\n this.onCanvasInteractionMove(e)\r\n }\r\n }\r\n\r\n onCanvasInteractionStart = (e: React.Touch | React.MouseEvent) => {\r\n const { activeTool, activeChartInteraction, chartModel, model } = this.props\r\n const isTouch = typeof Touch !== 'undefined' && e instanceof Touch\r\n this.lastActiveTool = activeTool\r\n\r\n if (isPrimaryClick(e) && !activeChartInteraction && !chartModel.getIsDisabled()) {\r\n const area = this.getArea(e, { isTouch }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\r\n const element = this.getElement(area)\r\n\r\n // if user click outside of drawable area but still inside canvas creator would hang unfinised,\r\n // it that case we want to cancel element creation, same as we do on click outside of canvas / onBlur\r\n if (model.selection?.isCreator && !area.isCursorInChartWidthBoundaries && element !== model.selection) {\r\n model.getAllElements().forEach((element) => {\r\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\r\n element.destroyCascade()\r\n }\r\n })\r\n }\r\n if (this.chartLayoutModel.scrollable) {\r\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'grabbing' })\r\n if (model.scaleRange) {\r\n this.currentViewRange = model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\r\n }\r\n document.addEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\r\n document.addEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\r\n }\r\n if (element?.getIsChartEvent?.() && activeTool === DrawingTool.Mouse) {\r\n this.setSelectedElement(null)\r\n const chartEventElement = element as ChartEvent\r\n chartEventElement.toggleIsOpen()\r\n } else if (\r\n activeTool === DrawingTool.Mouse ||\r\n model.getAllElements().some(({ instance }) => instance.isCreator)\r\n ) {\r\n element?.trigger('mousedown', area)\r\n this.setSelectedElement(element)\r\n }\r\n model.trigger('mousedown', model, area, element)\r\n this.mouseDown = true\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n this.lastClientX = e.clientX\r\n this.lastClientY = e.clientY\r\n }\r\n\r\n onCanvasInteractionMove = (e: React.MouseEvent | React.Touch) => {\r\n const area = this.getArea(e, {\r\n mouseDown: this.mouseDown,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n })\r\n if (!area.isCursorInChartWidthBoundaries) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n return\r\n }\r\n\r\n const { model } = this.props\r\n const hoveredElement = this.getElement(area)\r\n const element = model.selection || hoveredElement\r\n\r\n if (!(this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) {\r\n this.isDisableTouchCrossAvailable = true\r\n this.setMousePosition(\r\n this.lastClientX && this.lastClientY && this.chartLayoutModel.isTouchCrossActive && MouseModel.position\r\n ? this.getMousePositionInBoundaries({\r\n x: MouseModel.position.x + (model.scale.x.invert(area.clientX) - model.scale.x.invert(this.lastClientX)),\r\n y: MouseModel.position.y + (model.scale.y.invert(area.clientY) - model.scale.y.invert(this.lastClientY)),\r\n })\r\n : { x: area.x, y: area.y }\r\n )\r\n }\r\n\r\n if (!this.chartLayoutModel.scrollable) {\r\n this.lastClientX = area.clientX\r\n this.lastClientY = area.clientY\r\n }\r\n\r\n element?.trigger('mousemove', area)\r\n if (\r\n this.mouseDown &&\r\n model.selection instanceof CanvasElement &&\r\n !model.selection.activeThumb &&\r\n !this.chartLayoutModel.activeChartEvent\r\n ) {\r\n if (!model.selection.getIsCreator?.()) {\r\n model.selection.moveBy(area.x - this.lastX, area.y - this.lastY)\r\n }\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n this.renderAll()\r\n }\r\n const isElementHovered =\r\n this.props.activeTool === DrawingTool.Mouse &&\r\n ((element && element === hoveredElement) || hoveredElement instanceof CanvasElement)\r\n\r\n if (hoveredElement !== this.hoveredElement && this.hoveredElement instanceof CanvasElement) {\r\n this.hoveredElement.setIsHovered(false)\r\n this.hoveredElement = null\r\n }\r\n\r\n if (isElementHovered && hoveredElement instanceof CanvasElement) {\r\n if (!hoveredElement.isHovered && !hoveredElement.isSelected) {\r\n hoveredElement.setIsHovered(true)\r\n this.hoveredElement = hoveredElement\r\n }\r\n }\r\n\r\n if (isElementHovered !== this.isElementHovered && this.canvas && hoveredElement?.type !== IndicatorType.Cot) {\r\n this.canvas.className = isElementHovered ? 'hover' : ''\r\n if (this.chartLayoutModel.cross && this.crossCanvas) {\r\n this.crossCanvas.className = `second${isElementHovered ? ' hover' : ''}`\r\n }\r\n this.isElementHovered = isElementHovered\r\n }\r\n }\r\n\r\n onCanvasInteractionEnd = (event: TouchEvent | MouseEvent | React.TouchEvent) => {\r\n if (MouseModel.position) {\r\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'crosshair' })\r\n } else {\r\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'default' })\r\n }\r\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\r\n this.mouseDown = false\r\n const area = this.getArea(event)\r\n const element = this.props.model.selection || this.getElement(area)\r\n element?.trigger('mouseup', area)\r\n document.removeEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\r\n document.removeEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\r\n }\r\n\r\n getMousePositionInBoundaries = ({ x, y }: { x: number; y: number }) => {\r\n const { model } = this.props\r\n const Settings = getSettings(model)\r\n const canvasAreaRectangle = this.canvas!.getBoundingClientRect()\r\n const chartLeft = model.scale.x.invert(-model.chart().leftOffset + 1)\r\n const chartRight = model.scale.x.invert(\r\n canvasAreaRectangle.width - Settings.right.width - Settings.left.width - model.chart().leftOffset - 1\r\n )\r\n const chartTop = model.scale.y.invert(0)\r\n const chartBottom = model.scale.y.invert(canvasAreaRectangle.height - Settings.bottom.height - Settings.top.height)\r\n\r\n return {\r\n x: getValueInRange({\r\n value: x,\r\n min: chartLeft,\r\n max: chartRight,\r\n }),\r\n y: getValueInRange({\r\n value: y,\r\n min: chartBottom,\r\n max: chartTop,\r\n }),\r\n }\r\n }\r\n\r\n setMousePosition = ({ x, y }: { x: number; y: number }) => {\r\n const isSameMouseModel = !!MouseModel.pane()?.eql(this.props.model)\r\n MouseModel.updateAttributes({\r\n position: { x, y },\r\n ...(isSameMouseModel ? {} : { pane: this.props.model }),\r\n })\r\n }\r\n\r\n setSelection = (selection: IndicatorElement | CanvasElement | null) => {\r\n if (selection instanceof CanvasElement) {\r\n selection?.setIsSelected(true)\r\n }\r\n\r\n this.props.model.updateAttribute('selection', selection)\r\n }\r\n\r\n setSelectedElement = (element: IndicatorElement | CanvasElement | null) => {\r\n const { selection } = this.props.model\r\n const isSelectionCanvas = selection instanceof CanvasElement\r\n if (element !== selection || (isSelectionCanvas && element && !selection?.isSelected)) {\r\n if (isSelectionCanvas) {\r\n selection?.setIsSelected(false)\r\n }\r\n if (isSelectionCanvas && selection?.isCreator) {\r\n this.setSelection(null)\r\n } else {\r\n this.setSelection(element)\r\n }\r\n }\r\n }\r\n\r\n getElement = (area: PaneArea) => {\r\n const chartEvents = this.props.model.getAllChartEvents(false)\r\n\r\n for (let i = chartEvents.length - 1; i >= 0; i--) {\r\n const el = chartEvents[i].instance\r\n if (el.getIsInChartView(this.props.chartModel) && el.isInArea(area)) {\r\n return el\r\n }\r\n }\r\n\r\n const elements = this.props.model.getAllElements()\r\n\r\n for (let i = elements.length - 1; i >= 0; i--) {\r\n const el = elements[i].instance\r\n if (el.getIsInChartView(this.props.chartModel) && el.isInArea(area)) {\r\n return el\r\n }\r\n }\r\n return null\r\n }\r\n\r\n getCanvasDOMNode = () =>\r\n // This is used in app/modals/publish/publish.jsx\r\n this.canvasRef.current\r\n}\r\n\r\nexport default withNotificationContext(withElementStyleDialogState(withPaneModel(Pane)))\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport PaneModel from '../../models/pane'\r\n\r\nexport function withPaneModel

(Component: React.ComponentType

) {\r\n return function WrappedComponent(props: P) {\r\n const model = useModelState(props.model, { watchProperties: ['selection'] })\r\n\r\n return \r\n }\r\n}\r\n","import { Spinner } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nexport function ChartSpinnerOverlay({ shouldDisplay, className }: { shouldDisplay: boolean; className: string }) {\r\n const [isVisible, setIsVisible] = React.useState(shouldDisplay)\r\n React.useEffect(() => {\r\n let timeout: number\r\n if (!shouldDisplay) {\r\n timeout = window.setTimeout(() => {\r\n setIsVisible(false)\r\n }, 400)\r\n }\r\n return () => {\r\n clearTimeout(timeout)\r\n }\r\n }, [shouldDisplay])\r\n\r\n return (\r\n <>\r\n {isVisible && (\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { RootChartConfigObjectChart } from '../../../types/shared'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { DrawingTool } from '../toolbar/interfaces'\r\n\r\nexport const CHART_CLASS_NAMES = 'chart flex-1 relative'\r\nexport const DEFAULT_WRAPPER_COMPONENT = 'div'\r\n\r\nexport interface ChartProps {\r\n chartIndex: number\r\n gridArea?: string\r\n WrapperComp?: React.ForwardRefRenderFunction\r\n config: RootChartConfigObjectChart\r\n chartModel: ChartModel\r\n layoutModel: ChartLayout\r\n setActiveChartInteraction: (interaction: string | null) => void\r\n activeChartInteraction: string | null\r\n activeTool: DrawingTool\r\n touchEventsDisabled: boolean\r\n hasOutline?: boolean\r\n shouldResize?: boolean\r\n renderChartToolbar?: () => React.ReactNode\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { ChartEditorEnum, SpecificChartFunctionality } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport ChartModel from '../../models/chart'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport MouseModel from '../../models/mouse'\r\nimport PaneModel from '../../models/pane'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport utils, { isRedesignEnabled } from '../../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../../utils/chart'\r\nimport { ChartControls } from '../chart-controls'\r\nimport Pane from '../pane'\r\nimport {\r\n getBarIndex,\r\n getIsSmallIndexChart,\r\n getLeftOffset,\r\n getMinMaxLeftOffset,\r\n updateZoomAndLeftOffsetByDateRange,\r\n} from '../renderUtils'\r\nimport { ChartProps } from './constants'\r\nimport { withChartInit } from './with-chart-init'\r\nimport { withWatchedPanesOnChartModel } from './with-watched-panes-on-chart-model'\r\n\r\nfunction preventDefaultFunc(event: Event) {\r\n event.preventDefault()\r\n}\r\n\r\nfunction getZoomFactor({\r\n chartLayout,\r\n currentZoomFactor,\r\n diff,\r\n minBarWidthInPx = 1,\r\n maxBarWidthInPx = 66,\r\n}: {\r\n chartLayout: ChartLayout\r\n currentZoomFactor: number\r\n diff: number\r\n minBarWidthInPx?: number\r\n maxBarWidthInPx?: number\r\n}) {\r\n const minZoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth: minBarWidthInPx,\r\n numOfVisibleBars: 1,\r\n })\r\n const maxZoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth: maxBarWidthInPx,\r\n numOfVisibleBars: 1,\r\n })\r\n const isNegativeDirection = diff < 0\r\n const newZoomFactor = currentZoomFactor + diff\r\n const newZoomFactorInRange = Math.min(Math.max(minZoomFactor, newZoomFactor), maxZoomFactor)\r\n\r\n if (newZoomFactor > newZoomFactorInRange && currentZoomFactor > newZoomFactorInRange) {\r\n return isNegativeDirection ? newZoomFactor : currentZoomFactor\r\n }\r\n\r\n if (newZoomFactor < newZoomFactorInRange && currentZoomFactor < newZoomFactorInRange) {\r\n return !isNegativeDirection ? newZoomFactor : currentZoomFactor\r\n }\r\n\r\n return newZoomFactorInRange\r\n}\r\n\r\ninterface ChartState {\r\n panesWrapperElement: HTMLDivElement | null\r\n}\r\n\r\nclass Chart extends React.Component {\r\n lastWidth: number\r\n mouseWheelTimeout?: number\r\n setStateWithPanesTimeout?: number\r\n lastHeight = 0\r\n lastY: number | null = null\r\n lastX: number | null = null\r\n resizerPaneIndex = -1\r\n minimalPaneHeight = 0\r\n zoomerRightAlign: {\r\n barIndex?: number\r\n index: number\r\n offsetDiff: number\r\n } | null = null\r\n\r\n // expects model, config, layoutModel\r\n constructor(props: ChartProps) {\r\n super(props)\r\n\r\n this.lastWidth = props.chartModel.width\r\n this.props.layoutModel.bind('change', this.onLayoutModelChange)\r\n this.state = { panesWrapperElement: null }\r\n }\r\n\r\n componentDidMount() {\r\n const { chartModel } = this.props\r\n this.lastWidth = this.props.layoutModel.width\r\n\r\n chartModel.trigger('change', chartModel)\r\n chartModel.bind('createPane', this.onPaneCreate)\r\n\r\n this.calculateMinimalPaneHeight()\r\n this.handleQuoteChange(chartModel.quote()!)\r\n this.onModelChange()\r\n\r\n chartModel.bind('update', this.onModelChange)\r\n chartModel.bind('destroy', () => {\r\n Quote.unbind('olderData', this.onOlderDataLoaded)\r\n Quote.unbind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\r\n })\r\n\r\n Quote.bind('olderData', this.onOlderDataLoaded)\r\n Quote.bind(`${QuoteFetchType.Refetch} ${QuoteFetchType.NewerData}`, this.onDataLoaded)\r\n }\r\n\r\n componentDidUpdate(prevProps: Readonly, prevState: Readonly) {\r\n if (\r\n prevState.panesWrapperElement !== this.state.panesWrapperElement ||\r\n prevProps.layoutModel.isWheelZoomEnabled !== this.props.layoutModel.isWheelZoomEnabled\r\n ) {\r\n prevState.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\r\n\r\n if (this.props.layoutModel.isWheelZoomEnabled) {\r\n // can't use onWheel as it has passive: true\r\n this.state.panesWrapperElement?.addEventListener('wheel', preventDefaultFunc, { passive: false })\r\n }\r\n }\r\n }\r\n\r\n componentWillUnmount() {\r\n const { chartModel, layoutModel } = this.props\r\n if (this.setStateWithPanesTimeout) {\r\n clearTimeout(this.setStateWithPanesTimeout)\r\n }\r\n layoutModel.unbind('change', this.onLayoutModelChange)\r\n chartModel.unbind('update', this.onModelChange)\r\n\r\n this.state.panesWrapperElement?.removeEventListener('wheel', preventDefaultFunc)\r\n }\r\n\r\n handleSetPanesWrapperRef = (panesWrapperElement: HTMLDivElement | null) => {\r\n this.setState({ panesWrapperElement })\r\n }\r\n\r\n render() {\r\n const { activeTool, chartIndex, layoutModel, chartModel, renderChartToolbar } = this.props\r\n const isChartPage = layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const panes =\r\n layoutModel.specificChartFunctionality === SpecificChartFunctionality.futuresPage\r\n ? chartModel.getAllValidPanes()\r\n : chartModel.getAllPanes()\r\n const showSettings = layoutModel.editors.includes(ChartEditorEnum.settings)\r\n const showTimeframe = showSettings || layoutModel.editors.includes(ChartEditorEnum.timeframe)\r\n\r\n return (\r\n <>\r\n this.onClick(undefined) : undefined}\r\n data-testid={`chart-${chartIndex}-settings`}\r\n onMouseEnter={this.resetMouseModel}\r\n >\r\n {showTimeframe && }\r\n \r\n {layoutModel.editable && showSettings && renderChartToolbar && (\r\n \r\n {renderChartToolbar()}\r\n \r\n )}\r\n \r\n {panes.map((pane, index) => (\r\n \r\n ))}\r\n \r\n \r\n )\r\n }\r\n\r\n onMouseWheel = (e: React.WheelEvent) => {\r\n const { chartModel, layoutModel } = this.props\r\n const isLoading = chartModel.panes().count() < 1\r\n if (!layoutModel.isWheelZoomEnabled || isLoading) {\r\n return\r\n }\r\n if (!this.zoomerRightAlign) {\r\n this.calcZoomerRightAlign()\r\n }\r\n clearTimeout(this.mouseWheelTimeout)\r\n this.mouseWheelTimeout = window.setTimeout(() => {\r\n this.zoomerRightAlign = null\r\n }, 250)\r\n this.onZoomerMouseMove(e, undefined, true)\r\n }\r\n\r\n onClick = (activePane: PaneModel | undefined) => {\r\n if (\r\n !this.props.layoutModel.activeChart.eql(this.props.chartModel) ||\r\n !(this.props.layoutModel.activePane?.eql(activePane) || this.props.layoutModel.activePane === activePane)\r\n ) {\r\n this.props.layoutModel.updateAttributes({ activeChart: this.props.chartModel, activePane })\r\n }\r\n }\r\n\r\n onPaneCreate = () => {\r\n const { chartModel } = this.props\r\n this.onModelChange()\r\n this.calculateMinimalPaneHeight()\r\n chartModel.trigger('change', chartModel)\r\n }\r\n\r\n onPaneDestroy = (paneId: string) => {\r\n const { chartModel } = this.props\r\n const pane = chartModel.panes().find(paneId)\r\n\r\n if (pane) {\r\n pane.destroyCascade()\r\n this.onModelChange()\r\n chartModel.trigger('change', chartModel)\r\n }\r\n }\r\n\r\n onModelChange = (chartModelParam?: ChartModel) => {\r\n const { chartModel, config } = this.props\r\n const panes = chartModel.getAllPanes()\r\n const quote = chartModel.quote()\r\n\r\n if (panes.length === 0 || !quote || chartModel.leftOffset === undefined) {\r\n return\r\n }\r\n\r\n const { width, height } = chartModel\r\n let panesHeight = panes.reduce((sum, pane) => sum + (pane.height ?? 0), 0)\r\n if (panesHeight !== height) {\r\n panesHeight = panes.reduce((sum, pane) => {\r\n const newPaneHeight = Math.round((pane.height / panesHeight) * height)\r\n if (!Number.isNaN(newPaneHeight)) {\r\n pane.updateAttribute('height', newPaneHeight)\r\n }\r\n return sum + newPaneHeight\r\n }, 0)\r\n const chartPane = chartModel.getChartPane()\r\n if (chartPane && panesHeight !== height) {\r\n const newChartPaneHeight = chartPane.height + height - panesHeight\r\n if (!Number.isNaN(newChartPaneHeight)) {\r\n chartPane.updateAttribute('height', newChartPaneHeight)\r\n }\r\n }\r\n }\r\n\r\n const newLeftOffset = getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: config,\r\n })\r\n const newIsScrolled = chartModel.leftOffset !== newLeftOffset\r\n const isScrolled = chartModel.isScrolled\r\n if (!isScrolled && this.lastWidth !== width) {\r\n this.lastWidth = width\r\n chartModel.updateAttribute('leftOffset', newLeftOffset)\r\n } else if (isScrolled !== newIsScrolled) {\r\n chartModel.updateAttributes({ isScrolled: newIsScrolled })\r\n }\r\n\r\n if (this.lastHeight !== height) {\r\n this.lastHeight = height\r\n this.calculateMinimalPaneHeight()\r\n }\r\n\r\n if (chartModelParam) {\r\n this.handleQuoteChange(chartModelParam.quote())\r\n }\r\n }\r\n\r\n onLayoutModelChange = ({ activeChart, activePane }: { activeChart: ChartModel; activePane: PaneModel }) => {\r\n const { chartModel } = this.props\r\n if (!activeChart) {\r\n return\r\n }\r\n for (const pane of chartModel.getAllPanes()) {\r\n if (activePane?.id !== pane.id && pane.selection?.isSelected === true) {\r\n pane.selection.setIsSelected(false)\r\n pane.updateAttribute('selection', undefined)\r\n }\r\n }\r\n }\r\n\r\n onResizerMouseDown = (e: React.MouseEvent | MouseEvent, model: PaneModel) => {\r\n if (e.button !== 0) {\r\n return\r\n }\r\n this.lastY = e.clientY\r\n this.resizerPaneIndex = this.props.chartModel\r\n .panes()\r\n .all()\r\n .findIndex((pane) => pane.eql(model))\r\n document.addEventListener('mousemove', this.onResizerMouseMove)\r\n document.addEventListener('mouseup', this.onResizerMouseUp)\r\n }\r\n\r\n onResizerMouseMove = (e: MouseEvent) => {\r\n if (this.resizerPaneIndex > 0 && this.lastY !== null && this.resizePanesAccordingly(this.lastY! - e.clientY)) {\r\n this.lastY = e.clientY\r\n }\r\n }\r\n\r\n onResizerMouseUp = (e: MouseEvent) => {\r\n const { chartModel } = this.props\r\n if (this.resizerPaneIndex > 0 && this.lastY !== null) {\r\n this.resizePanesAccordingly(this.lastY - e.clientY)\r\n this.lastY = null\r\n\r\n chartModel.trigger('change', chartModel)\r\n }\r\n\r\n document.removeEventListener('mousemove', this.onResizerMouseMove)\r\n document.removeEventListener('mouseup', this.onResizerMouseUp)\r\n }\r\n\r\n calculateMinimalPaneHeight() {\r\n const { chartModel } = this.props\r\n const { minHeight, total } = chartModel\r\n .panes()\r\n .all()\r\n .reduce(\r\n ({ minHeight, total }, pane) => {\r\n if (minHeight > pane.height) {\r\n minHeight = pane.height\r\n }\r\n total += pane.getIsChartPane() ? 3 : 1\r\n return { minHeight, total }\r\n },\r\n { minHeight: chartModel.height, total: 0 }\r\n )\r\n const optiMinHeight = Math.floor(chartModel.height / total)\r\n this.minimalPaneHeight = Math.min(minHeight, optiMinHeight)\r\n }\r\n\r\n resizePanesAccordingly(difY: number) {\r\n const { chartModel } = this.props\r\n const panes = chartModel.panes().all()\r\n let basePane = this.resizerPaneIndex\r\n if (!difY) {\r\n return true\r\n } else if (difY > 0) {\r\n let i = basePane\r\n let pane = panes[i]\r\n if (pane.height + difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height + difY)\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n for (--i; i >= 0; i--) {\r\n pane = panes[i]\r\n if (pane.height - difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height - difY)\r\n break\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n }\r\n } else if (difY < 0) {\r\n basePane = Math.max(0, basePane - 1)\r\n let i = basePane\r\n let pane = panes[i]\r\n if (pane.height - difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height - difY)\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n for (++i; i < panes.length; i++) {\r\n pane = panes[i]\r\n if (pane.height + difY >= this.minimalPaneHeight) {\r\n pane.updateAttribute('height', pane.height + difY)\r\n break\r\n } else {\r\n pane.updateAttribute('height', this.minimalPaneHeight)\r\n }\r\n }\r\n }\r\n\r\n const panesHeight = panes.reduce((sum, pane) => sum + pane.height, 0)\r\n if (panesHeight !== chartModel.height) {\r\n difY = chartModel.height - panesHeight\r\n\r\n const pane = panes[basePane]\r\n pane.updateAttribute('height', pane.height + difY)\r\n\r\n // if we exceeded total height we need to stop updating lastY - return false\r\n return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n onZoomerTouchStart = (e: React.TouchEvent | TouchEvent) => {\r\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1 || this.props.touchEventsDisabled) {\r\n return\r\n }\r\n this.onZoomerMouseDown(e.targetTouches[0])\r\n }\r\n\r\n onZoomerTouchMove = (e: TouchEvent) => {\r\n if (!this.props.layoutModel.scrollable || e.touches.length !== 1) {\r\n return\r\n }\r\n this.onZoomerMouseMove(e.targetTouches[0])\r\n }\r\n\r\n onZoomerTouchEnd = () => {\r\n if (!this.props.layoutModel.scrollable) {\r\n return\r\n }\r\n this.onZoomerMouseUp()\r\n }\r\n\r\n getRawDistance = (e: Pick) => {\r\n const p1 = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n const p2 = { x: e.touches[1].clientX, y: e.touches[1].clientY }\r\n return math.distance(p1, p2)\r\n }\r\n\r\n onPinchStart = (e: React.TouchEvent) => {\r\n const { chartModel } = this.props\r\n const { activeChartInteraction, setActiveChartInteraction, touchEventsDisabled } = this.props\r\n const isLoading = chartModel.panes().count() < 1\r\n\r\n if (\r\n this.props.layoutModel.scrollable &&\r\n e.touches.length === 2 &&\r\n !activeChartInteraction &&\r\n !isLoading &&\r\n !touchEventsDisabled\r\n ) {\r\n setActiveChartInteraction('pinch')\r\n this.onZoomerMouseDown({ clientX: this.getRawDistance(e as unknown as TouchEvent) })\r\n\r\n document.addEventListener('touchmove', this.onPinchMove)\r\n document.addEventListener('touchend', this.onPinchEnd)\r\n }\r\n }\r\n\r\n onPinchMove = (e: TouchEvent) => {\r\n if (e.touches.length === 2) {\r\n this.onZoomerMouseMove({ clientX: this.getRawDistance(e) })\r\n }\r\n }\r\n\r\n onPinchEnd = (e: TouchEvent) => {\r\n if (e.touches.length === 1) {\r\n this.onZoomerMouseUp()\r\n document.removeEventListener('touchmove', this.onPinchMove)\r\n document.removeEventListener('touchend', this.onPinchEnd)\r\n }\r\n }\r\n\r\n calcZoomerRightAlign = () => {\r\n const { chartModel } = this.props\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const quote = chartModel.quote()\r\n const fx = chartModel.panes().first().scale.x\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: this.props.layoutModel })\r\n const currentLeftOffset = getLeftOffset({ quote, chartModel, config: this.props.config, barWidth })\r\n this.zoomerRightAlign = null\r\n\r\n if (quote.isIntraday && quote.instrument === Instrument.Stock) {\r\n const barIndex = quote.getBarIndex(quote.close.length - 1)\r\n let offsetDiff =\r\n chartModel.leftOffset -\r\n getLeftOffset({\r\n quote,\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex,\r\n shouldAlignDaysToLeftApplied: false,\r\n })\r\n const offsetBars = ~~(offsetDiff / barWidth)\r\n offsetDiff -= offsetBars * barWidth\r\n this.zoomerRightAlign = {\r\n barIndex,\r\n index: barIndex - offsetBars,\r\n offsetDiff,\r\n }\r\n } else if (chartModel.leftOffset <= currentLeftOffset) {\r\n this.zoomerRightAlign = {\r\n index: quote.getBarIndex(quote.open.length - 1),\r\n offsetDiff: chartModel.leftOffset - currentLeftOffset,\r\n }\r\n } else {\r\n const offset = chartModel.leftOffset\r\n for (let i = 0; i < quote.open.length; i += 1) {\r\n const x = fx(i)\r\n if (x + offset < 0) {\r\n continue\r\n }\r\n if (x + offset > chartModel.width - ChartSettings.left.width - ChartSettings.right.width) {\r\n const barIndex = quote.getBarIndex(i - 1)\r\n let offsetDiff =\r\n offset -\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex,\r\n })\r\n const offsetBars = ~~(offsetDiff / barWidth)\r\n offsetDiff -= offsetBars * barWidth\r\n this.zoomerRightAlign = {\r\n barIndex,\r\n index: barIndex - offsetBars,\r\n offsetDiff,\r\n }\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n onZoomerMouseDown = (e: Partial) => {\r\n if ((e.button !== 0 && 'button' in e) || !this.props.layoutModel.scrollable) {\r\n return\r\n }\r\n switch (this.props.activeChartInteraction) {\r\n case 'pinch':\r\n break\r\n case null:\r\n this.props.setActiveChartInteraction('zoomer')\r\n break\r\n default:\r\n return\r\n }\r\n\r\n this.lastX = e.clientX ?? null\r\n this.calcZoomerRightAlign()\r\n\r\n document.addEventListener('mousemove', this.onZoomerMouseMove)\r\n document.addEventListener('mouseup', this.onZoomerMouseUp)\r\n document.addEventListener('touchmove', this.onZoomerTouchMove)\r\n document.addEventListener('touchend', this.onZoomerTouchEnd)\r\n }\r\n\r\n normalizeWheelDeltaY = (e: WheelEvent) => {\r\n // because wheel deltaY on mouse and touchpad is quite different we need to normalize it\r\n const abs = Math.abs(e.deltaY)\r\n if (abs === 0) return 0\r\n return Math.log(abs) * Math.sign(e.deltaY) * 10\r\n }\r\n\r\n onZoomerMouseMove = (\r\n e: React.WheelEvent | MouseEvent | Touch | { clientX: number },\r\n _?: unknown,\r\n isMouseWheel = false\r\n ) => {\r\n const { chartModel, layoutModel } = this.props\r\n let difX\r\n if (!layoutModel.scrollable) return\r\n if (!isMouseWheel && this.lastX !== null) {\r\n difX = (this.lastX - e.clientX) / chartModel.width\r\n this.lastX = e.clientX\r\n } else {\r\n // standard difX calculation result is around 0.00x, wheel deltaY is whole px\r\n // because of that we divide px with 1000\r\n difX = this.normalizeWheelDeltaY(e as WheelEvent) / 1000\r\n }\r\n\r\n this.addToZoomFactor({ diff: -difX })\r\n }\r\n\r\n addToZoomFactor = ({\r\n diff,\r\n shouldCalculateRightAlign = false,\r\n }: {\r\n diff: number\r\n shouldCalculateRightAlign?: boolean\r\n }) => {\r\n const { chartModel, layoutModel } = this.props\r\n if (shouldCalculateRightAlign) {\r\n this.calcZoomerRightAlign()\r\n }\r\n // 6 is default bar width with margin on charts page, so to get the similar feeling when zooming we're multiplying the zoom factor by the coefficient\r\n const diffCoefficient = chartModel.zoomFactor * (6 / getBarWidthWithMargin({ chartLayout: this.props.layoutModel }))\r\n const zoomFactor = getZoomFactor({\r\n chartLayout: layoutModel,\r\n currentZoomFactor: chartModel.zoomFactor,\r\n diff: diff * diffCoefficient,\r\n })\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: this.props.layoutModel,\r\n })\r\n\r\n let leftOffset\r\n if (this.props.config.stretch) {\r\n leftOffset = 0\r\n } else if (getIsSmallIndexChart(this.props.layoutModel.specificChartFunctionality)) {\r\n leftOffset = barWidth\r\n } else if (this.zoomerRightAlign) {\r\n leftOffset = getMinMaxLeftOffset({\r\n newLeftOffset:\r\n getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n barIndex: this.zoomerRightAlign.index,\r\n shouldAlignDaysToLeftApplied: false,\r\n }) + this.zoomerRightAlign.offsetDiff,\r\n chartModel: chartModel,\r\n barWidth,\r\n barIndex: getBarIndex(chartModel.quote()),\r\n })\r\n } else {\r\n return\r\n }\r\n chartModel.updateAttributes({\r\n zoomFactor,\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n if (shouldCalculateRightAlign) {\r\n this.zoomerRightAlign = null\r\n }\r\n }\r\n\r\n onZoomerMouseUp = () => {\r\n this.zoomerRightAlign = null\r\n document.removeEventListener('mousemove', this.onZoomerMouseMove)\r\n document.removeEventListener('mouseup', this.onZoomerMouseUp)\r\n document.removeEventListener('touchmove', this.onZoomerTouchMove)\r\n document.removeEventListener('touchend', this.onZoomerTouchEnd)\r\n this.props.setActiveChartInteraction(null)\r\n }\r\n\r\n onZoomerReset = () => {\r\n const { chartModel, layoutModel } = this.props\r\n const zoomFactor = chartModel.chart_layout().defaultZoomFactor\r\n const barWidth = getBarWidthWithMargin({ zoomFactor, chartLayout: layoutModel })\r\n const leftOffset = getLeftOffset({\r\n quote: chartModel.quote(),\r\n chartModel,\r\n config: this.props.config,\r\n barWidth,\r\n })\r\n\r\n chartModel.updateAttributes({\r\n zoomFactor,\r\n leftOffset,\r\n dateRange: null,\r\n })\r\n }\r\n\r\n onOlderDataLoaded = () => {\r\n throw new Error('onOlderDataLoaded not implemented')\r\n // TODO implement similarly to onDataLoaded\r\n }\r\n\r\n resetMouseModel = () => {\r\n const isLoading = this.props.chartModel.panes().count() < 1\r\n if (!isLoading) {\r\n MouseModel.updateAttributes({\r\n position: null,\r\n pane: null,\r\n })\r\n }\r\n }\r\n\r\n handleQuoteChange = (quote: Quote) => {\r\n const { chartModel } = this.props\r\n\r\n // Update only date range chart\r\n if (chartModel.dateRange) {\r\n if (!quote.eql(chartModel.quote()) || chartModel.timeframe !== quote.timeframe || quote.date.length === 0) {\r\n return\r\n }\r\n updateZoomAndLeftOffsetByDateRange({ chartModel, quote })\r\n }\r\n }\r\n\r\n onDataLoaded = (newQuote: Quote, fetchType: QuoteFetchType) => {\r\n const { chartModel } = this.props\r\n const quote = chartModel.quote()\r\n if (!quote?.eql(newQuote)) {\r\n return\r\n }\r\n\r\n const shouldForceLeftOffsetUpdate = fetchType === QuoteFetchType.Refetch\r\n let newLeftOffset = chartModel.leftOffset // TODO find proper fix. If this line is removed (if we don't trigger leftOffset update), the chart stops being updated for the user until they move chart around.\r\n if (\r\n (this.props.layoutModel.scrollable === false && !this.props.layoutModel.isTouchCrossActive) ||\r\n !chartModel.isScrolled ||\r\n shouldForceLeftOffsetUpdate\r\n ) {\r\n newLeftOffset = getLeftOffset({\r\n quote,\r\n chartModel: chartModel,\r\n config: this.props.config,\r\n })\r\n }\r\n\r\n chartModel.setChartEvents(quote.chartEvents, !quote.events)\r\n\r\n if (newLeftOffset !== chartModel.leftOffset) {\r\n chartModel.getAllElements().forEach((element) => {\r\n if (element.isDrawing() && !element.isMouseDown()) {\r\n element.instance.updateScales()\r\n }\r\n })\r\n }\r\n\r\n chartModel.updateAttribute('leftOffset', newLeftOffset)\r\n\r\n this.handleQuoteChange(quote)\r\n }\r\n}\r\n\r\nexport default withChartInit(withWatchedPanesOnChartModel(Chart))\r\n","import classNames from 'classnames'\r\nimport merge from 'lodash.merge'\r\nimport React from 'react'\r\n\r\nimport { ObjectHash } from '../../../types/shared'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Quote from '../../models/quote'\r\nimport { getChartsDimensions, isRedesignEnabled } from '../../utils'\r\nimport { getQuoteFinancialAttachmentsFromChartConfig, prefetchPerfIndicatorAllQuotes } from '../../utils/chart'\r\nimport { getLeftOffset } from '../renderUtils'\r\nimport { ChartSpinnerOverlay } from './chart-spinner-overlay'\r\nimport { CHART_CLASS_NAMES, ChartProps, DEFAULT_WRAPPER_COMPONENT } from './constants'\r\n\r\nexport function withChartInit(Component: React.ComponentType) {\r\n return function WrappedComponent(props: ChartProps) {\r\n const { WrapperComp = DEFAULT_WRAPPER_COMPONENT, gridArea } = props\r\n const isModelDestroyedRef = React.useRef(null)\r\n const model = useModelState(props.chartModel, { watchProperties: ['panes', 'quote'] })\r\n const layoutModel = useModelState(props.layoutModel, { watchProperties: ['activeChart'] })\r\n const quote = model.quote()\r\n\r\n const initChartRef = React.useRef(async () => {\r\n const { chartModel, config } = props\r\n const { premarket, hasChartEvents, aftermarket, ticker, instrument, timeframe, panes: panesConfig } = config\r\n const options = {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns: panesConfig.some((pane) =>\r\n pane.elements?.some((element) =>\r\n element.overlays?.some((overlay: ObjectHash) => overlay.type === 'overlays/patterns')\r\n )\r\n ),\r\n }\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options: {\r\n ...options,\r\n financialAttachments: getQuoteFinancialAttachmentsFromChartConfig(config),\r\n },\r\n })\r\n const panesWithPerfIndicator = panesConfig.filter(({ elements }) =>\r\n elements.some(({ type }) => type === 'indicators/perf')\r\n )\r\n\r\n if (panesWithPerfIndicator) {\r\n await Promise.allSettled(\r\n panesWithPerfIndicator.map((paneWithPerfIndicator) =>\r\n prefetchPerfIndicatorAllQuotes({ paneWithPerfIndicator, timeframe, options })\r\n )\r\n )\r\n }\r\n\r\n if (isModelDestroyedRef.current) {\r\n return\r\n }\r\n\r\n config.panes.forEach((pane) => {\r\n const paneProperties = merge({}, pane)\r\n paneProperties.chart = chartModel\r\n chartModel.createPaneCascade(paneProperties)\r\n })\r\n\r\n chartModel.updateAttributes({\r\n quote,\r\n premarket: options.premarket,\r\n aftermarket: options.aftermarket,\r\n })\r\n\r\n chartModel.setChartEvents(quote.chartEvents, true)\r\n\r\n if (props.shouldResize) {\r\n const chartsDimensions = getChartsDimensions(props.layoutModel.getHTMLElementId())\r\n props.layoutModel.updateAttributes(chartsDimensions)\r\n }\r\n\r\n if (chartModel.leftOffset == null) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chartModel, config: props.config })\r\n chartModel.updateAttribute('leftOffset', leftOffset)\r\n }\r\n })\r\n\r\n React.useEffect(() => {\r\n // This prevents the being re-called on hotreload\r\n if (isModelDestroyedRef.current !== null) {\r\n return\r\n }\r\n\r\n isModelDestroyedRef.current = false\r\n\r\n const handleModelBeforeDestroy = () => {\r\n isModelDestroyedRef.current = true\r\n }\r\n\r\n model.bind('beforeDestroy', handleModelBeforeDestroy)\r\n initChartRef.current()\r\n return () => {\r\n model.unbind('beforeDestroy', handleModelBeforeDestroy)\r\n }\r\n // We want to run it only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(props.layoutModel.specificChartFunctionality)\r\n const isChartPage = props.layoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isFuturesForexCryptoPage = [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(props.layoutModel.specificChartFunctionality)\r\n const isModelReady =\r\n quote && ((quote.fetchedAt === undefined && quote.close.length > 0) || quote.fetchedAt > 0 || quote)\r\n const loadingStyle =\r\n !isModelReady && isQuoteOrQuoteFinancials\r\n ? // 2px is border\r\n { width: model.width ? model.width + 2 : '100%', height: model.height + 2 }\r\n : undefined\r\n\r\n return (\r\n \r\n {isChartPage && (\r\n \r\n )}\r\n {isModelReady && }\r\n \r\n )\r\n }\r\n}\r\n","import React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartModel from '../../models/chart'\r\n\r\nexport function withWatchedPanesOnChartModel

(Component: React.ComponentType

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

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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

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

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

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

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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

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

\r\n

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

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

{idea.note}

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

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

\r\n
\r\n\r\n
\r\n {\r\n setIsConfirmDelete(false)\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n onDeleteIdeaClick.current(idea)\r\n }}\r\n >\r\n Delete\r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Badge, Tab, TabList, TabPanel, Tabs } from '@finviz/website'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { getInstrument } from '../../utils/chart'\r\nimport fetchApi from '../../utils/fetch_api'\r\nimport IdeaItem from './IdeaItem'\r\nimport { IIdea, IIdeaCategory, categorizeIdeas } from './utils'\r\n\r\nexport default function IdeasTabs() {\r\n const [hasError, setHasError] = React.useState(false)\r\n const [hasFetched, setHasFetched] = React.useState(false)\r\n const [categorizedIdeas, setCategorizedIdeas] = React.useState([])\r\n const [params] = useSearchParams()\r\n const queryTickers = params.get('t')!.split(',') // there always be some t param defined\r\n\r\n React.useEffect(() => {\r\n async function fetchIdeas() {\r\n window.gtag?.('event', 'load', { event_category: 'ideas' })\r\n try {\r\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\r\n const ideas = data.ideas.map((idea: IIdea) => {\r\n const dateParts = idea.date.split(' ')\r\n return {\r\n ...idea,\r\n instrument: getInstrument(idea.ticker),\r\n date: dateParts[0].replace('-', ' ').replace('-', ', '),\r\n time: dateParts[1],\r\n }\r\n })\r\n\r\n setCategorizedIdeas(categorizeIdeas(ideas, queryTickers))\r\n setHasFetched(true)\r\n } catch {\r\n setHasError(true)\r\n }\r\n }\r\n\r\n fetchIdeas()\r\n\r\n // run only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleIdeaDeleted = (idea: IIdea) => {\r\n setCategorizedIdeas((prev) => {\r\n const modifiedCategories = [...prev]\r\n\r\n // remove from specific ticker category\r\n const categoryIndex = modifiedCategories.findIndex((c) => c.ticker === idea.ticker)\r\n if (categoryIndex >= 0) {\r\n const updatedCategory = {\r\n ...modifiedCategories[categoryIndex],\r\n ideas: modifiedCategories[categoryIndex].ideas.filter((i) => i.id !== idea.id),\r\n }\r\n modifiedCategories[categoryIndex] = updatedCategory\r\n }\r\n\r\n // remove from all\r\n const updatedAll = {\r\n ...modifiedCategories[0],\r\n ideas: modifiedCategories[0].ideas.filter((i) => i.id !== idea.id),\r\n }\r\n modifiedCategories[0] = updatedAll\r\n\r\n // remove empty categories\r\n return modifiedCategories.filter((c) => c.ideas.length !== 0)\r\n })\r\n }\r\n\r\n if (!hasFetched || hasError) {\r\n return (\r\n
\r\n {hasError ? 'Unexpected error occurred, please refresh the page.' : 'Loading…'}\r\n
\r\n )\r\n }\r\n\r\n if (categorizedIdeas.length === 0) {\r\n return (\r\n \r\n No saved ideas.\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {categorizedIdeas.map((category) => (\r\n {category.ideas.length}}>\r\n {category.ticker}\r\n \r\n ))}\r\n \r\n {categorizedIdeas.map((category) => (\r\n \r\n
\r\n {category.ideas.map((idea) => (\r\n \r\n ))}\r\n
\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '@finviz/website'\r\n\r\nimport IdeasTabs from './IdeasTabs'\r\n\r\ntype IdeasDialogProps = {\r\n state: DialogStateReturn\r\n}\r\n\r\nexport default function IdeasDialog({ state }: IdeasDialogProps) {\r\n return (\r\n \r\n Your Ideas\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ButtonProps,\r\n Dropdown,\r\n DropdownItem,\r\n Spinner,\r\n Tooltip,\r\n TooltipTrigger,\r\n useDialogState,\r\n useTooltipState,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport IdeasDialog from '../../modals/ideas/Ideas'\r\nimport { saveIdea } from '../../modals/ideas/utils'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\nimport { getIsMobileScreenSize } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\ninterface IdeaDropdownProps {\r\n model: ChartLayout\r\n rounding?: 'none' | 'regular'\r\n theme?: ButtonProps['theme']\r\n size?: ButtonProps['size']\r\n dropdownButtonClassName?: string\r\n}\r\n\r\nexport function IdeasDropdown({\r\n model,\r\n rounding,\r\n dropdownButtonClassName,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const tooltipState = useTooltipState({ placement: 'right-start' })\r\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\r\n const ref = React.useRef(null)\r\n const dialog = useDialogState()\r\n const hideTooltip = tooltipState.hide\r\n\r\n const dropdownItemProps = isAnyQuoteLoading\r\n ? ({\r\n as: TooltipTrigger,\r\n state: tooltipState,\r\n } as ButtonComponentProps)\r\n : ({} as ButtonComponentProps)\r\n\r\n React.useEffect(() => {\r\n const checkIfAnyQuoteIsLoading = () => {\r\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\r\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\r\n }\r\n\r\n Quote.bind('change', checkIfAnyQuoteIsLoading)\r\n return () => {\r\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (!isAnyQuoteLoading) hideTooltip()\r\n }, [isAnyQuoteLoading, hideTooltip])\r\n\r\n if (!window.FinvizSettings.hasUserPremium) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n }\r\n >\r\n {\r\n if (isAnyQuoteLoading) {\r\n tooltipState.show()\r\n return\r\n }\r\n saveIdea(model)\r\n }}\r\n >\r\n Save idea\r\n \r\n dialog.show()}\r\n >\r\n Load idea\r\n \r\n \r\n \r\n {isAnyQuoteLoading && (\r\n \r\n
\r\n \r\n
\r\n \r\n Some data is still loading. Please wait.\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Button, ButtonComponentProps, Delayed, Icon, Spinner, useDialogState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface PublishProps extends Pick {\r\n model: ChartLayout\r\n}\r\n\r\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\r\n const dialog = useDialogState()\r\n const isDialogOpen = dialog.useState('open')\r\n const [publishModalModule, { isLoading }] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: isDialogOpen,\r\n errorSeverity: 'medium',\r\n onError: () => dialog.hide(),\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n\r\n return (\r\n <>\r\n dialog.show()}\r\n leftContent={\r\n isLoading ? (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n 'share'\r\n )\r\n }\r\n />\r\n {PublishDialog && }\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonSizeType,\r\n ButtonThemeType,\r\n Delayed,\r\n Icon,\r\n Spinner,\r\n TourDefinition,\r\n useTour,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\n\r\n// If we need to update / discontinue some tour we can use skip flag on legacy version to ensure that it won't reset users tour but won't include it in new tours\r\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\r\n return [\r\n {\r\n id: 'chart-tour',\r\n steps: [\r\n {\r\n title: 'Chart Tour',\r\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\r\n },\r\n ...(isPremium\r\n ? [\r\n {\r\n title: 'Scale the Timeline',\r\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\r\n },\r\n {\r\n title: 'Scale the Price Axis',\r\n body: 'Grab the Price Axis to zoom it in and out. Move the chart around freely in any direction when Price Axis has custom scale. Double-click the Price Axis to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\r\n },\r\n {\r\n title: 'Drawing tools & settings',\r\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\r\n target: '#toolbar',\r\n },\r\n {\r\n title: 'Fine-tune Drawings',\r\n body: 'Double-click on a chart drawing to tweak its color and style. Right-click on a drawing to access other options, such as changing its visibility, order, and more.',\r\n target: '[data-testid=\"chart-0-pane-0\"]',\r\n },\r\n ]\r\n : [\r\n {\r\n title: 'Enable Drawing mode',\r\n body: (\r\n <>\r\n \r\n Finviz*Elite\r\n {' '}\r\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\r\n chart.
\r\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\r\n \r\n ),\r\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\r\n placement: 'bottom-start',\r\n },\r\n ]),\r\n {\r\n title: 'Save your best Ideas',\r\n body: isPremium\r\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\r\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\r\n target: '[data-testid=\"chart-toolbar-ideas\"]',\r\n placement: 'bottom-start',\r\n },\r\n ...(page === SpecificChartFunctionality.quotePage\r\n ? []\r\n : [\r\n {\r\n title: 'Chart Layouts & Charts Sync',\r\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\r\n target: '[data-testid=\"chart-layout-layout\"]',\r\n },\r\n ]),\r\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\r\n ? []\r\n : [\r\n {\r\n title: 'Fullscreen mode',\r\n body:\r\n page === SpecificChartFunctionality.quotePage\r\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\r\n : 'Toggle the window to fill your entire screen.',\r\n target: '[data-testid=\"chart-layout-fullscreen\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ]),\r\n {\r\n title: 'Share chart',\r\n body: 'Share a chart together with your analysis and ideas.',\r\n target: '[data-testid=\"chart-toolbar-publish\"]',\r\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\r\n placement: 'bottom',\r\n },\r\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\r\n ? [\r\n {\r\n title: 'Theme',\r\n body: 'Switch between the Light and Dark theme.',\r\n target: '[data-testid=\"chart-layout-theme\"]',\r\n },\r\n ]\r\n : []),\r\n {\r\n title: 'Study Settings',\r\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\r\n target: '[data-testid=\"chart-settings-open-btn\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ],\r\n },\r\n page === SpecificChartFunctionality.chartPage && {\r\n id: 'sidebar-watchlist',\r\n steps: [\r\n {\r\n title: 'Explore Your Portfolios',\r\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\r\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\r\n placement: 'left-start',\r\n },\r\n ],\r\n },\r\n ].filter(Boolean) as TourDefinition[]\r\n}\r\n\r\ninterface TourButtonProps {\r\n page: SpecificChartFunctionality\r\n rounding?: 'none' | 'regular'\r\n size?: ButtonSizeType\r\n theme?: ButtonThemeType\r\n className?: string\r\n}\r\n\r\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\r\n const tour = useTour()\r\n const pageTours = getTour(page)\r\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\r\n const buttonTheme: ButtonThemeType = userTour.hasNewTours ? 'blue' : (theme ?? 'headerItem')\r\n\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n className={className}\r\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\r\n title=\"Explore new features\"\r\n onClick={async () => {\r\n if (userTour) {\r\n const activeTour = await tour.startTour(userTour.tour)\r\n activeTour?.once('inactive', () => {\r\n setCurrentTour(tour.getStepsForUser(pageTours))\r\n })\r\n }\r\n }}\r\n />\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { getChartStartEndDates } from '../controllers/renderUtils'\r\nimport Quote from '../models/quote'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange: string) {\r\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\r\n const parsedRange = getChartStartEndDates({ dateRange, quote })\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n\r\n let startQuoteDate: Date | null = null\r\n let endQuoteDate: Date | null = null\r\n let numOfDaysToRender: number | null = null\r\n\r\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const reversedDaysInQuote = [...daysInQuote].reverse()\r\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\r\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\r\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\r\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\r\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\r\n }\r\n\r\n return {\r\n start: parsedRange.start,\r\n end: parsedRange.end,\r\n startQuoteDate,\r\n endQuoteDate,\r\n numOfDaysToRender,\r\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\r\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\r\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { Instrument, ObjectHash } from '../../types/shared'\r\nimport type PerfChart from '../charts/perf_chart'\r\nimport {\r\n CHART_MARGIN,\r\n DateRangeType,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport ChartLayout from '../models/chart_layout'\r\nimport { IChartSettings, IIndicatorSettings, ISettings } from '../models/chart_settings/interfaces'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport Element from '../models/element'\r\nimport Pane, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport Utils from '../utils'\r\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\r\nimport {\r\n DATE_RANGE_PREFIX_DELMITER,\r\n getParsedDateRangeMetaData,\r\n parseCustomDateRangeUrlParam,\r\n} from '../utils/chart-date-range-utils'\r\n\r\ninterface VisibleBarNumberProps {\r\n start: Date | null\r\n end: Date\r\n quote: Quote\r\n dateRange: string\r\n}\r\n\r\ninterface ChartZoomAndLeftOffsetProps extends Omit {\r\n chartVisibleWidth: number\r\n numOfBarsToRender?: number\r\n chartModel: Chart\r\n}\r\n\r\ninterface ChartStartEndDatesProps {\r\n dateRange: string\r\n quote: Quote\r\n}\r\n\r\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\r\n const startInSec = start ? start.getTime() / 1000 : 0\r\n const endInSec = end.getTime() / 1000\r\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\r\n const lastQuoteDateIndex = quote.barIndex[quote.barIndex.length - 1]\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = quote.barIndex[index]\r\n }\r\n lastVisibleBarIndex = quote.barIndex[index]\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n canCropChart,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n canCropChart: boolean\r\n}) {\r\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\r\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\r\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\r\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n const chartWidthWithOffset = fullChartWidth - offsetInPx\r\n const shouldCropChart =\r\n canCropChart && hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\r\n\r\n return {\r\n fullChartWidth,\r\n offsetInPx: shouldCropChart ? offsetInPx : 0,\r\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\r\n offsetChartAfter,\r\n }\r\n}\r\n\r\nexport const getLeftOffset = ({\r\n quote,\r\n chartModel,\r\n config,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex = getBarIndex(quote),\r\n numberOfBarsToDraw,\r\n shouldAlignDaysToLeftApplied = true,\r\n}: GetLeftOffsetProps) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\r\n if (config?.stretch) {\r\n return 0\r\n }\r\n if (getIsSmallIndexChart(specificChartFunctionality)) {\r\n return barWidth\r\n }\r\n const fx = (index: number) => index * barWidth\r\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\r\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\r\n if (\r\n shouldAlignDaysToLeftApplied &&\r\n shouldAlignDaysToLeft({\r\n quote,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n dateRange: chartModel.dateRange,\r\n })\r\n ) {\r\n let drawDaysInOneChart = 1\r\n if (numberOfBarsToDraw) {\r\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\r\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\r\n drawDaysInOneChart = 5\r\n } else if (quote.interval === 15) {\r\n drawDaysInOneChart = 6\r\n } else if (quote.interval === 30) {\r\n drawDaysInOneChart = 12\r\n } else if (quote.interval === 60) {\r\n drawDaysInOneChart = 22\r\n } else if (quote.interval === 120) {\r\n drawDaysInOneChart = 39\r\n } else if (quote.interval === 240) {\r\n drawDaysInOneChart = 78\r\n } else if (quote.interval > 240) {\r\n drawDaysInOneChart = (quote.interval / 30) * 10\r\n }\r\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\r\n hasPremarket: quote.premarket,\r\n hasAftermarket: quote.aftermarket,\r\n barWidthWithMargin: barWidth,\r\n timeframeMinutes: quote.interval,\r\n maxWidth: chartModel.width,\r\n canCropChart: !chartModel.dateRange,\r\n })\r\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\r\n\r\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\r\n if (drawDaysWidth <= width + 1) {\r\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\r\n // Align start of day to left if we have enough space to show all bars in day\r\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n // Math.max(1, ~~num) is to mimic imlementation from getHalfBarWidth(),\r\n // we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n leftOffset = Math.round(-fx(barsToOffset) + Math.max(1, ~~(barWidth / 2))) - offsetChartInPx\r\n }\r\n }\r\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\r\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n return leftOffset\r\n }\r\n return getMinMaxLeftOffset({\r\n newLeftOffset: leftOffset,\r\n chartModel,\r\n barWidth,\r\n barIndex,\r\n })\r\n}\r\n\r\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\r\n\r\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\r\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\ninterface ShouldAlignDaysToLeftProps {\r\n quote: Quote\r\n numberOfBarsToDraw?: number\r\n specificChartFunctionality: SpecificChartFunctionality\r\n dateRange: DateRangeType | null\r\n}\r\n\r\n/**\r\n * Evaluate if days should be aligned to the left\r\n * @param {object} object.quote - Quote model\r\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\r\n * @returns {boolean} boolean\r\n * */\r\nexport const shouldAlignDaysToLeft = ({\r\n quote,\r\n dateRange,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n}: ShouldAlignDaysToLeftProps) => {\r\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\r\n const isIntradayDateRange = !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isOffScreen = specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isOffScreenWithNoDateRange = isOffScreen && !dateRange\r\n const isOffScreenIntradayDateRange = isOffScreen && isIntradayDateRange\r\n const isOffScreenWithFixedBars = isOffScreen && numberOfBarsToDraw\r\n\r\n const isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificChartFunctionality)\r\n const isQuotePageWithNoDateRange = isQuoteOrQuoteFinancials && !dateRange\r\n const isQuotePageIntradayDateRange = isQuoteOrQuoteFinancials && isIntradayDateRange\r\n const isQuotePageWithFixedBars = isQuoteOrQuoteFinancials && numberOfBarsToDraw\r\n\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange = isChartPage && isIntradayDateRange\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return (\r\n isStockIntraday &&\r\n (isOffScreenWithNoDateRange ||\r\n isOffScreenIntradayDateRange ||\r\n isOffScreenWithFixedBars ||\r\n isQuotePageWithNoDateRange ||\r\n isQuotePageIntradayDateRange ||\r\n isQuotePageWithFixedBars ||\r\n isChartsInradayDateRange ||\r\n isChartPageWithFixedBars)\r\n )\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n const chartElement = chartModel.getChartElement()\r\n // PerfChart can be only imported as type because of circular dependency, that's why it's not possible to do instanceof check\r\n const isPerfChart = !!chartElement?.instance && 'getCompleteChartNumOfBars' in chartElement?.instance\r\n const perfChartInstance = isPerfChart ? (chartElement.instance as PerfChart) : null\r\n const numOfBars = perfChartInstance?.getCompleteChartNumOfBars() ?? chartModel.quote().close.length\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, numOfBars - 1)]) as ScaledFn\r\n } else {\r\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\r\n fx.invert = (x: number) => x / barWidthWithMargin\r\n fx.width = function (w) {\r\n return this.invert(w) - this.invert(0)\r\n }\r\n }\r\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\r\n\r\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\r\n let fy\r\n\r\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\r\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\r\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\r\n const minPx = currentScale(min)\r\n const domain = currentScale.domain()\r\n if (minPx > protectedHeightPx) {\r\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\r\n const extendedMin = tempScale.invert(contentHeight)\r\n currentScale.domain([domain[0], extendedMin])\r\n }\r\n }\r\n }\r\n\r\n switch (scaleType) {\r\n case ScaleType.Logarithmic:\r\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n handleDomainOffset(fy, d3.scaleSymlog)\r\n break\r\n default:\r\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n if (!paneModel.scaleRange) {\r\n fy = fy.nice(10)\r\n handleDomainOffset(fy, d3.scaleLinear)\r\n }\r\n break\r\n }\r\n fy.height = function (h: number) {\r\n return this.invert(h) - this.invert(0)\r\n }\r\n paneModel.updateAttribute('scale', {\r\n x: fx,\r\n y: fy,\r\n })\r\n\r\n if (isChart) {\r\n el.setupAxis!(fx as ScaleAxis)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n// general, only when blurry ends won't be visible or didn't matter\r\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\r\n\r\ninterface IXYOffsetFromLine {\r\n lineWidth: number\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\n// return x,y offsets for pixel perfect line rendering\r\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\r\n // don't add offset is lineWidth is even\r\n if (lineWidth % 2 === 0) {\r\n return { x: 0, y: 0 }\r\n }\r\n if (y1 === y2) {\r\n return { x: 0, y: 0.5 } // horizontal line\r\n } else if (x1 === x2) {\r\n return { x: 0.5, y: 0 } // vertical line\r\n } else {\r\n return { x: 0.5, y: 0.5 } // diagonal line\r\n }\r\n}\r\n\r\nexport const getRoundedObject = (obj: T): T => {\r\n const rounded = Object.entries(obj)\r\n for (let i = 0; i < rounded.length; i++) {\r\n rounded[i][1] = Math.round(rounded[i][1])\r\n }\r\n return Object.fromEntries(rounded) as T\r\n}\r\n\r\ninterface ITranslate {\r\n context: CanvasRenderingContext2D\r\n xOffset: number\r\n yOffset: number\r\n}\r\n\r\ninterface ITranslateObj {\r\n do: () => void\r\n undo: () => void\r\n}\r\n\r\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\r\n do: () => context.translate(xOffset, yOffset),\r\n undo: () => context.translate(xOffset * -1, yOffset * -1),\r\n})\r\n\r\ninterface IPercentageScaleValue {\r\n number: number\r\n base: number\r\n}\r\n\r\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\r\n\r\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\r\n\r\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\r\n chartModel: Chart\r\n quote: Quote\r\n}\r\n\r\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\r\n\r\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\r\n dateRange: chartModel.dateRange,\r\n quote,\r\n })\r\n\r\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n numOfBarsToRender,\r\n chartModel: chartModel,\r\n })\r\n\r\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\r\n chartModel.updateAttributes({ zoomFactor, leftOffset })\r\n }\r\n}\r\n\r\nexport function renderPane({\r\n chartLayoutModel,\r\n chartModel,\r\n paneModel,\r\n canvasCtx,\r\n shouldRenderCross = false,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n chartModel: Chart\r\n paneModel: Pane\r\n canvasCtx: CanvasRenderingContext2D\r\n shouldRenderCross?: boolean\r\n}) {\r\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\r\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\r\n } else {\r\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\r\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\r\n }\r\n const elements = paneModel.getAllElements()\r\n for (const { instance: elementInstance } of elements) {\r\n if (typeof elementInstance.renderGrid === 'function') {\r\n canvasCtx.save()\r\n elementInstance.renderGrid(canvasCtx)\r\n canvasCtx.restore()\r\n }\r\n }\r\n\r\n const chartEvents = paneModel.getAllChartEvents()\r\n const Settings = getSettings(paneModel)\r\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\r\n const isDrawing = elementInstance.getIsDrawing()\r\n const isChartEvent = elementInstance.getIsChartEvent()\r\n\r\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\r\n continue\r\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\r\n continue\r\n }\r\n\r\n canvasCtx.save()\r\n if (elementInstance.renderContent != null) {\r\n canvasCtx.save()\r\n clip({\r\n canvasCtx,\r\n width: chartModel.width,\r\n height: paneModel.height,\r\n Settings,\r\n })\r\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\r\n elementInstance.renderContent(canvasCtx)\r\n canvasCtx.restore()\r\n if (typeof elementInstance.renderLabels === 'function') {\r\n elementInstance.renderLabels(canvasCtx)\r\n }\r\n } else {\r\n elementInstance.render(canvasCtx)\r\n }\r\n if (\r\n shouldRenderCross &&\r\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\r\n isRedesignedPage(chartLayoutModel)) &&\r\n elementInstance.renderCross != null\r\n ) {\r\n elementInstance.renderCross(canvasCtx)\r\n }\r\n canvasCtx.restore()\r\n }\r\n}\r\n","export const DEFAULT_WIDTHS = {\r\n min: 200,\r\n max: 400,\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","import React from 'react'\r\n\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\r\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\r\n\r\nexport type SidebarContextType = {\r\n isOpen: boolean\r\n isCloseVisible: boolean\r\n direction: SidebarDirection\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n activeModule: SidebarModuleType | null\r\n close: () => void\r\n onResize: () => void\r\n selectModule: (module?: SidebarModule) => void\r\n}\r\n\r\nconst DEFAULT_CONTEXT: SidebarContextType = {\r\n activeModule: null,\r\n isOpen: false,\r\n isCloseVisible: false,\r\n direction: SidebarDirection.horizontal,\r\n width: DEFAULT_WIDTHS,\r\n close: () => {},\r\n onResize: () => {},\r\n selectModule: () => {},\r\n}\r\n\r\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\r\nexport const useSidebarContext = () => React.useContext(SidebarContext)\r\n","import { DefaultErrorBoundary } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\n\r\nexport function ModuleLoadFailed(props: Partial) {\r\n return (\r\n \r\n )\r\n}\r\n","export const portfolioWatchlistAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\r\n cacheKey: 'portfolio-watchlist',\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\r\nimport { withModuleAsyncLoad } from './with-module-async-load'\r\n\r\nexport enum SidebarModule {\r\n portfolio = 'portfolio',\r\n}\r\n\r\nexport type SidebarModuleType = {\r\n key: SidebarModule\r\n icon: IconNameType\r\n description: string\r\n content: React.ComponentType\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n}\r\n\r\nexport const sidebarModules: Record = Object.freeze({\r\n [SidebarModule.portfolio]: {\r\n key: SidebarModule.portfolio,\r\n icon: 'briefcase',\r\n description: 'Portfolio watchlist',\r\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\r\n width: { min: 200, default: { mobile: 275 } },\r\n },\r\n})\r\n","import { Delayed, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\r\nimport { ModuleLoadFailed } from './module-load-failed'\r\n\r\nexport function withModuleAsyncLoad<\r\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\r\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\r\n return function InnerFunction() {\r\n const [isComponentReady, setIsComponentReady] = React.useState(false)\r\n const [sidebarModule, { isError }] = useAsyncModule({\r\n ...asyncModule,\r\n isSuspenseMode: true,\r\n })\r\n\r\n const SidebarModule = sidebarModule?.default\r\n\r\n if (isError) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n {!isComponentReady && withInitialLoading && (\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n {!!SidebarModule && }\r\n \r\n )\r\n }\r\n}\r\n","import { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\nimport { sidebarModules } from './modules/modules'\r\n\r\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\r\n\r\ntype SidebarTabsProps = {\r\n className?: string\r\n}\r\n\r\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\r\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\r\n const tooltipState = useTooltipState({ placement: 'left', showTimeout: 300 })\r\n\r\n return (\r\n \r\n {/* reserved space for drawing button on mobile devices */}\r\n {direction === SidebarDirection.horizontal && (\r\n \r\n )}\r\n\r\n {Object.entries(sidebarModules).map(([key, value]) => {\r\n const isActive = activeModule?.key === key\r\n return (\r\n \r\n {\r\n selectModule(isActive ? undefined : value.key)\r\n }}\r\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\r\n data-testid={`sidebar-${key}-btn`}\r\n >\r\n \r\n \r\n }\r\n state={tooltipState}\r\n aria-label={value.description}\r\n isHideOnClick\r\n />\r\n\r\n \r\n {value.description}\r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { Resizable } from 're-resizable'\r\nimport React from 'react'\r\n\r\nimport Utils from '../../utils'\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\n\r\ntype SidebarContentProps = {\r\n children: React.ReactNode\r\n}\r\n\r\nexport default function SidebarContent({ children }: SidebarContentProps) {\r\n const { direction, onResize, close, width } = useSidebarContext()\r\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\r\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\r\n const defaultMobile = width?.default?.mobile ?? minWidth\r\n const defaultDesktop = width?.default?.desktop ?? maxWidth\r\n\r\n return (\r\n <>\r\n {direction === SidebarDirection.vertical && (\r\n \r\n {children}\r\n \r\n )}\r\n {direction === SidebarDirection.horizontal && (\r\n <>\r\n
\r\n
\r\n {children}\r\n
\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { Delayed, Spinner, localStorage } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate, useSearchParams } from 'react-router-dom'\r\n\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { SidebarDirection } from './constants'\r\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\r\nimport { ModuleLoadFailed } from './modules/module-load-failed'\r\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\r\nimport SidebarContent from './sidebar-content'\r\nimport SidebarTabs from './sidebar-tabs'\r\n\r\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\r\n\r\n// This is a temp function, to remove unused property from localstorage\r\nfunction removeSidebarFromLocalstorage() {\r\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\r\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\r\n}\r\nremoveSidebarFromLocalstorage()\r\n\r\ntype SidebarProps = {\r\n onShouldResize: () => void\r\n direction: SidebarDirection\r\n tabsClassName?: string\r\n}\r\n\r\n// Todo - this is not correct approach but this component can unmount/mount on mobile orientation change so we can't keep it inside the component\r\nlet isInit = false\r\n\r\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\r\n const navigate = useNavigate()\r\n const [urlSearchParams] = useSearchParams()\r\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\r\n const [activeModule, setActiveModule] = React.useState(null)\r\n\r\n const isOpen = !!activeModule\r\n const handleSelectModule = React.useCallback(\r\n (key?: SidebarModule) => {\r\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\r\n if (key) {\r\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\r\n } else {\r\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\r\n }\r\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\r\n },\r\n [urlSearchParams, navigate]\r\n )\r\n\r\n const handleCloseSidebar = React.useCallback(() => {\r\n handleSelectModule(undefined)\r\n }, [handleSelectModule])\r\n\r\n // Resize charts every time the sidebar is opened/closed or active module is changed\r\n React.useEffect(() => {\r\n onShouldResize()\r\n }, [activeModule, onShouldResize])\r\n\r\n // Set active module based on sidebarModuleKey\r\n React.useEffect(() => {\r\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\r\n\r\n if (!isInit && getIsMobilePortrait()) {\r\n sidebarModule = null\r\n handleCloseSidebar()\r\n }\r\n\r\n setActiveModule(sidebarModule)\r\n isInit = true\r\n }, [sidebarModuleKey, handleCloseSidebar])\r\n\r\n const contextValue: SidebarContextType = React.useMemo(\r\n () => ({\r\n direction,\r\n isOpen,\r\n isCloseVisible: direction === SidebarDirection.horizontal,\r\n width: activeModule?.width,\r\n activeModule,\r\n onResize: onShouldResize,\r\n close: handleCloseSidebar,\r\n selectModule: handleSelectModule,\r\n }),\r\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\r\n )\r\n\r\n return (\r\n \r\n {activeModule && (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n }\r\n >\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n
\r\n )\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\n\r\nexport enum DrawingTool {\r\n Arrow = 'arrow',\r\n Brush = 'brush',\r\n Callout = 'callout',\r\n Curve = 'curve',\r\n ElliottWaves = 'elliott-wave',\r\n Ellipse = 'ellipse',\r\n FibonacciRetracements = 'fibonacci-retracements',\r\n HorizontalLine = 'horizontal-line',\r\n Measure = 'measure',\r\n Mouse = 'mouse',\r\n Pitchfork = 'pitchfork',\r\n Polygon = 'polygon',\r\n Position = 'position',\r\n Rectangle = 'rectangle',\r\n RotatedRectangle = 'rotated-rectangle',\r\n ScaledLine = 'scaled-line',\r\n ScaledText = 'scaled-text',\r\n Triangle = 'triangle',\r\n VerticalLine = 'vertical-line',\r\n Xabcd = 'xabcd',\r\n}\r\n\r\nexport enum DrawingActions {\r\n AddNote = 'add-note',\r\n DeleteDrawings = 'delete-drawings',\r\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\r\n}\r\n\r\nexport enum DrawingSetting {\r\n PreserveDrawings = 'preserve-drawings',\r\n DrawingModeContinuous = 'drawing-mode-continuous',\r\n HideDrawings = 'hide-drawings',\r\n LockDrawings = 'lock-drawings',\r\n}\r\n\r\nexport interface IToolBarProps {\r\n chartLayoutModel: ChartLayout\r\n isSidebar?: boolean\r\n isHorizontal?: boolean\r\n isMobileOverlay?: boolean\r\n /**\r\n * Current selected tool id\r\n */\r\n activeTool: DrawingTool\r\n /**\r\n * On tool item select callback\r\n */\r\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\r\n /**\r\n * On drawing actions item select callback\r\n */\r\n onDrawingActionClick?: (actionId: DrawingActions) => void\r\n /**\r\n * On drawing settings item select callback\r\n */\r\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\r\n /**\r\n * On drawing end callback\r\n */\r\n onDrawingEnd?: () => void\r\n /**\r\n * Current state of drawing settings\r\n */\r\n drawingSettings: Record\r\n isAlternativeTheme?: boolean\r\n /**\r\n * Are tools disabled\r\n */\r\n areToolsDisabled?: boolean\r\n}\r\n\r\nexport interface IToolbarItemProperties {\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\r\n id: DrawingTool\r\n}\r\n\r\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\r\n id: DrawingActions\r\n}\r\n\r\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\r\n id: DrawingSetting\r\n}\r\n\r\nexport interface IToolbarDrawingToolItem {\r\n defaultItem: IToolbarDrawingTool\r\n toolGroup?: Array\r\n toolGroupTitle?: string\r\n}\r\n\r\nexport interface IToolbarDrawingActionItem {\r\n defaultItem: IToolbarDrawingAction\r\n isDisabled?: boolean\r\n disabledTooltip?: string\r\n}\r\n\r\nexport interface IToolbarDrawingsSettingItem {\r\n defaultItem: IToolbarDrawingSetting\r\n isDisabled?: boolean\r\n isInAction?: boolean\r\n disabledTooltip?: string\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport QuoteModel from '../models/quote'\r\n\r\nexport function getInstrumentLabel(instrument: Instrument) {\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return 'Stock'\r\n case Instrument.Futures:\r\n return 'Futures'\r\n case Instrument.Forex:\r\n return 'Forex'\r\n case Instrument.Crypto:\r\n return 'Crypto'\r\n case Instrument.MarketSentiment:\r\n return 'Market Sentiment'\r\n }\r\n}\r\n\r\nexport function getChartAlt(quoteModel: QuoteModel) {\r\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\r\n}\r\n\r\nexport const getResponseChartType = (chartType: ChartElementType) => {\r\n switch (chartType) {\r\n case ChartElementType.HeikinAshi:\r\n return 'heikinashi'\r\n case ChartElementType.HollowCandleStick:\r\n return 'hollowcandlestick'\r\n case ChartElementType.LineChart:\r\n return 'line'\r\n case ChartElementType.OhlcChart:\r\n return 'ohlc'\r\n case ChartElementType.CandleStick:\r\n default:\r\n return 'candlestick'\r\n }\r\n}\r\n\r\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\r\n chartResponseType === null\r\n ? null\r\n : Object.values(ChartElementType).find(\r\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\r\n )\r\n","import utils from '../utils'\r\n\r\nclass AverageTrueRange {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(high: number, low: number, prevClose: number) {\r\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n\r\n if (this.count < this.period) {\r\n this.sum += tr\r\n this.value = this.sum / (this.count + 1)\r\n if (this.count === this.period - 1) {\r\n this.sum /= this.period\r\n }\r\n } else {\r\n this.value = (this.value * (this.period - 1) + tr) / this.period\r\n }\r\n this.count++\r\n }\r\n}\r\n\r\nexport default AverageTrueRange\r\n","import { PaneArea } from '../../types/shared'\r\nimport Element, { DefaultAttrs } from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport type PaneModel from '../models/pane'\r\nimport Utils from '../utils'\r\nimport { ChartEventBadgeState } from '../utils/chart-events-utils'\r\n\r\nconst isMobile = Utils.isMobile()\r\n\r\ninterface ChartEventAttrs extends DefaultAttrs {\r\n x: number\r\n}\r\n\r\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\r\n if (chartEvent.isOpen) {\r\n return ChartEventBadgeState.selected\r\n }\r\n if (chartEvent.isHovered) {\r\n return ChartEventBadgeState.hover\r\n }\r\n return ChartEventBadgeState.default\r\n}\r\n\r\nclass ChartEvent extends Element {\r\n static type = ChartEventType.ChartEvent\r\n static label = 'ChartEvent'\r\n\r\n declare scaled: Pick\r\n\r\n declare chart: BaseChart\r\n\r\n declare model: PaneModel\r\n\r\n declare chartEventModel: ChartEventElement | undefined\r\n\r\n isOpen = false\r\n\r\n left = 0\r\n top = 0\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\r\n\r\n get type() {\r\n return (this.constructor as typeof ChartEvent).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof ChartEvent).label\r\n }\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n switch (this.type) {\r\n case ChartEventType.Dividends:\r\n return ChartEventBadgeType.Dividends\r\n case ChartEventType.Split:\r\n return ChartEventBadgeType.Split\r\n }\r\n\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n getChartEventModel(): ChartEventElement | undefined {\r\n if (!this.chartEventModel) {\r\n this.chartEventModel = this.model.chartEvents()?.findByAttribute('instance', this)\r\n }\r\n\r\n return this.chartEventModel\r\n }\r\n\r\n getXYPosition() {\r\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\r\n const chartEventModel = this.getChartEventModel()\r\n const { x } = this.scaled\r\n const roundedXY = getRoundedObject({ x })\r\n const y =\r\n (this.model as PaneModel).height -\r\n top.height -\r\n bottom.height -\r\n CHART_EVENT_BADGE_SIZE -\r\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\r\n\r\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\r\n }\r\n\r\n getIsVisible() {\r\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (!this.getIsVisible() || !this.chartEventModel) return\r\n\r\n this.attrs.x = Math.round(this.attrs.x)\r\n const chart = this.model.chart()\r\n const chartLayout = chart.chart_layout()\r\n const { x, y } = this.getXYPosition()\r\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\r\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\r\n return\r\n }\r\n const item = this.chartEventModel.getChartEventBadgeImage({\r\n theme: chartLayout.theme,\r\n state: getChartEventState(this),\r\n badgeType: this.getChartEvenBadgeType(),\r\n })\r\n\r\n if (!item) return\r\n\r\n const { left, top } = this.getChartLayoutSettings().ChartSettings\r\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\r\n this.top = y + top.height\r\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n if (!this.getIsVisible()) return\r\n\r\n this.isHovered = isHovered\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n // If isOpenOverride is undefined, the function works as toggle\r\n toggleIsOpen(isOpenOverride?: boolean) {\r\n const chartLayout = this.model.chart().chart_layout()\r\n const chartEventModel = this.getChartEventModel()\r\n\r\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\r\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\r\n this.isOpen = isOpen\r\n // Due to the fact that chart events logic depends heavily on hover state which isn't really present on touch devices\r\n // we need to mimic that state for touch devices, this enables chart event to be open, and counterpart in\r\n // chart-event-popover-with-state.tsx allow chart event to be closed on click outside\r\n if (isMobile) {\r\n this.isHovered = isOpen\r\n }\r\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\r\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\r\n }\r\n if (isOpen || isCurrentEventActive) {\r\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\r\n }\r\n\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const scaledArea = area.scaled\r\n const { x, y } = this.getXYPosition()\r\n const isInArea =\r\n x <= scaledArea.x &&\r\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\r\n y <= scaledArea.y &&\r\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\r\n return isInArea\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const { x } = this.getXYPosition()\r\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\r\n return isInView\r\n }\r\n}\r\n\r\nexport default ChartEvent\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Dividends extends ChartEvent {\r\n static type = ChartEventType.Dividends\r\n static label = ChartEventLabels[ChartEventType.Dividends]\r\n}\r\n\r\nexport default Dividends\r\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport { IEarnings } from '../utils/chart-events-utils'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Earnings extends ChartEvent {\r\n static type = ChartEventType.Earnings\r\n static label = ChartEventLabels[ChartEventType.Earnings]\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\r\n\r\n if (!eventItem) {\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\r\n const now = Date.now() / 1000\r\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\r\n }\r\n return eventItem.epsActual - eventItem.epsEstimate < 0\r\n ? ChartEventBadgeType.EarningsNegative\r\n : ChartEventBadgeType.EarningsPositive\r\n }\r\n}\r\n\r\nexport default Earnings\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Split extends ChartEvent {\r\n static type = ChartEventType.Split\r\n static label = ChartEventLabels[ChartEventType.Split]\r\n}\r\n\r\nexport default Split\r\n","import { ChartEventType } from '../constants/common'\r\nimport chartEvent from './chart-event'\r\nimport dividends from './dividends'\r\nimport earnings from './earnings'\r\nimport split from './split'\r\n\r\nexport const chartEventsByType = Object.freeze({\r\n [ChartEventType.ChartEvent]: chartEvent,\r\n [ChartEventType.Dividends]: dividends,\r\n [ChartEventType.Split]: split,\r\n [ChartEventType.Earnings]: earnings,\r\n})\r\n","import { ChartConfigChartPaneElement } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport { chartEventsByType } from '../chart-events'\r\nimport { chartsByType } from '../charts/charts'\r\nimport { indicatorsByType } from '../indicators/indicators'\r\nimport { overlaysByType } from '../overlays/overlays'\r\n\r\nconst canvasElements = {\r\n ...overlaysByType,\r\n ...indicatorsByType,\r\n ...drawingToolsByType,\r\n ...chartsByType,\r\n ...chartEventsByType,\r\n}\r\n\r\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\r\n return canvasElements[elementType]\r\n}\r\n","import { Instrument, Point } from '../../types/shared'\r\n\r\ninterface LinePoints {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport enum BigNumber {\r\n Thousand,\r\n Million,\r\n Billion,\r\n Trillion,\r\n}\r\n\r\nexport const BIG_NUMBER_VALUES = {\r\n [BigNumber.Thousand]: 1e3,\r\n [BigNumber.Million]: 1e6,\r\n [BigNumber.Billion]: 1e9,\r\n [BigNumber.Trillion]: 1e12,\r\n}\r\n\r\nconst BIG_NUMBER_ZEROES = {\r\n [BigNumber.Thousand]: 3,\r\n [BigNumber.Million]: 6,\r\n [BigNumber.Billion]: 9,\r\n [BigNumber.Trillion]: 12,\r\n}\r\n\r\nconst BIG_NUMBER_SUFFIX = {\r\n [BigNumber.Thousand]: 'K',\r\n [BigNumber.Million]: 'M',\r\n [BigNumber.Billion]: 'B',\r\n [BigNumber.Trillion]: 'T',\r\n}\r\n\r\nconst math = {\r\n dotProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.x + p1.y * p2.y\r\n },\r\n\r\n crossProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.y - p1.y * p2.x\r\n },\r\n\r\n distance(p1: Point, p2: Point) {\r\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\r\n },\r\n\r\n lineEquation(line: LinePoints) {\r\n // ax + by + c = 0\r\n if (line.x1 === line.x2) {\r\n return {\r\n a: 1,\r\n b: 0,\r\n c: -line.x1,\r\n }\r\n }\r\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\r\n return {\r\n a: -k,\r\n b: 1,\r\n c: k * line.x1 - line.y1,\r\n k,\r\n }\r\n },\r\n\r\n pointInPolygon(point: Point, polygon: Point[]) {\r\n // http://alienryderflex.com/polygon/\r\n let j = polygon.length - 1\r\n let oddNodes = false\r\n for (let i = 0; i < polygon.length; i++) {\r\n const p = polygon[i]\r\n if (\r\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\r\n (p.x <= point.x || polygon[j].x <= point.x)\r\n ) {\r\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\r\n oddNodes = !oddNodes\r\n }\r\n }\r\n j = i\r\n }\r\n return oddNodes\r\n },\r\n\r\n distanceToLine(point: Point, line: LinePoints) {\r\n const { a, b, c } = this.lineEquation(line)\r\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\r\n return dist\r\n },\r\n\r\n distanceToSegment(point: Point, line: LinePoints) {\r\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\r\n if (l2 === 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\r\n if (t < 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n if (t > 1) {\r\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\r\n }\r\n const x = line.x1 + t * (line.x2 - line.x1)\r\n const y = line.y1 + t * (line.y2 - line.y1)\r\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\r\n },\r\n\r\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\r\n if (instrument === Instrument.Crypto && value <= 0.001) {\r\n return 8\r\n }\r\n\r\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\r\n return 4\r\n }\r\n\r\n return 2\r\n },\r\n\r\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\r\n const absNum = Math.abs(number)\r\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\r\n const str = num.toString()\r\n if (str.includes('e')) {\r\n const splitString = str.split('e')\r\n const addZeroes = Number(splitString[1]) - zeroes\r\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\r\n }\r\n const sign = Math.sign(num)\r\n const numberByZeroesCount = Math.pow(10, zeroes)\r\n const result = (absNum / numberByZeroesCount) * sign\r\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\r\n }\r\n\r\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\r\n })\r\n } else {\r\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\r\n }\r\n },\r\n\r\n round({\r\n value,\r\n lastClose = 0,\r\n instrument,\r\n overridePlaces,\r\n }: {\r\n value: number\r\n lastClose?: number\r\n instrument?: Instrument\r\n overridePlaces?: number\r\n }) {\r\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\r\n return this.formatBigNumber(value, overridePlaces)\r\n }\r\n\r\n const places =\r\n typeof overridePlaces === 'number'\r\n ? overridePlaces\r\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\r\n\r\n if (value < 0.000001) {\r\n // There was an issue with getting NaN when rounding small numbers with latter method\r\n return value.toFixed(places)\r\n }\r\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\r\n },\r\n\r\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\r\n if (distance === 0) {\r\n return { x: line.x2, y: line.y2 }\r\n }\r\n\r\n let yAxisCoeficient\r\n let xAxisCoeficient\r\n\r\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = 1\r\n } else {\r\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = 1\r\n }\r\n\r\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\r\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\r\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\r\n return { x, y }\r\n },\r\n\r\n rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n }: {\r\n rotationAxisPoint: Point\r\n angle: number\r\n pointToRotate: Point\r\n }) {\r\n // return newCoordinates for pointToRotate after rotation defined by\r\n // angle around rotationAxisPoint\r\n const sin = Math.sin(angle)\r\n const cos = Math.cos(angle)\r\n const rotatedX =\r\n cos * (pointToRotate.x - rotationAxisPoint.x) +\r\n sin * (pointToRotate.y - rotationAxisPoint.y) +\r\n rotationAxisPoint.x\r\n const rotatedY =\r\n cos * (pointToRotate.y - rotationAxisPoint.y) -\r\n sin * (pointToRotate.x - rotationAxisPoint.x) +\r\n rotationAxisPoint.y\r\n return { x: rotatedX, y: rotatedY }\r\n },\r\n sharedPointLinesAngle({\r\n sharedPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n sharedPoint: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) {\r\n // return angle between line from sharedPoint to oldLinePoint and\r\n // line from sharedPoint to newLinePoint\r\n const numerator =\r\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\r\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\r\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\r\n const denominator =\r\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\r\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\r\n const ratio = numerator / denominator\r\n\r\n return Math.atan(ratio)\r\n },\r\n\r\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\r\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\r\n // Determine the intersection point of two line segments\r\n // Return FALSE if the lines don't intersect\r\n\r\n // Check if none of the lines are of length 0\r\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\r\n return false\r\n }\r\n\r\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\r\n\r\n // Lines are parallel\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\r\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\r\n\r\n // is the intersection along the segments\r\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\r\n return false\r\n }\r\n\r\n // Return a object with the x and y coordinates of the intersection\r\n const x = p1.x + ua * (p2.x - p1.x)\r\n const y = p1.y + ua * (p2.y - p1.y)\r\n\r\n return { x, y }\r\n },\r\n\r\n // https://stackoverflow.com/a/60368757\r\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\r\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\r\n let a, b\r\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\r\n x: 0,\r\n y: 0,\r\n onLine1: false,\r\n onLine2: false,\r\n }\r\n const denominator =\r\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n a = line1_p1.y - line2_p1.y\r\n b = line1_p1.x - line2_p1.x\r\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\r\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\r\n a = numerator1 / denominator\r\n b = numerator2 / denominator\r\n\r\n // if we cast these lines infinitely in both directions, they intersect here:\r\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\r\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\r\n\r\n // if line1 is a segment and line2 is infinite, they intersect if:\r\n if (a > 0 && a < 1) {\r\n result.onLine1 = true\r\n }\r\n // if line2 is a segment and line1 is infinite, they intersect if:\r\n if (b > 0 && b < 1) {\r\n result.onLine2 = true\r\n }\r\n // if line1 and line2 are segments, they intersect if both of the above are true\r\n return result\r\n },\r\n\r\n // ray is considered line1, segment is considered line2\r\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\r\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\r\n\r\n if (\r\n !lineIntersection ||\r\n lineIntersection.onLine1 ||\r\n this.dotProduct(\r\n this.subtractPoints(rayOrigin, lineIntersection as Point),\r\n this.subtractPoints(rayOrigin, rayEnd)\r\n ) <= 0\r\n )\r\n return false\r\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\r\n },\r\n\r\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\r\n const x = (P1.x - P2.x) / 2 + P2.x\r\n const y = (P1.y - P2.y) / 2 + P2.y\r\n return { x, y }\r\n },\r\n\r\n normalizeVector(v: Point) {\r\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\r\n return { x: v.x / length, y: v.y / length }\r\n },\r\n\r\n multiplyVectorByScalar(v: Point, scalar: number) {\r\n return { x: v.x * scalar, y: v.y * scalar }\r\n },\r\n\r\n addPoints(P1: Point, P2: Point) {\r\n return { x: P1.x + P2.x, y: P1.y + P2.y }\r\n },\r\n\r\n subtractPoints(P1: Point, P2: Point): Point {\r\n return { x: P1.x - P2.x, y: P1.y - P2.y }\r\n },\r\n\r\n isSamePoint(P1: Point, P2: Point, margin = { x: 0, y: 0 }) {\r\n return P1.x - margin.x <= P2.x && P2.x <= P1.x + margin.x && P1.y - margin.y <= P2.y && P2.y <= P1.y + margin.y\r\n },\r\n}\r\n\r\nexport default math\r\n","import { EMAConfig, Options } from '../overlays/configs/ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\nexport class ExponentialMovingAverage {\r\n period: number\r\n multiplier: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.multiplier = 2 / (this.period + 1)\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(d: number) {\r\n if (this.count < this.period) {\r\n this.sum += d\r\n this.count++\r\n this.value = this.sum / this.count\r\n } else {\r\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\r\n }\r\n }\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ema: number[]\r\n}\r\n\r\nexport class EMACalculation extends MainCalculation {\r\n static config = EMAConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n 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 IndicatorBaseConfig from '../indicators/configs/indicatorBaseConfig'\r\nimport Quote from '../models/quote'\r\nimport OverlayBaseConfig from '../overlays/configs/overlayBaseConfig'\r\n\r\ntype OptionValuesType = ObjectHash\r\ntype CalculatedValuesType = ObjectHash\r\ninterface MainProps {\r\n quote?: Quote\r\n options: T\r\n}\r\n\r\nexport type OnValueCalculatedReturnValue = boolean | undefined\r\nexport type OnValueCalculated = ((value: T, dataIndex: number) => OnValueCalculatedReturnValue) | undefined\r\n\r\nexport class MainCalculation<\r\n TOptionValues extends OptionValuesType | undefined = undefined,\r\n TCalculatedValues extends CalculatedValuesType = CalculatedValuesType,\r\n> {\r\n declare static config: OverlayBaseConfig | IndicatorBaseConfig\r\n\r\n quote: NonNullable['quote']>\r\n options: MainProps['options']\r\n\r\n protected declare _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues ?? this.getDefaultCalculatedValues()\r\n }\r\n\r\n get config() {\r\n return (this.constructor as typeof MainCalculation).config\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n const defaultCalculatedValues = this.config.getDefaultCalculatedValues() as TCalculatedValues\r\n if (Object.keys(defaultCalculatedValues).length === 0) {\r\n throw Error('Add calculatedValues to indicator config')\r\n }\r\n return defaultCalculatedValues\r\n }\r\n\r\n calculate(_: OnValueCalculated) {\r\n throw Error('Implement calculate')\r\n }\r\n\r\n getAllCalculatedValues(lastNItems: number) {\r\n const calculatedValues = {} as TCalculatedValues\r\n Object.keys(this.calculatedValues).forEach((key) => {\r\n calculatedValues[key as keyof TCalculatedValues] = this.getCalculatedValues(key, lastNItems)\r\n })\r\n return calculatedValues\r\n }\r\n\r\n getCalculatedValues(key: keyof TCalculatedValues, lastNItems: number) {\r\n return (this.calculatedValues[key] as number[]).slice(-lastNItems) as TCalculatedValues[keyof TCalculatedValues]\r\n }\r\n\r\n /**\r\n * This function is used to construct sql script for db table creation\r\n * and also to build precalculated data object used on node server.\r\n *\r\n * Precalculated data object uses database column names as property keys to simplify data mapping on BE\r\n */\r\n getDbColumnName() {\r\n const colName = this.config.abbreviation\r\n const optionKeys = this.config.optionsOrder\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [colName, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import { ObjectHash } from '../../../types/shared'\r\nimport ElementBaseConfig from '../../canvas/ElementBaseConfig'\r\nimport { IndicatorType, QuoteFinancialAttachment } from '../../constants/common'\r\n\r\nexport default class IndicatorBaseConfig extends ElementBaseConfig {\r\n static type = IndicatorType.Indicator\r\n static abbreviation = 'ind'\r\n static label = 'Indicator'\r\n static shortLabel = 'Indicator'\r\n static optionsOrder = [] as readonly string[]\r\n static optionsLabels = {}\r\n static inputsOrder = [] as readonly string[]\r\n static inputsLabels = {}\r\n static calculatedValuesOrder = [] as readonly string[]\r\n static calculatedValuesLabels = {}\r\n static defaultCalculatedValueOption = undefined as undefined | string\r\n static quoteFinancialAttachments: QuoteFinancialAttachment[] = []\r\n\r\n static getShortLabelWithAttrs(attrs: ObjectHash) {\r\n return [this.shortLabel, this.optionsOrder.map((item) => attrs[item]).join(',')].filter((item) => !!item).join(' ')\r\n }\r\n\r\n get getShortLabelWithAttrs() {\r\n return (this.constructor as typeof IndicatorBaseConfig).getShortLabelWithAttrs\r\n }\r\n\r\n static getDefaultCalculatedValues() {\r\n return this.calculatedValuesOrder.reduce((prev, curr) => ({ ...prev, [curr]: [] }), {})\r\n }\r\n\r\n get getDefaultCalculatedValues() {\r\n return (this.constructor as typeof IndicatorBaseConfig).getDefaultCalculatedValues\r\n }\r\n}\r\n","import { IndicatorType, QuoteFinancialAttachment } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class ShrtflConfig extends IndicatorBaseConfig {\r\n static quoteFinancialAttachments: QuoteFinancialAttachment[] = [QuoteFinancialAttachment.shortInterest]\r\n static type = IndicatorType.Shrtfl\r\n static label = 'Short Float%'\r\n static shortLabel = 'Short Float%'\r\n static abbreviation = 'shrtfl'\r\n}\r\n","import { IndicatorType, QuoteFinancialAttachment } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class ShrtraConfig extends IndicatorBaseConfig {\r\n static quoteFinancialAttachments: QuoteFinancialAttachment[] = [QuoteFinancialAttachment.shortInterest]\r\n static type = IndicatorType.Shrtra\r\n static label = 'Short Ratio'\r\n static shortLabel = 'Short Ratio'\r\n static abbreviation = 'shrtra'\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ADXConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Adx\r\n static abbreviation = 'adx'\r\n static label = 'ADX'\r\n static shortLabel = 'ADX'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text, { ITextAttrs } from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n FONT_SIZE,\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n OFFSET,\r\n PADDING,\r\n SpecificChartFunctionality,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport { ISettings } from '../models/chart_settings/interfaces'\r\nimport mouseModel from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport { roundedRect } from '../utils/canvas-render'\r\nimport { renderCross } from '../utils/chart'\r\nimport { renderFadeExtendedHours, renderXAxis } from '../utils/chart-grid-render-utils'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport {\r\n drawInVisibleArea,\r\n getAreNoBarsVisible,\r\n getCompensatedFirstBarToRenderIndex,\r\n getVisibleBarToRenderIndex,\r\n} from '../utils/draw_in_visible_area'\r\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\nimport IndicatorBaseConfig from './configs/indicatorBaseConfig'\r\n\r\nconst MAX_POSITIVE_DEFAULT_VALUE = Number.MAX_VALUE\r\nconst MAX_NEGATIVE_DEFAULT_VALUE = -Number.MAX_VALUE\r\n\r\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\r\n switch (indicator) {\r\n case IndicatorType.Rvol:\r\n return { min: 0, max: 2 }\r\n case IndicatorType.Atr:\r\n return { min: 0, max: 10 }\r\n case IndicatorType.Adx:\r\n case IndicatorType.Aro:\r\n case IndicatorType.Mfi:\r\n case IndicatorType.Perf:\r\n case IndicatorType.Rmi:\r\n case IndicatorType.Rsi:\r\n case IndicatorType.Stofu:\r\n case IndicatorType.Ult:\r\n return { min: 0, max: 100 }\r\n case IndicatorType.Macd:\r\n case IndicatorType.Rwi:\r\n case IndicatorType.Trix:\r\n return { min: -1, max: 1 }\r\n case IndicatorType.Wr:\r\n return { min: -100, max: 0 }\r\n case IndicatorType.Aroosc:\r\n case IndicatorType.Roc:\r\n return { min: -100, max: 100 }\r\n case IndicatorType.Cci:\r\n case IndicatorType.Fi:\r\n return { min: -200, max: 200 }\r\n case IndicatorType.Shrtfl:\r\n case IndicatorType.Shrtra:\r\n return { min: 0, max: 1 }\r\n default:\r\n return { min: 0, max: 100 }\r\n }\r\n}\r\n\r\nexport interface IIndicatorIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\r\n static config = IndicatorBaseConfig\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n return this.model.height\r\n },\r\n })\r\n Object.defineProperty(this.prototype, 'contentHeight', {\r\n get() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static fromObject(values: ObjectHash, model: Pane) {\r\n const indicator = new this(values, model)\r\n indicator.set(values)\r\n return indicator\r\n }\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare min: number\r\n declare max: number\r\n declare contentHeight: number\r\n declare height: number\r\n\r\n attrs: Attrs\r\n model: Pane\r\n labelWidth = 0\r\n fetchedAt = -1\r\n leftOffset = 0\r\n width = 0\r\n contentWidth = 0\r\n lastValue: number | null = null\r\n shouldUpdate = true\r\n tickers: string | null = null\r\n period?: string | number\r\n\r\n // Used to calculate yAxis min/max values if min === max, and we don't want to use domain defaults\r\n applyMinMaxPadding = false\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.attrs = attrs\r\n this.model = model\r\n this.data = this.model.chart().quote()\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n\r\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\r\n this.model.bind('update change', this.trigger.bind(this, 'change'))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Indicator).config.type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Indicator).config.label\r\n }\r\n\r\n get config() {\r\n return (this.constructor as typeof Indicator).config\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.data = this.model.chart().quote()\r\n this.leftOffset = this.model.chart().leftOffset\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n this.compute()\r\n\r\n this.setupCache()\r\n\r\n this.renderYAxis(context)\r\n\r\n context.save()\r\n this.clip(context)\r\n this.renderXAxis(context)\r\n const translate = getTranslate({\r\n context,\r\n xOffset: this.leftOffset + IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n this.renderIndicator(context)\r\n translate.undo()\r\n\r\n renderFadeExtendedHours({ context, paneModel: this.model, quote: this.data })\r\n\r\n context.restore()\r\n\r\n if (!this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabel(context)\r\n }\r\n }\r\n\r\n isComputeNecessary() {\r\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\r\n // or indicator setting was changed via modal (this.shouldUpdate)\r\n // allow compute and update variables to prevent another unless\r\n // those variables change again\r\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\r\n this.fetchedAt = this.data.fetchedAt\r\n this.shouldUpdate = false\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D, options?: { lastValueSuffix?: string }) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.model.scale.y.ticks(10)\r\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\r\n const yLine = new Line(\r\n {\r\n x1: 0,\r\n x2: this.contentWidth,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n for (let index = 0; index < ticks.length; index++) {\r\n const tick = ticks[index]\r\n y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n if (index % 2 === 0) {\r\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\r\n }\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\r\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\r\n new Text(\r\n {\r\n text: `${math.formatBigNumber(this.lastValue, 2)}${options?.lastValueSuffix ?? ''}`,\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n y: valueY,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n background: Colors.indicatorCurrentBackground,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n\r\n translate.do()\r\n\r\n renderXAxis({ context, quote: this.data, paneModel: this.model, type: this.type })\r\n\r\n translate.undo()\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n } else {\r\n this.renderLabelQuotePage(context)\r\n }\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y: IndicatorSettings.left.indicatorLabel.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context)\r\n return label.render(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificChartFunctionality)\r\n const isDarkMode = theme === Theme.dark\r\n const x = isQuoteOrQuoteFinancials ? OFFSET.S : IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: x * 2,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\r\n roundedRect({\r\n ctx: context,\r\n x,\r\n y,\r\n height: INDICATOR_LABEL_HEIGHT,\r\n width: this.labelWidth,\r\n radius: 6,\r\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\r\n })\r\n label.render(context)\r\n\r\n return { x, y, labelWidth: this.labelWidth }\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.model,\r\n quote: this.data,\r\n contentWidth: this.contentWidth,\r\n contentHeight: this.contentHeight,\r\n isIndicator: true,\r\n isPerfIndicator: this.type === IndicatorType.Perf || this.type === IndicatorType.Shrtfl,\r\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\r\n })\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\r\n }\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.data = this.model.chart().quote()\r\n const index = Number.isNaN(crossIndex) ? -1 : crossIndex\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n\r\n this.renderCrossTextChartsPage(context, index)\r\n } else {\r\n this.renderCrossTextQuotePage(context, index)\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(_: number): Array<{ color: string; text: string | null }> {\r\n return []\r\n }\r\n\r\n renderCrossTextValueLabels(\r\n context: CanvasRenderingContext2D,\r\n crossIndex: number,\r\n { textBaseline, y }: Pick\r\n ) {\r\n if (!context || isNaN(crossIndex) || crossIndex === -1) {\r\n return\r\n }\r\n\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const crossValueText = new Text(\r\n {\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...IndicatorSettings.left.indicatorLabel.font,\r\n style: 'normal',\r\n }),\r\n textAlign: TextAlign.left,\r\n textBaseline,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\r\n },\r\n this.model\r\n )\r\n\r\n let x = this.labelWidth + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n\r\n const renderLabel = ({ color, text }: { color: string; text: string | null }) => {\r\n crossValueText.set({\r\n x,\r\n y,\r\n fillStyle: color,\r\n text: text ?? ' - ',\r\n })\r\n\r\n x += crossValueText.measure(context) + crossValueText.attrs.padding.left + crossValueText.attrs.padding.right\r\n\r\n crossValueText.render(context)\r\n }\r\n\r\n let lastRenderedIndex = -1\r\n this.getValueLabelsAtIndex(crossIndex).forEach(({ color, text }, index) => {\r\n if (text !== null) {\r\n if (lastRenderedIndex > -1) {\r\n renderLabel({ color: Colors.zeroChange, text: '·' })\r\n }\r\n renderLabel({ color, text })\r\n\r\n lastRenderedIndex = index\r\n }\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { indicatorLabel } = this.getChartLayoutSettings().IndicatorSettings.left\r\n // @todo - Default text lineheight is 20 , and is not overwritten by indicatorLabel.font (which is probably a bug) , in this case it's easier to hardcode this value than access is on Text instance\r\n const lineHeight = 20\r\n this.renderCrossTextValueLabels(context, crossIndex, {\r\n textBaseline: TextBaseline.middle,\r\n y: indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - lineHeight) / 2,\r\n })\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.renderCrossTextValueLabels(context, crossIndex, {\r\n textBaseline: TextBaseline.top,\r\n y: this.getChartLayoutSettings().IndicatorSettings.left.indicatorLabel.margin.top,\r\n })\r\n }\r\n\r\n getValueLabel(value: number | undefined | null, unit = '') {\r\n if (value === undefined || value === null || !Number.isFinite(value)) return null\r\n\r\n return `${math.formatBigNumber(value, 2)}${unit}`\r\n }\r\n\r\n getOversoldOverboughtValueLabelsAtIndex(index: number, array: number[]) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [{ color: IndicatorSettings.general.Colors.line, text: this.getValueLabel(array[dataIndex]) }]\r\n }\r\n\r\n renderOversoldOverbought(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n zero: number,\r\n overbought: number,\r\n drawLines?: boolean\r\n ) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.data.close.length === 0) return\r\n const drawInVisibleAreaProps = {\r\n fromIndexOffset: from,\r\n leftOffset: this.leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width: this.width,\r\n }\r\n\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex(drawInVisibleAreaProps)\r\n\r\n if (drawLines == null) {\r\n drawLines = true\r\n }\r\n\r\n context.save()\r\n\r\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\r\n if (clipHeight <= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\r\n this.contentWidth,\r\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n context.clip()\r\n context.set('fillStyle', '#87ceef')\r\n\r\n context.beginPath()\r\n 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 if (!areNoBarsVisible && min !== MAX_POSITIVE_DEFAULT_VALUE && max !== MAX_NEGATIVE_DEFAULT_VALUE) {\r\n if (min === max && this.applyMinMaxPadding) {\r\n min = min - min * Math.sign(min)\r\n max = max + max * Math.sign(max)\r\n }\r\n if (min !== max) {\r\n return { min, max }\r\n }\r\n }\r\n return this.getDomainDefaults(this.type)\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\r\n\r\n getMinMax() {\r\n this.data = this.model.chart().quote()\r\n this.compute()\r\n return { min: this.min, max: this.max }\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n period: this.getModalConfig()\r\n .inputs.map((input: IModalConfigInput) => input.value.toString())\r\n .join(','),\r\n }\r\n }\r\n\r\n toString() {\r\n return this.config.getShortLabelWithAttrs(this)\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n renderIndicator(_: CanvasRenderingContext2D) {\r\n throw Error('Implement renderIndicator method')\r\n }\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n getIsChartPageSpecificFunctionality() {\r\n const { specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto =\r\n isRedesignEnabled() &&\r\n [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.quotePage,\r\n ].includes(specificChartFunctionality)\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n getIsDrawing() {\r\n return false\r\n }\r\n\r\n getIsChartEvent() {\r\n return false\r\n }\r\n\r\n compute() {\r\n throw Error('Implement compute method')\r\n }\r\n}\r\n\r\nIndicator.initClass()\r\n\r\nexport default Indicator\r\n","export function roundedRect({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n radius,\r\n color,\r\n}: {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n radius: number\r\n color: string\r\n}) {\r\n ctx.translate(0.5, 0.5)\r\n ctx.set('strokeStyle', color)\r\n ctx.set('fillStyle', color)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + radius)\r\n ctx.lineTo(x, y + height - radius)\r\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\r\n ctx.lineTo(x + width - radius, y + height)\r\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\r\n ctx.lineTo(x + width, y + radius)\r\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\r\n ctx.lineTo(x + radius, y)\r\n ctx.arcTo(x, y, x, y + radius, radius)\r\n ctx.stroke()\r\n ctx.fill()\r\n ctx.translate(-0.5, -0.5)\r\n}\r\n","import utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { ADXConfig, Attrs } from './configs/adx'\r\nimport Indicator from './indicator'\r\n\r\nclass ADX extends Indicator {\r\n static config = ADXConfig\r\n\r\n declare period: number\r\n pdi: number[] = []\r\n mdi: number[] = []\r\n adx: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let adx, amdm, apdm, mdi, pdi\r\n this.pdi = []\r\n this.mdi = []\r\n this.adx = []\r\n let atr = (apdm = amdm = adx = 0)\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\r\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\r\n\r\n let pdm = 0\r\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\r\n pdm = deltaHigh\r\n }\r\n\r\n let mdm = 0\r\n if (deltaLow > 0 && deltaLow > deltaHigh) {\r\n mdm = deltaLow\r\n }\r\n\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n\r\n atr = (atr * (this.period - 1) + tr) / this.period\r\n apdm = (apdm * (this.period - 1) + pdm) / this.period\r\n amdm = (amdm * (this.period - 1) + mdm) / this.period\r\n\r\n pdi = atr > 0 ? (apdm * 100) / atr : 0\r\n mdi = atr > 0 ? (amdm * 100) / atr : 0\r\n const di = Math.abs(pdi - mdi)\r\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\r\n adx = (adx * (this.period - 1) + dx) / this.period\r\n\r\n this.pdi[i] = pdi\r\n this.mdi[i] = mdi\r\n this.adx[i] = adx\r\n }\r\n this.lastValue = this.adx.last() ?? null\r\n }\r\n const { min, max } =\r\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\r\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLineColors() {\r\n return {\r\n pdi: '#2eb12e',\r\n mdi: '#d43737',\r\n adx: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line,\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const lineColors = this.getLineColors()\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.pdi, text: this.getValueLabel(this.pdi[dataIndex]) },\r\n { color: lineColors.mdi, text: this.getValueLabel(this.mdi[dataIndex]) },\r\n { color: lineColors.adx, text: this.getValueLabel(this.adx[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n const lineColors = this.getLineColors()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', lineColors.pdi)\r\n context.beginPath()\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\r\n },\r\n })\r\n\r\n context.stroke()\r\n\r\n context.set('strokeStyle', lineColors.mdi)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.set('strokeStyle', lineColors.adx)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: ADXConfig.label,\r\n inputs: ADXConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default ADX\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class AroConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Aro\r\n static abbreviation = 'aro'\r\n static label = 'Aroon'\r\n static shortLabel = 'Aroon'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['aroonUp', 'aroonDown', 'oscillator'] as const\r\n static calculatedValuesLabels = {\r\n aroonUp: 'Aroon Up',\r\n aroonDown: 'Aroon Down',\r\n oscillator: 'Oscillator',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { AroConfig, Attrs } from '../indicators/configs/aro'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n aroonUp: number[]\r\n aroonDown: number[]\r\n oscillator: number[]\r\n}\r\n\r\nexport class AroonCalculation extends MainCalculation {\r\n static config = AroConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { low, high } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period; i < high.length; i++) {\r\n const highPeriod = high.slice(i - period, i + 1)\r\n const highestInPeriod = Math.max(...highPeriod)\r\n const periodSinceHigh = period - highPeriod.lastIndexOf(highestInPeriod)\r\n this._calculatedValues.aroonUp[i] = 100 * ((period - periodSinceHigh) / period)\r\n\r\n const lowPeriod = low.slice(i - period, i + 1)\r\n const lowestInPeriod = Math.min(...lowPeriod)\r\n const periodSinceLow = period - lowPeriod.lastIndexOf(lowestInPeriod)\r\n this._calculatedValues.aroonDown[i] = 100 * ((period - periodSinceLow) / period)\r\n\r\n this._calculatedValues.oscillator[i] = this._calculatedValues.aroonUp[i] - this._calculatedValues.aroonDown[i]\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Pane from '../models/pane'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { AroConfig, Attrs } from './configs/aro'\r\nimport Indicator from './indicator'\r\n\r\nconst COLORS = {\r\n aroonUp: '#00a000',\r\n aroonDown: '#c80000',\r\n}\r\n\r\nclass Aroon extends Indicator {\r\n static config = AroConfig\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLineColors() {\r\n return {\r\n aroonUp: COLORS.aroonUp,\r\n aroonDown: COLORS.aroonDown,\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return []\r\n\r\n const lineColors = this.getLineColors()\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.aroonDown, text: this.getValueLabel(aroonDown[dataIndex]) },\r\n { color: lineColors.aroonUp, text: this.getValueLabel(aroonUp[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return\r\n\r\n const lineColors = this.getLineColors()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', lineColors.aroonUp)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonUp[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', lineColors.aroonDown)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonDown[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n if (!this.aroonCalculation) return\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (aroonDown.length > 0) {\r\n textLabels.push({\r\n text: aroonDown.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonDown.last()!)),\r\n background: COLORS.aroonDown,\r\n })\r\n }\r\n if (aroonUp.length > 0) {\r\n textLabels.push({\r\n text: aroonUp.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonUp.last()!)),\r\n background: COLORS.aroonUp,\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: AroConfig.label,\r\n inputs: AroConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default Aroon\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { AroConfig } from './aro'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ArooscConfig extends AroConfig {\r\n static type = IndicatorType.Aroosc\r\n static abbreviation = 'aroosc'\r\n static label = 'Aroon Oscillator'\r\n static shortLabel = 'Aroon Oscillator'\r\n}\r\n","import { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport { ArooscConfig, Attrs } from './configs/aroosc'\r\nimport Indicator from './indicator'\r\n\r\nclass AroonOscillator extends Indicator {\r\n static config = ArooscConfig\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n this.lastValue = this.aroonCalculation.calculatedValues.oscillator.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.aroonCalculation?.calculatedValues.oscillator ?? [])\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.aroonCalculation?.calculatedValues.oscillator ?? [],\r\n this.period,\r\n 0,\r\n 0,\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: ArooscConfig.label,\r\n inputs: ArooscConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default AroonOscillator\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ATRConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Atr\r\n static abbreviation = 'atr'\r\n static label = 'Average True Range'\r\n static shortLabel = 'ATR'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import AverageTrueRange from '../helpers/atr'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { ATRConfig, Attrs } from './configs/atr'\r\nimport Indicator from './indicator'\r\n\r\nclass ATR extends Indicator {\r\n static config = ATRConfig\r\n\r\n atr: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.atr = []\r\n const atr = new AverageTrueRange(this.period)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n this.atr[i] = atr.value\r\n }\r\n\r\n this.lastValue = this.atr.last() ?? null\r\n }\r\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.atr[dataIndex]),\r\n },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: ATRConfig.label,\r\n inputs: ATRConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default ATR\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class CCIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Cci\r\n static abbreviation = 'cci'\r\n static label = 'Commodity Channel Index'\r\n static shortLabel = 'CCI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { Attrs, CCIConfig } from './configs/cci'\r\nimport Indicator from './indicator'\r\n\r\nconst constant = 0.015\r\nclass CommodityChannelIndex extends Indicator {\r\n static config = CCIConfig\r\n\r\n cci: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let smaCount\r\n const tp = []\r\n this.cci = []\r\n let smaSum = (smaCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let devCount\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n tp[i] = typicalPrice\r\n\r\n smaSum += typicalPrice\r\n smaCount++\r\n if (smaCount > this.period) {\r\n smaSum -= tp[i - this.period]\r\n smaCount--\r\n }\r\n const sma = smaSum / smaCount\r\n\r\n if (i < this.period - 1) {\r\n continue\r\n }\r\n\r\n let devSum = (devCount = 0)\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n devSum += Math.abs(tp[j] - sma)\r\n devCount++\r\n }\r\n\r\n const dev = devSum / devCount\r\n this.cci[i] = 0\r\n if (dev > 0) {\r\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\r\n }\r\n }\r\n\r\n this.lastValue = this.cci.last() ?? null\r\n }\r\n\r\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.cci)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: CCIConfig.label,\r\n inputs: CCIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default CommodityChannelIndex\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Attrs = {\r\n period: string\r\n code: string\r\n}\r\n\r\nexport class COTConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Cot\r\n static abbreviation = 'cot'\r\n static label = 'COT'\r\n static shortLabel = 'CCI'\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { Theme } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport { INDICATOR_LABEL_HEIGHT, TextAlign, TextBaseline } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, COTConfig } from './configs/cot'\r\nimport Indicator from './indicator'\r\n\r\nexport interface ICOT {\r\n code: string\r\n name: string\r\n units: string\r\n commercialHedgers: number[]\r\n largeTraders: number[]\r\n smallTraders: number[]\r\n}\r\n\r\ntype ColorsKeys = keyof Pick\r\n\r\nclass COT extends Indicator {\r\n static config = COTConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() || !this.data.COTs) return\r\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\r\n if (!this.attrs.code && cotQuoteCode) {\r\n this.attrs.code = cotQuoteCode\r\n }\r\n const cot = this.data.COTs[this.attrs.code]\r\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\r\n this.max = Math.max(Math.abs(max), Math.abs(min))\r\n this.min = -this.max\r\n }\r\n\r\n getLineColors() {\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n return {\r\n commercialHedgers: tailwindColors.green[400],\r\n largeTraders: tailwindColors.red[400],\r\n smallTraders: tailwindColors.blue[isDarkMode ? 300 : 500],\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (!this.data.COTs) return []\r\n const colors = this.getLineColors()\r\n\r\n return Object.keys(colors).map((key) => {\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n return {\r\n color: colors[key as ColorsKeys],\r\n text: this.getValueLabel(data[index]),\r\n }\r\n })\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n context.translate(0.5, 0.5)\r\n const colors = this.getLineColors()\r\n for (const key in colors) {\r\n context.set('strokeStyle', colors[key as ColorsKeys])\r\n context.beginPath()\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(data[i])))\r\n },\r\n })\r\n context.stroke()\r\n }\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const name = new Text(\r\n {\r\n text: this.toString(),\r\n x: 8,\r\n y: 16,\r\n font: { size: 10, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n name.render(context)\r\n const secondarylabelX = 38 + name.measure()\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX,\r\n y: 16,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n\r\n this.labelWidth = secondarylabelX + 8 + secondarylabel.measure(context)\r\n secondarylabel.render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\r\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\r\n\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n const secondarylabelX = labelWidth + x * 2\r\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\r\n const scaleCoefficient = 0.7\r\n\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX + x,\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...fontSettings,\r\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\r\n style: 'normal',\r\n }),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n secondarylabel.set({\r\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\r\n })\r\n this.labelWidth = secondarylabelX + x + secondarylabel.measure(context)\r\n secondarylabel.render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const colors = this.getLineColors()\r\n\r\n new Text(\r\n {\r\n text: 'COT',\r\n x: 23,\r\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n const text = new Text(\r\n {\r\n text: 'Commercial Hedgers',\r\n x: IndicatorSettings.left.width,\r\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\r\n font: { size: 8, style: 'bold' },\r\n fillStyle: colors.commercialHedgers,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n text.render(context)\r\n\r\n let x = text.get('x')! + 8 + text.measure()\r\n text.set({ text: 'Large Traders', x, fillStyle: colors.largeTraders })\r\n text.render(context)\r\n\r\n x += 8 + text.measure()\r\n text.set({ text: 'Small Traders', x, fillStyle: colors.smallTraders })\r\n text.render(context)\r\n }\r\n\r\n formatAxis(value: number) {\r\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\r\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: COTConfig.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : ''\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n code: this.attrs.code,\r\n }\r\n }\r\n}\r\n\r\nexport default COT\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class FIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Fi\r\n static abbreviation = 'fi'\r\n static label = 'Force Index'\r\n static shortLabel = 'FORCE'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['fi'] as const\r\n static calculatedValuesLabels = { fi: 'Force Index' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, FIConfig } from '../indicators/configs/fi'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n fi: number[]\r\n}\r\n\r\nexport class FICalculation extends MainCalculation {\r\n static config = FIConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close, volume } = this.quote\r\n 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 { FICalculation } from '../indicator-calculation/fi'\r\nimport { Attrs, FIConfig } from './configs/fi'\r\nimport Indicator from './indicator'\r\n\r\nclass ForceIndex extends Indicator {\r\n static config = FIConfig\r\n\r\n fiCalculation: FICalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.fiCalculation = new FICalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.fiCalculation.calculate()\r\n this.lastValue = this.fiCalculation.calculatedValues.fi.last() ?? null\r\n }\r\n const fi = this.fiCalculation?.calculatedValues.fi ?? []\r\n const { min, max } = fi.length > 0 ? this.computeVisibleMinMax(fi) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.fiCalculation?.calculatedValues.fi ?? [])\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.fiCalculation?.calculatedValues.fi ?? [], 1, 0, 0, 0, false)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 13,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: FIConfig.label,\r\n inputs: FIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default ForceIndex\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: string\r\n}\r\n\r\nexport class MACDConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Macd\r\n static abbreviation = 'macd'\r\n static label = 'MACD'\r\n static shortLabel = 'MACD'\r\n static optionsOrder = ['fastPeriod', 'slowPeriod', 'signalPeriod'] as const\r\n static optionsLabels = { fastPeriod: 'Period', slowPeriod: 'Slow', signalPeriod: 'Signal' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['macd', 'signal', 'histogram'] as const\r\n static calculatedValuesLabels = { macd: 'MACD Line', signal: 'Signal', histogram: 'Histogram' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { MACDConfig, Options } from '../indicators/configs/macd'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n macd: number[]\r\n signal: number[]\r\n histogram: number[]\r\n}\r\n\r\nexport class MACDCalculation extends MainCalculation {\r\n static config = MACDConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { fastPeriod, slowPeriod, signalPeriod } = this.options\r\n 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 { MACDCalculation } from '../indicator-calculation/macd'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, MACDConfig } from './configs/macd'\r\nimport Indicator from './indicator'\r\n\r\nclass MACD extends Indicator {\r\n static config = MACDConfig\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\r\n }\r\n\r\n macdCalculation: MACDCalculation | null = null\r\n\r\n declare fastPeriod: number\r\n declare slowPeriod: number\r\n declare signalPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\r\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary() || this.macdCalculation === null) {\r\n this.macdCalculation = new MACDCalculation({\r\n quote: this.data,\r\n options: {\r\n signalPeriod: this.signalPeriod,\r\n fastPeriod: this.fastPeriod,\r\n slowPeriod: this.slowPeriod,\r\n },\r\n })\r\n this.macdCalculation.calculate()\r\n\r\n this.lastValue = this.macdCalculation.calculatedValues.macd.last() ?? null\r\n }\r\n\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n\r\n const { min, max } =\r\n macd.length > 0 || signal.length > 0 || histogram.length > 0\r\n ? this.computeVisibleMinMax(macd, signal, histogram)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLineColors() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n return {\r\n histogram: '#79c3e8',\r\n macd: IndicatorSettings.general.Colors.line,\r\n signal: IndicatorSettings.general.Colors.signalLine,\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (this.macdCalculation === null || this.data.close.length === 0) return []\r\n\r\n const lineColors = this.getLineColors()\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.histogram, text: this.getValueLabel(histogram[dataIndex]) },\r\n { color: lineColors.macd, text: this.getValueLabel(macd[dataIndex]) },\r\n { color: lineColors.signal, text: this.getValueLabel(signal[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.macdCalculation === null || this.data.close.length === 0) return\r\n const lineColors = this.getLineColors()\r\n const y = Math.round(this.fy(0))\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n }\r\n\r\n context.set('fillStyle', lineColors.histogram)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.rect(x - halfBarWidth, y, barWidthWithoutMargin, Math.round(this.fy(histogram[i]) - y))\r\n },\r\n })\r\n context.fill()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', lineColors.macd)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(macd[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', lineColors.signal)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(signal[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n fastPeriod: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'fastPeriod',\r\n value: this.fastPeriod ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n slowPeriod: {\r\n type: 'number',\r\n label: 'Slow',\r\n name: 'slowPeriod',\r\n value: this.slowPeriod ?? 26,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n signalPeriod: {\r\n type: 'number',\r\n label: 'Signal',\r\n name: 'signalPeriod',\r\n value: this.signalPeriod ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: MACDConfig.label,\r\n inputs: MACDConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n fastPeriod: `${options.fastPeriod.label} must be a whole number between ${options.fastPeriod.min} and ${options.fastPeriod.max}`,\r\n slowPeriod: `${options.slowPeriod.label} must be a whole number between ${options.slowPeriod.min} and ${options.slowPeriod.max}`,\r\n signalPeriod: `${options.signalPeriod.label} must be a whole number between ${options.signalPeriod.min} and ${options.signalPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'fastPeriod':\r\n case 'slowPeriod':\r\n case 'signalPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default MACD\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class MFIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Mfi\r\n static abbreviation = 'mfi'\r\n static label = 'Money Flow Index'\r\n static shortLabel = 'MFI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { Attrs, MFIConfig } from './configs/mfi'\r\nimport Indicator from './indicator'\r\n\r\nclass MFI extends Indicator {\r\n static config = MFIConfig\r\n\r\n mfi: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n let negativeMoneyFlow\r\n const mf = []\r\n this.mfi = []\r\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\r\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n const moneyFlow = typicalPrice * this.data.volume[i]\r\n\r\n if (typicalPrice > prevTypicalPrice) {\r\n positiveMoneyFlow += moneyFlow\r\n mf[i] = moneyFlow\r\n } else if (typicalPrice < prevTypicalPrice) {\r\n negativeMoneyFlow += moneyFlow\r\n mf[i] = -moneyFlow\r\n }\r\n\r\n if (i > this.period) {\r\n const oldMF = mf[i - this.period]\r\n if (oldMF > 0) {\r\n positiveMoneyFlow -= oldMF\r\n } else if (oldMF < 0) {\r\n negativeMoneyFlow += oldMF\r\n }\r\n\r\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\r\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\r\n } else {\r\n this.mfi[i] = 50\r\n }\r\n }\r\n\r\n prevTypicalPrice = typicalPrice\r\n }\r\n\r\n this.lastValue = this.mfi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.mfi)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: MFIConfig.label,\r\n inputs: MFIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default MFI\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class NoneConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.None\r\n static abbreviation = 'none'\r\n static label = 'None'\r\n static shortLabel = 'None'\r\n}\r\n","import { NoneConfig } from './configs/none'\r\nimport Indicator from './indicator'\r\n\r\nclass None extends Indicator {\r\n static config = NoneConfig\r\n\r\n compute() {}\r\n\r\n renderIndicator() {}\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nexport default None\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class OBVConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Obv\r\n static abbreviation = 'obv'\r\n static label = 'On-Balance Volume'\r\n static shortLabel = 'OBV'\r\n}\r\n","import math from '../helpers/math'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { OBVConfig } from './configs/obv'\r\nimport Indicator from './indicator'\r\n\r\nclass OBV extends Indicator {\r\n static config = OBVConfig\r\n\r\n obv: number[] = []\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.obv = [0]\r\n\r\n for (let i = 1; i < this.data.volume.length; i++) {\r\n let currentObv = this.obv[i - 1]\r\n if (this.data.close[i] > this.data.close[i - 1]) {\r\n currentObv += this.data.volume[i]\r\n } else if (this.data.close[i] < this.data.close[i - 1]) {\r\n currentObv -= this.data.volume[i]\r\n }\r\n\r\n this.obv[i] = currentObv\r\n }\r\n\r\n this.lastValue = this.obv.last() ?? null\r\n }\r\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.obv[dataIndex]),\r\n },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: OBVConfig.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n}\r\n\r\nexport default OBV\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: string\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n tickers?: string\r\n}\r\n\r\nexport class PerfConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Perf\r\n static abbreviation = 'perf'\r\n static label = 'Price Performance %'\r\n static shortLabel = 'PERF %'\r\n static optionsOrder = ['tickers'] as const\r\n static optionsLabels = { tickers: 'Tickers' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport {\r\n INDICATOR_LABEL_HEIGHT,\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n OFFSET,\r\n PADDING,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getSanitizedTicker } from '../utils'\r\nimport { getInstrument } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { Attrs, PerfConfig } from './configs/perf'\r\nimport Indicator from './indicator'\r\n\r\nconst DEFAULT_TICKERS = 'SPY,QQQ'\r\nconst NO_VALUE = ' - '\r\n\r\ntype PerfData = { lastValueIndex: number; values: Array }\r\nfunction getDefaultPerfData(): PerfData {\r\n return {\r\n lastValueIndex: 0,\r\n values: [],\r\n }\r\n}\r\n\r\nclass PricePerformance extends Indicator {\r\n static config = PerfConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n timeframe: string\r\n tickers = ''\r\n ready = false\r\n perf: ObjectHash = {}\r\n quotes: ObjectHash = {} // this is used in getAllQuotes() in charts/app/models/chart.ts\r\n indicatorLabelWidth: ObjectHash = {}\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n\r\n this.timeframe = this.model.chart().timeframe\r\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\r\n if (this.attrs.period && !this.tickers) {\r\n this.tickers = this.attrs.period\r\n }\r\n }\r\n\r\n async compute() {\r\n const data: ObjectHash = {}\r\n let hasCachedData = true\r\n this.getTickersAndTimeframe().forEach((quoteSettings) => {\r\n const quote = Quote.getFromCacheSync(quoteSettings)\r\n hasCachedData = hasCachedData && !!quote\r\n if (quote) {\r\n data[quoteSettings.ticker] = quote\r\n }\r\n })\r\n\r\n if (hasCachedData) {\r\n return this._compute(Object.keys(data), data)\r\n }\r\n\r\n const fetchedData = await Quote.getAll(this.getTickersAndTimeframe())\r\n if (fetchedData) {\r\n this._compute(Object.keys(fetchedData), fetchedData)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n _compute(tickers: string[], data: ObjectHash) {\r\n const { leftOffset } = this.model.chart()\r\n data[this.data.ticker] = this.data\r\n this.quotes = data\r\n this.perf = {}\r\n\r\n const firstVisibleBar = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n leftOffset,\r\n paneModel: this.model,\r\n })\r\n const lastVisibleBar = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n leftOffset,\r\n paneModel: this.model,\r\n chartWidth: this.contentWidth,\r\n })\r\n\r\n let min: number | null = null\r\n let max: number | null = null\r\n\r\n for (const ticker of [this.data.ticker, ...tickers]) {\r\n this.perf[ticker] = getDefaultPerfData()\r\n const d = data[ticker]\r\n const lastTickerTimestamp = d.date[d.date.length - 1]\r\n if (!d) {\r\n continue\r\n }\r\n const dateToIndex = d.getDateToIndex()\r\n let first = null\r\n let lastValue = null\r\n let dataIndex = -1\r\n for (let i = firstVisibleBar.barIndex; i <= lastVisibleBar.barIndex; i++) {\r\n const timestamp = this.data.getTimestampFomPositionX(i)\r\n dataIndex = dateToIndex[timestamp]\r\n\r\n if (typeof dataIndex === 'number') {\r\n first = first === null ? d.close[dataIndex] : first\r\n lastValue = (d.close[dataIndex] * 100) / (first ?? 0) - 100\r\n }\r\n\r\n this.perf[ticker].values[i] = null\r\n if (lastTickerTimestamp >= timestamp && lastValue !== null && !isNaN(lastValue)) {\r\n this.perf[ticker].values[i] = lastValue\r\n this.perf[ticker].lastValueIndex = i\r\n if (min === null || (lastValue !== null && min > lastValue)) min = lastValue\r\n if (max === null || (lastValue !== null && max < lastValue)) max = lastValue\r\n }\r\n }\r\n\r\n if (firstVisibleBar.barIndex > 0) {\r\n this.perf[ticker].values[firstVisibleBar.barIndex - 1] = this.perf[ticker].values[firstVisibleBar.barIndex]\r\n }\r\n if (lastVisibleBar.barIndex < this.data.barToDataIndex.length) {\r\n this.perf[ticker].values[lastVisibleBar.barIndex + 1] = this.perf[ticker].values[lastVisibleBar.barIndex]\r\n }\r\n }\r\n\r\n // > 2 because we need at least 2 bars to be able to calculate price perf and also we copy first visible bar value\r\n // to its index - 1 to ensure line is drawn from the very left edge of the chart\r\n // so first 2 values are the same and we need one more\r\n const canUseCustomMinMax = Object.values(this.perf).some(\r\n ({ values }) => values.filter((val) => typeof val === 'number').length > 2\r\n )\r\n const domainDefaults = this.getDomainDefaults(this.type)\r\n this.min = canUseCustomMinMax && min !== null ? min : domainDefaults.min\r\n this.max = canUseCustomMinMax && max !== null ? max : domainDefaults.max\r\n\r\n const fy = d3\r\n .scaleLinear()\r\n .range([0, this.contentHeight])\r\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\r\n if (!this.model.scaleRange) {\r\n fy.nice(10)\r\n }\r\n // @ts-expect-error - TODO scale.y types dont match\r\n this.model.scale.y = this.fy = fy\r\n this.ready = true\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.translate(0.5, 0.5)\r\n\r\n const allTickers = [...this.getTickers(), this.data.ticker]\r\n\r\n allTickers.forEach((ticker) => {\r\n context.set('strokeStyle', this.getTickerColor(ticker))\r\n context.beginPath()\r\n this.perf[ticker].values.forEach((value, index) => {\r\n const y = value !== null ? Math.round(this.fy(value)) : null\r\n if (y !== null && !isNaN(y)) {\r\n context.lineTo(this.model.scale.x(index), y)\r\n }\r\n })\r\n context.stroke()\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number, hasBackground = true) {\r\n if (!context || isNaN(crossIndex) || !this.ready) {\r\n return\r\n }\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n tickers.forEach((key, index) => {\r\n const tickerValue = this.perf[key]?.values[crossIndex] ?? null\r\n context.fillStyle = hasBackground ? Colors.canvasFill : getHEXWithSpecificAplha(Colors.canvasFill, 0.8)\r\n context.fillRect(\r\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! + 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] ?? 0) + PADDING.XXXS,\r\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\r\n )\r\n const text = new Text(\r\n {\r\n text: `${key} ${tickerValue !== null ? `${tickerValue.toFixed(2)}%` : NO_VALUE}`,\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: this.getTickerColor(key),\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n\r\n if (!hasBackground) {\r\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\r\n }\r\n text.render(context)\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || isNaN(crossIndex)) {\r\n return\r\n }\r\n\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let isVertical = true\r\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n const tickerText = new Text(\r\n {\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...IndicatorSettings.left.indicatorLabel.font,\r\n style: 'normal',\r\n }),\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\r\n },\r\n this.model\r\n )\r\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n let y =\r\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\r\n\r\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\r\n\r\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\r\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\r\n isVertical = false\r\n x += x + this.labelWidth\r\n } else {\r\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n tickers.forEach((key) => {\r\n const tickerValue = this.perf[key]?.values[crossIndex > -1 ? crossIndex : this.perf[key].lastValueIndex] ?? null\r\n tickerText.set({\r\n x,\r\n y,\r\n fillStyle: this.getTickerColor(key),\r\n text: `${key} ${tickerValue !== null ? `${tickerValue.toFixed(2)}%` : NO_VALUE}`,\r\n })\r\n const tickerTextWidth =\r\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\r\n if (\r\n !isVertical &&\r\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\r\n x + tickerTextWidth\r\n ) {\r\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\r\n y += tickerText.attrs.lineHeight\r\n tickerText.set({ x, y })\r\n }\r\n tickerText.render(context)\r\n\r\n if (isVertical) {\r\n y += tickerText.attrs.lineHeight\r\n } else {\r\n x += tickerTextWidth\r\n }\r\n })\r\n }\r\n\r\n getTickerColor(ticker: string) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n if (ticker === this.data.ticker) {\r\n return Colors.performanceIndicatorLabel\r\n }\r\n\r\n return ColorsSettings[this.getTickers().indexOf(ticker) % ColorsSettings.length]\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n return super.renderXAxis(context)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.ready) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', { size }),\r\n lineHeight,\r\n padding: {\r\n left: padding!.left!,\r\n right: padding!.right!,\r\n top: padding!.top!,\r\n bottom: padding!.bottom!,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n },\r\n this.model\r\n )\r\n const allTickers = [...this.getTickers(), this.data.ticker]\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n allTickers.forEach((ticker) => {\r\n const lastValue = this.perf[ticker]?.values[this.perf[ticker]?.lastValueIndex] ?? null\r\n if (lastValue !== null) {\r\n const labelSetting = {\r\n text: `${lastValue.toFixed(2)}%`,\r\n y: Math.round(this.fy(lastValue)),\r\n background: this.getTickerColor(ticker),\r\n }\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n super.renderLabelQuotePage(context)\r\n this.renderCrossTextQuotePage(context, this.perf[this.data.ticker].lastValueIndex, false)\r\n }\r\n\r\n getTickers() {\r\n return this.tickers\r\n .split(',')\r\n .filter((ticker, i, arr) => ticker && ticker !== this.data.ticker && arr.indexOf(ticker) === i)\r\n }\r\n\r\n getTickersAndTimeframe() {\r\n const chartModel = this.model.chart()\r\n const { timeframe, premarket, aftermarket, hasPatterns } = chartModel.quote()\r\n return this.getTickers().map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n chartUuid: chartModel.chart_layout().uuid,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n patterns: hasPatterns,\r\n },\r\n }))\r\n }\r\n\r\n set(values: Partial) {\r\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\r\n this.tickers = (this.tickers || '').toUpperCase()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n tickers: {\r\n type: 'text',\r\n label: 'Tickers',\r\n name: 'tickers',\r\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\r\n required: true,\r\n },\r\n }\r\n\r\n return {\r\n title: PerfConfig.label,\r\n inputs: PerfConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n tickers: 'At least one ticker has to be provided',\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'tickers':\r\n return this[key].length > 0\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return this.getIsChartPageSpecificFunctionality() ? PerfConfig.shortLabel : super.toString()\r\n }\r\n}\r\n\r\nexport default PricePerformance\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number | string\r\n momentum: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RMIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rmi\r\n static abbreviation = 'rmi'\r\n static label = 'Relative Momentum Index'\r\n static shortLabel = 'RMI'\r\n static optionsOrder = ['period', 'momentum'] as const\r\n static optionsLabels = { period: 'Period', momentum: 'Momentum' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, RMIConfig } from './configs/rmi'\r\nimport Indicator from './indicator'\r\n\r\nclass RMI extends Indicator {\r\n static config = RMIConfig\r\n\r\n rmi: number[] = []\r\n declare momentum: number\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, momentum })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.rmi = []\r\n let count = 0\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = this.momentum; i < this.data.close.length; i++) {\r\n u = d = 0\r\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\r\n u = this.data.close[i] - this.data.close[i - this.momentum]\r\n }\r\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\r\n d = this.data.close[i - this.momentum] - this.data.close[i]\r\n }\r\n\r\n if (count < this.period) {\r\n sumu += u\r\n sumd += d\r\n count++\r\n au = sumu / count\r\n ad = sumd / count\r\n } else {\r\n au = (au! * (this.period - 1) + u) / this.period\r\n ad = (ad! * (this.period - 1) + d) / this.period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\r\n }\r\n\r\n this.lastValue = this.rmi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.rmi)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n momentum: {\r\n type: 'number',\r\n label: 'Momentum',\r\n name: 'momentum',\r\n value: this.momentum ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: RMIConfig.label,\r\n inputs: RMIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n momentum: `${options.momentum.label} must be a whole number between ${options.momentum.min} and ${options.momentum.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'momentum':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default RMI\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class ROCConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Roc\r\n static abbreviation = 'roc'\r\n static label = 'Rate of Change %'\r\n static shortLabel = 'ROC'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Line from '../canvas/line'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, ROCConfig } from './configs/roc'\r\nimport Indicator from './indicator'\r\n\r\nclass ROC extends Indicator {\r\n static config = ROCConfig\r\n\r\n roc: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.roc = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\r\n }\r\n\r\n this.lastValue = this.roc.last() ?? null\r\n }\r\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.roc[dataIndex]),\r\n },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: ROCConfig.label,\r\n inputs: ROCConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default ROC\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RSIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rsi\r\n static abbreviation = 'rsi'\r\n static label = 'Relative Strength Index'\r\n static shortLabel = 'RSI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['rsi'] as const\r\n static calculatedValuesLabels = { rsi: 'RSI' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, RSIConfig } from '../indicators/configs/rsi'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rsi: number[]\r\n}\r\n\r\nexport class RsiCalculation extends MainCalculation {\r\n static config = RSIConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n 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 { RsiCalculation } from '../indicator-calculation/rsi'\r\nimport { Attrs, RSIConfig } from './configs/rsi'\r\nimport Indicator from './indicator'\r\n\r\nclass RSI extends Indicator {\r\n static config = RSIConfig\r\n\r\n rsiCalculation: RsiCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.rsiCalculation !== null) return\r\n\r\n this.rsiCalculation = new RsiCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.rsiCalculation.calculate()\r\n\r\n this.lastValue = this.rsiCalculation.calculatedValues.rsi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.rsiCalculation?.calculatedValues.rsi ?? [])\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rsiCalculation?.calculatedValues.rsi ?? [], this.period, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: RSIConfig.label,\r\n inputs: RSIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default RSI\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number | string\r\n baseLine: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RVOLConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rvol\r\n static abbreviation = 'rvol'\r\n static label = 'Relative Volume'\r\n static shortLabel = 'RVOL'\r\n static optionsOrder = ['period', 'baseLine'] as const\r\n static optionsLabels = { period: 'Period', baseLine: 'BaseLine' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Line from '../canvas/line'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, RVOLConfig } from './configs/rvol'\r\nimport Indicator from './indicator'\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 50,\r\n BaseLine: 1.0,\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\r\n\r\n return [period, baseLine]\r\n}\r\n\r\nclass RelativeVolume extends Indicator {\r\n static config = RVOLConfig\r\n\r\n rvol: number[] = []\r\n declare period: number\r\n declare baseLine: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\r\n super.set({ ...values, period, baseLine })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.rvol = []\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.period; i++) {\r\n sum += this.data.volume[i]\r\n }\r\n for (let i = this.period; i < this.data.volume.length; i++) {\r\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\r\n this.rvol[i] = sum > 0 ? this.data.volume[i] / (sum / this.period) : 0\r\n }\r\n\r\n this.lastValue = this.rvol.last() ?? null\r\n }\r\n\r\n const { min, max } =\r\n this.rvol.length > 0\r\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const dataIndex = this.data.barToDataIndex[index]\r\n const value = this.rvol[dataIndex]\r\n return [\r\n { color: value < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp, text: this.getValueLabel(value) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period + 1,\r\n drawBarCallback: (i, x) => {\r\n if (this.rvol[i] === undefined) return\r\n\r\n const baseLine = Math.round(this.fy(this.baseLine))\r\n const y = Math.round(this.fy(this.rvol[i]))\r\n\r\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\r\n },\r\n })\r\n\r\n const baseLineY = this.fy(this.baseLine)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(baseLineY),\r\n y2: Math.round(baseLineY),\r\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n baseLine: {\r\n type: 'number',\r\n label: 'Baseline',\r\n name: 'baseLine',\r\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\r\n required: true,\r\n step: 0.1,\r\n allowDecimal: true,\r\n min: 0,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: RVOLConfig.label,\r\n inputs: RVOLConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n baseLine: `${options.baseLine.label} must be a number between ${options.baseLine.min} and ${options.baseLine.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'baseLine':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `${super.toString()}, SMA`\r\n }\r\n}\r\n\r\nexport default RelativeVolume\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class RWIConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Rwi\r\n static abbreviation = 'rwi'\r\n static label = 'Random Walk Index'\r\n static shortLabel = 'RWI'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Text from '../canvas/text'\r\nimport { OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, RWIConfig } from './configs/rwi'\r\nimport Indicator from './indicator'\r\n\r\nclass RWI extends Indicator {\r\n static config = RWIConfig\r\n\r\n tr: number[] = []\r\n atr: number[] = []\r\n rwiHi: number[] = []\r\n rwiLo: number[] = []\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.tr = []\r\n this.atr = []\r\n this.rwiHi = []\r\n this.rwiLo = []\r\n let atr = 0\r\n\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n this.tr[i] = tr\r\n\r\n if (i < this.period) {\r\n atr += tr\r\n this.atr[i] = atr / (i + 1)\r\n if (i === this.period - 1) {\r\n atr /= this.period\r\n }\r\n } else {\r\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\r\n }\r\n }\r\n\r\n for (let i = this.period + 2; i < this.data.close.length; i++) {\r\n const h = this.data.high[i]\r\n const l = this.data.low[i]\r\n let trSum = this.tr[i - 1] + this.tr[i - 2]\r\n let count = 2\r\n let atrWeight = (trSum / count) * Math.sqrt(count)\r\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\r\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\r\n for (let j = i - 1; j > i - this.period + 1; j--) {\r\n trSum += this.tr[j - 2]\r\n count++\r\n atrWeight = (trSum / count) * Math.sqrt(count)\r\n if (atrWeight === 0) {\r\n continue\r\n }\r\n\r\n const hi = (h - this.data.low[j - 1]) / atrWeight\r\n if (hi > maxHi) {\r\n maxHi = hi\r\n }\r\n\r\n const lo = (this.data.high[j - 1] - l) / atrWeight\r\n if (lo > maxLo) {\r\n maxLo = lo\r\n }\r\n }\r\n this.rwiHi[i] = maxHi\r\n this.rwiLo[i] = maxLo\r\n }\r\n }\r\n const { min, max } =\r\n this.rwiHi.length > 0 || this.rwiLo.length > 0\r\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLineColors() {\r\n return {\r\n rwiLo: '#c80000',\r\n rwiHi: '#00a000',\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n if (this.data.close.length === 0) return []\r\n\r\n const lineColors = this.getLineColors()\r\n const dataIndex = this.data?.barToDataIndex[index]\r\n return [\r\n { color: lineColors.rwiLo, text: this.getValueLabel(this.rwiLo[dataIndex]) },\r\n { color: lineColors.rwiHi, text: this.getValueLabel(this.rwiHi[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#00a000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (this.rwiLo.length > 0) {\r\n textLabels.push({\r\n text: this.rwiLo.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiLo.last()!)),\r\n background: '#c80000',\r\n })\r\n }\r\n if (this.rwiHi.length > 0) {\r\n textLabels.push({\r\n text: this.rwiHi.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiHi.last()!)),\r\n background: '#00a000',\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: RWIConfig.label,\r\n inputs: RWIConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default RWI\r\n","import { format } from 'date-fns'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport { TIMEFRAME } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ntype ValuesType = Array<{\r\n isBeforeData: boolean\r\n timestamp: number\r\n value: number | null\r\n sourceIndex: number\r\n}>\r\n\r\nclass FinancialIndicator extends Indicator {\r\n values: ValuesType[] = []\r\n applyMinMaxPadding = true\r\n\r\n getComputedValuesAtDateIndex(_: number): ValuesType {\r\n throw Error('Implement getComputedValuesAtDateIndex method')\r\n }\r\n\r\n compute() {\r\n if (!isNaN(this.contentWidth) && this.isComputeNecessary()) {\r\n this.values = []\r\n\r\n if (this.data.financialAttachmentsData) {\r\n for (let i = 0; i < this.data.date.length; i++) {\r\n const computedValues = this.getComputedValuesAtDateIndex(i)\r\n this.values[i] = computedValues.length > 0 ? computedValues : (this.values[i - 1] ?? [])\r\n }\r\n }\r\n }\r\n\r\n this.lastValue = this.getLastValue()\r\n const { min, max } = this.computeVisibleMinMax()\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLastValue() {\r\n return this.getValueAtDataIndex(this.values.length - 1)\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return super.computeVisibleMinMax(this.values.map((values) => values[values.length - 1]?.value ?? Number.NaN))\r\n }\r\n\r\n getValueAtDataIndex(dataIndex: number) {\r\n const vals = this.values[dataIndex]\r\n const val = vals?.[(vals?.length ?? 0) - 1] ?? null\r\n return val?.value\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const shouldShowDate = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3].includes(this.data.timeframe)\r\n const dataIndex = this.data.barToDataIndex[index]\r\n const values = this.values[dataIndex]\r\n if (!values) {\r\n return []\r\n }\r\n\r\n return values.map(({ timestamp, value, isBeforeData }) => {\r\n const valueLabel = this.getValueLabel(value)\r\n\r\n return {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text:\r\n valueLabel !== null\r\n ? `${valueLabel} ${\r\n values.length >= 2 || isBeforeData || shouldShowDate\r\n ? `(${format(dateFromUnixTimestamp(timestamp), 'MMM dd')})`\r\n : ''\r\n }`\r\n : null,\r\n }\r\n })\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const translate = getTranslate({ context, xOffset: 0.5, yOffset: 0.5 })\r\n translate.do()\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const val = this.getValueAtDataIndex(i)\r\n context.lineTo(x, Math.round(this.fy(val!)))\r\n },\r\n })\r\n context.stroke()\r\n translate.undo()\r\n }\r\n\r\n formatAxis(value: number) {\r\n return this.getValueLabel(value) ?? value.toString()\r\n }\r\n}\r\n\r\nexport default FinancialIndicator\r\n","import { QuoteFinancialAttachment } from '../constants/common'\r\nimport { ShrtflConfig } from './configs/shrtfl'\r\nimport FinancialIndicator from './financialIndicator'\r\n\r\nclass Shrtfl extends FinancialIndicator {\r\n static config = ShrtflConfig\r\n\r\n getComputedValuesAtDateIndex(dateIndex: number) {\r\n const { timestampToFinancialsIndexesMap, alignedFinancialAttachmentsData } = this.data\r\n const timestampKey = this.data.date[dateIndex]?.toString() ?? ''\r\n const sourceIndexes = timestampToFinancialsIndexesMap[QuoteFinancialAttachment.shortInterest]?.[timestampKey] ?? []\r\n const alignedData = alignedFinancialAttachmentsData[QuoteFinancialAttachment.shortInterest] ?? []\r\n let isBeforeData = false\r\n\r\n if (sourceIndexes.length === 0 && dateIndex === 0) {\r\n const lastBeforeDateFinancialsDataIndex = alignedData.findLastIndex(\r\n ({ timestamp }) => timestamp < this.data.date[dateIndex]\r\n )\r\n if (lastBeforeDateFinancialsDataIndex >= 0) {\r\n sourceIndexes.push(lastBeforeDateFinancialsDataIndex)\r\n isBeforeData = true\r\n }\r\n }\r\n\r\n return sourceIndexes.map((si) => {\r\n const { timestamp, shortInterest, sharesFloat } = alignedData[si]\r\n let value: number | null = null\r\n if (shortInterest !== null && sharesFloat !== null) {\r\n value = (shortInterest / sharesFloat) * 100\r\n }\r\n\r\n return {\r\n isBeforeData,\r\n timestamp,\r\n value,\r\n sourceIndex: si,\r\n }\r\n })\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D, options: { lastValueSuffix?: string } = {}) {\r\n return super.renderYAxis(context, { ...options, lastValueSuffix: '%' })\r\n }\r\n\r\n getValueLabel(value: number | null | undefined) {\r\n return super.getValueLabel(value, '%')\r\n }\r\n\r\n getIsValid(): boolean {\r\n return true\r\n }\r\n}\r\n\r\nexport default Shrtfl\r\n","import { QuoteFinancialAttachment } from '../constants/common'\r\nimport { ShrtraConfig } from './configs/shrtra'\r\nimport FinancialIndicator from './financialIndicator'\r\n\r\nclass Shrtra extends FinancialIndicator {\r\n static config = ShrtraConfig\r\n\r\n getComputedValuesAtDateIndex(dateIndex: number) {\r\n const { timestampToFinancialsIndexesMap, alignedFinancialAttachmentsData } = this.data\r\n const timestampKey = this.data.date[dateIndex]?.toString() ?? ''\r\n const sourceIndexes = timestampToFinancialsIndexesMap[QuoteFinancialAttachment.shortInterest]?.[timestampKey] ?? []\r\n const alignedData = alignedFinancialAttachmentsData[QuoteFinancialAttachment.shortInterest] ?? []\r\n let isBeforeData = false\r\n\r\n if (sourceIndexes.length === 0 && dateIndex === 0) {\r\n const lastBeforeDateFinancialsDataIndex = alignedData.findLastIndex(\r\n ({ timestamp }) => timestamp < this.data.date[dateIndex]\r\n )\r\n if (lastBeforeDateFinancialsDataIndex >= 0) {\r\n sourceIndexes.push(lastBeforeDateFinancialsDataIndex)\r\n isBeforeData = true\r\n }\r\n }\r\n\r\n return sourceIndexes.map((si) => {\r\n const { timestamp, shortInterest, averageVolume } = alignedData[si]\r\n let value: number | null = null\r\n if (shortInterest !== null && averageVolume !== null) {\r\n value = (shortInterest / averageVolume) * 1_000_000\r\n }\r\n\r\n return {\r\n isBeforeData,\r\n timestamp,\r\n value,\r\n sourceIndex: si,\r\n }\r\n })\r\n }\r\n\r\n getIsValid(): boolean {\r\n return true\r\n }\r\n}\r\n\r\nexport default Shrtra\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: string | number\r\n dPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n kPeriod: number\r\n}\r\n\r\nexport class StofaConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Stofa\r\n static abbreviation = 'stofa'\r\n static label = 'Stochastics FAST'\r\n static shortLabel = 'Stochastics FAST'\r\n static optionsOrder = ['period', 'dPeriod']\r\n\r\n static optionsLabels = { period: 'Period', dPeriod: 'D Period' }\r\n\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class StofuConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Stofu\r\n static abbreviation = 'stofu'\r\n static label = 'Stochastics FULL'\r\n static shortLabel = 'Stochastics FULL'\r\n static optionsOrder = ['period', 'dPeriod', 'kPeriod']\r\n\r\n static optionsLabels = { period: 'Period', kPeriod: 'K Period', dPeriod: 'D Period' } as { [key: string]: string }\r\n\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import Line from '../canvas/line'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, StofuConfig } from './configs/stofu'\r\nimport Indicator from './indicator'\r\n\r\nclass Stochastics extends Indicator {\r\n static config = StofuConfig\r\n\r\n k: number[] = []\r\n k1: number[] = []\r\n d: number[] = []\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n const period = Math.min(this.period, this.data.close.length - 1)\r\n let dCount, dSum, k\r\n this.k1 = []\r\n this.k = []\r\n this.d = []\r\n let kSum = (dSum = 0)\r\n let kCount = (dCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\r\n if (highestHigh === lowestLow) {\r\n k = 100\r\n }\r\n this.k1[i] = k\r\n if (this.kPeriod > 1) {\r\n kSum += k\r\n kCount++\r\n if (kCount > this.kPeriod) {\r\n kSum -= this.k1[i - this.kPeriod]\r\n kCount--\r\n }\r\n k = kSum / kCount\r\n }\r\n\r\n dSum += k\r\n dCount++\r\n if (dCount > this.dPeriod) {\r\n dSum -= this.k[i - this.dPeriod]\r\n dCount--\r\n }\r\n\r\n const d = dSum / dCount\r\n this.k[i] = k\r\n this.d[i] = d\r\n }\r\n\r\n this.lastValue = this.k.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getLineColors() {\r\n return {\r\n k: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line,\r\n d: '#c80000',\r\n }\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const lineColors = this.getLineColors()\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n { color: lineColors.k, text: this.getValueLabel(this.k[dataIndex]) },\r\n { color: lineColors.d, text: this.getValueLabel(this.d[dataIndex]) },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(50)),\r\n y2: Math.round(this.fy(50)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(20)),\r\n y2: Math.round(this.fy(20)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(80)),\r\n y2: Math.round(this.fy(80)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n const lineColors = this.getLineColors()\r\n context.set('strokeStyle', lineColors.k)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.k[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', lineColors.d)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.d[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n kPeriod: {\r\n type: 'number',\r\n label: 'K Period',\r\n name: 'kPeriod',\r\n value: this.kPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n dPeriod: {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: StofuConfig.label,\r\n inputs: StofuConfig.inputsOrder.map((item) => options[item as keyof Attrs]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n dPeriod: `${options.dPeriod.label} must be a whole number between ${options.dPeriod.min} and ${options.dPeriod.max}`,\r\n kPeriod: `${options.kPeriod.label} must be a whole number between ${options.kPeriod.min} and ${options.kPeriod.max}`,\r\n } as {\r\n period: string\r\n dPeriod: string\r\n kPeriod?: string\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n case 'kPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default Stochastics\r\n","import Pane from '../models/pane'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, Options, StofaConfig } from './configs/stofa'\r\nimport Stochastics from './stofu'\r\n\r\nclass StochasticsFast extends Stochastics {\r\n static config = StofaConfig\r\n\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.kPeriod = 1\r\n }\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n dPeriod: {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: StofaConfig.label,\r\n inputs: StofaConfig.inputsOrder.map((item) => options[item as keyof Options]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n dPeriod: `${options.dPeriod.label} must be a whole number between ${options.dPeriod.min} and ${options.dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default StochasticsFast\r\n","import { IndicatorType } from '../../constants/common'\r\nimport { StofaConfig } from './stofa'\r\n\r\nexport type Options = {\r\n period: string | number\r\n dPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n kPeriod: number\r\n}\r\n\r\nexport class StoslConfig extends StofaConfig {\r\n static type = IndicatorType.Stosl\r\n static abbreviation = 'stosl'\r\n static label = 'Stochastics SLOW'\r\n static shortLabel = 'Stochastics SLOW'\r\n}\r\n","import { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, Options, StoslConfig } from './configs/stosl'\r\nimport Stochastics from './stofu'\r\n\r\nclass StochasticsSlow extends Stochastics {\r\n static config = StoslConfig\r\n\r\n kPeriod = 3\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n dPeriod: {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: StoslConfig.label,\r\n inputs: StoslConfig.inputsOrder.map((item) => options[item as keyof Options]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n dPeriod: `${options.dPeriod.label} must be a whole number between ${options.dPeriod.min} and ${options.dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default StochasticsSlow\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class TRIXConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Trix\r\n static abbreviation = 'trix'\r\n static label = 'TRIX'\r\n static shortLabel = 'TRIX'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n static calculatedValuesOrder = ['trix'] as const\r\n static calculatedValuesLabels = { trix: 'TRIX' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Attrs, TRIXConfig } from '../indicators/configs/trix'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n trix: number[]\r\n}\r\n\r\nexport class TrixCalculation extends MainCalculation {\r\n static config = TRIXConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { 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 { TrixCalculation } from '../indicator-calculation/trix'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, TRIXConfig } from './configs/trix'\r\nimport Indicator from './indicator'\r\n\r\nclass Trix extends Indicator {\r\n static config = TRIXConfig\r\n\r\n trixCalculation: TrixCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.trixCalculation = new TrixCalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.trixCalculation.calculate()\r\n this.lastValue = this.trixCalculation.calculatedValues.trix.last() ?? null\r\n }\r\n const trix = this.trixCalculation?.calculatedValues.trix ?? []\r\n const { min, max } = trix.length > 0 ? this.computeVisibleMinMax(trix) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const value = this.trixCalculation?.calculatedValues.trix[i]\r\n if (value) context.lineTo(x, ~~this.fy(value))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.getChartLayoutSettings().IndicatorSettings.general.Colors.line!,\r\n text: this.getValueLabel(this.trixCalculation?.calculatedValues.trix[dataIndex]),\r\n },\r\n ]\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: TRIXConfig.label,\r\n inputs: TRIXConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default Trix\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period1: number\r\n period2: number\r\n period3: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: string\r\n}\r\n\r\nexport class UltConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Ult\r\n static abbreviation = 'ult'\r\n static label = 'Ultimate Oscillator'\r\n static shortLabel = 'ULT'\r\n static optionsOrder = ['period1', 'period2', 'period3'] as const\r\n static optionsLabels = {\r\n period1: 'Period 1',\r\n period2: 'Period 2',\r\n period3: 'Period 3',\r\n }\r\n\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, UltConfig } from './configs/ult'\r\nimport Indicator from './indicator'\r\n\r\nclass UltimateOscillator extends Indicator {\r\n static config = UltConfig\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(period1, period2, period3)\r\n }\r\n\r\n declare period1: number\r\n declare period2: number\r\n declare period3: number\r\n ult: number[] = []\r\n tr: number[] = []\r\n bp: number[] = []\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period1, period2, period3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.ult = []\r\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\r\n const tr = []\r\n const bp = []\r\n let bpSum1 = (bpSum2 = bpSum3 = 0)\r\n let trSum1 = (trSum2 = trSum3 = 0)\r\n let count1 = (count2 = count3 = 0)\r\n let avg2, avg3\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\r\n tr[i] = Math.max(this.data.high[i], this.data.close[i - 1]) - Math.min(this.data.low[i], this.data.close[i - 1])\r\n\r\n bpSum1 += bp[i]\r\n trSum1 += tr[i]\r\n count1++\r\n if (count1 > this.period1) {\r\n bpSum1 -= bp[i - this.period1]\r\n trSum1 -= tr[i - this.period1]\r\n }\r\n\r\n bpSum2 += bp[i]\r\n trSum2 += tr[i]\r\n count2++\r\n if (count2 > this.period2) {\r\n bpSum2 -= bp[i - this.period2]\r\n trSum2 -= tr[i - this.period2]\r\n }\r\n\r\n bpSum3 += bp[i]\r\n trSum3 += tr[i]\r\n count3++\r\n if (count3 > this.period3) {\r\n bpSum3 -= bp[i - this.period3]\r\n trSum3 -= tr[i - this.period3]\r\n }\r\n\r\n let avg1 = (avg2 = avg3 = 0)\r\n if (trSum1 > 0) {\r\n avg1 = bpSum1 / trSum1\r\n }\r\n if (trSum2 > 0) {\r\n avg2 = bpSum2 / trSum2\r\n }\r\n if (trSum3 > 0) {\r\n avg3 = bpSum3 / trSum3\r\n }\r\n\r\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\r\n }\r\n\r\n this.lastValue = this.ult.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.ult)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period1: {\r\n type: 'number',\r\n label: 'Period 1',\r\n name: 'period1',\r\n value: this.period1 ?? 7,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n period2: {\r\n type: 'number',\r\n label: 'Period 2',\r\n name: 'period2',\r\n value: this.period2 ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n period3: {\r\n type: 'number',\r\n label: 'Period 3',\r\n name: 'period3',\r\n value: this.period3 ?? 28,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: UltConfig.label,\r\n inputs: UltConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period1: `${options.period1.label} must be a whole number between ${options.period1.min} and ${options.period1.max}`,\r\n period2: `${options.period2.label} must be a whole number between ${options.period2.min} and ${options.period2.max}`,\r\n period3: `${options.period3.label} must be a whole number between ${options.period3.min} and ${options.period3.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period1':\r\n case 'period2':\r\n case 'period3':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default UltimateOscillator\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport class VolConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Vol\r\n static abbreviation = 'vol'\r\n static label = 'Volume'\r\n static shortLabel = 'Volume'\r\n}\r\n","import math from '../helpers/math'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { VolConfig } from './configs/vol'\r\nimport Indicator from './indicator'\r\n\r\nclass Volume extends Indicator {\r\n static config = VolConfig\r\n\r\n compute() {\r\n const { min, max } =\r\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n this.lastValue = this.data.volume.last() ?? null\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const dataIndex = this.data.barToDataIndex[index]\r\n return [\r\n {\r\n color: this.data.close[dataIndex] < this.data.open[dataIndex] ? Colors.volumeTrendDown : Colors.volumeTrendUp,\r\n text: this.getValueLabel(this.data.volume[dataIndex]),\r\n },\r\n ]\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.fy(this.data.volume[i]))\r\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\r\n },\r\n })\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: VolConfig.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n}\r\n\r\nexport default Volume\r\n","import { IndicatorType } from '../../constants/common'\r\nimport IndicatorBaseConfig from './indicatorBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport type Attrs = Options\r\n\r\nexport class WRConfig extends IndicatorBaseConfig {\r\n static type = IndicatorType.Wr\r\n static abbreviation = 'wr'\r\n static label = 'Williams %R'\r\n static shortLabel = 'W%R'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = this.optionsOrder\r\n static inputsLabels = this.optionsLabels\r\n}\r\n","import { Attrs, WRConfig } from './configs/wr'\r\nimport Indicator from './indicator'\r\n\r\nclass WilliamsR extends Indicator {\r\n static config = WRConfig\r\n\r\n declare period: number\r\n r: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.r = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n this.r[i] = 0\r\n if (highestHigh - lowestLow > 0) {\r\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\r\n }\r\n }\r\n\r\n this.lastValue = this.r.last() ?? null\r\n }\r\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n getValueLabelsAtIndex(index: number) {\r\n return this.getOversoldOverboughtValueLabelsAtIndex(index, this.r)\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n }\r\n\r\n return {\r\n title: WRConfig.label,\r\n inputs: WRConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nexport default WilliamsR\r\n","import { IndicatorType } from '../constants/common'\r\nimport adx from './adx'\r\nimport aro from './aro'\r\nimport aroosc from './aroosc'\r\nimport atr from './atr'\r\nimport cci from './cci'\r\nimport cot from './cot'\r\nimport fi from './fi'\r\nimport indicator from './indicator'\r\nimport macd from './macd'\r\nimport mfi from './mfi'\r\nimport none from './none'\r\nimport obv from './obv'\r\nimport perf from './perf'\r\nimport rmi from './rmi'\r\nimport roc from './roc'\r\nimport rsi from './rsi'\r\nimport rvol from './rvol'\r\nimport rwi from './rwi'\r\nimport shrtfl from './shrtfl'\r\nimport shrtra from './shrtra'\r\nimport stofa from './stofa'\r\nimport stofu from './stofu'\r\nimport stosl from './stosl'\r\nimport trix from './trix'\r\nimport ult from './ult'\r\nimport vol from './vol'\r\nimport wr from './wr'\r\n\r\n// TODO check if this doesn't break saved charts\r\nexport const indicatorsByType = Object.freeze({\r\n [IndicatorType.Indicator]: indicator,\r\n [IndicatorType.None]: none,\r\n [IndicatorType.Adx]: adx,\r\n [IndicatorType.Aro]: aro,\r\n [IndicatorType.Aroosc]: aroosc,\r\n [IndicatorType.Atr]: atr,\r\n [IndicatorType.Cci]: cci,\r\n [IndicatorType.Cot]: cot,\r\n [IndicatorType.Fi]: fi,\r\n [IndicatorType.Macd]: macd,\r\n [IndicatorType.Mfi]: mfi,\r\n [IndicatorType.Obv]: obv,\r\n [IndicatorType.Perf]: perf,\r\n [IndicatorType.Rmi]: rmi,\r\n [IndicatorType.Roc]: roc,\r\n [IndicatorType.Rsi]: rsi,\r\n [IndicatorType.Rvol]: rvol,\r\n [IndicatorType.Rwi]: rwi,\r\n [IndicatorType.Stofa]: stofa,\r\n [IndicatorType.Stofu]: stofu,\r\n [IndicatorType.Stosl]: stosl,\r\n [IndicatorType.Trix]: trix,\r\n [IndicatorType.Ult]: ult,\r\n [IndicatorType.Vol]: vol,\r\n [IndicatorType.Wr]: wr,\r\n [IndicatorType.Shrtfl]: shrtfl,\r\n [IndicatorType.Shrtra]: shrtra,\r\n})\r\n\r\nexport const financialIndicators = Object.freeze([IndicatorType.Shrtfl, IndicatorType.Shrtra])\r\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol, ...financialIndicators])\r\n","export const publishModalAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\r\n cacheKey: 'modals-publish',\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nimport { DefaultSpineEvents } from '../../types/shared'\r\nimport ElementModule from '../canvas/element'\r\nimport IndicatorModule from '../indicators/indicator'\r\nimport { useForceUpdate } from '../utils/force-update'\r\nimport { getJSONReplacerFunc } from '../utils/helpers'\r\n\r\ninterface UseModelStateOptions {\r\n watchProperties?: T extends null ? never[] : Array\r\n listenOnEvents?: string[]\r\n}\r\n\r\nconst getIsSpineObject = (value: any) =>\r\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\r\n\r\nconst getWatchedPropValue = (\r\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\r\n model: Model | null\r\n) => {\r\n if (typeof watchedProp === 'function') {\r\n const value = watchedProp.call(model)\r\n\r\n if (value && !getIsSpineObject(value)) {\r\n throw Error('Watched prop should have a primitive value or a spine object')\r\n }\r\n\r\n if (typeof value?.all === 'function') {\r\n return value.all()\r\n }\r\n\r\n return value\r\n }\r\n\r\n if (typeof watchedProp === 'object') {\r\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\r\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\r\n }\r\n\r\n return watchedProp\r\n}\r\n\r\nconst getWatchedProps = (model: Model | null, props?: Array) =>\r\n props?.reduce(\r\n (acc, propKey) => ({\r\n ...acc,\r\n [propKey]: getWatchedPropValue(model?.[propKey], model),\r\n }),\r\n {} as Partial\r\n )\r\n\r\nconst getAreWatchedPropsEqual = (\r\n currentValue: Value,\r\n previousValue: Value\r\n) => {\r\n if (currentValue instanceof Spine.Model) {\r\n return currentValue.eql(previousValue)\r\n }\r\n\r\n return currentValue === previousValue\r\n}\r\n\r\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\r\n\r\nexport function useModelState(\r\n model: Model,\r\n options: UseModelStateOptions = {}\r\n) {\r\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\r\n const stringifiedOptions = JSON.stringify(options)\r\n const { forceUpdate } = useForceUpdate()\r\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\r\n\r\n React.useEffect(() => {\r\n const handleModelChange = () => {\r\n const hasChange = watchProperties.some((propKey) => {\r\n const currentValue = getWatchedPropValue(model?.[propKey], model)\r\n const previousValue = watchedPropertiesRef.current?.[propKey]\r\n\r\n if (Array.isArray(currentValue)) {\r\n return (\r\n !Array.isArray(previousValue) ||\r\n currentValue.length !== previousValue.length ||\r\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\r\n )\r\n }\r\n\r\n return !getAreWatchedPropsEqual(currentValue, previousValue)\r\n })\r\n\r\n if (hasChange) {\r\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\r\n forceUpdate()\r\n }\r\n }\r\n\r\n const spineEvents = listenOnEvents.join(' ')\r\n\r\n model?.bind(spineEvents, handleModelChange)\r\n\r\n forceUpdate()\r\n\r\n return () => {\r\n model?.unbind(spineEvents, handleModelChange)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [model?.cid, stringifiedOptions, forceUpdate])\r\n\r\n return model\r\n}\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPane,\r\n CustomSpineEvents,\r\n Instrument,\r\n ObjectHash,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport BaseChart from '../charts/base_chart'\r\nimport PerfChart from '../charts/perf_chart'\r\nimport {\r\n DateRangeType,\r\n IndicatorType,\r\n QuotePollingIntervalInMs,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\r\nimport IndicatorBaseConfig from '../indicators/configs/indicatorBaseConfig'\r\nimport COT from '../indicators/cot'\r\nimport PricePerformance from '../indicators/perf'\r\nimport Utils from '../utils'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\r\nimport ChartLayout from './chart_layout'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\nimport { getChartLayoutSettings } from './settings'\r\n\r\nclass Chart extends Spine.Model {\r\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\r\n this.configure(\r\n 'Chart',\r\n 'width',\r\n 'height',\r\n 'timeframe',\r\n 'dateRange',\r\n 'scale',\r\n 'leftOffset',\r\n 'ticker',\r\n 'instrument',\r\n 'fx',\r\n 'fy',\r\n 'zoomFactor',\r\n 'refreshData',\r\n 'stretch',\r\n 'isHideDrawingsActive',\r\n 'isScrolled',\r\n 'firstBarClose',\r\n 'premarket',\r\n 'aftermarket',\r\n 'hasChartEvents'\r\n )\r\n this.hasMany('panes', paneModel)\r\n this.belongsTo('quote', quoteModel)\r\n this.belongsTo('chart_layout', chartLayoutModel)\r\n }\r\n\r\n declare stretch: boolean\r\n declare chart_layout_id: string\r\n declare chart_layout: () => ChartLayout\r\n declare quote_id: string\r\n declare quote: () => Quote\r\n declare panes: () => Collection\r\n declare refreshData: boolean | number\r\n declare dateRange: DateRangeType\r\n declare width: number\r\n declare height: number\r\n declare timeframe: TIMEFRAME\r\n declare leftOffset: number\r\n declare ticker: string\r\n declare instrument: Instrument\r\n declare fx: (x: number) => number\r\n declare fy: (x: number) => number\r\n declare zoomFactor: number\r\n declare isHideDrawingsActive: boolean\r\n declare isScrolled: boolean\r\n declare scale: ScaleType\r\n declare firstBarClose: number\r\n declare premarket: boolean\r\n declare aftermarket: boolean\r\n declare hasChartEvents: boolean\r\n\r\n getChartPane() {\r\n return this.panes()\r\n .all()\r\n .find((pane: Pane) =>\r\n pane\r\n .elements()\r\n .all()\r\n .some((el) => el.isChart())\r\n )\r\n }\r\n\r\n getChartElement() {\r\n for (const pane of this.panes().all()) {\r\n for (const el of pane.elements().all()) {\r\n if (el.isChart()) {\r\n return el\r\n }\r\n }\r\n }\r\n }\r\n\r\n getChartType() {\r\n return this.getChartElement()?.instance.type\r\n }\r\n\r\n getRefreshInterval() {\r\n let defaultRefreshInterval: number | null = null\r\n if (typeof this.refreshData === 'number') {\r\n defaultRefreshInterval = this.refreshData\r\n } else if (this.refreshData === true) {\r\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\r\n }\r\n\r\n const isStock = this.instrument === Instrument.Stock\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\r\n if (!isPremium) {\r\n customRefreshInterval = QuotePollingIntervalInMs.Free\r\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\r\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\r\n }\r\n\r\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\r\n }\r\n\r\n toObject() {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toObject())\r\n return {\r\n width: this.width,\r\n dateRange: this.dateRange,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toConfig(omitKeys))\r\n return omit(\r\n {\r\n width: this.width,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.panes()\r\n .all()\r\n .forEach((pane) => {\r\n pane.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart_layout())\r\n }\r\n\r\n getIsDisabled() {\r\n return this.quote()?.close.length === 0\r\n }\r\n\r\n getIsScrollable() {\r\n return this.chart_layout().scrollable\r\n }\r\n\r\n getAllPanes() {\r\n return this.panes().all()\r\n }\r\n\r\n getAllValidPanes() {\r\n const cotKeys = Object.keys(this.quote().COTs ?? {})\r\n return this.getAllPanes().filter((pane) => {\r\n const mainElement = pane.mainElement()\r\n if (mainElement?.instance.type === IndicatorType.Cot) {\r\n // Type of mainElement is `Element` but it can be an indicator too\r\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\r\n }\r\n return true\r\n })\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\r\n }\r\n\r\n getAllQuotes(): Quote[] {\r\n const perfQuotes = this.getAllElements()\r\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\r\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\r\n\r\n let quotePerfTickers: Quote[] = []\r\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\r\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\r\n if (perfChart) {\r\n quotePerfTickers = Quote.select(\r\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\r\n )\r\n }\r\n }\r\n\r\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\r\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\r\n )\r\n }\r\n\r\n createPaneCascade(paneProperties: ChartConfigChartPane) {\r\n const paneModel = this.panes().create(paneProperties)\r\n\r\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\r\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\r\n paneModel.elements().create({ instance, zIndex, elementId })\r\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\r\n })\r\n\r\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\r\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\r\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\r\n }\r\n\r\n return paneModel\r\n }\r\n\r\n updateAttributesAndSync(value: T) {\r\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\r\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\r\n .flatMap(([_, modelAttr]) => modelAttr)\r\n this.updateAttributes(value)\r\n\r\n if (attrsInSync.length > 0) {\r\n this.chart_layout()\r\n .getAllCharts()\r\n .forEach((chartModel) => {\r\n if (this.eql(chartModel)) {\r\n return\r\n }\r\n const newAttrs: ObjectHash = {}\r\n attrsInSync.forEach((modelAttr) => {\r\n if (value.hasOwnProperty(modelAttr)) {\r\n newAttrs[modelAttr] = value[modelAttr]\r\n }\r\n })\r\n chartModel.updateAttributes(newAttrs)\r\n })\r\n }\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return this.chart_layout().getIsChartPartInSync(chartPart)\r\n }\r\n\r\n getHasPatterns() {\r\n return this.getAllElements().some((element) => {\r\n if ('hasOverlay' in element.instance) {\r\n return (element.instance as BaseChart).hasOverlay?.('patterns')\r\n }\r\n\r\n return false\r\n })\r\n }\r\n\r\n getQuoteFinancialAttachments() {\r\n return this.getAllElements()\r\n .filter((el) => el.isFinancialIndicator())\r\n .flatMap(\r\n (indicatorElement) =>\r\n ((indicatorElement.instance as unknown as any).config as typeof IndicatorBaseConfig).quoteFinancialAttachments\r\n )\r\n .filter((quoteFinancialAttachment, index, arr) => arr.indexOf(quoteFinancialAttachment) === index)\r\n }\r\n\r\n getQuoteRawTicker(): string | null {\r\n return this.quote()?.getRawTicker() ?? null\r\n }\r\n\r\n setChartEvents(chartEvents?: Array, shouldClear = false) {\r\n const chartPane = this.getChartPane()\r\n if (!chartPane) {\r\n return\r\n }\r\n const allChartEvents = chartPane.chartEvents().all()\r\n if (shouldClear) {\r\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\r\n }\r\n\r\n const events = shouldClear\r\n ? chartEvents\r\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\r\n\r\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\r\n const newChartEvent = chartPane.chartEvents().create({\r\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\r\n elementId,\r\n })\r\n newChartEvent.instance.updateScales()\r\n })\r\n\r\n chartPane.updateChartEventsZIndexes()\r\n }\r\n}\r\n\r\nexport default Chart\r\n","/*\r\n * it converts it to numbered index and it causes problems later on\r\n * the reason it's not just numbered enum is that it when used in const below\r\n * */\r\nexport enum ChartSyncablePart {\r\n Crosshair = 'crosshair',\r\n Ticker = 'ticker',\r\n Timeframe = 'timeframe',\r\n}\r\n\r\nexport const ChartPartToAttrsSyncMap = {\r\n [ChartSyncablePart.Ticker]: ['ticker'],\r\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\r\n}\r\n\r\nexport const ChartSyncableParts = [\r\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\r\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\r\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\r\n]\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\r\nimport { DrawingSetting } from '../controllers/toolbar/interfaces'\r\nimport Indicator from '../indicators/indicator'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartSyncablePart } from './chart/contstants'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Pane from './pane'\r\nimport { QuoteFetchType } from './quote/constants'\r\n\r\nclass ChartLayout extends Spine.Model {\r\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\r\n this.configure(\r\n 'ChartLayout',\r\n 'layout',\r\n 'activeChart',\r\n 'activePane',\r\n 'activeChartEvent',\r\n 'width',\r\n 'height',\r\n 'editable',\r\n 'canChangeTicker',\r\n 'scrollable',\r\n 'initialScrollable',\r\n 'cross',\r\n 'editors',\r\n 'theme',\r\n 'settings',\r\n 'isWheelZoomEnabled',\r\n 'specificChartFunctionality',\r\n 'isLargeChart',\r\n 'isHideDrawingsActive',\r\n 'isPreserveDrawingsActive',\r\n 'isLockDrawingsActive',\r\n 'isDrawingModeContinuousActive',\r\n 'uuid',\r\n 'isTouchCrossActive',\r\n 'defaultZoomFactor',\r\n 'syncChartParts',\r\n 'isInit',\r\n 'willDestroy',\r\n 'idea'\r\n )\r\n this.hasMany('charts', chartModel)\r\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\r\n }\r\n\r\n declare layout: LayoutType\r\n declare activeChart: Chart\r\n declare activePane?: Pane\r\n declare activeChartEvent?: ChartEventElement\r\n declare width: number\r\n declare height: number\r\n declare editable: boolean\r\n declare canChangeTicker: boolean\r\n declare scrollable: boolean\r\n declare readonly initialScrollable: boolean\r\n declare cross: boolean\r\n declare editors: ChartEditorEnum[]\r\n declare theme: Theme\r\n declare settings: ISettings\r\n declare isWheelZoomEnabled: boolean\r\n declare specificChartFunctionality: SpecificChartFunctionality\r\n declare isLargeChart?: boolean\r\n declare charts: () => Collection\r\n declare isHideDrawingsActive: boolean\r\n declare isPreserveDrawingsActive: boolean\r\n declare isLockDrawingsActive: boolean\r\n declare isDrawingModeContinuousActive: boolean\r\n declare uuid: string\r\n declare isTouchCrossActive?: boolean\r\n declare defaultZoomFactor: number\r\n declare syncChartParts: ChartSyncablePart[]\r\n declare idea?: IIdea\r\n declare isInit?: boolean\r\n declare willDestroy?: boolean\r\n declare drawingsInternalStore: () => DrawingsInternalStore\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n\r\n if (!getIsSSr()) {\r\n this.bind('update', (model: ChartLayout) => {\r\n if (!window.FinvizSettings.toolsState) {\r\n window.FinvizSettings.toolsState = {}\r\n }\r\n window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings] = model.isPreserveDrawingsActive\r\n })\r\n }\r\n }\r\n\r\n getPaneWithSelection() {\r\n for (const pane of this.getAllPanes()) {\r\n if (pane.selection) {\r\n return pane\r\n }\r\n }\r\n }\r\n\r\n toObject() {\r\n const charts = this.getAllCharts().map((chart) => chart.toObject())\r\n return {\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n }\r\n }\r\n\r\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\r\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\r\n return JSON.parse(\r\n JSON.stringify(\r\n omit(\r\n {\r\n ...this.settings.ChartSettings.center,\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n colors: this.settings.ChartSettings.general.Colors,\r\n specificChartFunctionality: this.specificChartFunctionality,\r\n editors: this.editors,\r\n editable: this.editable,\r\n scrollable: this.scrollable,\r\n theme: this.theme,\r\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\r\n },\r\n omitKeys\r\n )\r\n )\r\n )\r\n }\r\n\r\n destroy(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n return super.destroy(options)\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n this.getAllCharts().forEach((chart) => {\r\n chart.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getAllCharts() {\r\n return this.charts().all()\r\n }\r\n\r\n getAllPanes() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\r\n\r\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\r\n\r\n if (isInSync) {\r\n newSyncedChartParts.push(...chartPartsToSync)\r\n }\r\n\r\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return !!this.syncChartParts?.includes(chartPart)\r\n }\r\n\r\n getIsIndicatorPresent(type: IndicatorType) {\r\n return !!this.charts()\r\n .first()\r\n ?.getAllElements()\r\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\r\n }\r\n\r\n getHTMLElementId() {\r\n return `chart-layout-${this.id}`\r\n }\r\n\r\n exitIdea() {\r\n this.updateAttribute('idea', undefined)\r\n this.getAllCharts().forEach((chart) => {\r\n // Change all idea quotes to non idea quotes and refetch because we don't need them anymore, but they may cause inconsistencies if they are in cache\r\n chart.getAllQuotes().forEach((quote) => {\r\n if (quote.ideaID) {\r\n quote.updateAttributes({ ideaID: undefined })\r\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\r\n }\r\n })\r\n\r\n chart.updateAttributes({ refreshData: true })\r\n })\r\n }\r\n\r\n isIdeaId(id: number | null = null) {\r\n return (this.idea?.id ?? null) === id\r\n }\r\n}\r\n\r\nexport default ChartLayout\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\r\n\r\nfunction normalizeHexAlpha(hexString = '') {\r\n const hexValue = hexString.replace('#', '')\r\n if (hexValue.length === 6) {\r\n return `${hexString}FF`\r\n }\r\n return hexString\r\n}\r\n\r\nexport const getColorOverwrites = ({\r\n theme,\r\n colors,\r\n}: {\r\n theme: Theme\r\n colors: ObjectHash, Theme>\r\n}) => {\r\n const customColors = colors[theme]\r\n const customColorKeys = Object.keys(customColors) as Array>\r\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\r\n\r\n return customColorKeys.reduce((acc, colorKey) => {\r\n const isDefaultOverWritten =\r\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\r\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\r\n\r\n return isDefaultOverWritten\r\n ? {\r\n ...acc,\r\n [colorKey]: customColors[colorKey],\r\n }\r\n : acc\r\n }, {})\r\n}\r\n","import tailwindColors from '../constants/colors'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\n\r\nexport interface IChartThemeColors {\r\n aftermarketFade: string\r\n background: string\r\n borderDown: string\r\n borderUp: string\r\n canvasFill: string\r\n cross: string\r\n crossText: string\r\n crossTextBackground: string\r\n currentBackground: string\r\n currentText: string\r\n grid: string\r\n gridSecondary: string\r\n indicatorCurrentBackground: string\r\n indicatorCurrentText: string\r\n line: string\r\n marketDown: string\r\n marketUp: string\r\n negativeChange: string\r\n ohlcTrendDown: string\r\n ohlcTrendUp: string\r\n overlayTransparentBackground: string\r\n percentageZeroLineText: string\r\n performanceIndicatorLabel: string\r\n positiveChange: string\r\n premarketFade: string\r\n prevClose: string\r\n text: string\r\n textSecondary: string\r\n trendDown: string\r\n trendUp: string\r\n volumeTrendDown: string\r\n volumeTrendUp: string\r\n wickDown: string\r\n wickUp: string\r\n zeroChange: string\r\n}\r\n\r\nexport interface IIndicatorThemeColors {\r\n line: string\r\n signalLine: string\r\n}\r\n\r\nexport interface IElementThemeColors {\r\n line: string\r\n border: string\r\n textWithoutBackground: string\r\n}\r\n\r\ninterface IDarkerWickColors {\r\n borderUp: string\r\n wickUp: string\r\n borderDown: string\r\n wickDown: string\r\n}\r\n\r\nexport const chartLightTheme: IChartThemeColors = {\r\n aftermarketFade: '#FFFFFF99',\r\n background: '#008CFF0E',\r\n borderDown: '#000000FF',\r\n borderUp: '#000000FF',\r\n canvasFill: '#FFFFFFFF',\r\n cross: '#0000004C',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.brightYellow[100],\r\n currentText: tailwindColors.gray[800],\r\n grid: '#D2D2D2FF',\r\n gridSecondary: '#ECECEC',\r\n indicatorCurrentBackground: tailwindColors.gray[600],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[500],\r\n marketUp: tailwindColors.green[500],\r\n negativeChange: '#C80000FF',\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\r\n percentageZeroLineText: '#111',\r\n performanceIndicatorLabel: tailwindColors.gray[600],\r\n positiveChange: '#009600FF',\r\n premarketFade: '#FFFFFF99',\r\n prevClose: '#C80000FF',\r\n text: '#828282',\r\n textSecondary: '#dedede',\r\n trendDown: '#FF0000FF',\r\n trendUp: '#00FF00FF',\r\n volumeTrendDown: '#ffc0c0',\r\n volumeTrendUp: '#a8e0a8',\r\n wickDown: '#000000FF',\r\n wickUp: '#000000FF',\r\n zeroChange: '#000',\r\n}\r\n\r\nexport const chartDarkTheme: IChartThemeColors = {\r\n aftermarketFade: '#4C526133',\r\n background: '#1E6DC019',\r\n borderDown: '#F63538FF',\r\n borderUp: '#30CC5AFF',\r\n canvasFill: tailwindColors.gray[800],\r\n cross: '#404553',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.yellow[200],\r\n currentText: tailwindColors.gray[700],\r\n grid: '#363A46FF',\r\n gridSecondary: '#2C303A',\r\n indicatorCurrentBackground: tailwindColors.gray[500],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[300],\r\n marketUp: tailwindColors.green[300],\r\n negativeChange: tailwindColors.red[400],\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\r\n percentageZeroLineText: '#fff',\r\n performanceIndicatorLabel: tailwindColors.gray[300],\r\n positiveChange: tailwindColors.green[400],\r\n premarketFade: '#4C526133',\r\n prevClose: '#C80000FF',\r\n text: '#929cb3',\r\n textSecondary: '#929CB399',\r\n trendDown: '#F63538FF',\r\n trendUp: '#30CC5AFF',\r\n volumeTrendDown: '#F635387F',\r\n volumeTrendUp: '#30CC5A7F',\r\n wickDown: '#F63538FF',\r\n wickUp: '#30CC5AFF',\r\n zeroChange: '#929cb3',\r\n}\r\n\r\nexport const darkerWickColors: IDarkerWickColors = {\r\n borderUp: '#006400FF',\r\n wickUp: '#006400',\r\n borderDown: '#6E0000FF',\r\n wickDown: '#6E0000FF',\r\n}\r\n\r\nexport const indicatorLightTheme: IIndicatorThemeColors = {\r\n line: '#000000',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\r\n line: '#D07933',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const elementLightTheme: IElementThemeColors = {\r\n line: '#000000',\r\n border: '#000000',\r\n textWithoutBackground: '#000000',\r\n}\r\n\r\nexport const elementDarkTheme: IElementThemeColors = {\r\n line: '#5faaf4',\r\n border: '#5192D1',\r\n textWithoutBackground: '#929cb3',\r\n}\r\nexport const generalColors: Array = [\r\n '#1f77b4',\r\n '#ff7f0e',\r\n '#2ca02c',\r\n '#d62728',\r\n '#9467bd',\r\n '#8c564b',\r\n '#e377c2',\r\n '#7f7f7f',\r\n '#bcbd22',\r\n '#17becf',\r\n]\r\n\r\n// node chart with thin bars color override\r\nexport const thinBarColorsOverride = {\r\n trendUp: '#00b400',\r\n trendDown: '#b40000',\r\n}\r\n\r\nexport enum AutoSaveState {\r\n Off,\r\n Saved,\r\n Unsaved,\r\n Saving,\r\n}\r\n\r\nexport const CHART_EVENT_BADGE_SIZE = 24\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { AutoSaveElement } from '../controllers/autosave/constants'\r\nimport { getUuid } from '../utils/helpers'\r\nimport { HLC, initHlc } from '../utils/hlc'\r\nimport { AutoSaveState } from './constants'\r\n\r\ninterface DrawingsInternalStateAttrs {\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n}\r\n\r\nclass DrawingsInternalStore extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'DrawingsInternalState',\r\n 'elements',\r\n 'latestRemoteUpdateTimestamp',\r\n 'latestLocalUpdateTimestamp',\r\n 'autoSaveState',\r\n 'instanceUUID'\r\n )\r\n }\r\n\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n\r\n constructor(attrs: Partial = {}) {\r\n super(attrs)\r\n\r\n this.elements = attrs.elements ?? []\r\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\r\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\r\n }\r\n\r\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\r\n if (this.autoSaveState !== newAutoSaveState) {\r\n this.updateAttributes({ autoSaveState: newAutoSaveState })\r\n }\r\n }\r\n}\r\n\r\nexport default DrawingsInternalStore\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport { TodoObjectHashAnyType } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport CanvasElement from '../canvas/element'\r\nimport { CanvasElementType, ChartElementType, IndicatorType } from '../constants/common'\r\nimport { financialIndicators } from '../indicators/indicators'\r\nimport { getIsSSr, getUuid } from '../utils/helpers'\r\nimport Pane from './pane'\r\nimport { changeElementZIndexes } from './utils'\r\n\r\nclass Element extends Spine.Model {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: CanvasElement\r\n declare pane_id: string\r\n declare destroyed: true | undefined\r\n declare pane: () => Pane\r\n lastChange: number | null = null\r\n elementId: string | null = null\r\n zIndex = -1\r\n\r\n generateUuid = getIsSSr() ? undefined : getUuid\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n const elementAttrs = args[0]\r\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\r\n this.one('create', () => {\r\n this.updateAttributes({\r\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\r\n })\r\n })\r\n }\r\n\r\n replace(instance: CanvasElement) {\r\n const oldInstance = this.instance\r\n this.updateAttribute('instance', instance)\r\n this.trigger('replace', this, oldInstance)\r\n }\r\n\r\n makeClone() {\r\n const { instance, pane_id } = this\r\n const { attrs } = instance\r\n const { scale } = instance.model\r\n const clonedObj = merge({ pane_id }, attrs)\r\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\r\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\r\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\r\n cloned.cachePointPositionTimestamp()\r\n Element.create({ instance: cloned, pane_id })\r\n this.trigger('makeClone', this, cloned)\r\n }\r\n\r\n moveToZIndex(zIndex: number) {\r\n const currentZIndex = this.zIndex\r\n const directionCoef = zIndex > currentZIndex ? 1 : -1\r\n\r\n if (this.isChart() || this.isIndicator()) {\r\n if (this.zIndex !== 0) {\r\n this.updateAttributes({ zIndex: 0 })\r\n }\r\n this.pane()\r\n .getAllElements()\r\n .filter((element) => {\r\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\r\n return shouldMove && element.isDrawing()\r\n })\r\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\r\n\r\n return\r\n }\r\n\r\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\r\n const { min, max } = this.pane().getElementZIndexRange()\r\n if (\r\n currentZIndex === newZIndex ||\r\n (currentZIndex === min && directionCoef === -1) ||\r\n (currentZIndex === max && directionCoef === 1)\r\n ) {\r\n return\r\n }\r\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsBelowZero,\r\n addElement: newZIndex < 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n isBelowZero: true,\r\n })\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsAboveZero,\r\n addElement: newZIndex > 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n })\r\n }\r\n\r\n bringToFront() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\r\n }\r\n\r\n sendToBack() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\r\n }\r\n\r\n bringForward() {\r\n this.moveToZIndex(this.zIndex + 1)\r\n }\r\n\r\n sendBackward() {\r\n this.moveToZIndex(this.zIndex - 1)\r\n }\r\n\r\n isChart() {\r\n return !!this.instance?.type.startsWith('charts/')\r\n }\r\n\r\n getIsChartType(chartType: ChartElementType) {\r\n return this.instance?.type === chartType\r\n }\r\n\r\n isFinancialIndicator() {\r\n return this.isIndicator() && financialIndicators.includes(this.instance!.type as IndicatorType)\r\n }\r\n\r\n isIndicator() {\r\n return !!this.instance?.type.startsWith('indicators/')\r\n }\r\n\r\n isOverlay() {\r\n return !!this.instance?.type.startsWith('overlays/')\r\n }\r\n\r\n isDrawing() {\r\n return !!this.instance?.type.startsWith('canvas/')\r\n }\r\n\r\n isChartEvent() {\r\n return !!this.instance?.type.startsWith('chartEvent/')\r\n }\r\n\r\n isMouseDown() {\r\n return !!this.instance?.isMouseDown\r\n }\r\n\r\n hasOngoingInteraction() {\r\n return this.isMouseDown() || this.instance.isEditInProgress\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...this.instance.toObject(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...this.instance.toConfig(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n return this.destroy(options)\r\n }\r\n\r\n refreshElementId() {\r\n this.updateAttribute('elementId', this.generateUuid?.())\r\n }\r\n}\r\n\r\nexport default Element\r\n","import endOfDay from 'date-fns/endOfDay'\r\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\r\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\r\nimport setDate from 'date-fns/set'\r\n\r\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\r\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\r\nimport Chart from '../chart'\r\n\r\nconst MARKET_START = { hours: 9, minutes: 30 }\r\nconst END_OF_DAY = { hours: 23, minutes: 59 }\r\n\r\nfunction getIsDateBeforeMarketStart(date: Date) {\r\n const hours = date.getHours()\r\n const minutes = date.getMinutes()\r\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\r\n}\r\n\r\nexport function roundTimeForSyncedPane({\r\n sourceChart,\r\n targetChart,\r\n timestamp,\r\n}: {\r\n sourceChart: Chart\r\n targetChart: Chart\r\n timestamp: number\r\n}) {\r\n let dateToReturn = dateFromUnixTimestamp(timestamp)\r\n const sourceChartHasPremarket =\r\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\r\n const targetChartHasPremarket =\r\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\r\n\r\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\r\n dateToReturn = setDate(dateToReturn, MARKET_START)\r\n }\r\n\r\n if (targetChart.timeframe === TIMEFRAME.m) {\r\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.w) {\r\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\r\n dateToReturn = endOfDay(dateToReturn)\r\n }\r\n\r\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\r\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\r\n }\r\n\r\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { ChartSyncablePart } from '../chart/contstants'\r\nimport Pane from '../pane'\r\nimport { roundTimeForSyncedPane } from './mouse-utils'\r\n\r\nexport class Mouse extends Spine.Model {\r\n static initClass() {\r\n this.configure('Mouse', 'position')\r\n this.belongsTo('pane', Pane)\r\n }\r\n\r\n declare position: { x: number; y: number } | undefined\r\n declare pane: () => Pane | null\r\n\r\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\r\n\r\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\r\n\r\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\r\n\r\n getCrossIndexForPane = (pane: Pane) => {\r\n if (this.position) {\r\n if (this.getIsMouseInChartOfPane(pane)) {\r\n return Math.round(this.position.x)\r\n }\r\n const paneOfMouse = this.pane()\r\n if (this.getIsCrossSyncOn() && paneOfMouse) {\r\n const mouseInChart = paneOfMouse.chart()\r\n const currentPaneChart = pane.chart()\r\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\r\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\r\n roundTimeForSyncedPane({\r\n sourceChart: mouseInChart,\r\n targetChart: currentPaneChart,\r\n timestamp: mousePositionTimestamp,\r\n })\r\n )\r\n return Math.floor(currentPanePositionX)\r\n }\r\n }\r\n\r\n return Number.NaN\r\n }\r\n\r\n getPriceForPane = (pane: Pane) => {\r\n const positionY = this.position?.y ?? null\r\n\r\n if (this.pane()?.eql(pane)) {\r\n return positionY\r\n }\r\n\r\n if (this.getIsCrossSyncOn() && this.pane()) {\r\n const mousePaneIndex = this.pane()?.getIndexInChart()\r\n const currentPaneIndex = pane.getIndexInChart()\r\n return mousePaneIndex === currentPaneIndex ? positionY : null\r\n }\r\n\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Mouse is a singleton, so `initClass` must be called before we create the instance\r\n * otherwise it wouldn’t work\r\n */\r\nMouse.initClass()\r\n\r\nconst mouse = Mouse.create()\r\nmouse.save()\r\n\r\nexport default mouse as Mouse\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport Element from './element'\r\nimport { getChartLayoutSettings } from './settings'\r\nimport { rebuildElementZIndexes } from './utils'\r\n\r\nexport interface ScaleAxis {\r\n (index: number): number\r\n invert: (x: number) => number\r\n domain: () => [currentDomainMax: number, currentDomainMin: number]\r\n width: (x: number) => number\r\n height: (y: number) => number\r\n ticks: (y: number) => number[]\r\n}\r\n\r\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\r\n ChartEventBadgeType.Split,\r\n ChartEventBadgeType.Dividends,\r\n ChartEventBadgeType.EarningsPositive,\r\n ChartEventBadgeType.EarningsNegative,\r\n ChartEventBadgeType.EarningsNeutral,\r\n ChartEventBadgeType.EarningsFuture,\r\n]\r\n\r\nclass Pane extends Spine.Model {\r\n static initClass(\r\n elementModel: typeof Element,\r\n chartEventElementModel: typeof ChartEventElement,\r\n chartModel: typeof Chart\r\n ) {\r\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\r\n this.hasMany('elements', elementModel)\r\n this.hasMany('chartEvents', chartEventElementModel)\r\n this.belongsTo('mainElement', elementModel)\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare id: string\r\n declare chart_id: string\r\n declare height: number\r\n declare scale: {\r\n x: ScaleAxis\r\n y: ScaleAxis\r\n }\r\n\r\n declare instance: any\r\n declare chart: () => Chart\r\n declare mainElement: () => T | null\r\n declare elements: () => Collection\r\n declare chartEvents: () => Collection\r\n selection: CanvasElement | null = null\r\n scaleRange: { min: number; max: number } | null = null\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.elements()\r\n .all()\r\n .forEach((element) => {\r\n element.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n toObject() {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toObject())\r\n return {\r\n height: this.height,\r\n scale: this.scale,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toConfig())\r\n return omit(\r\n {\r\n height: this.height,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n move(direction: Position) {\r\n const chartPanes = this.chart().getAllPanes()\r\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\r\n const targetPane = chartPanes.find((pane) => this.eql(pane))\r\n\r\n if (!chartPane || !targetPane) return\r\n\r\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\r\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\r\n\r\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\r\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\r\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\r\n\r\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\r\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\r\n if (direction === Position.Above) {\r\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\r\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n if (direction === Position.Below) {\r\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\r\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n\r\n Pane.records = ohterChartPaneRecords.concat([\r\n ...panesAbove,\r\n arrayWithoutTargetRecord[chartRecordIndex],\r\n ...panesBelow,\r\n ])\r\n this.chart().trigger('change', this.chart())\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart().chart_layout())\r\n }\r\n\r\n getAllElements() {\r\n return this.elements()\r\n .all()\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n }\r\n\r\n getAllChartEvents(isSorted = true) {\r\n const chartEvents = [...this.chartEvents().all()]\r\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\r\n }\r\n\r\n getChartOrIndicatorElement() {\r\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\r\n }\r\n\r\n getIsIndicatorPane() {\r\n let mainElement = this.mainElement()\r\n\r\n // @todo Fix - In SSR we don't have mainElement because it's not assigned to pane when it's created\r\n if (getIsSSr()) {\r\n mainElement = this.getChartOrIndicatorElement()\r\n }\r\n\r\n return !!mainElement?.isIndicator()\r\n }\r\n\r\n getIsChartPane() {\r\n return !!this.mainElement()?.isChart()\r\n }\r\n\r\n resetHeight() {\r\n if (this.getIsIndicatorPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\r\n }\r\n if (this.getIsChartPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\r\n }\r\n }\r\n\r\n getIndexInChart() {\r\n return this.chart()\r\n .getAllPanes()\r\n .findIndex((chartPane) => chartPane.eql(this))\r\n }\r\n\r\n getElementZIndexRange() {\r\n let max = -1\r\n let min = 1\r\n this.getAllElements().forEach((el) => {\r\n if (el.zIndex > max) {\r\n max = el.zIndex\r\n }\r\n if (el.zIndex < min) {\r\n min = el.zIndex\r\n }\r\n })\r\n return { min, max }\r\n }\r\n\r\n getBelowAboveZeroElements() {\r\n const allPaneElements = this.getAllElements()\r\n const elementsBelowZero: Element[] = []\r\n const elementsAboveZero: Element[] = []\r\n allPaneElements.forEach((el) => {\r\n if (el.zIndex < 0) {\r\n elementsBelowZero.push(el)\r\n }\r\n if (el.zIndex > 0) {\r\n elementsAboveZero.push(el)\r\n }\r\n })\r\n\r\n return { elementsBelowZero, elementsAboveZero }\r\n }\r\n\r\n normalizeZIndexes() {\r\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\r\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\r\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\r\n }\r\n\r\n getQuoteRawTicker() {\r\n return this.chart().getQuoteRawTicker()\r\n }\r\n\r\n getNumericId() {\r\n return Number(this.id.replace('c-', ''))\r\n }\r\n\r\n updateChartEventsZIndexes() {\r\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\r\n return\r\n }\r\n\r\n const chartEvents = this.getAllChartEvents(false).sort(\r\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\r\n )\r\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\r\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\r\n\r\n const hoveredTypeChartEventElements: ChartEventElement[] = []\r\n const openedTypeChartEventElements: ChartEventElement[] = []\r\n const nonActiveChartEventElements: ChartEventElement[] = []\r\n\r\n chartEvents.forEach((chartEvent, index) => {\r\n const chartEventsOnSameXPoint = chartEvents.filter(\r\n (chartEvent_B, i) =>\r\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\r\n )\r\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\r\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\r\n const isOpened = chartEvent.instance === openedChartEvent?.instance\r\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\r\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\r\n if (!isHovered || !isOpened) {\r\n if (isHoveredType) {\r\n hoveredTypeChartEventElements.push(chartEvent)\r\n } else if (isOpenType) {\r\n openedTypeChartEventElements.push(chartEvent)\r\n } else {\r\n nonActiveChartEventElements.push(chartEvent)\r\n }\r\n }\r\n })\r\n\r\n nonActiveChartEventElements.sort(\r\n (a, b) =>\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\r\n )\r\n\r\n const chartEventElements = [\r\n ...nonActiveChartEventElements,\r\n ...openedTypeChartEventElements,\r\n openedChartEvent,\r\n ...hoveredTypeChartEventElements,\r\n hoveredChartEvent,\r\n ].filter(Boolean)\r\n chartEventElements.forEach((chartEvent, index) => {\r\n chartEvent!.updateAttributes({ zIndex: index })\r\n })\r\n }\r\n}\r\n\r\nexport default Pane\r\n","import { ObjectHash, RequireByKey } from '../../types/shared'\r\n\r\ninterface HeikinAshiData {\r\n HAOpen: number[]\r\n HAClose: number[]\r\n}\r\n\r\ninterface QuoteValues {\r\n cachedAt: null | number\r\n dayToOffset: ObjectHash[]\r\n dateToIndex: ObjectHash[]\r\n heikinAshiData?: HeikinAshiData\r\n daysInQuote: Date[]\r\n}\r\n\r\ninterface QuoteCacheFunctionProps {\r\n cid: string\r\n key: keyof QuoteValues\r\n fetchedAt: number\r\n value: any\r\n}\r\n\r\nconst quoteCache = {} as ObjectHash\r\n\r\nexport function getCachedQuote({\r\n cid,\r\n key,\r\n fetchedAt,\r\n}: RequireByKey>, 'cid'>) {\r\n const quote = quoteCache[cid]\r\n if (quote?.cachedAt === fetchedAt && key) {\r\n return quote[key]\r\n } else if (!key) {\r\n return quote\r\n }\r\n return null\r\n}\r\n\r\nexport function setCachedQuote({\r\n cid,\r\n key,\r\n value,\r\n fetchedAt,\r\n}: Pick) {\r\n quoteCache[cid] = {\r\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\r\n [key]: value,\r\n cachedAt: fetchedAt,\r\n } as QuoteValues\r\n}\r\n\r\nexport function deleteCachedQuote({ cid }: Pick) {\r\n delete quoteCache[cid]\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { isSameDay, isSameMonth, isSameWeek } from 'date-fns'\r\nimport omit from 'lodash.omit'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash, RootChartConfigObject, TodoObjectHashAnyType } from '../../types/shared'\r\nimport {\r\n ChartEventDbType,\r\n ChartEventType,\r\n IntradayTimeframeInterval,\r\n QuoteFinancialAttachment,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport type { ICOT } from '../indicators/cot'\r\nimport { convertLocalToNyTime, dateFromUnixTimestamp, dateStringFromDate } from '../utils'\r\nimport { getIsAbortError } from '../utils/abort_controller'\r\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\r\nimport { FinancialAttachmentsData, ShortInterestData } from './quote/financialAttachmentsData'\r\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\r\nimport { getRawTickerForInstrument } from './utils'\r\n\r\nconst quoteRefreshChecksBeforeFullRefresh = 15\r\n\r\ntype TodoPattern = TodoObjectHashAnyType\r\n\r\nexport interface TickerTimeframesProps {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ninterface QuoteFetchOptions {\r\n aftermarket?: boolean\r\n premarket?: boolean\r\n patterns?: boolean\r\n events?: boolean\r\n maxBars?: number\r\n financialAttachments?: string[]\r\n}\r\n\r\ninterface QuoteInternalOptions {\r\n cachePredicate?: (quote: Quote) => boolean\r\n fetchNewDataOnCachedQuote?: boolean\r\n}\r\n\r\ninterface UrlOptions extends Omit {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n financialAttachments?: string\r\n}\r\n\r\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\r\n\r\nexport interface DataResponse {\r\n COTs: COTData\r\n name: string\r\n ticker: string\r\n instrument: string\r\n interval: number\r\n timeframe: string\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n date: number[]\r\n volume: number[]\r\n lastOpen: number\r\n lastHigh: number\r\n lastLow: number\r\n lastClose: number\r\n lastDate: number\r\n lastTime: string | null\r\n lastVolume: number\r\n dataId: string\r\n prevClose: number\r\n afterClose: number\r\n afterChange: number\r\n afterTime: string | null\r\n drawMinutesPerDay: number\r\n marketStartMinutes: number\r\n premarketLengthMinutes: number\r\n aftermarketLengthMinutes: number\r\n aftermarket: boolean\r\n premarket: boolean\r\n hasPatterns: boolean\r\n patterns: Array\r\n patternsMinRange: number\r\n patternsMaxRange: number\r\n relativeVolume: number\r\n isIntraday: boolean\r\n noNewData?: boolean\r\n chartEvents?: ChartEventDataRaw[]\r\n financialAttachmentsData?: FinancialAttachmentsData\r\n}\r\n\r\ninterface COTData {\r\n [code: string]: ICOT\r\n}\r\n\r\nconst getEmptyQuote = () => ({\r\n open: [],\r\n high: [],\r\n low: [],\r\n close: [],\r\n volume: [],\r\n date: [],\r\n fetchedAt: -1,\r\n numberOfRefreshChecks: 0,\r\n isFetching: false,\r\n is404: false,\r\n COTs: undefined,\r\n name: undefined,\r\n drawMinutesPerDay: undefined,\r\n marketStartMinutes: undefined,\r\n premarketLengthMinutes: undefined,\r\n aftermarketLengthMinutes: undefined,\r\n patterns: [],\r\n patternsMinRange: undefined,\r\n patternsMaxRange: undefined,\r\n relativeVolume: undefined,\r\n lastOpen: undefined,\r\n lastHigh: undefined,\r\n lastLow: undefined,\r\n lastClose: undefined,\r\n lastVolume: undefined,\r\n dataId: undefined,\r\n lastDate: undefined,\r\n prevClose: undefined,\r\n afterClose: undefined,\r\n afterChange: undefined,\r\n chartEvents: [],\r\n financialAttachments: [],\r\n financialAttachmentsData: null,\r\n})\r\n\r\ninterface ICacheAvailabilityCheckFunctionsArguments {\r\n quote: Quote\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n}\r\n\r\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !quote.premarket === !options?.premarket &&\r\n !quote.aftermarket === !options?.aftermarket &&\r\n !quote.hasPatterns === !options?.patterns &&\r\n // if options.events is false we can reuse quote with events\r\n (!options?.events || !!quote.events) &&\r\n // Either has no financialAttachments or require all of them to match\r\n ((options?.financialAttachments?.length ?? 0) === 0 ||\r\n options!.financialAttachments!.every((financialAttachment) =>\r\n quote.financialAttachments?.includes(financialAttachment as QuoteFinancialAttachment)\r\n ))\r\n\r\nconst doesQuoteAndFetchParamsMatch = ({\r\n quote,\r\n ticker,\r\n instrument,\r\n timeframe,\r\n}: {\r\n quote: Quote\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\r\n\r\n// either we don't care about matching uuid at all, or they have to match\r\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\r\n\r\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !options?.cachePredicate || options.cachePredicate(quote)\r\n\r\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching || !!quote.is404\r\n\r\nexport type QuoteGetParams = {\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n abortController?: null | AbortController\r\n shouldUseCache?: boolean\r\n chartUuid?: string\r\n}\r\n\r\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\r\n return (\r\n chartEvents?.map((item) => {\r\n let eventType: ChartEventType\r\n switch (item.eventType) {\r\n case ChartEventDbType.Dividends:\r\n eventType = ChartEventType.Dividends\r\n break\r\n case ChartEventDbType.Split:\r\n eventType = ChartEventType.Split\r\n break\r\n case ChartEventDbType.Earnings:\r\n eventType = ChartEventType.Earnings\r\n break\r\n }\r\n return {\r\n ...item,\r\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\r\n eventType,\r\n }\r\n }) ?? []\r\n )\r\n}\r\n\r\nclass Quote extends Spine.Model {\r\n static computableKeys = [\r\n 'isIntraday',\r\n 'interval',\r\n 'drawDays',\r\n 'barIndex',\r\n 'barToDataIndex',\r\n 'alignedFinancialAttachmentsData',\r\n 'timestampToFinancialsIndexesMap',\r\n ]\r\n\r\n static initClass() {\r\n this.configure(\r\n 'Quote',\r\n 'ticker',\r\n 'name',\r\n 'instrument',\r\n 'timeframe',\r\n 'open',\r\n 'high',\r\n 'low',\r\n 'close',\r\n 'date',\r\n 'volume',\r\n 'lastOpen',\r\n 'lastHigh',\r\n 'lastLow',\r\n 'lastClose',\r\n 'lastDate',\r\n 'lastVolume',\r\n 'lastTime',\r\n 'dataId',\r\n 'prevClose',\r\n 'COTs',\r\n 'chartEvents',\r\n 'afterClose',\r\n 'afterChange',\r\n 'afterTime',\r\n 'drawMinutesPerDay',\r\n 'marketStartMinutes',\r\n 'premarketLengthMinutes',\r\n 'aftermarketLengthMinutes',\r\n 'aftermarket',\r\n 'premarket',\r\n 'events',\r\n 'financialAttachments',\r\n 'financialAttachmentsData',\r\n 'hasPatterns',\r\n 'patterns',\r\n 'patternsMinRange',\r\n 'patternsMaxRange',\r\n 'relativeVolume',\r\n 'fetchedAt',\r\n 'fetchingPromise',\r\n 'isFetching',\r\n 'wasFetchAborted',\r\n 'chartUuid',\r\n 'numberOfRefreshChecks',\r\n 'maxBars',\r\n 'ideaID',\r\n 'is404',\r\n ...Quote.computableKeys\r\n )\r\n }\r\n\r\n static getFromCacheSync({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n }: Omit): Quote | null {\r\n const ticker = tickerRaw.replace('@', '')\r\n return (\r\n Quote.select(\r\n (q) =>\r\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\r\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\r\n isNotEmptyQuote(q) &&\r\n isCacheAllowed({ quote: q, options }) &&\r\n (q.instrument !== Instrument.Stock ||\r\n Number.isInteger(q.ideaID) ||\r\n doesQuoteAndOptionsMatch({ quote: q, options }))\r\n )[0] ?? null\r\n )\r\n }\r\n\r\n static async get({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n abortController,\r\n shouldUseCache = true,\r\n chartUuid,\r\n }: QuoteGetParams): Promise {\r\n const ticker = tickerRaw.replace('@', '')\r\n const quote = shouldUseCache\r\n ? this.getFromCacheSync({ ticker: tickerRaw, instrument, timeframe, options, chartUuid })\r\n : null\r\n\r\n if (quote) {\r\n if (quote.isFetching) {\r\n await quote.getResolvedFetchingPromise()\r\n } else if (options?.fetchNewDataOnCachedQuote) {\r\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController })\r\n }\r\n return quote\r\n }\r\n\r\n const newQuote = Quote.create({\r\n ...getEmptyQuote(),\r\n ticker,\r\n timeframe,\r\n instrument,\r\n chartUuid,\r\n maxBars: options?.maxBars,\r\n premarket: !!options?.premarket,\r\n aftermarket: !!options?.aftermarket,\r\n hasPatterns: !!options?.patterns,\r\n events: !!options?.events,\r\n financialAttachments: options?.financialAttachments ?? [],\r\n })\r\n\r\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController })\r\n\r\n return newQuote\r\n }\r\n\r\n static async getAll(\r\n tickersAndTimeframes: Array>\r\n ) {\r\n // TODO: fetch in 1 request\r\n if (tickersAndTimeframes.length === 0) {\r\n return {}\r\n }\r\n\r\n try {\r\n const quotes = await Promise.all(tickersAndTimeframes.map((props) => this.get(props)))\r\n const data = quotes.reduce(\r\n (accumulator, quote) => ({\r\n ...accumulator,\r\n [quote.ticker]: quote,\r\n }),\r\n {}\r\n )\r\n return data\r\n } catch {\r\n // TODO: handle somehow\r\n }\r\n }\r\n\r\n declare ticker: string\r\n declare name: string\r\n declare instrument: Instrument\r\n declare interval: number\r\n declare timeframe: TIMEFRAME\r\n declare open: number[]\r\n declare high: number[]\r\n declare low: number[]\r\n declare close: number[]\r\n declare date: number[]\r\n declare volume: number[]\r\n declare lastOpen: number\r\n declare lastHigh: number\r\n declare lastLow: number\r\n declare lastClose: number\r\n declare lastDate: number\r\n declare lastVolume: number\r\n declare dataId: string\r\n declare prevClose: number\r\n declare COTs: COTData\r\n declare afterClose: number\r\n declare afterChange: number\r\n declare drawMinutesPerDay: number\r\n declare marketStartMinutes: number\r\n declare premarketLengthMinutes: number\r\n declare aftermarketLengthMinutes: number\r\n declare hasPatterns: boolean\r\n declare patterns: Array\r\n declare patternsMinRange: number\r\n declare patternsMaxRange: number\r\n declare relativeVolume: number\r\n declare isIntraday: boolean\r\n declare drawDays?: number\r\n declare barIndex: number[]\r\n /**\r\n * Array of length the same as number of bars\r\n *\r\n * If there's a gap and a bar index has no corresponding data index,\r\n * the last data index is used (or 0 if there's no last data index)\r\n *\r\n * @type {number[]}\r\n */\r\n declare barToDataIndex: number[]\r\n declare chartUuid?: string\r\n declare aftermarket: boolean\r\n declare premarket: boolean\r\n declare fetchedAt: number\r\n declare numberOfRefreshChecks: number\r\n declare isFetching: boolean\r\n declare fetchingPromise?: Promise\r\n declare wasFetchAborted: boolean\r\n declare maxBars?: number\r\n declare ideaID?: number\r\n declare is404?: boolean\r\n declare chartEvents: Array\r\n declare events?: boolean\r\n declare financialAttachments?: QuoteFinancialAttachment[]\r\n declare financialAttachmentsData?: FinancialAttachmentsData\r\n declare alignedFinancialAttachmentsData: {\r\n [QuoteFinancialAttachment.shortInterest]?: Array\r\n }\r\n\r\n declare timestampToFinancialsIndexesMap: {\r\n [QuoteFinancialAttachment.shortInterest]?: ObjectHash\r\n }\r\n\r\n async fetchRequest({\r\n abortController,\r\n options = { type: QuoteFetchTypeUrlOption.New },\r\n }: {\r\n abortController?: null | AbortController\r\n options?: QuoteUrlOptions\r\n }) {\r\n let data: DataResponse | null = null\r\n let is404 = false\r\n let wasFetchAborted = false\r\n\r\n const fetchingPromise = fetchApi({\r\n location: this.getUrl(options),\r\n throwOnStatusCodes: [404],\r\n abortController,\r\n })\r\n\r\n this.updateAttributes({\r\n isFetching: true,\r\n fetchingPromise,\r\n })\r\n\r\n try {\r\n data = await fetchingPromise\r\n } catch (err) {\r\n is404 = err instanceof NotFoundError\r\n if (getIsAbortError(err as Error)) {\r\n wasFetchAborted = true\r\n } else if (!is404 && process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? getEmptyQuote() : {}),\r\n is404,\r\n wasFetchAborted,\r\n isFetching: false,\r\n })\r\n\r\n return data\r\n }\r\n\r\n async isPossibleToFetchSequentialData({\r\n abortController,\r\n }: {\r\n abortController?: null | AbortController\r\n } = {}) {\r\n const data = await this.fetchRequest({ abortController })\r\n if (data && data.date.length > 0 && this.date.length > 0) {\r\n return this.date[this.date.length - 1] >= data.date[0]\r\n }\r\n return false\r\n }\r\n\r\n async fetchData({\r\n fetchType,\r\n abortController,\r\n }: {\r\n fetchType: QuoteFetchType\r\n abortController?: null | AbortController\r\n }) {\r\n let options: QuoteUrlOptions\r\n if (fetchType === QuoteFetchType.Refetch) {\r\n options = { type: QuoteFetchTypeUrlOption.New }\r\n } else if (fetchType === QuoteFetchType.NewerData) {\r\n options = { type: QuoteFetchTypeUrlOption.Newer }\r\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\r\n options.dataId = this.dataId\r\n }\r\n } else {\r\n return\r\n }\r\n if (this.instrument === Instrument.Stock) {\r\n options.events = this.events == null ? true : this.events\r\n }\r\n\r\n const data = await this.fetchRequest({ abortController, options })\r\n\r\n if (!data || data.noNewData === true) {\r\n this.updateAttributes({\r\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\r\n })\r\n return\r\n }\r\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\r\n return\r\n }\r\n\r\n const newQuoteData = {\r\n COTs: data.COTs,\r\n name: data.name,\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: data.volume,\r\n date: data.date,\r\n drawMinutesPerDay: data.drawMinutesPerDay,\r\n marketStartMinutes: data.marketStartMinutes,\r\n premarketLengthMinutes: data.premarketLengthMinutes,\r\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\r\n patterns: data.patterns ?? [],\r\n patternsMinRange: data.patternsMinRange,\r\n patternsMaxRange: data.patternsMaxRange,\r\n relativeVolume: data.relativeVolume,\r\n lastOpen: data.lastOpen,\r\n lastHigh: data.lastHigh,\r\n lastLow: data.lastLow,\r\n lastClose: data.lastClose,\r\n lastVolume: data.lastVolume,\r\n dataId: data.dataId,\r\n lastDate: data.lastDate,\r\n lastTime: data.lastTime,\r\n prevClose: data.prevClose,\r\n afterClose: data.afterClose,\r\n afterChange: data.afterChange,\r\n afterTime: data.afterTime,\r\n numberOfRefreshChecks: 0,\r\n chartEvents: data.chartEvents ?? [],\r\n fetchedAt: Date.now(),\r\n financialAttachmentsData: data.financialAttachmentsData,\r\n }\r\n\r\n if (\r\n !(\r\n fetchType === QuoteFetchType.Refetch ||\r\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\r\n )\r\n ) {\r\n /*\r\n * Merges current and new data taking date as index\r\n */\r\n let AIndex = 0\r\n let BIndex = 0\r\n let mergeIndex = -1\r\n while (AIndex < this.date.length || BIndex < data.date.length) {\r\n const ADate = this.date[AIndex]\r\n const BDate = data.date[BIndex]\r\n if (BDate === undefined) {\r\n break\r\n } else if (ADate === BDate) {\r\n // Same date, update OHLCV\r\n this.open[AIndex] = data.open[BIndex]\r\n this.high[AIndex] = data.high[BIndex]\r\n this.low[AIndex] = data.low[BIndex]\r\n this.close[AIndex] = data.close[BIndex]\r\n this.volume[AIndex] = data.volume[BIndex]\r\n AIndex++\r\n BIndex++\r\n } else if (ADate > BDate || ADate === undefined) {\r\n // New bar for a date not yet in our dataset\r\n // If weekly or monthly timeframe & wasn't merged on AIndex\r\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\r\n const prevAIndex = AIndex - 1\r\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\r\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\r\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\r\n if (\r\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\r\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\r\n ) {\r\n this.date[prevAIndex] = data.date[BIndex]\r\n this.open[prevAIndex] = data.open[BIndex]\r\n this.high[prevAIndex] = data.high[BIndex]\r\n this.low[prevAIndex] = data.low[BIndex]\r\n this.close[prevAIndex] = data.close[BIndex]\r\n this.volume[prevAIndex] = data.volume[BIndex]\r\n mergeIndex = prevAIndex\r\n // Incrementing BIndex only because we're mergin arrays on AIndex\r\n BIndex++\r\n continue\r\n }\r\n }\r\n this.date.splice(AIndex, 0, data.date[BIndex])\r\n this.open.splice(AIndex, 0, data.open[BIndex])\r\n this.high.splice(AIndex, 0, data.high[BIndex])\r\n this.low.splice(AIndex, 0, data.low[BIndex])\r\n this.close.splice(AIndex, 0, data.close[BIndex])\r\n this.volume.splice(AIndex, 0, data.volume[BIndex])\r\n // Incrementing AIndex because we're changing the array in-place\r\n AIndex++\r\n BIndex++\r\n } else if (ADate < BDate) {\r\n AIndex++\r\n } else {\r\n console.warn('fetchNewerData merge warning')\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\r\n extra: {\r\n thisDateLength: this.date.length,\r\n dataDateLength: data.date.length,\r\n AIndex,\r\n BIndex,\r\n ADate,\r\n BDate,\r\n },\r\n })\r\n }\r\n }\r\n\r\n newQuoteData.date = this.date\r\n newQuoteData.open = this.open\r\n newQuoteData.high = this.high\r\n newQuoteData.low = this.low\r\n newQuoteData.close = this.close\r\n newQuoteData.volume = this.volume\r\n }\r\n\r\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\r\n // https://github.com/finvizhq/charts/issues/510\r\n if (!hasUpdatedSuccessfully) {\r\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\r\n }\r\n if (!this) {\r\n // or this somehow became null / falsy\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\r\n }\r\n this.trigger(fetchType, this, fetchType)\r\n }\r\n\r\n async getResolvedFetchingPromise() {\r\n try {\r\n return await this.fetchingPromise\r\n } catch {\r\n // do nothing\r\n }\r\n }\r\n\r\n fetchOlderData() {\r\n return // not yet implemented\r\n // TODO cancel previous request\r\n }\r\n\r\n load(atts: ObjectHash) {\r\n super.load(atts)\r\n // This has to be here to prevent recalculations if atts.fetchedAt is not provided\r\n const fetchedAt = atts.fetchedAt ?? this.fetchedAt ?? 0\r\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\r\n if (this.timeframe && cachedAt !== fetchedAt) {\r\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\r\n this.isIntraday = [\r\n TIMEFRAME.i1,\r\n TIMEFRAME.i2,\r\n TIMEFRAME.i3,\r\n TIMEFRAME.i5,\r\n TIMEFRAME.i10,\r\n TIMEFRAME.i15,\r\n TIMEFRAME.i30,\r\n TIMEFRAME.h,\r\n TIMEFRAME.h2,\r\n TIMEFRAME.h4,\r\n ].includes(this.timeframe)\r\n this.interval = this.isIntraday\r\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\r\n : 0\r\n this.drawDays = this.getDrawDays()\r\n this.barIndex = this.getBarIndexes()\r\n this.patterns = this.patterns ?? []\r\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\r\n const lastIndex = this.barIndex[index - 1] ?? -1\r\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\r\n })\r\n this.alignAllFinancialAttachmentsDataWithQuoteDates()\r\n }\r\n if (this.timeframe && this.ticker) {\r\n this.chartEvents = getChartEventsWithId({\r\n ticker: this.ticker,\r\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\r\n })\r\n }\r\n return this\r\n }\r\n\r\n alignAllFinancialAttachmentsDataWithQuoteDates() {\r\n this.alignedFinancialAttachmentsData = {}\r\n this.timestampToFinancialsIndexesMap = {}\r\n this.financialAttachments?.forEach((quoteFinancialAttachment) => {\r\n this.alignFinancialAttachmentsDataWithQuoteDates(quoteFinancialAttachment)\r\n })\r\n }\r\n\r\n alignFinancialAttachmentsDataWithQuoteDates(quoteFinancialAttachment: QuoteFinancialAttachment) {\r\n const timestampToFinancialsIndexesMap: ObjectHash = {}\r\n const financialAttachmentsData = this.financialAttachmentsData?.[quoteFinancialAttachment]\r\n\r\n if (financialAttachmentsData) {\r\n let lastDateIndex = 0\r\n const firstDate = this.date[0]\r\n this.alignedFinancialAttachmentsData[quoteFinancialAttachment] = financialAttachmentsData.map((data, index) => {\r\n let matchingQuoteTimestamp: number | null = null\r\n\r\n const parsedDate = dateFromUnixTimestamp(data.timestamp)\r\n const convertedDateToNyTimestamp = convertLocalToNyTime(parsedDate, false).getTime() / 1000\r\n\r\n if (firstDate < convertedDateToNyTimestamp) {\r\n for (let dateIndex = lastDateIndex; dateIndex < this.date.length; dateIndex += 1) {\r\n const timestamp = this.date[dateIndex]\r\n const dateDate = dateFromUnixTimestamp(timestamp)\r\n if (this.isIntraday || this.timeframe === TIMEFRAME.d) {\r\n if (isSameDay(parsedDate, dateDate)) {\r\n lastDateIndex = dateIndex\r\n matchingQuoteTimestamp = timestamp\r\n break\r\n }\r\n } else if (this.timeframe === TIMEFRAME.w) {\r\n if (isSameWeek(parsedDate, dateDate, { weekStartsOn: 1 })) {\r\n lastDateIndex = dateIndex\r\n matchingQuoteTimestamp = timestamp\r\n break\r\n }\r\n } else if (this.timeframe === TIMEFRAME.m) {\r\n if (isSameMonth(parsedDate, dateDate)) {\r\n lastDateIndex = dateIndex\r\n matchingQuoteTimestamp = timestamp\r\n break\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (matchingQuoteTimestamp !== null) {\r\n const key = matchingQuoteTimestamp.toString()\r\n timestampToFinancialsIndexesMap[key] ??= []\r\n timestampToFinancialsIndexesMap[key].push(index)\r\n }\r\n\r\n return { ...data, matchingQuoteTimestamp }\r\n })\r\n\r\n this.timestampToFinancialsIndexesMap = {\r\n [quoteFinancialAttachment]: timestampToFinancialsIndexesMap,\r\n }\r\n }\r\n }\r\n\r\n clearCachedData() {\r\n deleteCachedQuote({ cid: this.cid })\r\n }\r\n\r\n destroy(options?: ObjectHash) {\r\n super.destroy(options)\r\n this.clearCachedData()\r\n return this\r\n }\r\n\r\n getDrawDays() {\r\n if (this.instrument !== Instrument.Stock) {\r\n return Infinity\r\n }\r\n switch (this.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n return 10\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n return 15\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getHeikinAshiData() {\r\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\r\n if (cachedHeikinAshiData) {\r\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\r\n }\r\n\r\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\r\n const HAOpen = this.open.reduce(\r\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\r\n [] as number[]\r\n )\r\n\r\n const heikAshiData = { open: HAOpen, close: HAClose }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\r\n\r\n return heikAshiData\r\n }\r\n\r\n getDayToOffset(): ObjectHash {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as ObjectHash\r\n }\r\n const dayToOffset: ObjectHash = {}\r\n let day = 0\r\n let lastDay\r\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n const dateString = dateStringFromDate(date)\r\n if (dateString !== lastDay) {\r\n dayToOffset[dateString] = day\r\n day++\r\n lastDay = dateString\r\n }\r\n }\r\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\r\n // premarket=false in fetch query there isn't other way to distinguish that\r\n if (getIsSSr() && this.lastDate) {\r\n // YYYYMMDD / 20211118 => YYYY-MM-DD\r\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\r\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\r\n\r\n if (lastDay !== lastDate) {\r\n dayToOffset[lastDate] = day\r\n }\r\n }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\r\n return dayToOffset\r\n }\r\n\r\n getDaysInQuote() {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as Date[]\r\n }\r\n const dayToOffset = this.getDayToOffset()\r\n const daysInQuote = Object.keys(dayToOffset)\r\n .map((dateString) => {\r\n const [year, month, day] = dateString.split('-')\r\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\r\n })\r\n .sort((a, b) => a.getTime() - b.getTime())\r\n\r\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\r\n return daysInQuote\r\n }\r\n\r\n getBarIndexes() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return Array.from({ length: this.date.length }).map((_, index) => index)\r\n }\r\n\r\n const barIndex = []\r\n const dayToOffset = this.getDayToOffset()\r\n\r\n for (let i = 0; i < this.date.length; i += 1) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\r\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\r\n barIndex[i] = x\r\n }\r\n\r\n return barIndex\r\n }\r\n\r\n getBarIndex(i: number) {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return i\r\n }\r\n return this.barIndex[i]\r\n }\r\n\r\n getBarsInDay() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n return Math.ceil(this.drawMinutesPerDay / this.interval)\r\n }\r\n\r\n getDataIndexByBarIndex(index: number) {\r\n if (this.barIndex) {\r\n for (let i = 0; i < this.barIndex.length; i++) {\r\n if (this.barIndex[i] === index) {\r\n return i\r\n }\r\n }\r\n }\r\n return -1\r\n }\r\n\r\n getDataByBarIndex(key: keyof Quote, index: number) {\r\n const dataIndex = this.getDataIndexByBarIndex(index)\r\n if (dataIndex > -1) {\r\n const quoteData = this[key as keyof Quote]! as number[]\r\n return quoteData[dataIndex] ?? null\r\n }\r\n return null\r\n }\r\n\r\n getDateToIndex() {\r\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\r\n if (cachedDateToIndex) {\r\n return cachedDateToIndex as unknown as ObjectHash\r\n }\r\n const dateToIndex: ObjectHash = {}\r\n for (let i = 0; i < this.date.length; i++) {\r\n dateToIndex[this.date[i]] = i\r\n }\r\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\r\n return dateToIndex\r\n }\r\n\r\n getTimestampFomPositionX(positionX: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getTimestampFromPositionX({\r\n positionX,\r\n quote: this,\r\n })\r\n }\r\n\r\n getPositionXFromTimestamp(timestamp: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getPositionXFromTimestamp({\r\n timestamp,\r\n quote: this,\r\n })\r\n }\r\n\r\n getUrl(options: QuoteUrlOptions) {\r\n const config: UrlOptions = {\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n timeframe: this.timeframe || 'd1',\r\n aftermarket: this.aftermarket,\r\n premarket: this.premarket,\r\n patterns: this.hasPatterns,\r\n maxBars: this.maxBars,\r\n ...options,\r\n financialAttachments: this.financialAttachments?.join(','),\r\n }\r\n\r\n const isStock = config.instrument === Instrument.Stock\r\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\r\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\r\n\r\n if (getIsSSr()) {\r\n domain = process.env.BE_API_URL!\r\n }\r\n\r\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\r\n }\r\n\r\n getRawTicker() {\r\n return getRawTickerForInstrument(this.instrument, this.ticker)\r\n }\r\n\r\n clearData() {\r\n this.updateAttributes(getEmptyQuote())\r\n }\r\n\r\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\r\n return JSON.parse(JSON.stringify(omit(this.toJSON(), [...Quote.computableKeys, ...omitKeys])))\r\n }\r\n}\r\n\r\nQuote.initClass()\r\n\r\nexport default Quote\r\n","import { QuoteFinancialAttachment } from '../../constants/common'\r\n\r\nexport enum QuoteFetchType {\r\n Refetch = 'refetch',\r\n NewerData = 'newerData',\r\n}\r\n\r\nexport enum QuoteFetchTypeUrlOption {\r\n New = 'new',\r\n Newer = 'newer',\r\n}\r\n\r\nexport interface QuoteUrlOptions {\r\n type: QuoteFetchTypeUrlOption\r\n dataId?: string\r\n events?: boolean\r\n financialAttachments?: QuoteFinancialAttachment[]\r\n}\r\n","export const largeChartFontSize = {\r\n S: 8,\r\n M: 10,\r\n XXL: 16,\r\n XXXL: 24,\r\n}\r\n","import { Theme } from '../../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n FONT_SIZE,\r\n LINE_HEIGHT,\r\n OFFSET,\r\n PADDING,\r\n SETTINGS_HEIGHT,\r\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n TextBaseline,\r\n} from '../../constants/common'\r\nimport {\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n generalColors,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from '../constants'\r\nimport { ISettings } from './interfaces'\r\n\r\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\r\n ChartSettings: {\r\n general: {\r\n Colors: {\r\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\r\n [Theme.light]: chartLightTheme,\r\n [Theme.dark]: chartDarkTheme,\r\n },\r\n settingsHeight: SETTINGS_HEIGHT,\r\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.XL,\r\n baseline: TextBaseline.alphabetic,\r\n ticker: {\r\n margin: {\r\n top: 30,\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.XXXL,\r\n style: 'bold',\r\n },\r\n },\r\n ohlc: {\r\n margin: {\r\n top: 30,\r\n left: 30,\r\n right: 30,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n change: {\r\n margin: {\r\n top: 30,\r\n right: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n },\r\n },\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.M,\r\n baseline: TextBaseline.top,\r\n axis: {\r\n margin: {\r\n top: 8,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n overlayLabel: {\r\n labelSpacing: 12,\r\n margin: {\r\n top: -8,\r\n left: 6,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n weight: 'bold',\r\n },\r\n },\r\n timeframe: {\r\n margin: {\r\n top: 0,\r\n left: 28,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n weight: '900',\r\n family: 'Lato, sans-serif',\r\n },\r\n },\r\n volumeAxis: {\r\n margin: {\r\n left: 33,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n },\r\n IndicatorSettings: {\r\n general: {\r\n height: 140,\r\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 2,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.S,\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.S,\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n indicatorLabel: {\r\n labelSpacing: 4,\r\n margin: {\r\n top: OFFSET.S,\r\n left: OFFSET.M,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n lineHeight: LINE_HEIGHT.M,\r\n },\r\n },\r\n },\r\n },\r\n MarketSentimentSettings: {\r\n general: {\r\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: 0,\r\n },\r\n bottom: {\r\n height: 12,\r\n },\r\n left: {\r\n width: 0,\r\n },\r\n right: {\r\n width: 30,\r\n },\r\n },\r\n ColorsSettings: generalColors,\r\n ThumbSettings: {\r\n size: 8,\r\n touchSize: 16,\r\n color: '#ddd',\r\n borderWidth: 1,\r\n borderColor: '#999',\r\n },\r\n ElementSettings: {\r\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\r\n defaultFill: '#1e6dc066',\r\n defaultTransparentFill: '#1e6dc000',\r\n },\r\n})\r\n","import merge from 'lodash.merge'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\r\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\r\nimport { SpecificChartFunctionality } from '../constants/common'\r\nimport Utils, { isRedesignedPage } from '../utils'\r\nimport LayoutModel from './chart_layout'\r\nimport { getColorOverwrites } from './chart_settings'\r\nimport { largeChartFontSize } from './chart_settings/constants'\r\nimport { INTERACTIVE_CHART_SETTINGS } from './chart_settings/interactive_chart_settings'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport {\r\n IChartThemeColors,\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from './constants'\r\n\r\ninterface Config {\r\n theme: Theme\r\n barMargin?: number\r\n barWidth?: number\r\n border?: number\r\n charts?: ChartConfigChart[]\r\n colorsOverride?: Array\r\n volumeHeight?: number\r\n colors?: ObjectHash, Theme>\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport function getSettings(config: Config, chartSettings?: ISettings): ISettings {\r\n const settings = merge({}, chartSettings ?? INTERACTIVE_CHART_SETTINGS(config.theme))\r\n\r\n if (config.barWidth != null) {\r\n settings.ChartSettings.center.barWidth = config.barWidth\r\n settings.IndicatorSettings.center.barWidth = config.barWidth\r\n }\r\n if (config.barMargin != null) {\r\n settings.ChartSettings.center.barMargin = config.barMargin\r\n settings.IndicatorSettings.center.barMargin = config.barMargin\r\n }\r\n if (config.border != null) {\r\n settings.ChartSettings.center.border = config.border\r\n settings.IndicatorSettings.center.border = config.border\r\n }\r\n if (config.colorsOverride) {\r\n settings.ColorsSettings = config.colorsOverride\r\n }\r\n if (config.volumeHeight) {\r\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\r\n }\r\n if (config.colors) {\r\n const settingColors = settings.ChartSettings.general.Colors\r\n settings.ChartSettings.general.Colors = {\r\n ...settingColors,\r\n [Theme.light]: {\r\n ...settingColors[Theme.light],\r\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\r\n },\r\n [Theme.dark]: {\r\n ...settingColors[Theme.dark],\r\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\r\n },\r\n }\r\n }\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\r\n settings.ChartSettings.left.width = 0\r\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\r\n settings.IndicatorSettings.left.width = 0\r\n }\r\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\r\n settings.ChartSettings.top.height = 10\r\n }\r\n\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\r\n if (isGroupInstrument) {\r\n settings.ChartSettings.top.ohlc.margin.top = 4\r\n settings.ChartSettings.top.ticker.margin.top = 0\r\n settings.ChartSettings.top.ticker.font = {\r\n size: largeChartFontSize.XXL,\r\n style: 'bold',\r\n }\r\n settings.ChartSettings.left.timeframe.margin.top = 12\r\n settings.ChartSettings.left.timeframe.font = {\r\n size: largeChartFontSize.S,\r\n style: 'bold',\r\n }\r\n }\r\n }\r\n\r\n if (config.isOurSiteRequest !== undefined) {\r\n settings.isOurSiteRequest = config.isOurSiteRequest\r\n }\r\n\r\n return settings\r\n}\r\n\r\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\r\n const settings = merge({}, chart_layout.settings)\r\n const isLight = theme === Theme.light\r\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\r\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\r\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\r\n\r\n return settings\r\n}\r\n\r\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\r\n const settings = chart_layout.settings\r\n\r\n return {\r\n ...settings,\r\n ChartSettings: {\r\n ...settings.ChartSettings,\r\n general: {\r\n ...settings.ChartSettings.general,\r\n Colors: {\r\n ...settings.ChartSettings.general.Colors,\r\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\r\n },\r\n },\r\n },\r\n }\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport ChartLayoutModel from './chart_layout'\r\nimport Element from './element'\r\n\r\nexport const handleRemoveIndicatorPane = ({\r\n paneIndex,\r\n chartLayoutModel,\r\n}: {\r\n paneIndex: number\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const charts = chartLayoutModel.getAllCharts()\r\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\r\n}\r\n\r\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\r\n return (index + 1) * (isBelowZero ? -1 : 1)\r\n}\r\n\r\nexport function rebuildElementZIndexes({\r\n elementsArray,\r\n isBelowZero,\r\n}: {\r\n elementsArray: Element[]\r\n isBelowZero: boolean\r\n}) {\r\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n elements.forEach((element, index) => {\r\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\r\n if (newZIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: newZIndex })\r\n }\r\n })\r\n}\r\n\r\nexport function changeElementZIndexes({\r\n elementsArray,\r\n addElement,\r\n oldZIndex,\r\n newZIndex,\r\n isBelowZero = false,\r\n}: {\r\n elementsArray: Element[]\r\n addElement: Element | undefined\r\n oldZIndex: number\r\n newZIndex: number\r\n isBelowZero?: boolean\r\n}) {\r\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n const elements =\r\n elementsArray.length === 0 && addElement\r\n ? [...array, addElement]\r\n : array\r\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\r\n .flatMap((el, index) =>\r\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\r\n )\r\n\r\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\r\n if (elements.length < Math.abs(newZIndex) && addElement) {\r\n elements.push(addElement)\r\n }\r\n\r\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\r\n}\r\n\r\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\r\n return `${\r\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\r\n }${ticker}`\r\n}\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n color: string\r\n}\r\n\r\nexport class EMAConfig extends BaseConfig {\r\n static type = OverlayType.Ema\r\n static abbreviation = 'ema'\r\n static label = 'Exponential Moving Average'\r\n static shortLabel = 'EMA'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'color'] as Array\r\n static inputsLabels = { period: 'Period', color: 'Color' }\r\n static calculatedValuesOrder = ['ema'] as const\r\n static calculatedValuesLabels = { ema: 'EMA' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { ObjectHash } from '../../../types/shared'\r\nimport ElementBaseConfig from '../../canvas/ElementBaseConfig'\r\nimport { OverlayType } from '../../constants/common'\r\n\r\nexport default class OverlayBaseConfig extends ElementBaseConfig {\r\n static type = OverlayType.Overlay\r\n static abbreviation = 'ovl'\r\n static label = 'Overlay'\r\n static shortLabel = 'Overlay'\r\n static optionsOrder = [] as readonly string[]\r\n static optionsLabels = {}\r\n static inputsOrder = [] as readonly string[]\r\n static inputsLabels = {}\r\n static calculatedValuesOrder = [] as readonly string[]\r\n static calculatedValuesLabels = {}\r\n static defaultCalculatedValueOption = undefined as undefined | string\r\n\r\n get defaultCalculatedValueOption() {\r\n return (this.constructor as typeof OverlayBaseConfig).defaultCalculatedValueOption\r\n }\r\n\r\n static getShortLabelWithAttrs(attrs: ObjectHash) {\r\n return `${this.shortLabel} ${this.optionsOrder.map((item) => attrs[item]).join(',')}`\r\n }\r\n\r\n get getShortLabelWithAttrs() {\r\n return (this.constructor as typeof OverlayBaseConfig).getShortLabelWithAttrs\r\n }\r\n\r\n static getDefaultCalculatedValues() {\r\n return this.calculatedValuesOrder.reduce((prev, curr) => ({ ...prev, [curr]: [] }), {})\r\n }\r\n\r\n get getDefaultCalculatedValues() {\r\n return (this.constructor as typeof OverlayBaseConfig).getDefaultCalculatedValues\r\n }\r\n}\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n deviations: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n topColor?: string\r\n bottomColor?: string\r\n}\r\n\r\nexport class BBConfig extends BaseConfig {\r\n static type = OverlayType.Bb\r\n static abbreviation = 'bb'\r\n static label = 'Bollinger Bands'\r\n static shortLabel = 'BB'\r\n static optionsOrder = ['period', 'deviations'] as const\r\n static optionsLabels = { period: 'Period', deviations: 'Deviations' }\r\n static inputsOrder = ['period', 'deviations', 'topColor', 'bottomColor'] as Array\r\n static inputsLabels = {\r\n period: 'Period',\r\n deviations: 'Deviations',\r\n topColor: 'Top Color',\r\n bottomColor: 'Bottom Color',\r\n }\r\n\r\n static calculatedValuesOrder = ['upperBand', 'sma', 'lowerBand'] as const\r\n static calculatedValuesLabels = {\r\n sma: 'SMA',\r\n upperBand: 'Upper Band',\r\n lowerBand: 'Lower Band',\r\n }\r\n\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[1]\r\n}\r\n","import { BBConfig, Options } from '../overlays/configs/bb'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n upperBand: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class BbCalculation extends MainCalculation {\r\n static config = BBConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period, deviations } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n const stdDev = []\r\n\r\n for (let i = 0; i < period; i++) {\r\n sum += close[i]\r\n }\r\n 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 stdDev[i] = Math.sqrt(stdDevSum / period)\r\n\r\n this.calculatedValues.upperBand[i] = this.calculatedValues.sma[i] + stdDev[i] * deviations\r\n this.calculatedValues.lowerBand[i] = this.calculatedValues.sma[i] - stdDev[i] * deviations\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChartConfigChartPaneElement,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n RequireByKey,\r\n} from '../../types/shared'\r\nimport Element from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\r\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\nimport OverlayConfig from './configs/overlayBaseConfig'\r\n\r\nexport interface IOverlayIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nconst DEFAULT_LABEL_COLOR = '#0587cd'\r\n\r\nclass Overlay extends Element implements IOverlayIsValid {\r\n static config = OverlayConfig\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare chart: BaseChart\r\n\r\n get type() {\r\n return (this.constructor as typeof Overlay).config.type as OverlayType\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Overlay).config.label\r\n }\r\n\r\n get config() {\r\n return (this.constructor as typeof Overlay).config\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\r\n }\r\n\r\n getFreeColor() {\r\n return this.getChartLayoutSettings().ColorsSettings[0]\r\n // TODO proper implementation - example how this could be done:\r\n // let colorsUsed = []\r\n // for (let overlay of this.chart.overlays) {\r\n // let object = overlay.getModalConfig().inputs\r\n // for (let _ in object) {\r\n // let input = object[_]\r\n // if (input.type === 'color') {\r\n // colorsUsed.push(input.value)\r\n // }\r\n // }\r\n // }\r\n // for (let color of colors) {\r\n // if (!colorsUsed.includes(color)) {\r\n // return color\r\n // }\r\n // }\r\n // return colors[0]\r\n }\r\n\r\n renderContent(_?: RenderingContext2DType) {\r\n this.data = this.model.chart().quote()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n isRendered() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toConfig() {\r\n const colors: string[] = []\r\n const periods: string[] = []\r\n\r\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\r\n if (input.type === 'color') {\r\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\r\n } else {\r\n periods.push(input.value.toString())\r\n }\r\n })\r\n\r\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\r\n }\r\n\r\n toString() {\r\n return this.config.getShortLabelWithAttrs(this.attrs)\r\n }\r\n}\r\n\r\nexport default Overlay\r\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\r\nimport { BbCalculation } from '../indicator-calculation/bb'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, BBConfig } from './configs/bb'\r\nimport Overlay from './overlay'\r\n\r\nconst BB_COLORS = {\r\n [Theme.light]: {\r\n TOP: '#D386DF',\r\n BOTTOM: '#69C1EA',\r\n MIDDLE: '#CFD2F2',\r\n },\r\n [Theme.dark]: {\r\n TOP: '#D38BFB',\r\n BOTTOM: '#57AEFB',\r\n MIDDLE: '#E1B6FC',\r\n },\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Deviations: 2.0,\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\r\n\r\n return [period, deviations]\r\n}\r\n\r\nclass BollingerBands extends Overlay {\r\n static config = BBConfig\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, deviations] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.deviations = deviations\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n const { leftOffset, width } = this.model.chart()\r\n const [top, bottom] = this.model.scale.y.domain()\r\n const scaledTop = this.fy(top)\r\n const scaledBottom = this.fy(bottom)\r\n const { close } = this.data\r\n const period = Math.min(this.attrs.period, close.length - 1)\r\n\r\n let firstBarToRender: number | undefined\r\n let lastBarToRender = 0\r\n\r\n // middle line && find first & last bar to render\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\r\n\r\n const bbCalculation = new BbCalculation({\r\n quote: this.data,\r\n options: {\r\n period,\r\n deviations: this.attrs.deviations,\r\n },\r\n })\r\n\r\n bbCalculation.calculate(({ sma }, dataIndex) => {\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = dataIndex\r\n\r\n context.lineTo(this.fx(dataIndex), Math.round(this.fy(sma[dataIndex])))\r\n\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n lastBarToRender = dataIndex\r\n })\r\n\r\n if (firstBarToRender === undefined) return\r\n context.stroke()\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n\r\n // top line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledTop)\r\n context.set('strokeStyle', BB_COLORS[theme].TOP)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.upperBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledTop)\r\n context.fill()\r\n\r\n // bottom line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\r\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\r\n context.fill()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: BBConfig.inputsLabels.period,\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n deviations: {\r\n type: 'number',\r\n label: BBConfig.inputsLabels.deviations,\r\n name: 'deviations',\r\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\r\n required: true,\r\n min: 0.1,\r\n max: 999,\r\n step: 0.1,\r\n },\r\n topColor: {\r\n type: 'color',\r\n label: BBConfig.inputsLabels.topColor,\r\n name: 'topColor',\r\n value: this.attrs.topColor ?? this.getFreeColor(),\r\n },\r\n bottomColor: {\r\n type: 'color',\r\n label: BBConfig.inputsLabels.bottomColor,\r\n name: 'bottomColor',\r\n value: this.attrs.bottomColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: BBConfig.label,\r\n inputs: BBConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n deviations: `${options.deviations.label} must be a number between ${options.deviations.min} and ${options.deviations.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'deviations':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'topColor':\r\n case 'bottomColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n return this.attrs.topColor || BB_COLORS[theme].TOP\r\n }\r\n}\r\n\r\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\r\n\r\nexport default BollingerBands\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n channelStrokeColor: string\r\n channelFillColor: string\r\n medianBandColor: string\r\n}\r\n\r\nexport class DchConfig extends BaseConfig {\r\n static type = OverlayType.Dch\r\n static abbreviation = 'dch'\r\n static label = 'Donchian Channels'\r\n static shortLabel = 'Donchian'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'channelStrokeColor', 'channelFillColor', 'medianBandColor'] as Array\r\n static inputsLabels = {\r\n period: 'Period',\r\n channelStrokeColor: 'Channels Stroke Color',\r\n channelFillColor: 'Channels Fill Color',\r\n medianBandColor: 'Median Band Color',\r\n }\r\n}\r\n","import utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { Attrs, DchConfig } from './configs/dch'\r\nimport Overlay from './overlay'\r\n\r\nconst DEFAULT_PERIOD = 20\r\n\r\nconst COLORS = {\r\n ChannelStroke: '#69c1ea',\r\n ChannelFill: '#69C1EA12',\r\n MedianBandStroke: '#ffa75f',\r\n}\r\n\r\nclass DonchianChannels extends Overlay {\r\n static config = DchConfig\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period } = this.attrs\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const medianBand: number[] = []\r\n let firstBarToRender = -1\r\n let lastBarToRender = 0\r\n if (this.data.close.length === undefined) {\r\n return\r\n }\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', COLORS.ChannelStroke)\r\n context.set('fillStyle', COLORS.ChannelFill)\r\n\r\n //upper band + clip\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\r\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\r\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\r\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n },\r\n })\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // lower band + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // median band\r\n context.set('strokeStyle', COLORS.MedianBandStroke)\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PERIOD,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n channelStrokeColor: {\r\n type: 'color',\r\n label: 'Channels Stroke Color',\r\n name: 'channelStrokeColor',\r\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\r\n },\r\n channelFillColor: {\r\n type: 'color',\r\n label: 'Channels Fill Color',\r\n name: 'channelFillColor',\r\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\r\n },\r\n medianBandColor: {\r\n type: 'color',\r\n label: 'Median Band Color',\r\n name: 'medianBandColor',\r\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: DchConfig.label,\r\n inputs: DchConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'channelStrokeColor':\r\n case 'channelFillColor':\r\n case 'medianBandColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.medianBandColor\r\n }\r\n}\r\n\r\nDonchianChannels.prototype.defaults = {\r\n medianBandColor: COLORS.MedianBandStroke,\r\n channelStrokeColor: COLORS.ChannelStroke,\r\n channelFillColor: COLORS.ChannelFill,\r\n}\r\n\r\nexport default DonchianChannels\r\n","import { EMACalculation } from '../indicator-calculation/ema'\r\nimport { Attrs, EMAConfig } from './configs/ema'\r\nimport Overlay from './overlay'\r\n\r\nclass EMA extends Overlay {\r\n static config = EMAConfig\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n const emaCalculation = new EMACalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.attrs.period,\r\n },\r\n })\r\n emaCalculation.calculate(({ ema }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(ema[dataIndex])))\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n color: {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: this.config.label,\r\n inputs: this.config.inputsOrder.map((item) => options[item as keyof Attrs]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nEMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default EMA\r\n","import { OverlayType } from '../../constants/common'\r\nimport { EMAConfig } from './ema'\r\n\r\nexport class EMA2Config extends EMAConfig {\r\n static type = OverlayType.Ema2\r\n}\r\n","import { EMA2Config } from './configs/ema2'\r\nimport EMA from './ema'\r\n\r\nclass EMA2 extends EMA {\r\n static config = EMA2Config\r\n}\r\n\r\nEMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default EMA2\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n lowColor: string\r\n highColor: string\r\n}\r\n\r\nexport class HILOConfig extends BaseConfig {\r\n static type = OverlayType.Hilo\r\n static abbreviation = 'hilo'\r\n static label = 'High/Low'\r\n static shortLabel = 'HILO'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'highColor', 'lowColor'] as Array\r\n static inputsLabels = {\r\n period: 'Period',\r\n highColor: 'High Color',\r\n lowColor: 'Low Color',\r\n }\r\n}\r\n","import PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport { Attrs, HILOConfig } from './configs/hilo'\r\nimport Overlay from './overlay'\r\n\r\nclass HighLow extends Overlay {\r\n static config = HILOConfig\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const chartModel = this.model.chart()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const halfWidth = barWidth / 2\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n context.translate(0.5, 0.5)\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.highColor)\r\n let prevHigh = -1\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < -10) {\r\n prevHigh = highestHigh\r\n continue\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n\r\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\r\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\r\n\r\n prevHigh = highestHigh\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n if (firstBarToRender === undefined) return\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.lowColor)\r\n let prevLow = -1\r\n let prevBar = firstBarToRender\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\r\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\r\n\r\n prevLow = lowestLow\r\n prevBar = i\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\r\n context.fill()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 50,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n highColor: {\r\n type: 'color',\r\n label: 'High Color',\r\n name: 'highColor',\r\n value: this.attrs.highColor ?? this.getFreeColor(),\r\n },\r\n lowColor: {\r\n type: 'color',\r\n label: 'Low Color',\r\n name: 'lowColor',\r\n value: this.attrs.lowColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: HILOConfig.label,\r\n inputs: HILOConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'highColor':\r\n case 'lowColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.highColor\r\n }\r\n}\r\n\r\nHighLow.prototype.defaults = {\r\n lowColor: '#69c1ea',\r\n highColor: '#d386df',\r\n}\r\n\r\nexport default HighLow\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n price: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: number\r\n color: string\r\n}\r\n\r\nexport class HLineConfig extends BaseConfig {\r\n static type = OverlayType.Hline\r\n static abbreviation = 'hline'\r\n static label = 'Horizontal Line'\r\n static shortLabel = 'HL'\r\n static optionsOrder = ['price'] as const\r\n static optionsLabels = { price: 'Price' }\r\n static inputsOrder = ['price', 'color'] as Array>\r\n static inputsLabels = {\r\n price: 'Price',\r\n color: 'Color',\r\n }\r\n}\r\n","import { isPositiveFloat } from '../utils/helpers'\r\nimport { Attrs, HLineConfig } from './configs/hline'\r\nimport Overlay from './overlay'\r\n\r\nclass HorizontalLine extends Overlay {\r\n static config = HLineConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\r\n this.attrs.price = parseFloat(this.attrs.period)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const y = Math.round(this.fy(this.attrs.price))\r\n context.set('strokeStyle', this.attrs.color)\r\n context.translate(0, 0.5)\r\n context.beginPath()\r\n context.moveTo(-this.model.chart().leftOffset, y)\r\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\r\n context.stroke()\r\n context.translate(0, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n price: {\r\n type: 'number',\r\n label: 'Price',\r\n name: 'price',\r\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\r\n required: true,\r\n step: 0.1,\r\n },\r\n color: {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: HLineConfig.label,\r\n inputs: HLineConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n price: `${options.price.label} must be number`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'price':\r\n return isPositiveFloat(this.attrs[key])\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\r\n\r\nexport default HorizontalLine\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n conversion: number\r\n base: number\r\n spanB: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period?: string\r\n spanAStrokeColor: string\r\n spanAFillColor: string\r\n spanBStrokeColor: string\r\n spanBFillColor: string\r\n conversionLineColor: string\r\n baseLineColor: string\r\n laggingSpanColor: string\r\n}\r\n\r\nexport class ICConfig extends BaseConfig {\r\n static type = OverlayType.Ic\r\n static abbreviation = 'ic'\r\n static label = 'Ichimoku Cloud'\r\n static shortLabel = 'Ichimoku'\r\n static optionsOrder = ['conversion', 'base', 'spanB'] as const\r\n\r\n static optionsLabels = {\r\n conversion: 'Conversion Line',\r\n base: 'Base Line Length',\r\n spanB: 'Leading Span B Length',\r\n }\r\n\r\n static inputsOrder = [\r\n ...this.optionsOrder,\r\n 'spanAStrokeColor',\r\n 'spanAFillColor',\r\n 'spanBStrokeColor',\r\n 'spanBFillColor',\r\n 'conversionLineColor',\r\n 'baseLineColor',\r\n 'laggingSpanColor',\r\n ] as Array>\r\n\r\n static inputsLabels = {\r\n ...this.optionsLabels,\r\n spanAStrokeColor: 'Span A Stroke Color',\r\n spanAFillColor: 'Span A Fill Color',\r\n spanBStrokeColor: 'Span B Stroke Color',\r\n spanBFillColor: 'Span B Fill Color',\r\n conversionLineColor: 'Conversion Line Color',\r\n baseLineColor: 'Base Line Color',\r\n laggingSpanColor: 'Lagging Span Color',\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, ICConfig } from './configs/ic'\r\nimport Overlay from './overlay'\r\n\r\nconst COLORS = {\r\n SpanA: {\r\n Stroke: '#009600',\r\n Fill: '#00960022',\r\n },\r\n SpanB: {\r\n Stroke: '#C80000',\r\n Fill: '#C8000022',\r\n },\r\n ConversionLine: '#69C1EA',\r\n BaseLine: '#E54040',\r\n LaggingSpan: '#FFA75F',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Conversion: 9,\r\n Base: 26,\r\n SpanB: 52,\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\r\n getParsedIntegersFromPeriodString(period)\r\n return [conversion, base, spanB]\r\n}\r\n\r\nclass IchimokuCloud extends Overlay {\r\n static config = ICConfig\r\n static renderFull = false\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period))\r\n }\r\n\r\n get renderFull() {\r\n return (this.constructor as typeof IchimokuCloud).renderFull\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\r\n ) {\r\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\r\n this.attrs.conversion = conversion\r\n this.attrs.base = base\r\n this.attrs.spanB = spanB\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { high, low, close } = this.data\r\n\r\n const {\r\n conversion,\r\n base,\r\n spanB,\r\n spanAFillColor,\r\n spanAStrokeColor,\r\n spanBFillColor,\r\n spanBStrokeColor,\r\n baseLineColor,\r\n conversionLineColor,\r\n laggingSpanColor,\r\n } = this.attrs\r\n\r\n const conversionLine: number[] = []\r\n const baseLine: number[] = []\r\n const senkouSpanA: number[] = []\r\n const senkouSpanB: number[] = []\r\n const conversionStartIndex = conversion - 1\r\n const baseStartIndex = base - 1\r\n const spanBIndex = spanB - 1\r\n const start = Math.min(baseStartIndex, conversionStartIndex)\r\n const end = close.length + baseStartIndex\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n // Calculation\r\n for (let i = start; i < end; i++) {\r\n if (i >= conversionStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\r\n conversionLine[i] = (highestHi + lowestLo) / 2\r\n }\r\n\r\n if (i >= baseStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\r\n baseLine[i] = (highestHi + lowestLo) / 2\r\n\r\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n\r\n if (i >= spanBIndex) {\r\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\r\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n }\r\n\r\n let lastSpanAX = 0\r\n let lastSpanBX = 0\r\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\r\n\r\n const drawInVisibleAreaProps = {\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width,\r\n fxOverride: this.fx,\r\n }\r\n\r\n context.set('lineWidth', 1)\r\n context.translate(0.5, 0.5)\r\n context.save()\r\n // 1. Senkou Span A\r\n // 1.1 Stroke\r\n context.set('strokeStyle', spanAStrokeColor)\r\n context.set('fillStyle', spanAFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n lastSpanAX = x\r\n },\r\n })\r\n context.stroke()\r\n // 1.2 Clipping area\r\n context.lineTo(lastSpanAX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 1.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n lastSpanBX = x\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n\r\n // 2. Senkou Span B\r\n // 2.1 Stroke\r\n context.save()\r\n context.set('strokeStyle', spanBStrokeColor)\r\n context.set('fillStyle', spanBFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n },\r\n })\r\n context.stroke()\r\n // 2.2 Clipping area\r\n context.lineTo(lastSpanBX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 2.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n context.translate(-0.5, -0.5)\r\n\r\n if (this.renderFull) {\r\n // conversion line\r\n context.set('strokeStyle', conversionLineColor)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // base line\r\n context.set('strokeStyle', baseLineColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // lagging span\r\n context.set('strokeStyle', laggingSpanColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n fxOverride: (x: number) => this.fx(x - base),\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n conversion: {\r\n type: 'number',\r\n label: 'Conversion Line',\r\n name: 'conversion',\r\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n base: {\r\n type: 'number',\r\n label: 'Base Line Length',\r\n name: 'base',\r\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n spanB: {\r\n type: 'number',\r\n label: 'Leading Span B Length',\r\n name: 'spanB',\r\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n\r\n spanAStrokeColor: {\r\n type: 'color',\r\n label: 'Span A Stroke Color',\r\n name: 'spanAStrokeColor',\r\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\r\n },\r\n spanAFillColor: {\r\n type: 'color',\r\n label: 'Span A Fill Color',\r\n name: 'spanAFillColor',\r\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\r\n },\r\n spanBStrokeColor: {\r\n type: 'color',\r\n label: 'Span B Stroke Color',\r\n name: 'spanBStrokeColor',\r\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\r\n },\r\n spanBFillColor: {\r\n type: 'color',\r\n label: 'Span B Fill Color',\r\n name: 'spanBFillColor',\r\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\r\n },\r\n conversionLineColor: {\r\n type: 'color',\r\n label: 'Conversion Line Color',\r\n name: 'conversionLineColor',\r\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\r\n },\r\n baseLineColor: {\r\n type: 'color',\r\n label: 'Base Line Color',\r\n name: 'baseLineColor',\r\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\r\n },\r\n laggingSpanColor: {\r\n type: 'color',\r\n label: 'Lagging Span Color',\r\n name: 'laggingSpanColor',\r\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: this.config.label,\r\n inputs: this.config.inputsOrder.map((item) => options[item as keyof Omit]),\r\n inputsErrorMessages: {\r\n conversion: `${options.conversion.label} must be a whole number between ${options.conversion.min} and ${options.conversion.max}`,\r\n base: `${options.base.label} must be a whole number between ${options.base.min} and ${options.base.max}`,\r\n spanB: `${options.spanB.label} must be a whole number between ${options.spanB.min} and ${options.spanB.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'conversion':\r\n case 'base':\r\n case 'spanB':\r\n case 'lagging':\r\n return this.getIsNumberInputValid({ key })\r\n case 'spanAStrokeColor':\r\n case 'spanAFillColor':\r\n case 'spanBStrokeColor':\r\n case 'spanBFillColor':\r\n case 'conversionLineColor':\r\n case 'baseLineColor':\r\n case 'laggingSpanColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.spanAStrokeColor\r\n }\r\n}\r\n\r\nIchimokuCloud.prototype.defaults = {\r\n spanAStrokeColor: COLORS.SpanA.Stroke,\r\n spanAFillColor: COLORS.SpanA.Fill,\r\n spanBStrokeColor: COLORS.SpanB.Stroke,\r\n spanBFillColor: COLORS.SpanB.Fill,\r\n conversionLineColor: COLORS.ConversionLine,\r\n baseLineColor: COLORS.BaseLine,\r\n laggingSpanColor: COLORS.LaggingSpan,\r\n}\r\n\r\nexport default IchimokuCloud\r\n","import { OverlayType } from '../../constants/common'\r\nimport { ICConfig } from './ic'\r\n\r\nexport class ICFConfig extends ICConfig {\r\n static type = OverlayType.Icf\r\n static abbreviation = 'icf'\r\n static label = 'Ichimoku Cloud (Full)'\r\n static shortLabel = 'Ichimoku Full'\r\n}\r\n","import { ICFConfig } from './configs/icf'\r\nimport IchimokuCloud from './ic'\r\n\r\nclass IchimokuCloudFull extends IchimokuCloud {\r\n static config = ICFConfig\r\n static renderFull = true\r\n}\r\n\r\nexport default IchimokuCloudFull\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n emaPeriod: number\r\n multiplier: number\r\n atrPeriod: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period?: string\r\n strokeColor: string\r\n fillColor: string\r\n}\r\n\r\nexport class KCHConfig extends BaseConfig {\r\n static type = OverlayType.Kch\r\n static abbreviation = 'kch'\r\n static label = 'Keltner Channel'\r\n static shortLabel = 'Keltner Channel'\r\n static optionsOrder = ['emaPeriod', 'multiplier', 'atrPeriod'] as const\r\n\r\n static optionsLabels = {\r\n emaPeriod: 'EMA Period',\r\n multiplier: 'Multiplier',\r\n atrPeriod: 'ATR Period',\r\n }\r\n\r\n static inputsOrder = [...this.optionsOrder, 'strokeColor', 'fillColor'] as Array>\r\n\r\n static inputsLabels = {\r\n ...this.optionsLabels,\r\n strokeColor: 'Stroke Color',\r\n fillColor: 'Fill Color',\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { ExponentialMovingAverage } from '../indicator-calculation/ema'\r\nimport { Attrs, KCHConfig } from './configs/kch'\r\nimport Overlay from './overlay'\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n emaPeriod: 20,\r\n multiplier: 2.0,\r\n atrPeriod: 10,\r\n}\r\n\r\nconst COLORS = {\r\n Stroke: '#69C1EA',\r\n Fill: '#69C1EA33',\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const values = period.split(',')\r\n const emaPeriod = parseInt(values[0])\r\n const multiplier = parseFloat(values[1])\r\n const atrPeriod = parseInt(values[2])\r\n\r\n return [emaPeriod, multiplier, atrPeriod]\r\n}\r\n\r\nclass KeltnerChannel extends Overlay {\r\n static config = KCHConfig\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period)) * 2\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\r\n ) {\r\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\r\n this.attrs.emaPeriod = emaPeriod\r\n this.attrs.multiplier = multiplier\r\n this.attrs.atrPeriod = atrPeriod\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\r\n const ema = new ExponentialMovingAverage(emaPeriod)\r\n const atr = new AverageTrueRange(atrPeriod)\r\n const middleLine: number[] = []\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const start = Math.max(emaPeriod, atrPeriod)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', strokeColor)\r\n context.set('fillStyle', fillColor)\r\n\r\n //top line + clip\r\n context.beginPath()\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n ema.add(this.data.close[i])\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n if (i < start) {\r\n continue\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n middleLine[i] = ema.value\r\n upperBand[i] = ema.value + multiplier * atr.value\r\n lowerBand[i] = ema.value - multiplier * atr.value\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n }\r\n if (firstBarToRender === undefined) {\r\n context.restore()\r\n return\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // bottom line + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // middle line\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n emaPeriod: {\r\n type: 'number',\r\n label: 'EMA Period',\r\n name: 'emaPeriod',\r\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n multiplier: {\r\n type: 'number',\r\n label: 'Multiplier',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n },\r\n atrPeriod: {\r\n type: 'number',\r\n label: 'ATR Period',\r\n name: 'atrPeriod',\r\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n strokeColor: {\r\n type: 'color',\r\n label: 'Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.strokeColor ?? this.getFreeColor(),\r\n },\r\n fillColor: {\r\n type: 'color',\r\n label: 'Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.fillColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: KCHConfig.label,\r\n inputs: KCHConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n emaPeriod: `${options.emaPeriod.label} must be a whole number between ${options.emaPeriod.min} and ${options.emaPeriod.max}`,\r\n multiplier: `${options.multiplier.label} must be a number between ${options.multiplier.min} and ${options.multiplier.max}`,\r\n atrPeriod: `${options.atrPeriod.label} must be a whole number between ${options.atrPeriod.min} and ${options.atrPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'emaPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'atrPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.strokeColor\r\n }\r\n}\r\n\r\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\r\n\r\nexport default KeltnerChannel\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport class NoneConfig extends BaseConfig {\r\n static type = OverlayType.None\r\n static abbreviation = 'none'\r\n static label = 'None'\r\n static shortLabel = 'None'\r\n}\r\n","import { NoneConfig } from './configs/none'\r\nimport Overlay from './overlay'\r\n\r\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\r\nclass None extends Overlay {\r\n static config = NoneConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n isRendered() {\r\n return false\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n}\r\n\r\nexport default None\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\ninterface Attrs {\r\n supportColor: string\r\n resistColor: string\r\n}\r\n\r\nexport class PatternsConfig extends BaseConfig {\r\n static type = OverlayType.Patterns\r\n static abbreviation = 'patterns'\r\n static label = 'Patterns (daily charts)'\r\n static shortLabel = ''\r\n static inputsOrder = ['supportColor', 'resistColor'] as Array\r\n static inputsLabels = { supportColor: 'Support Color', resistColor: 'Resist Color' }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport { PatternsConfig } from './configs/patterns'\r\nimport Overlay from './overlay'\r\n\r\ntype aboveBelowType = 'above' | 'below'\r\n\r\nclass Patterns extends Overlay {\r\n static config = PatternsConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const data = this.data\r\n if (data.patterns.length === 0) {\r\n return\r\n }\r\n\r\n const originalScale = {\r\n width: 600,\r\n height: 300,\r\n barsInDay: Math.min(data.close.length, 200),\r\n high: data.patternsMaxRange,\r\n low: data.patternsMinRange,\r\n barWidth: 0,\r\n }\r\n originalScale.barWidth = originalScale.width / 200\r\n\r\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\r\n const fx = (x: number) => {\r\n if (x === 0) {\r\n return this.fx(0)\r\n }\r\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\r\n }\r\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\r\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\r\n const roundedXY = getRoundedObject({\r\n x1: fx(x1),\r\n y1: fy(y1),\r\n x2: fx(x2),\r\n y2: fy(y2),\r\n })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\r\n context.translate(translateXY.x, translateXY.y)\r\n\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', color)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n }\r\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx((x1 + x2) / 2),\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx(x1) + 5,\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 9, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const above = (y: number) =>\r\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\r\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\r\n\r\n const supportColor = 'rgb(0, 150, 220)'\r\n const resistColor = 'rgb(180, 50, 200)'\r\n\r\n for (const pattern of data.patterns) {\r\n const { x1, x2, x3, y3 } = pattern\r\n let { y1, y2 } = pattern\r\n switch (pattern.kind) {\r\n case 1: // Horiz S/R\r\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\r\n break\r\n\r\n case 2: // tl resist\r\n line(resistColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 3: // tl support\r\n if (y1 === originalScale.height && y2 === originalScale.height) {\r\n y1 = y2 = originalScale.height - 1\r\n // Maybe just need to check on the new scale?\r\n } // support \"pod grafom\"\r\n line(supportColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 12: // double top\r\n text('Double Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 13: // double bottom\r\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 14: // multi top\r\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 15: // multi bottom\r\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 16: // h&s top\r\n textHS('L', below(y1), resistColor, x1, y1)\r\n textHS('H', below(y2), resistColor, x2, y2)\r\n textHS('R', below(y3), resistColor, x3, y3)\r\n break\r\n\r\n case 17: // h&s bot\r\n textHS('L', above(y1), supportColor, x1, y1)\r\n textHS('H', above(y2), supportColor, x2, y2)\r\n textHS('R', above(y3), supportColor, x3, y3)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n supportColor: {\r\n type: 'color',\r\n label: 'Support Color',\r\n name: 'supportColor',\r\n value: this.attrs.supportColor ?? this.getFreeColor(),\r\n },\r\n resistColor: {\r\n type: 'color',\r\n label: 'Resist Color',\r\n name: 'resistColor',\r\n value: this.attrs.resistColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: PatternsConfig.label,\r\n inputs: PatternsConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return false\r\n }\r\n}\r\n\r\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\r\n\r\nexport default Patterns\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport enum Calculation {\r\n standard = 'Standard',\r\n fibonacci = 'Fibonacci',\r\n}\r\nexport type CalculationType = keyof typeof Calculation\r\n\r\nexport type Options = {\r\n calculationType: CalculationType\r\n}\r\nexport interface Attrs extends Options {\r\n period?: string\r\n color: string\r\n}\r\n\r\nexport class PPConfig extends BaseConfig {\r\n static type = OverlayType.Pp\r\n static abbreviation = 'pp'\r\n static label = 'Pivot Points'\r\n static shortLabel = 'Pivot Points'\r\n static optionsOrder = ['calculationType'] as const\r\n static optionsLabels = { calculationType: 'Calculation Type' }\r\n static inputsOrder = ['calculationType', 'color'] as Array>\r\n static inputsLabels = { calculationType: 'Calculation Type', color: 'Color' }\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { Instrument } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { TIMEFRAME, TextBaseline } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport Utils from '../utils'\r\nimport { getBarWidthWithMargin, round } from '../utils/chart'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { Attrs, Calculation, CalculationType, PPConfig } from './configs/pp'\r\nimport Overlay from './overlay'\r\n\r\nenum PivotPeriod {\r\n day,\r\n week,\r\n month,\r\n year,\r\n}\r\n\r\ntype PivotPointType = {\r\n pivot: number\r\n res1: number\r\n res2: number\r\n res3: number\r\n sup1: number\r\n sup2: number\r\n sup3: number\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n CalculationType: 'standard' as CalculationType,\r\n Color: '#FFA75F',\r\n}\r\nconst FIB_LVL_1 = 0.382\r\nconst FIB_LVL_2 = 0.618\r\nconst DAY_SECONDS = 86400\r\nconst MINUTES_PER_DAY = 1440\r\n\r\nclass PivotPoints extends Overlay {\r\n static config = PPConfig\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (period) {\r\n this.attrs.calculationType = period as CalculationType\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n getPeriodType() {\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n return PivotPeriod.week\r\n case TIMEFRAME.h4:\r\n case TIMEFRAME.d:\r\n return PivotPeriod.month\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n return PivotPeriod.year\r\n default:\r\n return PivotPeriod.day\r\n }\r\n }\r\n\r\n getIsEnoughData(startIndex: number, endIndex: number, periodType: PivotPeriod) {\r\n let dayGap = 7 // one week for week period\r\n if (periodType === PivotPeriod.month) dayGap = 28 // shortest month\r\n if (periodType === PivotPeriod.year) dayGap = 365\r\n\r\n if (startIndex !== endIndex) {\r\n if (startIndex === 0) {\r\n const daysDiff = (this.data.date[endIndex] - this.data.date[startIndex]) / DAY_SECONDS\r\n // we need to somehow determine if we have data if it starts from index 0\r\n // and we can't easily check if day before is different (different month/week/year)\r\n // so we are at least checking if it is [dayGap] days between start and end date\r\n return daysDiff >= dayGap\r\n } else {\r\n const startDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex])\r\n const beforeDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex - 1])\r\n if (periodType === PivotPeriod.week) {\r\n return beforeDay.getDate() !== startDay.getDate()\r\n } else {\r\n return beforeDay.getMonth() !== startDay.getMonth()\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (this.data.close.length === 0) return\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const text = (label: string, price: number, calculatedX: number) => {\r\n new Text(\r\n {\r\n x: calculatedX,\r\n y: this.fy(price) - 13,\r\n font: { size: 8, weight: '900' },\r\n textBaseline: TextBaseline.top,\r\n fillStyle: this.attrs.color,\r\n text: `${label} (${round({ data: this.data, num: price })})`,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n const line = (fromX: number, toX: number, y: number) => {\r\n context.moveTo(fromX, this.fy(y))\r\n context.lineTo(toX, this.fy(y))\r\n }\r\n\r\n let startIndex = -1\r\n let endIndex = -1\r\n const isStock = this.data.instrument === Instrument.Stock\r\n const periodType = this.getPeriodType()\r\n let currentDate = new Date()\r\n let lastDate: Date | undefined\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n for (let index = firstBarToRender.index; index <= lastBarToRender.index; index++) {\r\n currentDate = Utils.dateFromUnixTimestamp(this.data.date[index])\r\n\r\n // check if new calculation/render is necessary\r\n switch (periodType) {\r\n case PivotPeriod.day: // only if it is a new day\r\n if (currentDate.getDate() === lastDate?.getDate()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.week: // only if it is a new week\r\n if (lastDate && dateFns.isSameWeek(lastDate, currentDate, { weekStartsOn: 1 })) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.month: // only if it is a new month\r\n if (currentDate.getMonth() === lastDate?.getMonth()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.year: // only if it is a new year\r\n if (currentDate.getFullYear() === lastDate?.getFullYear()) {\r\n continue\r\n }\r\n break\r\n }\r\n lastDate = currentDate\r\n\r\n // Find start/end indexes for the entire previous period\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n if (index > 0) {\r\n let previousTradingDay = new Date()\r\n for (let i = index - 1; i >= 0; i--) {\r\n previousTradingDay = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (previousTradingDay.getDate() !== currentDate.getDate()) break\r\n }\r\n previousTradingDay.setHours(0, 0, 0, 0)\r\n const previousNYMidnightTimestamp = Utils.convertLocalToNyTime(previousTradingDay, false).getTime() / 1000\r\n const currentMidnight = new Date(currentDate)\r\n currentMidnight.setHours(0, 0, 0, 0)\r\n const currentNYMidnightTimestamp = Utils.convertLocalToNyTime(currentMidnight, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= previousNYMidnightTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > currentNYMidnightTimestamp)\r\n\r\n // check if we have data for entire day\r\n if (startIndex !== endIndex) {\r\n const diff = this.data.date[endIndex] - this.data.date[startIndex]\r\n const isNonStockFullDay = !isStock && diff >= DAY_SECONDS\r\n const isStockFullDay = isStock && previousTradingDay.getDate() !== currentDate.getDate()\r\n if (!isNonStockFullDay && !isStockFullDay) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n }\r\n }\r\n break\r\n case PivotPeriod.week:\r\n const firstDayCurrentWeek = dateFns.startOfWeek(currentDate, { weekStartsOn: 1 })\r\n const firstDayCurrentWeekTimestamp = Utils.convertLocalToNyTime(firstDayCurrentWeek, false).getTime() / 1000\r\n const firstDayPreviousWeek = dateFns.sub(firstDayCurrentWeek, { weeks: 1 })\r\n const firstDayPreviousWeekTimestamp = Utils.convertLocalToNyTime(firstDayPreviousWeek, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousWeekTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentWeekTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.month:\r\n const firstDayCurrentMonth = dateFns.startOfMonth(currentDate)\r\n const firstDayCurrentMonthTimestamp = Utils.convertLocalToNyTime(firstDayCurrentMonth, false).getTime() / 1000\r\n const firstDayPreviousMonth = dateFns.sub(firstDayCurrentMonth, { months: 1 })\r\n const firstDayPreviousMonthTimestamp =\r\n Utils.convertLocalToNyTime(firstDayPreviousMonth, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousMonthTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentMonthTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.year:\r\n const firstDayCurrentYear = dateFns.startOfYear(currentDate)\r\n const firstDayCurrentYearTimestamp = Utils.convertLocalToNyTime(firstDayCurrentYear, false).getTime() / 1000\r\n const firstDayPreviousYear = dateFns.sub(firstDayCurrentYear, { years: 1 })\r\n const firstDayPreviousYearTimestamp = Utils.convertLocalToNyTime(firstDayPreviousYear, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousYearTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentYearTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n }\r\n\r\n // calculate pivot point if it was found\r\n if (!(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex)) continue\r\n\r\n let pivot, sup1, sup2, sup3, res1, res2, res3\r\n const previousHigh = Math.max(...this.data.high.slice(startIndex, endIndex))\r\n const previousLow = Math.min(...this.data.low.slice(startIndex, endIndex))\r\n const previousClose = this.data.close[endIndex - 1] // endIndex is the beginning of the next period\r\n\r\n if (this.attrs.calculationType === 'standard') {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = 2 * pivot - previousHigh\r\n sup2 = pivot - (previousHigh - previousLow)\r\n sup3 = previousLow - 2 * (previousHigh - pivot)\r\n res1 = 2 * pivot - previousLow\r\n res2 = pivot + (previousHigh - previousLow)\r\n res3 = previousHigh + 2 * (pivot - previousLow)\r\n } else {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = pivot - (previousHigh - previousLow) * FIB_LVL_1\r\n sup2 = pivot - (previousHigh - previousLow) * FIB_LVL_2\r\n sup3 = pivot - (previousHigh - previousLow)\r\n res1 = pivot + (previousHigh - previousLow) * FIB_LVL_1\r\n res2 = pivot + (previousHigh - previousLow) * FIB_LVL_2\r\n res3 = pivot + (previousHigh - previousLow)\r\n }\r\n\r\n const pivotPoint: PivotPointType = { pivot, sup1, sup2, sup3, res1, res2, res3 }\r\n\r\n // prepare x coordinates for lines rendering\r\n let fromX = this.fx(index)\r\n let toX = this.fx(index)\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n const interval = this.data.interval\r\n const currentX = fromX\r\n\r\n const toDate = new Date(currentDate)\r\n toDate.setHours(16, 0, 0, 0)\r\n if (this.data.aftermarket && interval <= 5) toDate.setHours(18, 30, 0, 0)\r\n if (interval <= 15 && !isStock) toDate.setHours(23, 59, 59, 99)\r\n const toTimestamp = toDate.getTime() / 1000\r\n const toDiffMinutes = (toTimestamp - currentDate.getTime() / 1000) / 60\r\n const toBars = toDiffMinutes / interval\r\n toX = Math.min(currentX + toBars * barWidth, -leftOffset + width)\r\n\r\n const fromDate = new Date(currentDate)\r\n fromDate.setHours(9, 30, 0, 0)\r\n if (this.data.premarket && interval <= 5) fromDate.setHours(7, 0, 0, 0)\r\n if (interval <= 15 && !isStock) fromDate.setHours(0, 0, 0, 0)\r\n const fromTimestamp = fromDate.getTime() / 1000\r\n const fromDiffMinutes = (fromTimestamp - currentDate.getTime() / 1000) / 60\r\n const fromBars = fromDiffMinutes / interval\r\n fromX = currentX + fromBars * barWidth\r\n break\r\n\r\n case PivotPeriod.week:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n fromX = this.fx(i + 1) // because we need start from current week\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the week\r\n const barsPerDay = Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n toX += (isStock ? 5 : 7) * barsPerDay * barWidth\r\n }\r\n break\r\n\r\n case PivotPeriod.month:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n fromX = this.fx(i + 1) // because we need start from current month\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the month\r\n const barsPerDay = this.data.isIntraday\r\n ? Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n : 1\r\n toX += (isStock ? 20 : 30) * barsPerDay * barWidth\r\n }\r\n break\r\n default:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n fromX = this.fx(i + 1) // because we need start from current year\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the year\r\n toX += (this.data.timeframe === TIMEFRAME.w ? 49 : 12) * barWidth\r\n }\r\n break\r\n }\r\n fromX = Math.max(fromX, -leftOffset)\r\n\r\n // render pivot line\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.pivot)\r\n context.stroke()\r\n\r\n // render resistance and support lines\r\n context.save()\r\n context.setLineDash([3, 3])\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.res1)\r\n line(fromX, toX, pivotPoint.res2)\r\n line(fromX, toX, pivotPoint.res3)\r\n line(fromX, toX, pivotPoint.sup1)\r\n line(fromX, toX, pivotPoint.sup2)\r\n line(fromX, toX, pivotPoint.sup3)\r\n context.stroke()\r\n context.restore()\r\n\r\n // render labels if there is enough space\r\n if (toX - fromX >= 48) {\r\n text('P', pivotPoint.pivot, fromX)\r\n text('R1', pivotPoint.res1, fromX)\r\n text('R2', pivotPoint.res2, fromX)\r\n text('R3', pivotPoint.res3, fromX)\r\n text('S1', pivotPoint.sup1, fromX)\r\n text('S2', pivotPoint.sup2, fromX)\r\n text('S3', pivotPoint.sup3, fromX)\r\n }\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n calculationType: {\r\n type: 'select',\r\n label: 'Calculation Type',\r\n name: 'calculationType',\r\n value: this.attrs.calculationType ?? DEFAULT_PARAMETERS.CalculationType,\r\n required: true,\r\n items: [\r\n {\r\n value: 'standard',\r\n label: 'Standard',\r\n },\r\n {\r\n value: 'fibonacci',\r\n label: 'Fibonacci',\r\n },\r\n ],\r\n },\r\n color: {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: PPConfig.label,\r\n inputs: PPConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'calculationType':\r\n case 'color':\r\n return !!this.attrs[key]\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `${PPConfig.shortLabel} (${Calculation[this.attrs.calculationType]})`\r\n }\r\n}\r\n\r\nPivotPoints.prototype.defaults = {\r\n calculationType: DEFAULT_PARAMETERS.CalculationType,\r\n color: DEFAULT_PARAMETERS.Color,\r\n}\r\n\r\nexport default PivotPoints\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n step: number\r\n maxStep: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n period: string\r\n risingColor: string\r\n fallingColor: string\r\n}\r\n\r\nexport class SARConfig extends BaseConfig {\r\n static type = OverlayType.Sar\r\n static abbreviation = 'sar'\r\n static label = 'Parabolic SAR'\r\n static shortLabel = 'SAR'\r\n static optionsOrder = ['step', 'maxStep'] as const\r\n static optionsLabels = {\r\n step: 'Step',\r\n maxStep: 'Maximum Step',\r\n }\r\n\r\n static inputsOrder = [...this.optionsOrder, 'risingColor', 'fallingColor'] as Array>\r\n static inputsLabels = { ...this.optionsLabels, risingColor: 'Rising Color', fallingColor: 'Falling Color' }\r\n}\r\n","import { Attrs, SARConfig } from './configs/sar'\r\nimport Overlay from './overlay'\r\n\r\nclass SAR extends Overlay {\r\n static config = SARConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\r\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\r\n this.attrs.step = step\r\n this.attrs.maxStep = maxStep\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const data = this.data\r\n const deltaHigh = data.high[1] - data.high[0]\r\n const deltaLow = data.low[0] - data.low[1]\r\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\r\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\r\n let isLong = pdm >= mdm\r\n\r\n let sar = isLong ? data.low[0] : data.high[0]\r\n let ep = isLong ? data.high[1] : data.low[1]\r\n let newHigh = data.high[0]\r\n let newLow = data.low[0]\r\n let af = this.attrs.step\r\n\r\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\r\n let sarToDraw\r\n const prevHigh = newHigh\r\n const prevLow = newLow\r\n newHigh = data.high[i]\r\n newLow = data.low[i]\r\n\r\n if (isLong) {\r\n if (newLow <= sar) {\r\n isLong = false\r\n sar = ep\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newLow\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newHigh > ep) {\r\n ep = newHigh\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n }\r\n } else {\r\n if (newHigh >= sar) {\r\n isLong = true\r\n sar = ep\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newHigh\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newLow < ep) {\r\n ep = newLow\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n }\r\n }\r\n\r\n const x = Math.round(this.fx(i) - 1.5)\r\n const y = Math.round(this.fy(sarToDraw) - 1.5)\r\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\r\n context.fillRect(x, y, 3, 3)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n step: {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Step',\r\n name: 'step',\r\n value: this.attrs.step ?? 0.02,\r\n required: true,\r\n },\r\n maxStep: {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Maximum Step',\r\n name: 'maxStep',\r\n value: this.attrs.maxStep ?? 0.2,\r\n required: true,\r\n },\r\n risingColor: {\r\n type: 'color',\r\n label: 'Rising Color',\r\n name: 'risingColor',\r\n value: this.attrs.risingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n },\r\n fallingColor: {\r\n type: 'color',\r\n label: 'Falling Color',\r\n name: 'fallingColor',\r\n value: this.attrs.fallingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n },\r\n }\r\n\r\n return {\r\n title: SARConfig.label,\r\n inputs: SARConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n step: `${options.step.label} must be a number between ${options.step.min} and ${options.step.max}`,\r\n maxStep: `${options.maxStep.label} must be a number between ${options.maxStep.min} and ${options.maxStep.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'step':\r\n case 'maxStep': {\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n }\r\n case 'risingColor':\r\n case 'fallingColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.risingColor\r\n }\r\n}\r\n\r\nSAR.prototype.defaults = {\r\n risingColor: '#69c1ea',\r\n fallingColor: '#d386df',\r\n}\r\n\r\nexport default SAR\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = { period: number }\r\n\r\nexport interface Attrs extends Options {\r\n color: string\r\n}\r\n\r\nexport class SMAConfig extends BaseConfig {\r\n static type = OverlayType.Sma\r\n static abbreviation = 'sma'\r\n static label = 'Simple Moving Average'\r\n static shortLabel = 'SMA'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'color'] as Array\r\n static inputsLabels = { period: 'Period', color: 'Color' }\r\n static calculatedValuesOrder = ['sma'] as const\r\n static calculatedValuesLabels = { sma: 'SMA' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Options, SMAConfig } from '../overlays/configs/sma'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n}\r\n\r\nexport class SMACalculation extends MainCalculation {\r\n static config = SMAConfig\r\n declare options: Options\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { 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 { SMACalculation } from '../indicator-calculation/sma'\r\nimport { Attrs, SMAConfig } from './configs/sma'\r\nimport Overlay from './overlay'\r\n\r\nclass SMA extends Overlay {\r\n static config = SMAConfig\r\n\r\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\r\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\r\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n context.beginPath()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const smaCalculation = new SMACalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n smaCalculation.calculate(({ sma }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(sma[dataIndex])))\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n context.stroke()\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n color: {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: this.config.label,\r\n inputs: this.config.inputsOrder.map((item) => options[item as keyof Attrs]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nSMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default SMA\r\n","import { OverlayType } from '../../constants/common'\r\nimport { SMAConfig } from './sma'\r\n\r\nexport class SMA2Config extends SMAConfig {\r\n static type = OverlayType.Sma2\r\n}\r\n","import { SMA2Config } from './configs/sma2'\r\nimport SMA from './sma'\r\n\r\nclass SMA2 extends SMA {\r\n static config = SMA2Config\r\n}\r\n\r\nSMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default SMA2\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number\r\n multiplier: number\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n uptrendColor: string\r\n downtrendColor: string\r\n}\r\n\r\nexport class StrConfig extends BaseConfig {\r\n static type = OverlayType.Str\r\n static abbreviation = 'str'\r\n static label = 'Supertrend'\r\n static shortLabel = 'Supertrend'\r\n static optionsOrder = ['period', 'multiplier'] as const\r\n static optionsLabels = { period: 'Period', multiplier: 'Period' }\r\n static inputsOrder = [...this.optionsOrder, 'uptrendColor', 'downtrendColor'] as Array\r\n static inputsLabels = {\r\n ...this.optionsLabels,\r\n uptrendColor: 'Uptrend Color',\r\n downtrendColor: 'Downtrend Color',\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { Attrs, StrConfig } from './configs/str'\r\nimport Overlay from './overlay'\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 7,\r\n Multiplier: 3.0,\r\n}\r\n\r\nconst COLORS = {\r\n Uptrend: '#00a000',\r\n Downtrend: '#c80000',\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\r\n\r\n return [period, multiplier]\r\n}\r\n\r\nclass Supertrend extends Overlay {\r\n static config = StrConfig\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = parsePeriod(period)\r\n return periodInt + 1\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, multiplier] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.multiplier = multiplier\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period, multiplier } = this.attrs\r\n const { high, low, close } = this.data\r\n const atr = new AverageTrueRange(period)\r\n const finalUpperBand: number[] = []\r\n const finalLowerBand: number[] = []\r\n const supertrend: boolean[] = []\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.uptrendColor)\r\n for (let i = 1; i < close.length; i++) {\r\n atr.add(high[i], low[i], close[i - 1])\r\n\r\n // compute bands\r\n const avg = (high[i] + low[i]) / 2\r\n const upperBand = avg + multiplier * atr.value\r\n const lowerBand = avg - multiplier * atr.value\r\n\r\n finalUpperBand[i] = upperBand\r\n finalLowerBand[i] = lowerBand\r\n\r\n // identify supertrend\r\n if (close[i] > finalUpperBand[i - 1]) {\r\n supertrend[i] = true\r\n } else if (close[i] < finalLowerBand[i - 1]) {\r\n supertrend[i] = false\r\n } else {\r\n supertrend[i] = supertrend[i - 1]\r\n }\r\n\r\n // adjust bands\r\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\r\n finalLowerBand[i] = finalLowerBand[i - 1]\r\n }\r\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\r\n finalUpperBand[i] = finalUpperBand[i - 1]\r\n }\r\n\r\n const x = this.fx(i)\r\n if (i < period || x + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n if (supertrend[i] && !supertrend[i - 1]) {\r\n // buy\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else if (supertrend[i]) {\r\n // keep buying\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else {\r\n // keep selling\r\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n }\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n\r\n if (firstBarToRender === undefined) {\r\n context.translate(-0.5, -0.5)\r\n return\r\n }\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.downtrendColor)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n if (!supertrend[i] && supertrend[i - 1]) {\r\n // sell\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else if (!supertrend[i]) {\r\n // keep selling\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else {\r\n // keep buying\r\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n }\r\n }\r\n context.stroke()\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n multiplier: {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n },\r\n uptrendColor: {\r\n type: 'color',\r\n label: 'Uptrend Color',\r\n name: 'uptrendColor',\r\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\r\n },\r\n downtrendColor: {\r\n type: 'color',\r\n label: 'Downtrend Color',\r\n name: 'downtrendColor',\r\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: StrConfig.label,\r\n inputs: StrConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n multiplier: `${options.multiplier.label} must be a number between ${options.multiplier.min} and ${options.multiplier.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'uptrendColor':\r\n case 'downtrendColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor(): string {\r\n return this.attrs.uptrendColor\r\n }\r\n}\r\n\r\nSupertrend.prototype.defaults = {\r\n uptrendColor: COLORS.Uptrend,\r\n downtrendColor: COLORS.Downtrend,\r\n}\r\n\r\nexport default Supertrend\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = {\r\n period: number | string\r\n}\r\n\r\nexport interface Attrs extends Options {\r\n opacity: number\r\n upColor?: string\r\n downColor?: string\r\n}\r\n\r\nexport class VPConfig extends BaseConfig {\r\n static type = OverlayType.Vp\r\n static abbreviation = 'vp'\r\n static label = 'Volume Profile'\r\n static shortLabel = 'VP'\r\n static optionsOrder = ['period'] as const\r\n static optionsLabels = { period: 'Period' }\r\n static inputsOrder = ['period', 'opacity', 'upColor', 'downColor'] as Array\r\n\r\n static inputsLabels = {\r\n period: 'Zones',\r\n opacity: 'Opacity',\r\n upColor: 'Up Color',\r\n downColor: 'Down Color',\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\n\r\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport Chart from '../models/chart'\r\nimport utils from '../utils'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport { Attrs, VPConfig } from './configs/vp'\r\nimport Overlay from './overlay'\r\n\r\nconst VP_COLORS = {\r\n UP: '#00FF00',\r\n DOWN: '#FF0000',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Opacity: 0.3,\r\n}\r\n\r\nfunction applyOpacityToColor(color: string, opacity: number) {\r\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\r\n}\r\n\r\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\r\n return [\r\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\r\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\r\n ]\r\n}\r\n\r\n// Only time when we want value to be able to equal start of segment is first segment,\r\n// because start of next segment is equal to end of previous and value would match two segments\r\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\r\n return (notEqualStart ? val > start : val >= start) && val <= end\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\r\n\r\n return [period, opacity]\r\n}\r\n\r\nclass VolumeProfile extends Overlay {\r\n static config = VPConfig\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, opacity] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.opacity = opacity\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\r\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender.index, lastBarToRender.index + 1))\r\n\r\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\r\n const segments = [] // create an empty array to hold the segments\r\n\r\n for (let i = 0; i < this.attrs.period; i++) {\r\n const segmentStart = minClose + segment * i // calculate start of current segment\r\n const segmentEnd = segmentStart + segment // calculate end of current segment\r\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\r\n }\r\n\r\n // loop through visible bars and assign volumes to segments\r\n for (let i = firstBarToRender.index; i <= lastBarToRender.index; i++) {\r\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\r\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\r\n )\r\n if (segmentIndex === -1) continue\r\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\r\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\r\n }\r\n\r\n const max = utils.max(segments.map((item) => item.up + item.down))\r\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\r\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\r\n\r\n segments.forEach((item) => {\r\n const y = Math.round(this.fy(item.start))\r\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\r\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\r\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\r\n const upSegmentWidth = Math.round(volumeFX(item.up))\r\n const downSegmentWidth = Math.round(volumeFX(item.down))\r\n\r\n context.fillStyle = upColor\r\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\r\n context.fillStyle = downColor\r\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\r\n })\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n period: {\r\n type: 'number',\r\n label: 'Zones',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n },\r\n opacity: {\r\n type: 'number',\r\n label: 'Opacity',\r\n name: 'opacity',\r\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\r\n required: true,\r\n min: 0,\r\n max: 1,\r\n step: 0.1,\r\n },\r\n upColor: {\r\n type: 'color',\r\n label: 'Up Color',\r\n name: 'upColor',\r\n value: this.attrs.upColor ?? VP_COLORS.UP,\r\n },\r\n downColor: {\r\n type: 'color',\r\n label: 'Down Color',\r\n name: 'downColor',\r\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\r\n },\r\n }\r\n\r\n return {\r\n title: VPConfig.label,\r\n inputs: VPConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {\r\n period: `${options.period.label} must be a whole number between ${options.period.min} and ${options.period.max}`,\r\n opacity: `${options.opacity.label} must be a number between ${options.opacity.min} and ${options.opacity.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'opacity':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'upColor':\r\n case 'downColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.upColor || VP_COLORS.UP\r\n }\r\n}\r\n\r\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\r\n\r\nexport default VolumeProfile\r\n","import { OverlayType } from '../../constants/common'\r\nimport BaseConfig from './overlayBaseConfig'\r\n\r\nexport type Options = { period: number }\r\n\r\nexport interface Attrs extends Options {\r\n color: string\r\n}\r\n\r\nexport class VWAPConfig extends BaseConfig {\r\n static type = OverlayType.Vwap\r\n static abbreviation = 'vwap'\r\n static label = 'VWAP (intraday charts)'\r\n static shortLabel = 'VWAP'\r\n static inputsOrder = ['color'] as Array>\r\n static inputsLabels = { color: 'Color' }\r\n static calculatedValuesOrder = ['vwap'] as const\r\n static calculatedValuesLabels = { vwap: 'VWAP' }\r\n static defaultCalculatedValueOption = this.calculatedValuesOrder[0]\r\n}\r\n","import { Options, VWAPConfig } from '../overlays/configs/vwap'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\nconst datesAreOnSameDay = (first: Date, second: Date) =>\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n\r\ntype DefaultCalculatedValuesType = {\r\n vwap: number[]\r\n}\r\n\r\nexport class VWapCalculation extends MainCalculation {\r\n static config = VWAPConfig\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { date, close, low, high, volume } = this.quote\r\n const lastIndex = date.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let cumulativePV = 0\r\n let cumulativeVolume = 0\r\n\r\n for (let i = 0; i <= lastIndex; i++) {\r\n if (i > 0) {\r\n const prevDate = dateFromUnixTimestamp(date[i - 1])\r\n if (!datesAreOnSameDay(prevDate, dateFromUnixTimestamp(date[i]))) {\r\n cumulativePV = 0\r\n cumulativeVolume = 0\r\n }\r\n }\r\n\r\n const typicalPrice = (close[i] + low[i] + high[i]) / 3\r\n const pv = typicalPrice * volume[i]\r\n\r\n cumulativePV += pv\r\n cumulativeVolume += volume[i]\r\n\r\n this.calculatedValues.vwap[i] = cumulativePV / cumulativeVolume\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport { Attrs, VWAPConfig } from './configs/vwap'\r\nimport Overlay from './overlay'\r\n\r\nclass VWAP extends Overlay {\r\n static config = VWAPConfig\r\n\r\n static getNumOfBarsBuffer() {\r\n return 1\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.attrs.period = 5\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (!this.isRendered()) {\r\n return\r\n }\r\n\r\n const { leftOffset, width } = this.model.chart()\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const vwapCalculation = new VWapCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n vwapCalculation.calculate(({ vwap }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return // continue\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false // break\r\n }\r\n const y = Math.round(this.fy(vwap[dataIndex]))\r\n context.lineTo(x, y)\r\n })\r\n\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const options = {\r\n color: {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n },\r\n }\r\n\r\n return {\r\n title: VWAPConfig.label,\r\n inputs: VWAPConfig.inputsOrder.map((item) => options[item]),\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'color':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n isRendered() {\r\n return this.model.chart().quote().isIntraday\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n toString() {\r\n return VWAPConfig.shortLabel\r\n }\r\n}\r\n\r\nVWAP.prototype.defaults = { color: '#9467bd' }\r\n\r\nexport default VWAP\r\n","import { OverlayType } from '../constants/common'\r\nimport bb from './bb'\r\nimport dch from './dch'\r\nimport ema from './ema'\r\nimport ema2 from './ema2'\r\nimport hilo from './hilo'\r\nimport hline from './hline'\r\nimport ic from './ic'\r\nimport icf from './icf'\r\nimport kch from './kch'\r\nimport none from './none'\r\nimport overlay from './overlay'\r\nimport patterns from './patterns'\r\nimport pp from './pp'\r\nimport sar from './sar'\r\nimport sma from './sma'\r\nimport sma2 from './sma2'\r\nimport str from './str'\r\nimport vp from './vp'\r\nimport vwap from './vwap'\r\n\r\nexport const overlaysByType = Object.freeze({\r\n [OverlayType.Overlay]: overlay,\r\n [OverlayType.None]: none,\r\n [OverlayType.Bb]: bb,\r\n [OverlayType.Dch]: dch,\r\n [OverlayType.Ema]: ema,\r\n [OverlayType.Ema2]: ema2,\r\n [OverlayType.Hilo]: hilo,\r\n [OverlayType.Hline]: hline,\r\n [OverlayType.Ic]: ic,\r\n [OverlayType.Icf]: icf,\r\n [OverlayType.Kch]: kch,\r\n [OverlayType.Patterns]: patterns,\r\n [OverlayType.Pp]: pp,\r\n [OverlayType.Sar]: sar,\r\n [OverlayType.Sma]: sma,\r\n [OverlayType.Sma2]: sma2,\r\n [OverlayType.Str]: str,\r\n [OverlayType.Vp]: vp,\r\n [OverlayType.Vwap]: vwap,\r\n})\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n isQuotePage ||\r\n isQuoteFinancials\r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\n\r\nconst requestsAbortControllersCache: ObjectHash = {}\r\n\r\nexport function removeFromAbortCache(key: string) {\r\n delete requestsAbortControllersCache[key]\r\n}\r\n\r\nexport function abortRequest(key: string) {\r\n requestsAbortControllersCache[key]?.abort()\r\n removeFromAbortCache(key)\r\n}\r\n\r\nexport function getIsAbortError(error: Error) {\r\n return error.name === 'AbortError'\r\n}\r\n\r\nexport function createRequestAbortController({\r\n key,\r\n shouldAbortRunningRequest = false,\r\n}: {\r\n key: string\r\n shouldAbortRunningRequest?: boolean\r\n}) {\r\n if (shouldAbortRunningRequest) {\r\n abortRequest(key)\r\n }\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n if (controller) {\r\n requestsAbortControllersCache[key] = controller\r\n }\r\n return controller\r\n}\r\n","import * as websiteShared from '@finviz/website'\r\n\r\nimport { captureException } from './helpers'\r\n\r\n/**\r\n * Hook used to asynchronously load a module\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\r\n */\r\nexport const useAsyncModule = (\r\n props: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n captureException?: (exception: Error, captureContext?: { extra: Record }) => void\r\n errorSeverity?: 'medium' | 'high'\r\n } & (websiteShared.ControlledModuleConfig | websiteShared.SuspenseModuleConfig)\r\n) =>\r\n websiteShared.useAsyncModule({ captureException, ...props }) as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n","import { getIsSSr } from './helpers'\r\n\r\n// Extracted from isMobile, and modified to fit usage\r\nfunction isFirefoxDesktop() {\r\n const matchesAndroid = navigator.userAgent.match(/Android/i)\r\n const matchesWebOS = navigator.userAgent.match(/webOS/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesiPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\n const matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n const isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\n const matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\n\r\n return matchesFirefox && !isMobileDevice\r\n}\r\n\r\n// Due bug in FireFox, when if HW acceleration is used canvas is blurry\r\n// we need to set canvas as CPU only\r\nconst shouldUseCPUOnly = getIsSSr() ? false : isFirefoxDesktop()\r\n\r\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\r\n if (!canvas) {\r\n return null\r\n }\r\n\r\n const context = canvas.getContext('2d', shouldUseCPUOnly ? { willReadFrequently: true } : undefined)\r\n if (!context) {\r\n window.Sentry?.captureMessage('Context unavailable')\r\n return null\r\n }\r\n\r\n context._cache = {}\r\n\r\n const _restore = CanvasRenderingContext2D.prototype.restore\r\n context.restore = function () {\r\n this._cache = {}\r\n return _restore.apply(this)\r\n }\r\n\r\n context.set = function (key, value) {\r\n if (this._cache[key] !== value) {\r\n this[key] = value\r\n this._cache[key] = value\r\n }\r\n }\r\n\r\n return context\r\n}\r\n","import { Theme } from '../../types/shared'\r\nimport twColors from '../constants/colors'\r\nimport { ChartEventType } from '../constants/common'\r\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../helpers/math'\r\nimport utils from '../utils'\r\nimport { formatDateToStringUS, getEarningsDateSuffix } from './helpers'\r\n\r\ninterface IChartEventBase {\r\n elementId: string\r\n eventType: ChartEventType\r\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\r\n}\r\n\r\nexport interface IEarnings extends IChartEventBase {\r\n epsActual?: number\r\n epsEstimate?: number\r\n epsReportedActual?: number\r\n epsReportedEstimate?: number\r\n fiscalEndDate: number\r\n fiscalPeriod: string\r\n salesActual?: number\r\n salesEstimate?: number\r\n}\r\n\r\nexport interface IDividends extends IChartEventBase {\r\n ordinary: number\r\n special: number\r\n}\r\n\r\nexport interface ISplit extends IChartEventBase {\r\n factorFrom: number\r\n factorTo: number\r\n}\r\n\r\nexport enum ChartEventBadgeState {\r\n default = 'default',\r\n hover = 'hover',\r\n selected = 'selected',\r\n}\r\n\r\nexport interface IChartEventBadgeProps {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n width: number\r\n}\r\n\r\ninterface IGetChartEventBadgeColors {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n colors: IBadgeColors\r\n}\r\n\r\ninterface IBadgeStateColors {\r\n default: string\r\n hover: string\r\n selected: string\r\n}\r\n\r\ninterface IBadgeThemeColors {\r\n outerStroke: string\r\n innerStroke: string\r\n innerFill: IBadgeStateColors\r\n textFill: IBadgeStateColors\r\n}\r\n\r\ninterface IBadgeColors {\r\n light: IBadgeThemeColors\r\n dark: IBadgeThemeColors\r\n}\r\n\r\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\r\n return {\r\n outerStroke: colors[theme].outerStroke,\r\n innerStroke: colors[theme].innerStroke,\r\n innerFill: colors[theme].innerFill[state],\r\n textFill: colors[theme].textFill[state],\r\n }\r\n}\r\n\r\nexport function getFormattedEventDate(\r\n exdate: number,\r\n hasEarningsDateSuffix = false,\r\n options: ObjectHash = {\r\n month: 'short',\r\n }\r\n) {\r\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\r\n\r\n const formattedDate = formatDateToStringUS(parsedDate, options)\r\n\r\n if (hasEarningsDateSuffix) {\r\n return `${formattedDate} ${getEarningsDateSuffix(parsedDate)}`\r\n }\r\n\r\n return formattedDate\r\n}\r\n\r\nexport function getFormattedValue({\r\n value,\r\n bigNumberUnit,\r\n maxDecimalPlaces = 3,\r\n}: {\r\n value: number\r\n bigNumberUnit?: BigNumber\r\n maxDecimalPlaces?: number\r\n}) {\r\n let numberString = ''\r\n let suffix = ''\r\n\r\n if (bigNumberUnit === undefined) {\r\n numberString = math.round({ value, overridePlaces: 3 })\r\n } else {\r\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\r\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\r\n suffix = bigNumber.substring(bigNumber.length - 1)\r\n }\r\n\r\n const [wholeNumber, decimalNumber] = numberString.split('.')\r\n\r\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\r\n\r\n let formattedDecimalNumber = decimalNumber\r\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\r\n formattedDecimalNumber = decimalNumber.slice(0, -1)\r\n }\r\n\r\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\r\n}\r\n\r\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\r\n return {\r\n light: {\r\n outerStroke: twColors.white,\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][50],\r\n hover: twColors[colorKey][100],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors[colorKey][500],\r\n hover: twColors[colorKey][600],\r\n selected: twColors.white,\r\n },\r\n },\r\n dark: {\r\n outerStroke: twColors.gray[900],\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][800],\r\n hover: twColors[colorKey][600],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors.white,\r\n hover: twColors.white,\r\n selected: twColors.white,\r\n },\r\n },\r\n } as IBadgeColors\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n IntradayTimeframeInterval,\r\n MONTHS,\r\n OFFSET,\r\n OverlayType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport { getIsSmallIndexChart, getTranslate } from '../controllers/renderUtils'\r\nimport { ISettings } from '../models/chart_settings/interfaces'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils, { dateFromDateString } from '../utils'\r\nimport { getBarWidthWithMargin, getHalfBarWidth } from './chart'\r\nimport { getVisibleBarToRenderIndex } from './draw_in_visible_area'\r\n\r\ninterface RenderXAxisProps {\r\n context: CanvasRenderingContext2D\r\n textRenderer?: Text\r\n paneModel: Pane\r\n quote: Quote\r\n type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType\r\n}\r\n\r\ninterface RenderTimeframeXAxisProps extends Omit {\r\n startBarIndex: number\r\n endBarIndex: number\r\n fx: (x: number) => number\r\n}\r\n\r\ninterface XAxisLabel {\r\n x: number\r\n text: string\r\n textWidth: number\r\n hasPriority?: boolean\r\n allowedOverflow?: number\r\n}\r\n\r\nfunction getXLine({ paneModel, height }: { paneModel: Pane; height: number }): Line {\r\n const chartLayoutSettings = paneModel.getChartLayoutSettings()\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: height,\r\n strokeStyle: chartLayoutSettings.ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n paneModel\r\n )\r\n}\r\n\r\nfunction isXPointVisible({ buffer = 0, x, width }: { x: number; buffer?: number; width: number }) {\r\n return x >= 0 - buffer && x <= width + buffer\r\n}\r\n\r\nfunction getIsOverlapping({\r\n x,\r\n textWidth,\r\n renderedLabelRanges,\r\n}: {\r\n x: number\r\n textWidth: number\r\n renderedLabelRanges: Array<{ from: number; to: number }>\r\n}) {\r\n return renderedLabelRanges.some(({ from, to }) => {\r\n const minX = x - textWidth / 2\r\n const maxX = x + textWidth / 2\r\n return (from < maxX && maxX < to) || (from < minX && minX < to)\r\n })\r\n}\r\n\r\nfunction renderXAxisLabels({\r\n context,\r\n width,\r\n labels,\r\n textRenderer,\r\n allowedOverflow = 0,\r\n}: {\r\n context: CanvasRenderingContext2D\r\n width: number\r\n labels: Omit[]\r\n textRenderer: Text\r\n allowedOverflow?: number\r\n}) {\r\n const sortedLabels: XAxisLabel[] = []\r\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\r\n labels.reverse().forEach((label) => {\r\n textRenderer.set({ text: label.text })\r\n const textWidth = Math.floor(textRenderer.measure(context))\r\n const newLabel = { ...label, textWidth }\r\n if (label.hasPriority) {\r\n sortedLabels.unshift(newLabel)\r\n } else {\r\n sortedLabels.push(newLabel)\r\n }\r\n })\r\n\r\n sortedLabels.forEach(({ x, text, textWidth }) => {\r\n if (!isXPointVisible({ x, width, buffer: allowedOverflow })) {\r\n return\r\n }\r\n const halfOfTextWidth = textWidth / 2\r\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\r\n const overflowRight = width - (x + halfOfTextWidth) + allowedOverflow\r\n let labelX = x\r\n if (overflowLeft < 0) {\r\n labelX = Math.round(x - overflowLeft)\r\n } else if (overflowRight < 0) {\r\n labelX = Math.round(x + overflowRight)\r\n }\r\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\r\n return\r\n }\r\n renderedLabelRanges.push({\r\n from: labelX - halfOfTextWidth - OFFSET.M,\r\n to: labelX + halfOfTextWidth + OFFSET.M,\r\n })\r\n textRenderer.set({ text, x: labelX })\r\n textRenderer.render(context)\r\n })\r\n}\r\n\r\nfunction getSize(paneModel: Pane) {\r\n const isIndicator = paneModel.getIsIndicatorPane()\r\n const { IndicatorSettings, ChartSettings, MarketSentimentSettings } = paneModel.getChartLayoutSettings()\r\n let settings: ISettings['IndicatorSettings' | 'ChartSettings' | 'MarketSentimentSettings'] = ChartSettings\r\n\r\n if (isIndicator) {\r\n settings = IndicatorSettings\r\n } else if (paneModel.mainElement()?.getIsChartType(ChartElementType.MarketSentiment)) {\r\n settings = MarketSentimentSettings\r\n }\r\n\r\n const paddingX = settings.left.width + settings.right.width\r\n const paddingY = settings.top.height + settings.bottom.height\r\n\r\n const chartWidth = paneModel.chart().width\r\n const paneHeight = paneModel.height\r\n return { width: chartWidth ? chartWidth - paddingX : 0, height: paneHeight ? paneHeight - paddingY : 0 }\r\n}\r\n\r\nfunction renderDailyXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n\r\n const chartModel = paneModel.chart()\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(fx(i) + chartModel.leftOffset)\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({\r\n hasPriority: date.getMonth() === 0,\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\r\n x,\r\n })\r\n }\r\n }\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nfunction render15MinXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n const chartLayout = chartModel.chart_layout()\r\n let lastDay = ''\r\n let x = 0\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n if (day !== lastDay) {\r\n lastDay = day\r\n if (quote.instrument === Instrument.Stock) {\r\n const barAtMinute = date.getMinutes() + date.getHours() * 60\r\n const indexOffset = (barAtMinute - quote.marketStartMinutes) / quote.interval\r\n x = Math.round(paneModel.scale.x(quote.barIndex[i] - indexOffset) + chartModel.leftOffset)\r\n } else {\r\n x = Math.round(fx(i) + chartModel.leftOffset)\r\n }\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n // Offscreen only - if lastDate !== lastBarDate add tick\r\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const lastDate = `${MONTHS[(~~(quote.lastDate / 100) % 100) - 1]} ${(quote.lastDate % 100)\r\n .toString()\r\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\r\n\r\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\r\n const barsInDay = quote.getBarsInDay()!\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: chartModel.zoomFactor,\r\n chartLayout,\r\n })\r\n const dayWidth = barsInDay * barWidth\r\n x += dayWidth\r\n labels.push({\r\n text: lastDate,\r\n x,\r\n })\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\r\n\r\nfunction renderIntradayXAxis({ context, quote, paneModel, textRenderer }: Omit) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n const chartLayout = chartModel.chart_layout()\r\n const interval = IntradayTimeframeInterval[quote.timeframe as keyof typeof IntradayTimeframeInterval]\r\n const marketStartHour = ~~(quote.marketStartMinutes / 60)\r\n let marketEndHour = 15 + Math.ceil(quote.aftermarketLengthMinutes / 60)\r\n const labels = []\r\n const isSmallIndexChart = getIsSmallIndexChart(chartLayout.specificChartFunctionality)\r\n if (isSmallIndexChart) {\r\n marketEndHour = 16\r\n }\r\n\r\n const xLine = getXLine({ paneModel, height })\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: chartModel.zoomFactor,\r\n chartLayout,\r\n })\r\n\r\n const dayToOffset = quote.getDayToOffset()\r\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\r\n for (const day in dayToOffset) {\r\n const dayIndex = dayToOffset[day]\r\n const date = dateFromDateString(day)\r\n\r\n for (let i = marketStartHour; i <= marketEndHour; i++) {\r\n let x =\r\n ((i * 60 - quote.marketStartMinutes) / interval) * barWidth +\r\n dayIndex * (quote.drawMinutesPerDay / interval) * barWidth +\r\n chartModel.leftOffset\r\n if (!isXPointVisible({ x, width, buffer: allowedOverflow })) {\r\n continue\r\n }\r\n let roundedX = Math.round(x)\r\n\r\n if (i === marketStartHour) {\r\n if (isSmallIndexChart) {\r\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\r\n // ~9:30AM\r\n xLine\r\n .set({\r\n x1: roundedX,\r\n x2: roundedX,\r\n })\r\n .render(context)\r\n continue\r\n }\r\n if (quote.premarketLengthMinutes === 0) {\r\n // If there is no premarket, day starts at 9:30 AM\r\n x += (30 / interval) * barWidth\r\n }\r\n roundedX = Math.round(x)\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(context)\r\n labels.push({\r\n hasPriority: true,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x: roundedX,\r\n })\r\n } else {\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(context)\r\n labels.push({\r\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\r\n x: roundedX,\r\n })\r\n }\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer, allowedOverflow })\r\n }\r\n}\r\n\r\nfunction renderIntradayXAxisFutures({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n let lastDay = ''\r\n let lastHours = NaN\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n const hours = date.getHours()\r\n const x = Math.round(fx(i) + chartModel.leftOffset)\r\n\r\n if (day !== lastDay) {\r\n lastDay = day\r\n lastHours = hours\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({\r\n x,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n })\r\n } else if (hours % 2 === 0 && hours !== lastHours) {\r\n lastHours = hours\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nfunction renderWeeklyXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n const { Colors } = paneModel.getChartLayoutSettings().ChartSettings.general\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(fx(i) + chartModel.leftOffset)\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n if (date.getMonth() % 3 === 0) {\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n } else {\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: 0,\r\n y2: height,\r\n strokeStyle: Colors.gridSecondary,\r\n dashLength: 3,\r\n },\r\n paneModel\r\n ).render(context)\r\n }\r\n const isYearLabel = date.getMonth() === 0\r\n labels.push({\r\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\r\n hasPriority: isYearLabel,\r\n x,\r\n })\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nfunction renderMonthlyXAxis({\r\n context,\r\n quote,\r\n paneModel,\r\n textRenderer,\r\n startBarIndex,\r\n endBarIndex,\r\n fx,\r\n}: RenderTimeframeXAxisProps) {\r\n const { width, height } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n let lastYear = null\r\n\r\n const labels = []\r\n const xLine = getXLine({ paneModel, height })\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n const year = date.getFullYear()\r\n const isJanuary = date.getMonth() === 0\r\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\r\n lastYear = year\r\n const x = Math.round(fx(i) + chartModel.leftOffset)\r\n if (!isXPointVisible({ x, width })) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n labels.push({\r\n text: date.getFullYear().toString(),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n if (textRenderer) {\r\n renderXAxisLabels({ context, width, labels, textRenderer })\r\n }\r\n}\r\n\r\nexport function renderXAxis({ context, quote, paneModel, textRenderer, type: elementType }: RenderXAxisProps) {\r\n const fx = (x: number) => paneModel.scale.x(quote.barIndex[x])\r\n const { width } = getSize(paneModel)\r\n const chartModel = paneModel.chart()\r\n const chartLayout = chartModel.chart_layout()\r\n const leftOffset = chartModel.leftOffset\r\n\r\n // Ticks are placed at the start of each timeframe period (hour/day/month/year).\r\n // The \"-1\" in the code ensures we start searching from one bar outside the visible area,\r\n // avoiding a tick on the first visible index unless it marks the start of a new timeframe period.\r\n // For example, if the start of December is on December 3rd and the first visible bar is on December 14th,\r\n // we won't display a tick.\r\n const startBarIndex = Math.max(\r\n getVisibleBarToRenderIndex({\r\n quote,\r\n paneModel,\r\n leftOffset,\r\n }).index - 1,\r\n 0\r\n )\r\n\r\n const endBarIndex = Math.min(\r\n getVisibleBarToRenderIndex({\r\n quote,\r\n paneModel,\r\n leftOffset,\r\n chartWidth: width,\r\n }).index + 1,\r\n quote.close.length - 1\r\n )\r\n\r\n const renderTimeframeXAxisProps = { context, quote, paneModel, textRenderer, startBarIndex, endBarIndex, fx }\r\n\r\n switch (quote.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n if (quote.instrument === Instrument.Stock) {\r\n if (\r\n elementType === ChartElementType.LineChart &&\r\n chartLayout.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\r\n quote.timeframe === 'i5'\r\n ) {\r\n render15MinXAxis(renderTimeframeXAxisProps)\r\n } else {\r\n renderIntradayXAxis({ context, quote, paneModel, textRenderer })\r\n }\r\n } else {\r\n renderIntradayXAxisFutures(renderTimeframeXAxisProps)\r\n }\r\n break\r\n case TIMEFRAME.i10:\r\n if (getIsSmallIndexChart(chartLayout.specificChartFunctionality)) {\r\n renderIntradayXAxis({ context, quote, paneModel, textRenderer })\r\n } else {\r\n render15MinXAxis(renderTimeframeXAxisProps)\r\n }\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n render15MinXAxis(renderTimeframeXAxisProps)\r\n break\r\n case TIMEFRAME.d:\r\n renderDailyXAxis(renderTimeframeXAxisProps)\r\n break\r\n case TIMEFRAME.w:\r\n renderWeeklyXAxis(renderTimeframeXAxisProps)\r\n break\r\n case TIMEFRAME.m:\r\n renderMonthlyXAxis(renderTimeframeXAxisProps)\r\n break\r\n default:\r\n break\r\n }\r\n}\r\n\r\ninterface RenderFadeExtendedHoursProps {\r\n context: CanvasRenderingContext2D\r\n paneModel: Pane\r\n quote: Quote\r\n}\r\n// only for stocks on i1/i3/i5 and one day view\r\nexport function renderFadeExtendedHours({ context, paneModel, quote }: RenderFadeExtendedHoursProps) {\r\n const isIndicator = paneModel.getIsIndicatorPane()\r\n const { height } = getSize(paneModel)\r\n const { ChartSettings, IndicatorSettings } = paneModel.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = paneModel.chart()\r\n const period = quote.timeframe\r\n if (quote.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\r\n return\r\n }\r\n\r\n const interval = parseInt(period.substring(1), 10)\r\n const dayToOffset = quote.getDayToOffset()\r\n const translate = getTranslate({\r\n context,\r\n xOffset: chartModel.leftOffset + (isIndicator ? IndicatorSettings : ChartSettings).left.width,\r\n yOffset: (isIndicator ? IndicatorSettings : ChartSettings).top.height,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(chartModel)\r\n for (const day in dayToOffset) {\r\n // todo aftermarket\r\n const dayIndex = dayToOffset[day]\r\n let n0 = (quote.drawMinutesPerDay / interval) * dayIndex\r\n let n1 = quote.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\r\n let x0 = paneModel.scale.x(n0) - halfBarWidth\r\n let width = paneModel.scale.x(n1) - paneModel.scale.x(n0)\r\n context.set('fillStyle', Colors.premarketFade)\r\n context.fillRect(x0, 0, width, height + 1)\r\n\r\n if (quote.aftermarketLengthMinutes > 0) {\r\n n0 =\r\n (quote.drawMinutesPerDay / interval) * dayIndex +\r\n (quote.drawMinutesPerDay - quote.aftermarketLengthMinutes) / interval\r\n n1 = quote.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\r\n x0 = paneModel.scale.x(n0) - halfBarWidth\r\n width = paneModel.scale.x(n1) - paneModel.scale.x(n0)\r\n\r\n context.set('fillStyle', Colors.aftermarketFade)\r\n context.fillRect(x0, 0, width, height + 1)\r\n }\r\n }\r\n translate.undo()\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\r\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport { chartsByType } from '../charts/charts'\r\nimport {\r\n CRYPTOS,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n IndicatorType,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAME_SECONDS,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getPercentageFromValue } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport { indicatorsByType } from '../indicators/indicators'\r\nimport Chart from '../models/chart'\r\nimport ChartLayoutModel from '../models/chart_layout'\r\nimport { IChartSettings } from '../models/chart_settings/interfaces'\r\nimport { Mouse } from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote, { QuoteGetParams } from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils, { dateFromUnixTimestamp } from '../utils'\r\nimport { captureException } from './helpers'\r\n\r\nconst DAY_IN_SECONDS = 86400\r\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\r\nconst virtualDatesCache: ObjectHash<{\r\n fromSeconds: number\r\n toSeconds: number\r\n lastUsed: number\r\n virtualDates: number[]\r\n}> = {}\r\n\r\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\r\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\r\n const ts1Utc = ts1\r\n const ts2Utc = ts2\r\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\r\n}\r\n\r\nfunction getVirtualDatesCacheId({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n}) {\r\n return `${ticker}-${timeframe}-${idRevision}`\r\n}\r\n\r\nfunction getCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n const cache = virtualDatesCache[id]\r\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\r\n cache.lastUsed = Date.now()\r\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\r\n return cache.virtualDates\r\n }\r\n return cache.virtualDates.filter(\r\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction checkVirtualCacheSize() {\r\n const now = Date.now()\r\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\r\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\r\n delete virtualDatesCache[virtualDatesCacheId]\r\n }\r\n })\r\n}\r\n\r\nfunction setCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n virtualDates: number[]\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n checkVirtualCacheSize()\r\n virtualDatesCache[id] = {\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n lastUsed: Date.now(),\r\n }\r\n}\r\n\r\nconst MAX_BAR_BORDER_WIDTH = 1\r\nconst MIN_BAR_MARGIN_WIDTH = 0\r\nconst MAX_BAR_MARGIN_WIDTH = 16\r\n\r\nexport function getBarWidthWithMarginByParts({\r\n zoomFactor = 1,\r\n chartLayout,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const { ChartSettings } = chartLayout.settings\r\n const settingsCenter = ChartSettings.center\r\n const barMargin =\r\n zoomFactor > 1 && settingsCenter.barMargin === 0\r\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\r\n : settingsCenter.barMargin\r\n\r\n const barFillWidth = settingsCenter.barWidth * zoomFactor\r\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\r\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\r\n\r\n return {\r\n barFillWidth,\r\n barBorderWidth,\r\n barMarginWidth,\r\n }\r\n}\r\n\r\nexport function getBarWidthWithMargin({\r\n zoomFactor = 1,\r\n chartLayout,\r\n shouldRound = true,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n shouldRound?: boolean\r\n}) {\r\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\r\n\r\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\r\n if (!shouldRound) {\r\n return barWidth\r\n }\r\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\r\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\r\n}\r\n\r\nexport function getBarWithoutMarginWidth(chartModel: Chart) {\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: chartModel.chart_layout(),\r\n zoomFactor: chartModel.zoomFactor,\r\n })\r\n return barFillWidth + barBorderWidth * 2\r\n}\r\n\r\nexport function getHalfBarWidth(chartModel: Chart, floor = true) {\r\n // Math.max(1, num) is kept from previous implementation, it is highly likely\r\n // that some function which use getHalfBarWidth expect return to be >= 1,\r\n // because we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n // but some function require raw not floored number to be able to do it's calculations\r\n // TODO: it would be good to possibly revisit this and check usage if we do need\r\n // to perform floor as well as limit result to be >= 1 but it is most likely necessary\r\n const halfBarWidthRaw = Math.max(1, getBarWithoutMarginWidth(chartModel) / 2)\r\n return floor ? ~~halfBarWidthRaw : halfBarWidthRaw\r\n}\r\n\r\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\r\n\r\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\r\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\r\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\r\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\r\nconst setZoomFactorToCache = (key: string, value: number) => {\r\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\r\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\r\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\r\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\r\n if (poppedKey) {\r\n delete zoomFactorForBarsToDisplayCache[poppedKey]\r\n }\r\n }\r\n }\r\n\r\n zoomFactorForBarsToDisplayCache[key] = value\r\n}\r\n\r\nexport function getZoomFactorForBarsToDisplay({\r\n chartVisibleWidth,\r\n numOfVisibleBars,\r\n chartLayout,\r\n}: {\r\n chartVisibleWidth: number\r\n numOfVisibleBars: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\r\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\r\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\r\n let zoomIncrement = 0\r\n let currentZoomFactor = 1\r\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\r\n let iteration = 0\r\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\r\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\r\n }\r\n while (finalZoomFactor === null) {\r\n iteration += 1\r\n const threshold = 0.01\r\n currentZoomFactor += zoomIncrement\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\r\n const barWidthDiff = barWidthWithMargin - barWidth\r\n if (barWidthDiff > threshold) {\r\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else if (barWidthDiff < -threshold) {\r\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else {\r\n finalZoomFactor = currentZoomFactor\r\n }\r\n\r\n if (iteration === 1000) {\r\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\r\n extra: {\r\n iteration,\r\n zoomIncrement,\r\n barWidthWithMargin,\r\n barWidth,\r\n barWidthDiff,\r\n currentZoomFactor,\r\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n return currentZoomFactor\r\n }\r\n }\r\n\r\n setZoomFactorToCache(cacheKey, finalZoomFactor)\r\n\r\n return finalZoomFactor\r\n}\r\n\r\nexport function getTimeframeSeconds({\r\n lowerIndex,\r\n dates,\r\n timeframe,\r\n}: {\r\n lowerIndex: number\r\n dates: number[]\r\n timeframe: TIMEFRAME\r\n}) {\r\n const upperIndex = lowerIndex + 1\r\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\r\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\r\n}\r\n\r\nfunction getVirtualTradedDays({\r\n dateStartSeconds,\r\n dateEndSeconds,\r\n datesSeconds,\r\n marketStartMinutes,\r\n}: {\r\n dateStartSeconds: number\r\n dateEndSeconds: number\r\n datesSeconds: number[]\r\n marketStartMinutes: number\r\n}) {\r\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\r\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\r\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\r\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\r\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\r\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\r\n return dateFns\r\n .eachDayOfInterval({\r\n start:\r\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\r\n ? dateFns.addBusinessDays(dateStart, -1)\r\n : dateStart,\r\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\r\n })\r\n .filter((date) => {\r\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\r\n return (\r\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\r\n datesSeconds.some((dateTime) =>\r\n areTimestampsFromSameDay({\r\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\r\n ts2,\r\n })\r\n )\r\n )\r\n })\r\n}\r\n\r\nexport function getVirtualTimeframeTradedDates({\r\n dateStart,\r\n dateEnd,\r\n quote,\r\n}: {\r\n dateStart: number\r\n dateEnd: number\r\n quote: Quote\r\n}) {\r\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\r\n const barsInDay = quote.getBarsInDay() ?? 0\r\n\r\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\r\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\r\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\r\n\r\n const commonVirtualCacheProps = {\r\n idRevision: dates.length,\r\n ticker,\r\n timeframe,\r\n fromSeconds: dateStart,\r\n toSeconds: dateEnd,\r\n }\r\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\r\n if (cachedDates) {\r\n return cachedDates\r\n }\r\n if (!isIntraday || instrument !== Instrument.Stock) {\r\n if (isWithinRangeOfQuoteDate) {\r\n return dates\r\n }\r\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\r\n const firstDate = dates[0]\r\n const lastDate = dates[dates.length - 1]\r\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\r\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\r\n return [\r\n ...Array.from({ length: numOfDatesBefore })\r\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\r\n .reverse(),\r\n ...dates,\r\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\r\n ]\r\n }\r\n\r\n const virtualTradedDays = isWithinRangeOfQuoteDate\r\n ? quote.getDaysInQuote()\r\n : getVirtualTradedDays({\r\n dateStartSeconds: dateStart,\r\n dateEndSeconds: dateEnd,\r\n datesSeconds: dates,\r\n marketStartMinutes,\r\n })\r\n\r\n const marketStartSeconds = marketStartMinutes * 60\r\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\r\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\r\n const virtualDates = virtualTradedDays.flatMap((date) => {\r\n const daySeconds =\r\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\r\n const dayStartSeconds = daySeconds + marketStartSeconds\r\n return barTimeframeSeconds.map(\r\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\r\n (barSeconds, index) =>\r\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\r\n dayStartSeconds +\r\n barSeconds\r\n )\r\n })\r\n\r\n if (!isWithinRangeOfQuoteDate) {\r\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\r\n const isLowerBounded =\r\n date >= dateStart ||\r\n areTimestampsFromSameDay({\r\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\r\n ts2: dateStart - quoteDatesTimestampOffset,\r\n })\r\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\r\n return isLowerBounded || isOneBeforeLowerBoundStarts\r\n })\r\n }\r\n\r\n setCachedVirtualDates({\r\n ...commonVirtualCacheProps,\r\n virtualDates,\r\n })\r\n\r\n return virtualDates\r\n}\r\n\r\ninterface TimestampPositionGettersProps {\r\n quote: Quote\r\n}\r\n\r\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (positionX >= 0 && positionX <= lastDateIndex) {\r\n const lowerIndex = Math.floor(positionX)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\r\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\r\n }\r\n const isLookingBack = positionX < 0\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n const numOfSecondsOutOfBounds = isLookingBack\r\n ? Math.abs(positionX) * averageBarDate\r\n : (positionX - lastDateIndex) * averageBarDate\r\n return Math.round(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\r\n}\r\n\r\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\r\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\r\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\r\n return upperIndex - positionDiffUpperTimestamp\r\n }\r\n const isLookingBack = timestamp < dateStart\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n return isLookingBack\r\n ? -((dateStart - timestamp) / averageBarDate)\r\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\r\n}\r\n\r\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\r\nexport function getInstrument(tickerRaw: string) {\r\n if (tickerRaw.indexOf('@') === 0) {\r\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\r\n\r\n if (CRYPTOS[ticker]) {\r\n return Instrument.Crypto\r\n } else if (ticker.length === 6) {\r\n return Instrument.Forex\r\n } else {\r\n return Instrument.Futures\r\n }\r\n }\r\n return Instrument.Stock\r\n}\r\n\r\nexport function getPerfIndicatorTickerAndTimeframes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n}: {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n timeframe: TIMEFRAME\r\n}) {\r\n const { elements } = paneWithPerfIndicator\r\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\r\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\r\n return tickers.map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n}\r\n\r\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n chartUuid?: string\r\n}\r\n\r\nexport async function prefetchPerfIndicatorAllQuotes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n}: PrefetchPerfIndicatorAllQuotesProps) {\r\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\r\n\r\n if (tickersAndTimeframes.length > 0) {\r\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n })\r\n )\r\n return Promise.all(promises)\r\n }\r\n return Promise.resolve([])\r\n}\r\n\r\ninterface RenderCrossProps {\r\n context: CanvasRenderingContext2D\r\n mouseModel: Mouse\r\n paneModel: Pane\r\n quote: Quote\r\n contentWidth: number\r\n contentHeight: number\r\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\r\n getRoundDecimalPlaces?: (price?: number) => number | undefined\r\n isIndicator?: boolean\r\n isPerfIndicator?: boolean\r\n}\r\n\r\nexport function renderCross({\r\n context,\r\n mouseModel,\r\n paneModel,\r\n quote,\r\n contentWidth,\r\n contentHeight,\r\n onRenderCrossText,\r\n getRoundDecimalPlaces,\r\n isIndicator = false,\r\n isPerfIndicator = false,\r\n}: RenderCrossProps) {\r\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\r\n const chartModel = paneModel.chart()\r\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\r\n const settings = isIndicator ? IndicatorSettings : ChartSettings\r\n const { Colors } = ChartSettings.general\r\n\r\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\r\n return false\r\n }\r\n\r\n const price = mouseModel.getPriceForPane(paneModel)\r\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\r\n const isXAxisInView = middle > 0 && middle <= contentWidth\r\n if (isXAxisInView) {\r\n const x = middle + settings.left.width\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: settings.top.height,\r\n y2: settings.top.height + contentHeight,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n onRenderCrossText?.(context, crossIndex)\r\n }\r\n\r\n const domainRange = paneModel.scale.y\r\n .domain()\r\n .slice()\r\n .sort((a, b) => a - b)\r\n\r\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\r\n return isXAxisInView\r\n }\r\n\r\n const priceFy = paneModel.scale.y(price)\r\n const y = Math.round(priceFy + settings.top.height)\r\n new Line(\r\n {\r\n x1: settings.left.width,\r\n x2: settings.left.width + contentWidth,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\r\n\r\n const getCrossText = () => {\r\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\r\n return `${math.round({\r\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: 2,\r\n })}%`\r\n }\r\n return `${math.round({\r\n value: price,\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\r\n })}${isPerfIndicator ? '%' : ''}`\r\n }\r\n\r\n new Text(\r\n {\r\n text: getCrossText(),\r\n x:\r\n settings.left.width +\r\n settings.right.axis.margin.left! +\r\n contentWidth +\r\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\r\n padding: isIndicator\r\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\r\n : {\r\n top: PADDING.XXS,\r\n right: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n },\r\n ...{\r\n y,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n background: Colors.crossTextBackground,\r\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\r\n lineHeight: settings.right.axis.font.lineHeight,\r\n },\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Set canvas width and height to 0 which fixes Safari memory problems\r\n *\r\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n */\r\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\r\n if (!canvas) return\r\n\r\n canvas.width = 0\r\n canvas.height = 0\r\n canvas.style.width = '0px'\r\n canvas.style.height = '0px'\r\n}\r\n\r\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\r\n const { Colors } = ChartSettings.general\r\n if (change === 0) {\r\n return Colors.zeroChange\r\n }\r\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\r\n}\r\n\r\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\r\n return math.round({\r\n value: num,\r\n lastClose: data.lastClose,\r\n instrument: data.instrument,\r\n overridePlaces: overridePlaces,\r\n })\r\n}\r\n\r\nexport interface ITickerChange {\r\n points: number\r\n string: string\r\n percentString: string\r\n}\r\ninterface ITickerChangeResult {\r\n tickerChange: ITickerChange | null\r\n tickerAfterChange: ITickerChange | null\r\n}\r\n\r\nexport function getTickerChangeFromCloseValues({\r\n anchorClose,\r\n prevClose,\r\n data,\r\n}: {\r\n anchorClose: number\r\n prevClose: number\r\n data: Quote\r\n}): ITickerChange {\r\n const changePoints = anchorClose - prevClose\r\n const changePercent = (anchorClose / prevClose - 1) * 100\r\n const sign = changePoints < 0 ? '-' : changePoints > 0 ? '+' : ''\r\n const changePercentString = `${round({\r\n data,\r\n num: Math.abs(changePercent),\r\n overridePlaces: 2,\r\n })}%`\r\n const changePointsString = `${sign}${round({\r\n data,\r\n num: Math.abs(changePoints),\r\n })} (${changePercentString})`\r\n\r\n return {\r\n points: changePoints,\r\n string: changePointsString,\r\n percentString: `${sign}${changePercentString}`,\r\n }\r\n}\r\nexport function getTickerChange({ data }: { data: Quote }) {\r\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\r\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\r\n if (isChange) {\r\n result.tickerChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.lastClose,\r\n prevClose: data.prevClose,\r\n })\r\n }\r\n\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n if (isAfterChange) {\r\n const tickerAfterChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.afterClose,\r\n prevClose: data.lastClose,\r\n })\r\n result.tickerAfterChange = {\r\n ...tickerAfterChange,\r\n string: `AH: ${tickerAfterChange.string}`,\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.futuresPage,\r\n ].includes(specificChartFunctionality)\r\n}\r\n\r\nexport function isQuoteForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return (\r\n isForexFuturesCryptoPage(specificChartFunctionality) ||\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n )\r\n}\r\n\r\nexport function getShouldUseDarkerWickColors({\r\n specificChartFunctionality,\r\n totalBarWidth,\r\n}: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n timeFrame?: TIMEFRAME\r\n totalBarWidth: number\r\n}) {\r\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\r\n const isOffscreenChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\r\n const isQuoteOrQuoteFinancials = [\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.quoteFinancials,\r\n ].includes(specificChartFunctionality)\r\n const isQuoteChartWithNarrowBars = isQuoteOrQuoteFinancials && totalBarWidth < 5\r\n\r\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\r\n}\r\n\r\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabled() {\r\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport function setIsDrawingEnabled(value: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function getIsSidebarEnabled(specificChartFunctionality?: SpecificChartFunctionality) {\r\n return specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n}\r\n\r\nexport const handleTypeChange = ({\r\n type,\r\n chartLayoutModel,\r\n}: {\r\n type: ChartElementType\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const elements = chartLayoutModel.getAllElements()\r\n elements.forEach((element) => {\r\n if (element.isChart() && element.instance.attrs.type !== type) {\r\n const pane = element.pane()\r\n const instance = chartsByType[type].fromObject(\r\n {\r\n ...element.instance.attrs,\r\n type,\r\n },\r\n pane\r\n )\r\n element.replace(instance)\r\n }\r\n })\r\n}\r\n\r\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n}) => {\r\n const { specificChartFunctionality, editable, editors } = args\r\n\r\n return (\r\n editable &&\r\n editors?.includes(ChartEditorEnum.tools) &&\r\n specificChartFunctionality &&\r\n [\r\n SpecificChartFunctionality.chartPage,\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(specificChartFunctionality)\r\n )\r\n}\r\n\r\nexport function getQuoteFinancialAttachmentsFromChartConfig({ panes }: Pick) {\r\n return panes\r\n .flatMap((pane) =>\r\n pane.elements?.flatMap(\r\n (element) => indicatorsByType[element.type as IndicatorType]?.config.quoteFinancialAttachments ?? []\r\n )\r\n )\r\n .filter((quoteFinancialAttachment, index, arr) => arr.indexOf(quoteFinancialAttachment) === index)\r\n}\r\n","/**\r\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\r\n const isRgb = getIsRgb(strColor)\r\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\r\n\r\n if (allowAlpha) {\r\n return hexColor\r\n }\r\n return hexColor.slice(0, 7)\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\r\n// otherwise cursor is set if element exists\r\nexport const setElementCursor = ({\r\n elementId,\r\n cursor,\r\n conditionalCursor,\r\n}: {\r\n elementId: string\r\n cursor: string\r\n conditionalCursor?: string\r\n}) => {\r\n const element = document.getElementById(elementId)\r\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\r\n element.style.cursor = cursor\r\n }\r\n}\r\n","/*\r\n * We want to be able to render only bars/parts of line that are visible to users,\r\n * but without introducing visual artifacts like bars missing in front of users while scrolling\r\n * or lines that start in middle of chart for sparse intraday stock data.\r\n *\r\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\r\n * one bar outside of visible area to create a continuous line.\r\n */\r\nimport type Pane from '../models/pane'\r\nimport type Quote from '../models/quote'\r\nimport { getHalfBarWidth } from './chart'\r\n\r\ninterface IBarToRender {\r\n index: number\r\n isBarVisible: boolean\r\n}\r\n\r\nexport const drawInVisibleArea = ({\r\n drawBarCallback,\r\n fromIndexOffset = 0,\r\n fxOverride,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n toIndexOffset = 0,\r\n width,\r\n}: {\r\n drawBarCallback: (i: number, x: number) => void\r\n fromIndexOffset?: number\r\n fxOverride?: (index: number) => number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n toIndexOffset?: number\r\n width: number\r\n}) => {\r\n const fx = fxOverride ?? ((index: number) => paneModel.scale.x(quote.barIndex[index]))\r\n\r\n // We want to start rendering one bar outside of the visible area for two reasons:\r\n // 1. To create a seamless transition for bars entering/leaving the view, avoiding them from\r\n // abruptly dis/appearing when half the bar is outside.\r\n // 2. To prevent disconnected lines in case there's a bar gap.\r\n // However, if a `fromIndex` is provided and it's higher than the first visible bar,\r\n // we need to start rendering from that specific index. This ensures correct starting\r\n // points for elements like indicators that rely on this value.\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex({ quote, paneModel, leftOffset, fromIndexOffset })\r\n\r\n let lastBarToRender = -1\r\n for (let i = firstBarToRenderIndex; i < quote.close.length + toIndexOffset; i++) {\r\n const x = fx(i)\r\n if (x + leftOffset > width) {\r\n lastBarToRender = i\r\n break\r\n }\r\n drawBarCallback(i, x)\r\n }\r\n\r\n if (lastBarToRender > -1) {\r\n const x = fx(lastBarToRender)\r\n drawBarCallback(lastBarToRender, x)\r\n }\r\n}\r\n\r\n/**\r\n * Get first or last visible bar index.\r\n * IMPORTANT: If chartWidth provided return is lastVisibleBarIndex\r\n */\r\nexport function getVisibleBarToRenderIndex({\r\n chartWidth,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n chartWidth?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n const chartModel = paneModel.chart()\r\n\r\n // not all the time there is bar present on barIndex calculated via inverted leftOffset\r\n // there might be a gap between bars, if there is, barToDataIndex on that gap spot will have value of\r\n // previous bar which isn't visible\r\n\r\n const barIndex = Math.round(paneModel.scale.x.invert(-leftOffset + (chartWidth !== undefined ? chartWidth : 0)))\r\n const dataBarIndex = quote.barToDataIndex[Math.min(Math.max(barIndex, 0), quote.barToDataIndex.length - 1)]\r\n const halfBarWidth = getHalfBarWidth(chartModel, false)\r\n\r\n const isBarVisible = Math.round(paneModel.scale.x(quote.barIndex[dataBarIndex]) + halfBarWidth) + leftOffset > 0\r\n\r\n return {\r\n barIndex,\r\n index:\r\n chartWidth === undefined\r\n ? isBarVisible\r\n ? dataBarIndex\r\n : Math.max(Math.min(dataBarIndex + 1, quote.barIndex.length - 1), 0)\r\n : dataBarIndex,\r\n isBarVisible,\r\n }\r\n}\r\n\r\n// Get first bar to render compensated for fromIndexOffset\r\nexport function getCompensatedFirstBarToRenderIndex({\r\n fromIndexOffset = 0,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n fromIndexOffset?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n return Math.max(0, getVisibleBarToRenderIndex({ quote, leftOffset, paneModel }).index - 1, fromIndexOffset)\r\n}\r\n\r\n/**\r\n * Checks if there are no visible bars between the specified first and last bars to render.\r\n * IMPORTANT: Provided indexes should be without bar gap compensation.\r\n *\r\n * @param {IBarToRender} firstBarToRenderIndex The index of the first bar to render.\r\n * @param {IBarToRender} lastBarToRenderIndex The index of the last bar to render.\r\n * @returns {boolean} True if there are no visible bars between the first and last bars, false otherwise.\r\n */\r\nexport function getAreNoBarsVisible(firstBarToRenderIndex: IBarToRender, lastBarToRenderIndex: IBarToRender): boolean {\r\n return !firstBarToRenderIndex.isBarVisible && !lastBarToRenderIndex.isBarVisible\r\n}\r\n","import queryString from 'query-string'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface FetchApiProps {\r\n location: string\r\n queryParameters?: ObjectHash\r\n method?: string\r\n body?: RequestInit['body']\r\n contentType?: ContentType\r\n abortController?: null | AbortController\r\n throwOnStatusCodes?: number[]\r\n throwOnPredicate?: (response: Response) => boolean\r\n keepalive?: boolean\r\n}\r\n\r\nexport const getFormDataFromObject = (object: ObjectHash) =>\r\n Object.keys(object).reduce((formData, key) => {\r\n formData.append(key, object[key])\r\n return formData\r\n }, new FormData())\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nconst fetchApi = async ({\r\n location,\r\n queryParameters,\r\n method,\r\n body,\r\n contentType,\r\n abortController,\r\n throwOnStatusCodes,\r\n throwOnPredicate,\r\n keepalive = false,\r\n}: FetchApiProps) => {\r\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\r\n const parameters: RequestInit = {\r\n method: method || 'GET',\r\n credentials: 'include',\r\n headers: contentType && {\r\n 'Content-Type': contentType,\r\n },\r\n signal: abortController?.signal,\r\n body: body,\r\n keepalive,\r\n }\r\n try {\r\n const response = await fetch(url, parameters)\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\r\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\r\n const StatusCodeError = getStatusCodeError(response.status)\r\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\r\n }\r\n return responseData as T\r\n } catch (err) {\r\n throw err\r\n }\r\n}\r\n\r\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\r\n switch (statusCode) {\r\n case 403:\r\n return ForbiddenError\r\n case 404:\r\n return NotFoundError\r\n case 410:\r\n return GoneError\r\n case 500:\r\n return InternalServerError\r\n default:\r\n return GenericStatusCodeError\r\n }\r\n}\r\n\r\nexport class GenericStatusCodeError extends Error {\r\n response: ObjectHash | string\r\n statusCode: number\r\n\r\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\r\n super(message)\r\n this.response = response\r\n this.statusCode = statusCode\r\n }\r\n}\r\nexport class ForbiddenError extends GenericStatusCodeError {}\r\nexport class NotFoundError extends GenericStatusCodeError {}\r\nexport class InternalServerError extends GenericStatusCodeError {}\r\nexport class GoneError extends GenericStatusCodeError {}\r\n\r\nexport default fetchApi\r\n","import React from 'react'\r\n\r\nexport function useForceUpdate() {\r\n const [forceUpdateKey, increment] = React.useState(0)\r\n const forceUpdate = React.useCallback(() => {\r\n increment((prev) => prev + 1)\r\n }, [])\r\n return { forceUpdate, forceUpdateKey }\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n// duplicate from Website/js/app/header/utils.ts , will be refactored in next PR\r\nexport function getEarningsDateSuffix(date: Date) {\r\n const hours = date.getHours()\r\n\r\n if (hours <= 9) {\r\n return 'BMO'\r\n } else if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n\r\n return ''\r\n}\r\n","export type HLC = {\r\n ts: number\r\n count: number\r\n uuid: string\r\n}\r\n\r\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\r\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\r\n\r\nexport const parseHlc = (serialized: string) => {\r\n const [ts, count, uuid] = serialized.split(':')\r\n return {\r\n ts: Number.parseInt(ts),\r\n count: Number.parseInt(count, 36),\r\n uuid,\r\n }\r\n}\r\n\r\nexport const initHlc = (uuid: string, now: number): HLC => ({\r\n ts: now,\r\n count: 0,\r\n uuid,\r\n})\r\n\r\nexport const compareHlc = (one: HLC, two: HLC) => {\r\n if (one.ts === two.ts) {\r\n if (one.count === two.count) {\r\n if (one.uuid === two.uuid) {\r\n return 0\r\n }\r\n return one.uuid < two.uuid ? -1 : 1\r\n }\r\n return one.count - two.count\r\n }\r\n return one.ts - two.ts\r\n}\r\n\r\nexport const incrementHlc = (local: HLC, now: number): HLC => {\r\n if (now > local.ts) {\r\n return { ts: now, count: 0, uuid: local.uuid }\r\n }\r\n\r\n return { ...local, count: local.count + 1 }\r\n}\r\n\r\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\r\n if (compareHlc(local, remote) >= 0) {\r\n return local\r\n }\r\n return { ...local, ts: remote.ts, count: remote.count }\r\n}\r\n","import { useChartLayoutGlobalModelAsyncModule } from '../controllers/chart-settings/async-modules'\r\nimport { useAsyncModule } from './async-modules-utils'\r\n\r\nexport function useChartLayoutGlobalModelAsync() {\r\n const [useChartLayoutGlobalModelModule] = useAsyncModule({\r\n ...useChartLayoutGlobalModelAsyncModule,\r\n isSuspenseMode: true,\r\n })\r\n return useChartLayoutGlobalModelModule.useChartLayoutGlobalModel()\r\n}\r\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\r\n\r\nimport {\r\n CanvasElementType,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n LayoutType,\r\n OverlayType,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../app/constants/common'\r\nimport ChartModel from '../app/models/chart'\r\nimport ChartLayout from '../app/models/chart_layout'\r\nimport { IChartThemeColors } from '../app/models/constants'\r\n\r\ninterface ISentry {\r\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\r\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n Sentry: ISentry\r\n FinvizSettings: ObjectHash\r\n FinvizChartsSettings: ObjectHash\r\n globalChartConfig: RootChartConfigObject\r\n isRenderInProgress: boolean | number\r\n rendersInProgress: number[]\r\n FinvizQuoteTypeCurrent: string\r\n handleScriptNotLoaded: () => void\r\n renderScriptNotLoaded: () => void\r\n gtag?: any\r\n }\r\n\r\n interface Document {\r\n fullscreenElement: any\r\n webkitFullscreenElement?: () => void\r\n mozFullScreenElement?: () => void\r\n msFullscreenElement?: () => void\r\n\r\n webkitExitFullscreen?: () => void\r\n mozExitFullScreen?: () => void\r\n msExitFullscreen?: () => void\r\n }\r\n\r\n interface HTMLElement {\r\n webkitRequestFullScreen?: () => void\r\n mozRequestFullScreen?: () => void\r\n msRequestFullscreen?: () => void\r\n }\r\n\r\n interface Navigator {\r\n msMaxTouchPoints: any\r\n }\r\n\r\n interface Array {\r\n last(): T | undefined\r\n }\r\n\r\n interface String {\r\n padLeft(paddingValue: string): string\r\n startsWith(str: string): boolean\r\n }\r\n\r\n type CanvasCache = Partial>\r\n\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n // We need to omit `canvas` because it is read only\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n\r\n interface HTMLCanvasElement {\r\n _cache: CanvasCache\r\n }\r\n\r\n interface ImageBitmapRenderingContext {\r\n _cache: CanvasCache\r\n }\r\n\r\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\r\n}\r\n\r\ndeclare module 'skia-canvas' {\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n}\r\n\r\nexport type TodoObjectHashAnyType = Record\r\nexport type TodoAreaObject = Record\r\nexport type ObjectHash = Record\r\nexport type EmptyObject = Record\r\n\r\nexport type TodoAnyType = any\r\n\r\nexport type ThumbType = string\r\n\r\nexport type PaneArea = {\r\n mouseDown?: boolean\r\n x: number\r\n y: number\r\n scaled: {\r\n x: number\r\n y: number\r\n }\r\n width: number\r\n height: number\r\n cursorX: number\r\n cursorY: number\r\n isCursorInChartWidthBoundaries: boolean\r\n} & T\r\n\r\nexport type Maybe = T | null | undefined\r\n\r\nexport interface DrawingBorder {\r\n color: string\r\n width: number\r\n}\r\n\r\nexport interface TextAttrs {\r\n text?: string\r\n background: string\r\n border?: { width: number; color: string }\r\n lineWidth?: number\r\n font: {\r\n size: number\r\n family?: string\r\n style?: string\r\n weight?: string\r\n }\r\n fillStyle?: string\r\n strokeStyle?: string\r\n angle?: number\r\n lineHeight: number\r\n textAlign?: TextAlign\r\n textBaseline: TextBaseline\r\n padding: {\r\n top: number\r\n right: number\r\n bottom: number\r\n left: number\r\n }\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type RequireByKey = Omit & Required>\r\n\r\nexport interface ResizeByThumbFuncProps {\r\n type: ThumbType\r\n difX: number\r\n difY: number\r\n area: PaneArea\r\n}\r\n\r\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\r\n\r\nexport interface ChartConfigChartPaneElement {\r\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\r\n overlays?: OverlayConfigObject[]\r\n period?: string\r\n code?: string\r\n elementId?: string | null\r\n zIndex?: number\r\n}\r\n\r\nexport interface RendererChartBarProps {\r\n index: number\r\n chartSettingsColors: IChartThemeColors\r\n hasFillAndBorder?: boolean\r\n}\r\n\r\nexport interface ChartConfigChartPane {\r\n elements: ChartConfigChartPaneElement[]\r\n height: number\r\n chart?: ChartConfigObject | ChartModel\r\n}\r\n\r\nexport interface IIdea {\r\n id?: number\r\n date?: string\r\n note: string\r\n}\r\n\r\nexport interface ChartConfigObjectExtended {\r\n editable: boolean\r\n canChangeTicker: boolean\r\n scrollable: boolean\r\n cross: boolean\r\n ideas: boolean\r\n editors: ChartEditorEnum[]\r\n specificChartFunctionality: SpecificChartFunctionality\r\n theme: Theme\r\n layout: LayoutType\r\n uuid?: string\r\n idea?: IIdea\r\n}\r\n\r\nexport interface ChartConfigObject {\r\n width: number\r\n height: number\r\n panes: ChartConfigChartPane[]\r\n premarket: boolean\r\n aftermarket: boolean\r\n dateRange: string | null\r\n hasChartEvents?: boolean\r\n stretch?: boolean\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n chart_layout: ChartLayout\r\n zoomFactor: number\r\n leftOffset: number | null\r\n refreshData: boolean | number\r\n isHideDrawingsActive: boolean\r\n isScrolled?: boolean\r\n scale: ScaleType\r\n}\r\n\r\nexport type RootChartConfigObjectChart = Omit<\r\n ChartConfigObject,\r\n 'chart_layout' | 'leftOffset' | 'zoomFactor' | 'isHideDrawingsActive'\r\n>\r\nexport interface RootChartConfigObject extends Partial {\r\n charts: Array\r\n width: number\r\n height: number\r\n newCharts?: boolean\r\n useGrid?: boolean\r\n}\r\n\r\nexport interface OverlayConfigObject {\r\n color: string\r\n period: string\r\n type: OverlayType\r\n}\r\n\r\nexport enum Instrument {\r\n Stock = 'stock',\r\n Crypto = 'crypto',\r\n MarketSentiment = 'market_sentiment',\r\n Futures = 'futures',\r\n Forex = 'forex',\r\n Group = 'group',\r\n}\r\n\r\nexport enum Theme {\r\n light = 'light',\r\n dark = 'dark',\r\n}\r\n\r\nexport interface IModalConfig {\r\n title: string\r\n inputs: IModalConfigInput[]\r\n inputsErrorMessages: ObjectHash\r\n}\r\nexport interface IOptionType {\r\n value: string | number\r\n label: string\r\n}\r\nexport interface IModalConfigInput {\r\n type: React.HTMLInputTypeAttribute\r\n label: string\r\n name: string\r\n value: number | string\r\n required?: boolean\r\n min?: number\r\n color?: string\r\n step?: number\r\n items?: IOptionType[]\r\n}\r\n\r\n// Keep in sync with config/types/globals.d.ts\r\nexport enum Position {\r\n Above = 'above',\r\n Below = 'below',\r\n}\r\n\r\nexport enum DefaultSpineEvents {\r\n Change = 'change',\r\n Destroy = 'destroy',\r\n Refresh = 'refresh',\r\n Update = 'update',\r\n}\r\n\r\nexport enum CustomSpineEvents {\r\n IndicatorsChange = 'indicatorsChange',\r\n ManualChange = 'manualChange',\r\n}\r\n\r\nexport enum DrawingSpineOptionsEvent {\r\n Remove = 'remove',\r\n}\r\n\r\nexport interface DrawingSpineOptions {\r\n eventType: DrawingSpineOptionsEvent\r\n}\r\n\r\nexport type TodoButtonProps = ObjectHash\r\nexport type TodoButtonTheme = string\r\n"],"names":["Array","prototype","last","this","length","String","padLeft","paddingValue","slice","startsWith","str","indexOf","_callbackCache","Spine","bind","ev","callback","that","cb","record","fkey","id","_len","arguments","rest","_key","push","newCb","origCb","model","unbind","item","findIndex","element","iterable","all","index","el","eql","defaults","enabled","collapsed","duration","timestamp","logErrors","withStackTrace","level","logger","console","filterChanges","attrs","props","Object","keys","constructor","name","errorTransformer","error","titleFormatter","title","time","took","parts","toFixed","join","colors","prevState","action","nextState","pad","num","maxLength","repeat","times","toString","printLogEntry","logEntry","options","startedTime","data","formattedTime","getHours","getMinutes","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","log","styles","trace","groupEnd","initialize","window","protoModelLoad","load","started","Date","now","cid","attributes","returnedValue","apply","e","badgeImages","getSvgImageCacheKey","concat","badgeType","theme","state","ChartEventElement","ElementModel","_defineProperty","initClass","paneModel","configure","belongsTo","getChartEventBadgeImage","_badgeImages","cacheKey","badgeImage","isLoaded","image","width","height","async","_ref","onBadgeInitLoad","importWithRetry","chartBadgeSvgByType","chartEventsAsyncModule","importFn","handleImageResolve","values","some","_ref2","undefined","ChartEventBadgeState","forEach","badgeState","ChartEventBadgeType","Theme","svgHTML","CHART_EVENT_BADGE_SIZE","img","Image","onload","onerror","captureException","Error","extra","src","encodeURIComponent","fetchAndCacheChartEventBadges","trigger","getChartEventData","_this$instance$model$","instance","chart","quote","chartEvents","find","stockEvent","elementId","toObject","super","yIndex","toConfig","Indicator","chartModel","Overlay","Chart","Pane","Quote","ChartLayout","DrawingsInternalStore","Element","document","location","hostname","isIPad","Utils","IPAD_FULLSCREEN_CLASS","FullscreenButton","isFullscreen","setIsFullscreen","React","getFullscreenStatus","requestFullscreen","getRequestFullscreen","documentElement","exitFullscreen","getExitFullscreen","onClick","call","checkFullscreen","body","classList","add","remove","addEventListener","removeEventListener","_jsx","Button","leftContent","contentClass","current","children","SORTED_LAYOUT_KEYS","arr","sort","a","b","reduce","acc","option","sortBy","sortDirection","SORT_DIRECTION","ASC","directionMultiplier","sortObjects","entries","LAYOUTS","map","key","value","ChartLayoutDropdown","_ref3","useLocation","navigate","useNavigate","parsedQuery","decodeQueryString","search","chartLayoutModel","useModelState","watchProperties","getChartsToPath","useChartsPathLocation","Dropdown","placement","orientation","l","_jsxs","className","layout","DropdownItem","appearance","Icon","MenuGroup","Paragraph","size","ChartSyncableParts","_ref4","label","isChartPartInSync","getIsChartPartInSync","active","_window$gtag","_window","setSyncChartParts","gtag","event_label","ThemeToggleButton","isDarkMode","updateAttributes","settings","updateSettings","setCookieRequest","catch","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","_chartLayout$idea","onSettingsOpen","hasPublish","chartLayout","_Fragment","IdeasDropdown","TourButton","page","specificChartFunctionality","Publish","disabled","idea","Time","breakpointMode","breakpoints","ChartLayoutHeader","prevProps","nextProps","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","ColorVariant","CheckboxSize","CheckboxComponent","ref","_props$checked","default","checked","defaultChecked","classnames","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","dark","Checkbox","forwardRef","clamp","min","max","isTouch","event","getRelativePosition","node","rect","getBoundingClientRect","pointer","touches","left","pageX","pageXOffset","top","pageY","pageYOffset","preventDefaultMove","preventDefault","DraggablePickerComponent","onMove","onKey","container","useRef","hasTouched","isDragging","setDragging","useState","isValid","handleMove","useCallback","buttons","handleMoveStart","nativeEvent","handleKeyDown","keyCode","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onTouchStart","onMouseDown","onKeyDown","tabIndex","DraggablePicker","memo","Pointer","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","r","g","Number","Math","round","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","v","c","h","s","f","n","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","parseInt","parseFloat","strColor","isValidColor","isRgb","Option","convertColorToHEX","getIsRgb","rgbKeys","getHSVAFromColor","Alpha","onChange","changeLightness","pos","gradientPreview","useMemo","gradientFrom","gradientTo","backgroundImage","DEFAULT_COLORS","ColorPalette","lowerCaseColor","toLowerCase","colorObj","isSelected","HueSaturation","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","icon","isArray","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","inputClass","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","useEffect","handleColorInputChange","currentTarget","colorValue","Input","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","popover","Ariakit","input","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","_prompt","prompt","trim","alert","isMobile","_hex","orignalColor","focus","preventScroll","InputColorPicker","inputDataTestId","popoverState","usePopoverState","isMobileDevice","PopoverTrigger","render","Popover","hideOnInteractOutside","backdrop","hide","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonRounding","small","ButtonColorPicker","buttonPickerDataTestId","isOpen","isMultiPicker","activeColorIndex","setActiveColorIndex","handleColorChange","originalColor","colorObject","as","ButtonGroup","childComponent","hasDivider","_ref5","CopyToClipboard","text","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","timeout","resetTimer","clearTimeout","setTimeout","Textarea","readOnly","select","DropdownRounding","DropdownTheme","StatelessDropdown","modal","gutter","unmountOnHide","showOnHover","autoFocusOnShow","autoFocusOnHide","onFullyOpen","onFullyClosed","store","zIndex","updatePosition","usePopoverPlacement","isFullyOpen","setIsFullyOpen","isMounted","wasMounted","usePrevious","menuGutter","parent","focusable","portal","hideOnHoverOutside","preventBodyScroll","focusWithoutScroll","blurWithoutScroll","classNames","none","onTransitionEnd","target","focusLoop","virtualFocus","DropdownItemComponent","asComponent","OptionButton","useDropdownState","ContextMenuInner","items","onClose","onContextMenu","rightContent","_item$onClick","assign","menu_option","ContextMenu","ChartGridCell","gridArea","GridLayout","columns","rows","border","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","valueKey","changeKey","valueAccessor","setState","handleChange","RangeSize","RangeSlider","step","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","Boolean","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","direction","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","hasRedesignEnabled","horizontal","alternative","Toolbar","hasFocusRings","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","throttle","originalWidth","offsetWidth","showTimeout","hideTimeout","Provider","querySelector","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","context","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","menubar","blurOnHoverEnd","titleActive","Delayed","delay","delayComponent","Spinner","isMobileBrowser","ToolbarGroup","defaultItem","groupItems","groupTitle","useNativeSelect","rowId","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","menu","menuButton","setMenuButton","open","mounted","anchorElement","parentMenu","menuContentElement","hideMenu","onMouseLeave","showMenu","handleMenuOpen","setDisclosureElement","setAnchorElement","NativeSelect","onFocusVisible","onPointerDown","portalElement","ToolbarItem","isItemActive","ToolbarDivider","StepContent","Box","Heading","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","tour","_step$backButton","_step$nextButton","complete","classes","getButtonTheme","ButtonTheme","light","button","ButtonPadding","back","backButton","next","nextButton","getTourKey","getStepsForUser","tours","_localStorage","lastFinishedTour","localStorage","getItem","lastTourIndex","allToursViewed","every","skip","toursToView","hasNewTours","steps","initialTour","completeTour","_localStorage2","setItem","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","useTour","setIsLoading","currentTour","setTour","controller","AbortController","loadingSetter","_controller$current","signal","aborted","_controller$current2","abort","startTour","definition","_controller$current3","setComplete","tourUtils","_definition$initialTo","Tour","from","removeStep","processedSteps","_step$placement","_step$offset","_step$overlayRadius","_step$overlayPadding","attachTo","on","popperOptions","modifiers","offset","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","TabSpacing","InternalTab","ariaSelected","spacing","content","Tab","TabList","TabPanel","Tabs","BadgeSize","BadgePadding","Badge","padding","badgePadding","badgeSize","TooltipInputComponent","tooltipSettings","isPointerEventsEnabled","TooltipTrigger","hideOnBlur","Tooltip","TooltipInput","useTrackPageView","trackInitial","trackAutomatically","initialRender","handleTrackView","tracking","cache","errorsCache","ErrorSeverity","defaultCaptureException","exception","captureContext","Sentry","useAsyncModule","onError","errorSeverity","shouldLoadModule","isSuspenseMode","notificationContext","useNotification","isError","setIsError","getIsMounted","useIsMounted","handleError","high","handleScriptNotLoaded","renderScriptNotLoaded","medium","Notification","timeoutInMs","reload","loadModule","cachedModule","then","mod","err","Component","fallback","NUM_OF_RETRIES","retries","Promise","ElementBaseConfig","abbreviation","shortLabel","optionsOrder","optionsLabels","inputsOrder","inputsLabels","calculatedValuesOrder","calculatedValuesLabels","defaultCalculatedValueOption","getShortLabelWithAttrs","getDefaultCalculatedValues","Arrow","x","y","renderContent","resize","_thumbs","Thumb","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","getChartLayoutSettings","ElementSettings","Colors","scaled","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","set","angle","PI","moveTo","lineTo","stroke","lineAngle","atan2","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","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","minY","maxX","maxY","brushV1","TailDirection","getTailHalfWidth","halfWidth","p1","p2","dist","distance","Callout","Text","getModalConfigBase","required","textWithoutBackground","font","family","weight","fillStyle","lineHeight","textAlign","textBaseline","right","bottom","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","ctx","lastAttrs","JSON","stringify","merge","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","S","renderText","previousDescent","fillText","getCalloutProperties","_this$lines","textWidth","requiredTailHalfWidth","radius","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","twoSegmentLinesIntersection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","renderBackground","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","perpendicularPointToLine","pointOffsetX","pointOffsetY","tailP2","polygon","pointInPolygon","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","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","onMouseMove","_this$model$chartEven","_this$model2","_this$model$elements","_this$model3","getIsChartEvent","findByAttribute","__","setIsEditInProgress","isEditInProgress","shouldTriggerChange","setIsSelected","setIsHovered","isHovered","getIsPaneSelection","_this$model$elements$","pane","selection","attrsSubset","customizer","objValue","srcValue","getIsDrawing","mergewith","cachePointPositionTimestamp","get","defineProperty","globalAlpha","isMouseDown","activeThumb","startEditing","mouseDown","pointPoitionsFromTimestamp","chart_layout","isLockDrawingsActive","getIsVisible","getModalConfig","config","toAutosaveConfig","omit","replaceMyself","_window$Sentry","captureMessage","oldElement","isCreator","newElement","getIsCreatorDialogOpen","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","visibility","isInRange","to","setVisibilityTo","setTo","MacroTimeframe","timeframesToSet","attrsToSet","SetVisibilityTo","currentAndAbove","currentAndBelow","currentOnly","_this$getBoundingPoin","xPoints","yPoints","positionY","omitX","isMaxXInvalid","isNaN","isMinXInvalid","omitY","topBound","bottomBound","ElliottWaves","positionWavesTimestamps","waves","wave","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","getMaxCoefficientUnscaledY","getMinCoefficientUnscaledY","includes","_ref6","_ref7","maxCoefficientY","minCoefficientY","allYValues","HorizontalLine","ScaledLine","updateDecimalPlaces","decimalPlaces","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","Rectangle","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","ScaledText","XXXS","XXS","textBoxX","textBoxY","textBoxWidth","textBoxHeight","DEFAULTS","alphabetic","getMergedPropsWithDefaults","propKey","count","_obj$font","_this$context$measure","_this$context","MIN_SAFE_INTEGER","testArea","convertArea","rawHight","getFontHeight","_this$context$measure2","_this$context2","fontBoundingBoxAscent","fontBoundingBoxDescent","_border$width","borderWidth","ThumbSettings","borderColor","thumbWidth","getThumbWidth","Triangle","VerticalLine","XABCD","xx","xy","ax","ay","bx","by","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","utils","overlayDefinition","addOverlay","renderYAxis","renderCrossText","setupCache","renderOverlaysLabels","CustomSpineEvents","IndicatorsChange","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","unmountCanvas","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","getIsSmallIndexChart","ticker","general","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","Group","getTimeframeLabel","textSecondary","isOurSiteRequest","L","tickerWidth","SpecificChartFunctionality","offScreen","XS","M","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","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","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","currentText","getDrawDays","MarketSentiment","textRenderer","shouldRenderVolume","getIsIndicatorPresent","Vol","getVolumeTicks","maxHeight","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","renderCross","isRendered","contentWidth","contentHeight","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","getCrossIndexForPane","setElementCursor","getHTMLElementId","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","prevClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","change","tickerChange","tickerAfterChange","getTickerChange","isOffscreen","isGroupInstrument","finvizWatermarkOffset","changeText","percentString","string","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref8","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","flatMap","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref9","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","XXL","alignTop","renderOHLCToCanvas","_ref10","ohlcSet","isSingleLineWithChange","shouldShowPrevClose","isStock","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","smallIndex","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","firstBarToRenderIndex","getVisibleBarToRenderIndex","lastBarToRenderIndex","chartWidth","volumes","getAreNoBarsVisible","addMarginBottom","marginBottom","setOverlays","removeOverlay","splice","MAX_VALUE","MIN_VALUE","prevMin","closestMinMaxIndices","placesLastClose","priceAbs","hasOverlay","getXLine","chartPage","getCandleLikeChartsRenderingColors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","getShouldUseDarkerWickColors","totalBarWidth","barWidth","darkerWickColors","thinBarColorsOverride","isRedesignedPage","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","zoomFactor","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","getIsSSr","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","first","redLine","greenLine","MarketSentimentSettings","sum","_data","lastIndex","_dataLastIndex","drawMinutesPerDay","marketStartMinutes","renderLineBullBear","array","oversold","overbought","isRedesign","marketDown","marketUp","xLine","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","months","MultiLineChart","ColorsSettings","quotes","getQuotes","tickers","end","asc","barToDataIndex","_this$data$getDataByB","maxTickerLength","isLastDate","closeValue","NaN","tickersDimensions","arrays","q","_this$data","isIdeaId","ideaID","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","getCompleteChartNumOfBars","dates","perf","_this$dates$crossInde","shouldRenderDate","tickerData","_tickerData$crossInde","MARGIN","percentageText","_tickerData$lastCross","lastCrossIndex","findLastIndex","fromDate","toDate","timestampe","dateToIndex","getDateToIndex","lastValue","dataIndex","_first","lastMonth","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXXL","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","ChartEditorEnum","LayoutType","OverlayType","ChartEventDbType","ChartEventType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","gridAreas","DESC","IntradayTimeframeInterval","TimeframeLabelShort","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","QuotePageQueryChartTypes","minutes","hours","days","weeks","MicroTimeframeRange","prev","curr","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","getContainerTypeFromPaneConfig","indicatorElement","getContainerType","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","isChart","updateInternalStoreWithChangedElement","changeType","currentInternalStore","lastUpdateTimestamp","getQuoteRawTicker","containerType","destroyed","instanceJson","newDrawing","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","ScrollableChartSettingsPopover","forceGlobalRerender","getIsConfigChanged","confirmationDialogState","checkChangesAndOpenDiscard","discardChangesAndHide","buttonPosition","_popoverContentElemen","popoverContentElement","getState","disclosureElement","scrollY","chartHeight","_chartElement$clientH","chartElement","getElementById","clientHeight","minHeight","ZIndexContext","PopoverRounding","PopoverTheme","ConfirmationDialog","actions","DialogDismiss","ChartSettingsButton","settingsPopoverState","buttonProps","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","financialAttachments","getQuoteFinancialAttachments","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","fetchedAt","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","barMargin","hasSameBarWidth","hasSameBarMargin","isQuoteOrQuoteFinancials","quoteFinancials","_chartLayoutModel$spe","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","numOfVisibleBars","getVisibleBarsNumber","getChartStartEndDates","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","Timeframe","syncChartParts","hasSyncedTicker","Ticker","_decodedSearch$t$spli","_decodedSearch$t","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r","decodedSearch","urlTickers","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","sidebar","getIsMobilePortrait","getTimeframeGroups","timeFrameGroup","QuoteNodeChartTypes","QuoteUrlChartTypes","QuoteShortToLongType","cs","candlesticksimple","o","ha","hc","QuoteLongToShortType","DEFAULT_TYPES","FREE_TYPES_QUOTE","FREE_TYPES_QUOTE_VALUES","useChartLayoutGlobalModelAsyncModule","preventClosingUnsavedChangesAsyncModule","BackgroundInput","ColorRangeRowInput","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","BorderInput","CheckBox","FONT_VALUES","FontInput","setFamily","setSize","setStyle","setWeight","setValue","valueSetter","Select","selected","LineInput","MultilineStringInput","placeholder","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","handleDisableSubmit","TAB_BUTTON_COMMON_PROPS","getValuesFromFormState","formState","cur","DialogTabs","ElementStyleDialog","_config$title","initialFormStateRef","setFormState","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","handleFullyOpen","CanvasElement","handleFullyClosed","onHide","handleValuesChange","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","checkValidity","handleCloseDialog","Dialog","isDraggable","hideOnEsc","DialogHeader","onCloseClick","DialogBody","InputComponent","getInputForType","inputType","stateInput","DialogFooter","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","openDialog","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","fetchDrawings","fetchApi","queryParameters","throwOnStatusCodes","saveDrawings","bodyJsonString","keepalive","hi","charCodeAt","lo","getByteLengthOfString","method","contentType","ContentType","ApplicationJson","latestChangeHlc","_window$Sentry2","InternalServerError","ForbiddenError","GoneError","newTicker","response","message","GenericStatusCodeError","invalidItems","deleteAllDrawings","lastLocalChange","newHlc","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","isInit","getIsPreserveDrawingsAndAutosaveAvailable","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","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","runInitialSaveAndRefetchUpdate","Off","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","checkDrawingUpdateSubscription","intervalCallbackOnWindowVisible","interval","unregisterListeners","willDestroy","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","ta","ty","taInt","defaultType","FinvizQuoteTypeCurrent","generateRouterPath","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","nativeSelect","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","ChangeLabel","changePoints","isTiny","DailyChangeDisplay","listenOnEvents","quoteModel","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","expires","setMonth","setCookie","finally","getLayoutType","tickersCount","_tickers$index","Search","onTickerSelected","saveToPortfolioDialogState","isSaveToPortfolioVisible","createAlertDialogState","isCreateAlertVisible","saveToPortfolioModule","isLoadingSaveToPortfolio","createAlertModule","isLoadingCreateAlert","SaveToPortfolio","CreateAlert","detailLink","formattedTicker","Futures","Forex","WebsiteSearchComponent","isSearchIcon","isSearchItemLink","isShowAllVisible","event_category","_window$gtag3","_window3","ChartControls","_chartModel$quote$nam","isQuotePage","isQuoteFinancials","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","timeframeBarProps","canChangeTicker","hasTimeframe","editors","tools","editable","ideas","compactViewMaxBreakpointPx","publish","contextMenu","_watchedModel$config","_watchedModel$callbac2","_watchedModel$callbac3","watchedModel","shown","ContextMenuComponent","overlap","_watchedModel$callbac","callbacks","onBeforeItemClick","getAnchorRect","anchorRect","stopPropagation","ready","rootEl","clientX","clientY","ChartEventPopoverWithState","_activeChartEvent$id","unwatchedChartLayout","lastEventId","isPopoverMounted","chartEventsModule","isChartEventOfThisChart","setData","clickAwayRef","isListening","refCallback","handler","contains","useClickAway","_chartModel$getChartP","chartEvent","popoverShow","popoverHide","newData","getChartEvenBadgeType","PopoverAnchor","ChartEventPopoverContent","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","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","scalerLastY","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","elementModel","hasProperties","isElementDrawing","onContextMenuClose","makeClone","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","onContextMenuFullyOpen","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","hoveredElement","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","cross","crossRafId","requestAnimationFrame","process","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","getShouldRenderCrossInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","additionalData","Settings","getSettings","areaRectangle","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","cursorX","cursorY","isCursorInChartWidthBoundaries","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","Mouse","isChartsPage","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","onPaneMouseMove","getIsHammerAllowScrollActive","onCanvasInteractionMove","onCanvasInteractionEnd","onMouseMoveOnScrolling","Touch","isPrimaryClick","_model$selection","_element$getIsChartEv2","_element$instance$get3","_element$instance3","_element$instance$get4","_element$instance4","_model$getChartOrIndi3","_model$getChartOrIndi4","_model$getChartOrIndi5","_model$selection$getI","_model$selection2","isElementHovered","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","ManualChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","componentDidMount","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance5","_element$instance6","paneHammer","Hammer","paneRef","touchAction","threshold","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","forceUpdate","CHART_LAYOUT_CHILD_CHANGE_EVENT","componentWillUnmount","_this$canvasWrapperRe2","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onPaneMouseLeave","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","withNotificationContext","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","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","onZoomerMouseUp","getRawDistance","onPinchMove","onPinchEnd","currentLeftOffset","isIntraday","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","isMouseWheel","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","stretch","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","Refetch","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","isChartPage","getAllValidPanes","showSettings","showTimeframe","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","total","optiMinHeight","minimalPaneHeight","basePane","WrapperComp","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","getQuoteFinancialAttachmentsFromChartConfig","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","isDisabled","drawingSettings","DrawingSetting","PreserveDrawings","DrawingModeContinuous","HideDrawings","LockDrawings","preserveDrawingsAutosaveOverride","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","drawingTools","Xabcd","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","areToolsDisabled","ignoreRowId","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isToolLoading","ceil","ChartAutoSaveNote","onNoteChange","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isAnimating","isFullyClosed","onAction","onCancel","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","ToolbarMobile","toolbarState","hideToolbar","hideAll","urlSearchParams","setUrlSearchParams","useSearchParams","toolbarMobileElement","setToolbarMobileElement","MOBILE_TOOLBAR_DIV_ID","drawButtonProps","has","SIDEBAR_QUERY_PARAM","params","delete","handleActiveToolChange","drawingTool","handleDrawingActionClick","actionId","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","_this$model$activeCha2","preserveDrawings","toolsState","handlePreserveDrawingsSettings","setPreserveDrawings","preserveDrawingAbortController","URLSearchParams","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","_this$state","_this$state2","test","getVisualViewportScale","visualViewport","noteDialogState","toggle","drawingToRemove","settingId","newObj","toggleHideDrawings","handleLockDrawings","_this$model$activeCha","updateLayout","prevModelWidth","prevTimeframeActiveChart","modelProperties","isHideDrawingsActive","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","_this$model$activeCha3","_document$querySelect","quoteTimeframe","isQuoteForexFuturesCryptoPage","newIsToolbarHorizontal","innerWidth","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","_chartLayout$gridArea","Sidebar","onShouldResize","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","removeCharts","addCharts","_layout$gridAreas","rowStart","columnStart","rowEnd","columnEnd","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","withCompleteLayoutModelInit","updateChartsTitle","defaultDocumentTitleRef","percentageChange","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","withQuotePolling","isWithNotifications","parentElement","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","onRegisterChartLayoutModel","getDefaultZoomFactor","OnInitListener","setIsInit","checkIfInitIsComplete","elementIndex","_config$charts$chartI","hasOwnProperty","opacity","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","newElements","ChartLayoutModel","getMaxDecayInterval","EliteStocksReduced","Free","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalSubscriptions","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","setInterval","clearInterval","timeoutDurations","allCharts","timeoutDurationsMin","timeoutSubscription","decay","maxDecayInterval","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","unsubscribe","getIdeaUrl","searchObject","isStockOnQute","path","queryString","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","onDeleteIdeaClick","wasDeleted","fetch","status","newUrl","URL","searchParams","company","IdeasTabs","hasError","setHasError","hasFetched","setHasFetched","categorizedIdeas","setCategorizedIdeas","queryTickers","dateParts","processed","tickerIdeas","categorizeIdeas","fetchIdeas","handleIdeaDeleted","modifiedCategories","categoryIndex","updatedCategory","updatedAll","category","IdeasDialog","hasPadding","dropdownButtonClassName","tooltipState","useTooltipState","isAnyQuoteLoading","setIsAnyQuoteLoading","hideTooltip","dropdownItemProps","checkIfAnyQuoteIsLoading","fetchingQuotes","hideOnClick","_layoutModel$idea","activeChartQuote","toJSON","chartId","layoutModelObjectPanes","tickersString","getChartTickers","quotesJsonString","quoteTickersTimeframes","getFormDataFromObject","ideaUrl","saveIdea","getIsMobileScreenSize","isDialogOpen","pageTours","getTour","userTour","setCurrentTour","buttonTheme","activeTour","once","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","d1","d5","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","m1","m3","m6","ytd","y5","numOfBarsInView","getIntradayChartConfig","timeframeMinutes","barWidthWithMargin","hasPremarket","hasAftermarket","maxWidth","canCropChart","fullChartWidth","marketMinutesLength","getFullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","getBarsInDay","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","getDayToOffset","offsetChartInPx","_quote$open","isStockIntraday","isIntradayDateRange","isOffScreen","isOffScreenWithNoDateRange","isOffScreenIntradayDateRange","isOffScreenWithFixedBars","isQuotePageWithNoDateRange","isQuotePageIntradayDateRange","isQuotePageWithFixedBars","getShouldOffsetChartDomain","scaleType","_perfChartInstance$ge","getChartElement","perfChartInstance","numOfBars","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","_ref11","rounded","fromEntries","_ref12","_ref13","_ref14","_ref15","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","reverse","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","_ref16","shouldRenderCross","DEFAULT_WIDTHS","DEFAULT_CONTEXT","activeModule","isCloseVisible","onResize","selectModule","SidebarContext","useSidebarContext","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","description","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","withModuleAsyncLoad","mobile","SidebarTabs","isHideOnClick","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","defaultMobile","defaultDesktop","desktop","Resizable","enable","handleClasses","defaultSize","tabsClassName","sidebarModuleKey","setActiveModule","handleSelectModule","newUrlSearchParams","handleCloseSidebar","contextValue","ErrorBoundary","FallbackComponent","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","ChartEvent","getChartEventModel","chartEventModel","getXYPosition","_chartEventModel$yInd","_this$model$chart$quo","buffer","hover","isOpenOverride","isCurrentEventActive","scaledArea","Earnings","_this$getChartEventMo","eventItem","epsActual","epsEstimate","dateTimestamp","chartEventsByType","dividends","earnings","canvasElements","indicatorsByType","elementType","BigNumber","BIG_NUMBER_VALUES","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","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","scalar","isSamePoint","ExponentialMovingAverage","multiplier","EMACalculation","MainCalculation","calculate","onValueCalculated","ema","_calculatedValues","calculatedValues","EMAConfig","_this$_calculatedValu","defaultCalculatedValues","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","IndicatorBaseConfig","ShrtflConfig","shortInterest","Shrtfl","ShrtraConfig","Shrtra","ADXConfig","_ADXConfig","Adx","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Atr","Aro","Mfi","Perf","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","_options$lastValueSuf","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","lastValueSuffix","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","getValueLabelsAtIndex","renderCrossTextValueLabels","crossValueText","lastRenderedIndex","getValueLabel","unit","getOversoldOverboughtValueLabelsAtIndex","renderOversoldOverbought","zero","drawLines","drawInVisibleAreaProps","fromIndexOffset","getCompensatedFirstBarToRenderIndex","clipHeight","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","areNoBarsVisible","applyMinMaxPadding","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","getLineColors","lineColors","_this$period","AroConfig","_AroConfig","aroonUp","aroonDown","oscillator","AroonCalculation","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","ArooscConfig","AroonOscillator","_this$aroonCalculatio","_this$aroonCalculatio2","_this$aroonCalculatio3","_this$aroonCalculatio4","_this$aroonCalculatio5","ATRConfig","_ATRConfig","ATR","_this$atr$last","AverageTrueRange","CCIConfig","_CCIConfig","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COTConfig","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","secondarylabelX","secondarylabel","units","renderAdditionalLabels","fontSettings","FIConfig","_FIConfig","fi","FICalculation","ForceIndex","_this$fiCalculation$c2","_this$fiCalculation","_this$fiCalculation$c","fiCalculation","_this$fiCalculation$c3","_this$fiCalculation2","_this$fiCalculation$c4","_this$fiCalculation3","MACDConfig","_MACDConfig","fastPeriod","slowPeriod","signalPeriod","macd","histogram","MACDCalculation","emaFast","emaSlow","emaSignal","MACD","_this$macdCalculation","macdCalculation","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFIConfig","_MFIConfig","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","NoneConfig","OBVConfig","Obv","OBV","_this$obv$last","obv","currentObv","PerfConfig","_PerfConfig","PricePerformance","hasCachedData","getTickersAndTimeframe","quoteSettings","getFromCacheSync","fetchedData","getAll","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstVisibleBar","lastVisibleBar","lastValueIndex","lastTickerTimestamp","canUseCustomMinMax","domainDefaults","getTickers","getTickerColor","hasBackground","_this$perf$key$values","_this$perf$key","_this$indicatorLabelW","tickerValue","indicatorLabelWidth","isVertical","labelBottom","canFitItemsVertically","_this$perf$key$values2","_this$perf$key2","tickerTextWidth","performanceIndicatorLabel","crossText","allTickers","_this$perf$ticker$val","_this$perf$ticker","_this$perf$ticker2","hasPatterns","chartUuid","getSanitizedTicker","RMIConfig","_RMIConfig","momentum","RMI","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROCConfig","_ROCConfig","ROC","_this$roc$last","roc","RSIConfig","_RSIConfig","rsi","RsiCalculation","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","_this$rsiCalculation$3","_this$rsiCalculation2","RVOLConfig","_RVOLConfig","baseLine","DEFAULT_PARAMETERS","RelativeVolume","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWIConfig","_RWIConfig","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","getComputedValuesAtDateIndex","financialAttachmentsData","_this$values","computedValues","getLastValue","getValueAtDataIndex","_values$value","_values","_vals","_vals$length","vals","shouldShowDate","isBeforeData","valueLabel","_this$getValueLabel","FinancialIndicator","dateIndex","_this$data$date$dateI","_this$data$date$dateI2","_timestampToFinancial","_timestampToFinancial2","_alignedFinancialAtta","timestampToFinancialsIndexesMap","alignedFinancialAttachmentsData","timestampKey","sourceIndexes","alignedData","lastBeforeDateFinancialsDataIndex","si","sharesFloat","sourceIndex","averageVolume","StofaConfig","_StofaConfig","Stofa","dPeriod","StofuConfig","_StofuConfig","kPeriod","Stochastics","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","StoslConfig","Stosl","StochasticsSlow","TRIXConfig","_TRIXConfig","trix","TrixCalculation","ema1","ema2","ema3","_this$trixCalculation2","_this$trixCalculation3","_this$trixCalculation","trixCalculation","_this$trixCalculation4","_this$trixCalculation5","UltConfig","_UltConfig","period1","period2","period3","UltimateOscillator","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","VolConfig","Volume","_this$data$volume$las","WRConfig","_WRConfig","WilliamsR","_this$r$last","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","shrtfl","shrtra","financialIndicators","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","spineEvents","hasMany","getChartType","_this$getChartElement","defaultRefreshInterval","Default","customRefreshInterval","Elite","isStockFastRefreshAvailable","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","quotePerf","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","chartParts","isInSync","chartPart","_hasOverlay","isFinancialIndicator","quoteFinancialAttachments","quoteFinancialAttachment","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","normalizeHexAlpha","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","aftermarketFade","crossTextBackground","gridSecondary","negativeChange","overlayTransparentBackground","positiveChange","premarketFade","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","getIsChartType","_this$instance2","_this$instance3","isOverlay","_this$instance4","_this$instance5","_this$instance6","_this$instance7","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","move","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_mainElement","_this$mainElement","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","computableKeys","_Quote$select$","tickerRaw","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","is404","isNotEmptyQuote","isCacheAllowed","_options$financialAtt","_options$financialAtt2","financialAttachment","_quote$financialAttac","doesQuoteAndOptionsMatch","_options$financialAtt3","shouldUseCache","getResolvedFetchingPromise","numberOfRefreshChecks","premarketLengthMinutes","aftermarketLengthMinutes","patternsMinRange","patternsMaxRange","dataId","maxBars","tickersAndTimeframes","accumulator","fetchRequest","QuoteFetchTypeUrlOption","New","fetchingPromise","getUrl","NotFoundError","getIsAbortError","shouldUseEmptyQuote","_data$ticker","_data$patterns","_data$chartEvents","_this$numberOfRefresh","Newer","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","atts","_atts$fetchedAt","_this$patterns","drawDays","getBarIndexes","_this$barIndex","alignAllFinancialAttachmentsDataWithQuoteDates","_chartEvents$map","getChartEventsWithId","_this$financialAttach","alignFinancialAttachmentsDataWithQuoteDates","_this$financialAttach2","lastDateIndex","firstDate","matchingQuoteTimestamp","parsedDate","convertedDateToNyTimestamp","dateDate","isSameDay","clearCachedData","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dayToOffset","lastDay","dateStringFromDate","yyyy","mm","dd","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","_this$financialAttach3","host","env","BE_API_URL","rev","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","tickerTimeframeChangeHeight","chartSettings","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","BaseConfig","_EMAConfig","Ema","OverlayBaseConfig","BBConfig","_BBConfig","Bb","deviations","topColor","bottomColor","upperBand","lowerBand","BbCalculation","stdDev","stdDevSum","getFreeColor","periods","getRGBAValueFromValidColorString","OverlayConfig","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","bbCalculation","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","DchConfig","Dch","channelStrokeColor","channelFillColor","medianBandColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","EMA","_this$attrs$color","EMA2Config","Ema2","EMA2","HILOConfig","Hilo","highColor","lowColor","HighLow","prevHigh","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","HLineConfig","Hline","isPositiveFloat","ICConfig","_ICConfig","Ic","conversion","spanB","spanAStrokeColor","spanAFillColor","spanBStrokeColor","spanBFillColor","conversionLineColor","baseLineColor","laggingSpanColor","Stroke","Fill","Conversion","Base","SpanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","toIndexOffset","fxOverride","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","ICFConfig","Icf","IchimokuCloudFull","KCHConfig","_KCHConfig","Kch","emaPeriod","atrPeriod","strokeColor","fillColor","KeltnerChannel","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","PatternsConfig","Patterns","supportColor","resistColor","originalScale","barsInDay","aboveBelow","textHS","above","below","kind","_this$attrs$supportCo","_this$attrs$resistCol","Calculation","PPConfig","Pp","calculationType","PivotPeriod","PivotPoints","getPeriodType","week","getIsEnoughData","startIndex","endIndex","periodType","dayGap","startDay","beforeDay","_lastDate","_lastDate2","_lastDate3","calculatedX","fromX","toX","currentDate","previousTradingDay","previousNYMidnightTimestamp","currentMidnight","currentNYMidnightTimestamp","isNonStockFullDay","isStockFullDay","firstDayCurrentWeek","firstDayCurrentWeekTimestamp","firstDayPreviousWeek","firstDayPreviousWeekTimestamp","firstDayCurrentMonth","firstDayCurrentMonthTimestamp","firstDayPreviousMonth","firstDayPreviousMonthTimestamp","firstDayCurrentYear","firstDayCurrentYearTimestamp","firstDayPreviousYear","firstDayPreviousYearTimestamp","pivot","sup1","sup2","sup3","res1","res2","res3","previousHigh","previousLow","pivotPoint","currentX","toBars","nextDate","_this$data$drawMinute","_this$data$drawMinute2","_this$attrs$calculati","SARConfig","_SARConfig","Sar","maxStep","risingColor","fallingColor","SAR","isLong","sar","ep","newHigh","newLow","af","sarToDraw","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","SMAConfig","_SMAConfig","Sma","SMACalculation","SMA","SMA2Config","Sma2","SMA2","StrConfig","_StrConfig","Str","uptrendColor","downtrendColor","Supertrend","finalUpperBand","finalLowerBand","supertrend","avg","_this$attrs$uptrendCo","_this$attrs$downtrend","VPConfig","Vp","upColor","downColor","VP_COLORS","applyOpacityToColor","VolumeProfile","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","VWAPConfig","_VWAPConfig","Vwap","vwap","VWapCalculation","cumulativePV","cumulativeVolume","second","datesAreOnSameDay","VWAP","bb","dch","hilo","hline","ic","icf","kch","pp","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getQuoteDateTimestampOffsetInSeconds","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","dateFromDateString","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","websiteShared","shouldUseCPUOnly","matchesAndroid","matchesWebOS","matchesiPad","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","isFirefoxDesktop","getContext","willReadFrequently","_cache","_restore","CanvasRenderingContext2D","getChartEventBadgeColors","outerStroke","innerStroke","innerFill","textFill","getFormattedEventDate","exdate","hasEarningsDateSuffix","formattedDate","formatDateToStringUS","getEarningsDateSuffix","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","substring","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","twColors","chartLayoutSettings","isXPointVisible","renderXAxisLabels","labels","allowedOverflow","sortedLabels","renderedLabelRanges","newLabel","hasPriority","halfOfTextWidth","overflowLeft","overflowRight","labelX","getIsOverlapping","getSize","paddingX","paddingY","render15MinXAxis","startBarIndex","endBarIndex","indexOffset","SMALL_INDEX_CHART_LABEL_BUFFER","renderIntradayXAxis","marketStartHour","marketEndHour","dayIndex","roundedX","renderTimeframeXAxisProps","lastHours","renderIntradayXAxisFutures","renderDailyXAxis","isYearLabel","renderWeeklyXAxis","lastYear","isJanuary","renderMonthlyXAxis","n0","n1","x0","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","halfBarWidthRaw","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","resolve","_ref17","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref18","_ref19","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","_ref23","_ref24","_indicatorsByType$con","_indicatorsByType","allowAlpha","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":""}