{"version":3,"file":"8968.ceb694ed.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/hooks/use-popover-maxHeight.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/list/hooks.tsx","webpack://@finviz/website/./js/main/components/list/list-item.tsx","webpack://@finviz/website/./js/main/components/list/list.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/popover/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/popover/popover.tsx","webpack://@finviz/website/./js/main/components/toolbar/popover/popover-trigger.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/hooks/use-window-size.tsx","webpack://@finviz/website/./js/main/services/async-modules-utils.tsx","webpack://@finviz/website/./js/main/services/import-with-retry.ts","webpack://@finviz/website/../charts/app/canvas/arrow.ts","webpack://@finviz/website/../charts/app/canvas/brush/brush_v1.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_utils.ts","webpack://@finviz/website/../charts/app/canvas/callout/callout_v1.ts","webpack://@finviz/website/../charts/app/canvas/curve.ts","webpack://@finviz/website/../charts/app/canvas/ellipse.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle.ts","webpack://@finviz/website/../charts/app/canvas/symbol.ts","webpack://@finviz/website/../charts/app/canvas/drawingTools.ts","webpack://@finviz/website/../charts/app/canvas/element.ts","webpack://@finviz/website/../charts/app/canvas/elliott_waves/elliott_waves.ts","webpack://@finviz/website/../charts/app/canvas/ellipse/ellipse_v1.ts","webpack://@finviz/website/../charts/app/canvas/fibonacci_retracements.ts","webpack://@finviz/website/../charts/app/canvas/horizontal_line.ts","webpack://@finviz/website/../charts/app/canvas/line.ts","webpack://@finviz/website/../charts/app/canvas/measure.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_utils.ts","webpack://@finviz/website/../charts/app/canvas/pitchfork/pitchfork_v1.ts","webpack://@finviz/website/../charts/app/canvas/polygon.ts","webpack://@finviz/website/../charts/app/canvas/position.ts","webpack://@finviz/website/../charts/app/canvas/rectangle.ts","webpack://@finviz/website/../charts/app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://@finviz/website/../charts/app/canvas/scaled_line.ts","webpack://@finviz/website/../charts/app/canvas/scaled_text.ts","webpack://@finviz/website/../charts/app/canvas/text.ts","webpack://@finviz/website/../charts/app/canvas/thumb.ts","webpack://@finviz/website/../charts/app/canvas/triangle.ts","webpack://@finviz/website/../charts/app/canvas/vertical_line.ts","webpack://@finviz/website/../charts/app/canvas/xabcd.ts","webpack://@finviz/website/../charts/app/canvas/cache.js","webpack://@finviz/website/../charts/app/models/chart_settings/interfaces.ts","webpack://@finviz/website/../charts/app/charts/utils.ts","webpack://@finviz/website/../charts/app/charts/base_chart.ts","webpack://@finviz/website/../charts/app/charts/candle_stick.ts","webpack://@finviz/website/../charts/app/charts/candle_stick_hollow.ts","webpack://@finviz/website/../charts/app/charts/heikin_ashi.ts","webpack://@finviz/website/../charts/app/charts/line_chart.ts","webpack://@finviz/website/../charts/app/charts/market_sentiment.ts","webpack://@finviz/website/../charts/app/charts/multi_line_chart.ts","webpack://@finviz/website/../charts/app/charts/ohlc_chart.ts","webpack://@finviz/website/../charts/app/charts/perf_chart.ts","webpack://@finviz/website/../charts/app/charts/charts.ts","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/controllers/autosave/utils.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/settings-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-controls.ts","webpack://@finviz/website/../charts/app/model-hooks/useModelRef.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-model-custom-date-range-values.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-charts-path-location.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/utils.ts","webpack://@finviz/website/../charts/app/controllers/chart-events/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/chart-settings/async-modules.ts","webpack://@finviz/website/../charts/app/modals/background.tsx","webpack://@finviz/website/../charts/app/modals/color_range_row.tsx","webpack://@finviz/website/../charts/app/modals/border.tsx","webpack://@finviz/website/../charts/app/modals/checkbox.tsx","webpack://@finviz/website/../charts/app/modals/font.tsx","webpack://@finviz/website/../charts/app/modals/line.tsx","webpack://@finviz/website/../charts/app/modals/multiline_string.tsx","webpack://@finviz/website/../charts/app/modals/number.tsx","webpack://@finviz/website/../charts/app/modals/string.tsx","webpack://@finviz/website/../charts/app/modals/trend.tsx","webpack://@finviz/website/../charts/app/modals/visibility/visibility-input.tsx","webpack://@finviz/website/../charts/app/modals/visibility/index.tsx","webpack://@finviz/website/../charts/app/modals/element_style.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/constants.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-autosave-api.tsx","webpack://@finviz/website/../charts/app/utils/string-byte-length.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-is-auto-save-active.ts","webpack://@finviz/website/../charts/app/controllers/autosave/with-auto-save.tsx","webpack://@finviz/website/../charts/app/utils/use-prev-state.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/chart-type-select.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/use-chart-types.ts","webpack://@finviz/website/../charts/app/controllers/chart-controls/daily-change-display.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/draw-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/fullscreen-button.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/search.tsx","webpack://@finviz/website/../charts/app/controllers/chart-controls/chart-controls.tsx","webpack://@finviz/website/../charts/app/models/context_menu.ts","webpack://@finviz/website/../charts/app/controllers/context_menu.tsx","webpack://@finviz/website/../charts/app/controllers/pane/chart-event-popover-with-state.tsx","webpack://@finviz/website/../charts/app/utils/use-click-away.ts","webpack://@finviz/website/../charts/app/controllers/pane/load-latest-data-button.tsx","webpack://@finviz/website/../charts/app/utils/use-is-mounted.ts","webpack://@finviz/website/../charts/app/controllers/pane/zoom_controls.tsx","webpack://@finviz/website/../charts/app/controllers/pane/pane.tsx","webpack://@finviz/website/../charts/app/controllers/pane/with-pane-model.tsx","webpack://@finviz/website/../charts/app/controllers/chart/chart-spinner-overlay.tsx","webpack://@finviz/website/../charts/app/controllers/chart/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart/chart.tsx","webpack://@finviz/website/../charts/app/controllers/chart/with-chart-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart/with-watched-panes-on-chart-model.tsx","webpack://@finviz/website/../charts/app/creators/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingActions.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingSettings.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/drawingTools.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/toolbar.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/index.ts","webpack://@finviz/website/../charts/app/controllers/toolbar/auto-save-notes/auto-save-notes.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/auto-save-notes/auto-save-notes-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/confirmation_dialog.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/mobile/tool-button.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/mobile/toolbar-mobile.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://@finviz/website/../charts/app/controllers/autosave/idea-leave-dialog.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-route-change.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout_component.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://@finviz/website/../charts/app/controllers/with_dialog_state_hook.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-chart-page-title.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-idea-model-state.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/constants.ts","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-polling.tsx","webpack://@finviz/website/../charts/app/modals/ideas/utils.ts","webpack://@finviz/website/../charts/app/modals/ideas/IdeaItem.tsx","webpack://@finviz/website/../charts/app/modals/ideas/IdeasTabs.tsx","webpack://@finviz/website/../charts/app/modals/ideas/Ideas.tsx","webpack://@finviz/website/../charts/app/controllers/header/ideas_dropdown.tsx","webpack://@finviz/website/../charts/app/controllers/header/publish.tsx","webpack://@finviz/website/../charts/app/controllers/header/tour_button.tsx","webpack://@finviz/website/../charts/app/utils/chart-date-range-utils.ts","webpack://@finviz/website/../charts/app/controllers/renderUtils.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/constants.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/module-load-failed.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/modules.ts","webpack://@finviz/website/../charts/app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-tabs.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-content.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar.tsx","webpack://@finviz/website/../charts/app/controllers/toolbar/interfaces.ts","webpack://@finviz/website/../charts/app/controllers/utils.ts","webpack://@finviz/website/../charts/app/helpers/atr.ts","webpack://@finviz/website/../charts/app/chart-events/chart-event.ts","webpack://@finviz/website/../charts/app/chart-events/dividends.ts","webpack://@finviz/website/../charts/app/chart-events/earnings.ts","webpack://@finviz/website/../charts/app/chart-events/split.ts","webpack://@finviz/website/../charts/app/chart-events/index.ts","webpack://@finviz/website/../charts/app/helpers/get-canvas-element-by-type.ts","webpack://@finviz/website/../charts/app/helpers/math.ts","webpack://@finviz/website/../charts/app/indicator-calculation/ema.ts","webpack://@finviz/website/../charts/app/indicator-calculation/main.ts","webpack://@finviz/website/../charts/app/indicators/indicator.ts","webpack://@finviz/website/../charts/app/utils/canvas-render.ts","webpack://@finviz/website/../charts/app/indicators/adx.ts","webpack://@finviz/website/../charts/app/indicator-calculation/aroon.ts","webpack://@finviz/website/../charts/app/indicators/aro.ts","webpack://@finviz/website/../charts/app/indicators/aroosc.ts","webpack://@finviz/website/../charts/app/indicators/atr.ts","webpack://@finviz/website/../charts/app/indicators/cci.ts","webpack://@finviz/website/../charts/app/indicators/cot.ts","webpack://@finviz/website/../charts/app/indicator-calculation/fi.ts","webpack://@finviz/website/../charts/app/indicators/fi.ts","webpack://@finviz/website/../charts/app/indicator-calculation/macd.ts","webpack://@finviz/website/../charts/app/indicators/macd.ts","webpack://@finviz/website/../charts/app/indicators/mfi.ts","webpack://@finviz/website/../charts/app/indicators/none.ts","webpack://@finviz/website/../charts/app/indicators/obv.ts","webpack://@finviz/website/../charts/app/indicators/perf.ts","webpack://@finviz/website/../charts/app/indicators/rmi.ts","webpack://@finviz/website/../charts/app/indicators/roc.ts","webpack://@finviz/website/../charts/app/indicator-calculation/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rsi.ts","webpack://@finviz/website/../charts/app/indicators/rvol.ts","webpack://@finviz/website/../charts/app/indicators/rwi.ts","webpack://@finviz/website/../charts/app/indicators/stofu.ts","webpack://@finviz/website/../charts/app/indicators/stofa.ts","webpack://@finviz/website/../charts/app/indicators/stosl.ts","webpack://@finviz/website/../charts/app/indicator-calculation/trix.ts","webpack://@finviz/website/../charts/app/indicators/trix.ts","webpack://@finviz/website/../charts/app/indicators/ult.ts","webpack://@finviz/website/../charts/app/indicators/vol.ts","webpack://@finviz/website/../charts/app/indicators/wr.ts","webpack://@finviz/website/../charts/app/indicators/indicators.ts","webpack://@finviz/website/../charts/app/modals/publish/async-modules.ts","webpack://@finviz/website/../charts/app/model-hooks/use-model-state.ts","webpack://@finviz/website/../charts/app/models/chart.ts","webpack://@finviz/website/../charts/app/models/chart/contstants.ts","webpack://@finviz/website/../charts/app/models/chart_layout.ts","webpack://@finviz/website/../charts/app/models/chart_settings/index.ts","webpack://@finviz/website/../charts/app/models/constants.ts","webpack://@finviz/website/../charts/app/models/drawings-internal-store.ts","webpack://@finviz/website/../charts/app/models/element.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse-utils.ts","webpack://@finviz/website/../charts/app/models/mouse/mouse.ts","webpack://@finviz/website/../charts/app/models/pane.ts","webpack://@finviz/website/../charts/app/models/quoteCache.ts","webpack://@finviz/website/../charts/app/models/quote.ts","webpack://@finviz/website/../charts/app/models/quote/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/constants.ts","webpack://@finviz/website/../charts/app/models/chart_settings/interactive_chart_settings.ts","webpack://@finviz/website/../charts/app/models/settings.ts","webpack://@finviz/website/../charts/app/models/utils.ts","webpack://@finviz/website/../charts/app/indicator-calculation/bb.ts","webpack://@finviz/website/../charts/app/overlays/overlay.ts","webpack://@finviz/website/../charts/app/overlays/bb.ts","webpack://@finviz/website/../charts/app/overlays/dch.ts","webpack://@finviz/website/../charts/app/overlays/ema.ts","webpack://@finviz/website/../charts/app/overlays/ema2.ts","webpack://@finviz/website/../charts/app/overlays/hilo.ts","webpack://@finviz/website/../charts/app/overlays/hline.ts","webpack://@finviz/website/../charts/app/overlays/ic.ts","webpack://@finviz/website/../charts/app/overlays/icf.ts","webpack://@finviz/website/../charts/app/overlays/kch.ts","webpack://@finviz/website/../charts/app/overlays/none.ts","webpack://@finviz/website/../charts/app/overlays/patterns.ts","webpack://@finviz/website/../charts/app/overlays/pp.ts","webpack://@finviz/website/../charts/app/overlays/sar.ts","webpack://@finviz/website/../charts/app/indicator-calculation/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma.ts","webpack://@finviz/website/../charts/app/overlays/sma2.ts","webpack://@finviz/website/../charts/app/overlays/str.ts","webpack://@finviz/website/../charts/app/overlays/vp.ts","webpack://@finviz/website/../charts/app/indicator-calculation/vwap.ts","webpack://@finviz/website/../charts/app/overlays/vwap.ts","webpack://@finviz/website/../charts/app/overlays/overlays.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/abort_controller.ts","webpack://@finviz/website/../charts/app/utils/async-modules-utils.ts","webpack://@finviz/website/../charts/app/utils/canvas.ts","webpack://@finviz/website/../charts/app/utils/chart-events-utils.ts","webpack://@finviz/website/../charts/app/utils/chart.ts","webpack://@finviz/website/../charts/app/utils/colors.ts","webpack://@finviz/website/../charts/app/utils/cursor.ts","webpack://@finviz/website/../charts/app/utils/draw_in_visible_area.ts","webpack://@finviz/website/../charts/app/utils/fetch_api.ts","webpack://@finviz/website/../charts/app/utils/force-update.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../charts/app/utils/hlc.ts","webpack://@finviz/website/../charts/app/utils/useChartLayoutGlobalModelAsync.ts","webpack://@finviz/website/../charts/types/shared.ts"],"sourcesContent":["import Spine from '@finviz/spine'\r\n\r\n// eslint-disable-next-line no-extend-native\r\nArray.prototype.last = function () {\r\n return this[this.length - 1]\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.padLeft = function (paddingValue) {\r\n return String(paddingValue + this).slice(-paddingValue.length)\r\n}\r\n\r\n// eslint-disable-next-line no-extend-native\r\nString.prototype.startsWith = function (str) {\r\n return this.indexOf(str) === 0\r\n}\r\n\r\ninterface CallbackCacheItem {\r\n newCb: (...args: any[]) => any\r\n origCb: (...args: any[]) => any\r\n}\r\n\r\nconst _callbackCache: CallbackCacheItem[] = []\r\nSpine.Collection.prototype.bind = function (ev, callback) {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this\r\n const cb = (record: Spine.Model, ...rest: any[]) => {\r\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\r\n return callback(record, ...rest)\r\n }\r\n }\r\n _callbackCache.push({ newCb: cb, origCb: callback })\r\n this.model.bind(ev, cb)\r\n return this\r\n}\r\n\r\nSpine.Collection.prototype.unbind = function (ev, callback) {\r\n let cb\r\n for (const item of _callbackCache) {\r\n if (item.origCb === callback) {\r\n cb = item.newCb\r\n break\r\n }\r\n }\r\n return this.model.unbind(ev, cb)\r\n}\r\n\r\nSpine.Model.findIndex = function (element) {\r\n const iterable = this.all()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const el = iterable[index]\r\n if (element.eql(el)) {\r\n return index\r\n }\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nexport const defaults = {\r\n enabled: false,\r\n collapsed: true,\r\n duration: false,\r\n timestamp: true,\r\n logErrors: true,\r\n withStackTrace: false,\r\n level: 'log',\r\n logger: console,\r\n filterChanges: (model, attrs) => {\r\n const props = Object.keys(attrs)\r\n return (\r\n model.constructor.name === 'Mouse' ||\r\n model.constructor.name === 'Quote' ||\r\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\r\n )\r\n },\r\n errorTransformer: (error) => error,\r\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\r\n const parts = ['model']\r\n parts.push(`%c${String(title)}`)\r\n if (timestamp) {\r\n parts.push(`%c@ ${time}`)\r\n }\r\n if (duration) {\r\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\r\n }\r\n return parts.join(' ')\r\n },\r\n colors: {\r\n title: () => 'inherit',\r\n prevState: () => '#9E9E9E',\r\n action: () => '#03A9F4',\r\n nextState: () => '#4CAF50',\r\n error: () => '#F20404',\r\n },\r\n}\r\n\r\nconst repeat = (str, times) => new Array(times + 1).join(str)\r\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\r\nconst formatTime = (time) =>\r\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\r\n\r\nexport const printLogEntry = (logEntry, options = {}) => {\r\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\r\n ...defaults,\r\n ...options,\r\n }\r\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\r\n\r\n const formattedTime = formatTime(startedTime)\r\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\r\n const headerCSS = ['color: gray; font-weight: lighter;']\r\n headerCSS.push(titleCSS)\r\n if (timestamp) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n if (duration) {\r\n headerCSS.push('color: gray; font-weight: lighter;')\r\n }\r\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\r\n\r\n try {\r\n if (collapsed) {\r\n if (colors.title) {\r\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.groupCollapsed(formattedTitle)\r\n }\r\n } else if (colors.title) {\r\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\r\n } else {\r\n logger.group(formattedTitle)\r\n }\r\n } catch (e) {\r\n logger.log(formattedTitle)\r\n }\r\n\r\n if (colors.prevState) {\r\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\r\n logger[level]('%c prev state', styles, prevState)\r\n } else {\r\n logger[level]('prev state', prevState)\r\n }\r\n\r\n if (colors.action) {\r\n const styles = `color: ${colors.action(data)}; font-weight: bold`\r\n logger[level]('%c arguments ', styles, data)\r\n } else {\r\n logger[level]('arguments ', data)\r\n }\r\n\r\n if (error && logErrors) {\r\n if (colors.error) {\r\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\r\n logger['error']('%c error ', styles, error)\r\n } else {\r\n logger['error']('error ', error)\r\n }\r\n }\r\n\r\n if (colors.nextState) {\r\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\r\n logger[level]('%c next state', styles, nextState)\r\n } else {\r\n logger[level]('next state', nextState)\r\n }\r\n\r\n if (withStackTrace) {\r\n logger.groupCollapsed('TRACE')\r\n logger.trace()\r\n logger.groupEnd()\r\n }\r\n\r\n try {\r\n logger.groupEnd()\r\n } catch (e) {\r\n logger.log('—— log end ——')\r\n }\r\n}\r\n\r\nexport const initialize = () => {\r\n window['logger'] = defaults\r\n\r\n const protoModelLoad = Spine.Model.prototype.load\r\n Spine.Model.prototype.load = function (attrs) {\r\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\r\n const started = Date.now()\r\n const logEntry = {\r\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\r\n started: started,\r\n startedTime: new Date(started),\r\n prevState: this.attributes(),\r\n data: attrs,\r\n }\r\n\r\n let returnedValue\r\n try {\r\n returnedValue = protoModelLoad.apply(this, arguments)\r\n } catch (e) {\r\n logEntry.error = e\r\n }\r\n\r\n logEntry.nextState = this.attributes()\r\n logEntry.took = Date.now() - logEntry.started\r\n\r\n printLogEntry(logEntry)\r\n return returnedValue\r\n } else {\r\n return protoModelLoad.apply(this, arguments)\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { Theme } from '../../types/shared'\r\nimport ChartEvent from '../chart-events/chart-event'\r\nimport { ChartEventBadgeType } from '../constants/common'\r\nimport { chartEventsAsyncModule } from '../controllers/chart-events/async-modules'\r\nimport ElementModel from '../models/element'\r\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils/chart-events-utils'\r\nimport { captureException } from '../utils/helpers'\r\nimport { CHART_EVENT_BADGE_SIZE } from './constants'\r\nimport Pane from './pane'\r\n\r\nconst badgeImages = {} as ObjectHash<{ image: HTMLImageElement; isLoaded?: boolean }, string>\r\n\r\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\r\n\r\nfunction getSvgImageCacheKey(props: Pick) {\r\n return `${props.badgeType}-${props.theme}-${props.state}`\r\n}\r\n\r\nasync function fetchAndCacheChartEventBadges({ onBadgeInitLoad }: { onBadgeInitLoad: () => void }) {\r\n // Currently node charts don't render badges and if the code below is executed on server it will crash because of missing file which is not transpiled\r\n if (typeof window === 'undefined') {\r\n return\r\n }\r\n\r\n // Temp workaround to prevent node charts from crashing\r\n const { importWithRetry } = await import('@finviz/website')\r\n const { chartBadgeSvgByType } = await importWithRetry(chartEventsAsyncModule.importFn)\r\n\r\n const handleImageResolve = () => {\r\n const hasSomeUnresolvedImages = Object.values(badgeImages).some(({ isLoaded }) => isLoaded === undefined)\r\n if (!hasSomeUnresolvedImages) {\r\n onBadgeInitLoad()\r\n }\r\n }\r\n\r\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\r\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\r\n Object.values(Theme).forEach((theme) => {\r\n const cacheKey = getSvgImageCacheKey({\r\n badgeType,\r\n state: badgeState,\r\n theme,\r\n })\r\n const svgHTML = chartBadgeSvgByType[badgeType]({\r\n state: badgeState,\r\n theme,\r\n width: CHART_EVENT_BADGE_SIZE,\r\n })\r\n const img = new Image()\r\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\r\n img.onload = () => {\r\n badgeImages[cacheKey].isLoaded = true\r\n handleImageResolve()\r\n }\r\n img.onerror = () => {\r\n badgeImages[cacheKey].isLoaded = false\r\n handleImageResolve()\r\n captureException(new Error(`Image with cache key ${cacheKey} is invalid`), { extra: { src: img.src } })\r\n }\r\n badgeImages[cacheKey] = {\r\n image: img,\r\n }\r\n })\r\n })\r\n })\r\n}\r\n\r\nclass ChartEventElement extends ElementModel {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: ChartEvent\r\n yIndex = 0\r\n\r\n getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\r\n const cacheKey = getSvgImageCacheKey(props)\r\n const badgeImage = badgeImages[cacheKey]\r\n if (badgeImage) {\r\n // Possible fix for https://finvizcom.sentry.io/issues/4737062163\r\n if (badgeImage.isLoaded && badgeImage.image.width > 0 && badgeImage.image.height > 0) {\r\n return badgeImage.image\r\n }\r\n return undefined\r\n }\r\n\r\n void fetchAndCacheChartEventBadges({\r\n onBadgeInitLoad: () => this.trigger('change', this),\r\n })\r\n }\r\n\r\n getChartEventData() {\r\n return this.instance.model\r\n .chart()\r\n .quote()\r\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...super.toObject(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...super.toConfig(),\r\n yIndex: this.yIndex,\r\n }\r\n }\r\n}\r\n\r\nexport default ChartEventElement\r\n","import Spine from '@finviz/spine'\r\n\r\nimport Chart from './chart'\r\n\r\nclass Indicator extends Spine.Model {\r\n static initClass(chartModel: typeof Chart) {\r\n this.configure('Indicator', 'instance')\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare chart: () => Chart\r\n\r\n // instance - todo - not sure what instance type to put here\r\n}\r\n\r\nexport default Indicator\r\n","import Spine from '@finviz/spine'\r\n\r\nimport Chart from './chart'\r\n\r\nclass Overlay extends Spine.Model {\r\n static initClass(chartModel: typeof Chart) {\r\n this.configure('Overlay', 'overlay')\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare overlay: any\r\n declare chart: () => Chart\r\n}\r\n\r\nexport default Overlay\r\n","/**\r\n * This file sets up the relationships between models and solves circular dependencies\r\n * This file needs to be imported in the index file so that the relationships are\r\n * called in time for instantiation.\r\n */\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport ChartLayout from './chart_layout'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Element from './element'\r\nimport Indicator from './indicator'\r\nimport Overlay from './overlay'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\n\r\nChart.initClass(Pane, Quote, ChartLayout)\r\nChartLayout.initClass(Chart, DrawingsInternalStore)\r\nDrawingsInternalStore.initClass()\r\nElement.initClass(Pane)\r\nChartEventElement.initClass(Pane)\r\nIndicator.initClass(Chart)\r\nOverlay.initClass(Chart)\r\nPane.initClass(Element, ChartEventElement, Chart)\r\n","import './lib/shims'\r\nimport { initialize } from './logger'\r\nimport './models/relationships'\r\n\r\nif (document.location.hostname === 'localhost') {\r\n initialize()\r\n}\r\n","import { Button } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport Utils, { getExitFullscreen, getFullscreenStatus, getRequestFullscreen } from '../../utils'\r\n\r\nconst isIPad = Utils.isIPad()\r\nconst IPAD_FULLSCREEN_CLASS = 'is-ipad-fullscreen'\r\n\r\nexport function FullscreenButton() {\r\n const [isFullscreen, setIsFullscreen] = React.useState(getFullscreenStatus())\r\n const requestFullscreen = getRequestFullscreen(document.documentElement)\r\n const exitFullscreen = getExitFullscreen()\r\n\r\n const onClick = React.useRef(() => {\r\n if (getFullscreenStatus()) {\r\n exitFullscreen.call(document)\r\n } else {\r\n requestFullscreen.call(document.documentElement)\r\n }\r\n })\r\n\r\n React.useEffect(() => {\r\n const checkFullscreen = () => {\r\n if (isIPad) {\r\n if (getFullscreenStatus()) {\r\n document.body.classList.add(IPAD_FULLSCREEN_CLASS)\r\n } else {\r\n document.body.classList.remove(IPAD_FULLSCREEN_CLASS)\r\n }\r\n }\r\n setIsFullscreen(getFullscreenStatus())\r\n }\r\n\r\n document.addEventListener('webkitfullscreenchange', checkFullscreen)\r\n document.addEventListener('fullscreenchange', checkFullscreen)\r\n return () => {\r\n document.removeEventListener('webkitfullscreenchange', checkFullscreen)\r\n document.removeEventListener('fullscreenchange', checkFullscreen)\r\n }\r\n }, [])\r\n\r\n if (!requestFullscreen) return null\r\n\r\n return (\r\n \r\n {isFullscreen ? 'Exit Full screen' : 'Full screen'}\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n Dropdown,\r\n DropdownItem,\r\n DropdownSeparator,\r\n Icon,\r\n IconNameType,\r\n Paragraph,\r\n useDropdownState,\r\n} from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { LAYOUTS } from '../../constants/common'\r\nimport { sortObjects } from '../../helpers/sorter'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncableParts } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { decodeQueryString } from '../../utils/query_string'\r\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\r\n\r\nconst SORTED_LAYOUT_KEYS = sortObjects(\r\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\r\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\r\n).map(({ key }) => key)\r\n\r\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const parsedQuery = decodeQueryString(location.search)\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\r\n const state = useDropdownState({ placement: 'bottom', orientation: 'horizontal' })\r\n\r\n return (\r\n \r\n Layout\r\n \r\n }\r\n >\r\n
\r\n
\r\n {SORTED_LAYOUT_KEYS.map((layout) => (\r\n {\r\n navigate(getChartsToPath({ layout }))\r\n }}\r\n >\r\n \r\n \r\n ))}\r\n
\r\n \r\n
\r\n
\r\n Sync:\r\n
\r\n {ChartSyncableParts.map(({ value, label }) => {\r\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\r\n return (\r\n {\r\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\r\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\r\n }}\r\n >\r\n {label}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n \r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { SORT_DIRECTION } from '../constants/common'\r\n\r\nexport function sortObjects(\r\n arr: ObjectHash[],\r\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\r\n) {\r\n return arr.sort((a, b) =>\r\n options.reduce((acc, option) => {\r\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\r\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\r\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\r\n }, 0)\r\n )\r\n}\r\n","import { Button, setCookieRequest } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { updateSettings } from '../../models/settings'\r\n\r\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\r\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\r\n const isDarkMode = model.theme === 'dark'\r\n\r\n const onClick = () => {\r\n const theme = isDarkMode ? 'light' : 'dark'\r\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\r\n chartLayoutModel.trigger('theme', chartLayoutModel)\r\n setCookieRequest('chartsTheme', theme).catch(() => {})\r\n\r\n if (isDarkMode) {\r\n document.documentElement.classList.remove('dark')\r\n } else {\r\n document.documentElement.classList.add('dark')\r\n }\r\n }\r\n\r\n if (!chartLayoutModel) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import { Button, Time, TimeBreakpoint } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { FullscreenButton } from './fullscreen_button'\r\nimport { IdeasDropdown } from './ideas_dropdown'\r\nimport { ChartLayoutDropdown } from './layout_dropdown'\r\nimport { Publish } from './publish'\r\nimport { ThemeToggleButton } from './theme_toggle_button'\r\nimport { TourButton } from './tour_button'\r\n\r\nconst BREAKPOINTS: TimeBreakpoint[] = [\r\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\r\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\r\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\r\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\r\n]\r\n\r\ninterface ChartLayoutHeaderProps {\r\n model: ChartLayout\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\r\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\r\n\r\n return (\r\n <>\r\n
\r\n \r\n Ideas\r\n \r\n
\r\n
\r\n \r\n Chart tour\r\n \r\n \r\n \r\n {hasPublish && (\r\n \r\n Share\r\n \r\n )}\r\n \r\n \r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport const ChartLayoutHeader = React.memo(\r\n ChartLayoutHeaderComponent,\r\n (prevProps, nextProps) =>\r\n prevProps.model === nextProps.model &&\r\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\r\n prevProps.hasPublish === nextProps.hasPublish\r\n)\r\n","import {\r\n ButtonSizeType,\r\n CustomDateRange,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n withSuspense,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { isRedesignEnabled } from '../../utils'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { 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\n\r\nexport const assets = { logo, logo_light }\r\n\r\n// Re-export Portal so we can use it when we can’t use `modal` components (see chart event popover)\r\nexport { Portal as AriakitPortal } from '@ariakit/react'\r\n","import 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}\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) => {\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) => {\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 React from 'react'\r\n\r\nimport { DropdownStateReturn } from '../components/dropdown'\r\nimport { PopoverStateReturn } from '../components/toolbar/popover/hooks'\r\nimport { useWindowSize } from './use-window-size'\r\n\r\ntype Props = {\r\n maxHeightLimit: number\r\n hasViewportHeightLimit: boolean\r\n offsets: [number, number]\r\n state: DropdownStateReturn | PopoverStateReturn\r\n}\r\n\r\nconst MAX_HEIGHT_PROPERTY = '--popover-max-height'\r\nconst POPOVER_HEIGHT_LIMIT_STYLE = {\r\n maxHeight: `calc(var(${MAX_HEIGHT_PROPERTY}) - env(safe-area-inset-bottom))`,\r\n}\r\n\r\n/**\r\n * Limit popover height to be always in viewport is `hasViewportHeightLimit` is true\r\n */\r\nexport function usePopoverMaxHeight({ maxHeightLimit, hasViewportHeightLimit, offsets, state }: Props) {\r\n const { innerHeight } = useWindowSize({ isWatching: state.visible || state.animating })\r\n const buttonElement = state.unstable_referenceRef.current\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !hasViewportHeightLimit) return\r\n\r\n // calculate height\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const [, offsetY] = offsets\r\n let elementMaxHeight = 'auto'\r\n if (state.placement.startsWith('bottom')) {\r\n let height = innerHeight - buttonRect.bottom - offsetY * 2\r\n // when used on pages where is scrollable content, buttonRect.bottom is sometimes negative\r\n // in that case we need to subtract window.scrollY\r\n if (buttonRect.bottom < 0) height -= window.scrollY\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n } else {\r\n const height = buttonRect.top - offsetY * 2\r\n elementMaxHeight = `${Math.min(height, maxHeightLimit)}px`\r\n }\r\n\r\n // set height\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n popoverWrapper?.style.setProperty(MAX_HEIGHT_PROPERTY, elementMaxHeight)\r\n }, [buttonElement, innerHeight, maxHeightLimit, hasViewportHeightLimit, offsets, state.placement, state.visible])\r\n\r\n return hasViewportHeightLimit ? POPOVER_HEIGHT_LIMIT_STYLE : undefined\r\n}\r\n","import * as React from 'react'\r\nimport { usePopper } from 'react-popper'\r\n\r\nimport { usePopoverMaxHeight } from '../../hooks/use-popover-maxHeight'\r\nimport { Button } from '../button'\r\nimport { getExtendedDialogState } from '../dialog'\r\nimport { Dropdown, DropdownItem, DropdownSeparator, useDropdownState } from '../dropdown'\r\nimport { ObjectHash } from '../types'\r\n\r\nconst DEFAULT_OFFSETS: [number, number] = [5, 5]\r\n\r\nfunction getVirtualRef(top: number, left: number) {\r\n return {\r\n getBoundingClientRect(): DOMRect {\r\n const rect = {\r\n top: top - window.scrollY,\r\n x: top - window.scrollY,\r\n left: left - window.scrollX,\r\n y: left - window.scrollX,\r\n bottom: top,\r\n right: left,\r\n width: 0,\r\n height: 0,\r\n }\r\n\r\n return {\r\n ...rect,\r\n toJSON: () => rect,\r\n }\r\n },\r\n }\r\n}\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 ContextMenuProps {\r\n /**\r\n * Top coordinate of the click\r\n */\r\n top: number\r\n\r\n /**\r\n * Left coordinate of the click\r\n */\r\n left: number\r\n\r\n /**\r\n * Can limit the max height of the menu\r\n *\r\n * @default undefined\r\n */\r\n menuMaxHeight?: number\r\n\r\n /**\r\n * Items visible in the menu\r\n */\r\n items: ContextMenuItem[]\r\n\r\n /**\r\n * Callback to hide the menu\r\n */\r\n hide: () => void\r\n}\r\n\r\nexport function ContextMenu({ top, left, menuMaxHeight, hide, items }: ContextMenuProps) {\r\n const [popperElement, setPopperElement] = React.useState(null)\r\n const virtualRef = React.useMemo(() => getVirtualRef(top, left), [left, top])\r\n const dropdownState = useDropdownState({ placement: 'bottom-start' })\r\n const { isFullyClosed } = getExtendedDialogState(dropdownState)\r\n const hasBeenOpen = React.useRef(false)\r\n\r\n const { styles, attributes } = usePopper(virtualRef, popperElement, {\r\n placement: 'auto-end',\r\n modifiers: [\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: DEFAULT_OFFSETS,\r\n },\r\n },\r\n ],\r\n })\r\n\r\n /**\r\n * This effect handles closing the context menu (parent element) itself\r\n */\r\n React.useEffect(() => {\r\n if (isFullyClosed && hasBeenOpen.current) hide()\r\n }, [isFullyClosed, hide])\r\n\r\n /**\r\n * This effect handles opening/closing the inner dropdown\r\n */\r\n React.useEffect(() => {\r\n dropdownState.show()\r\n hasBeenOpen.current = true // This acts as a way to differentiate the first render\r\n\r\n return () => dropdownState.hide()\r\n // This needs to run only on mount/unmount for obvious reasons\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n return (\r\n \r\n }\r\n menuMaxHeight={menuMaxHeight}\r\n state={dropdownState}\r\n items={items}\r\n isStatic\r\n />\r\n \r\n )\r\n}\r\n\r\ninterface ContextMenuInnerProps {\r\n label: JSX.Element\r\n items: ContextMenuItem[]\r\n state: ReturnType\r\n isStatic?: boolean\r\n menuMaxHeight?: number\r\n}\r\n\r\nfunction ContextMenuInner(\r\n { label, items, state, isStatic, menuMaxHeight = Number.MAX_SAFE_INTEGER }: ContextMenuInnerProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const innerState = useDropdownState({ placement: 'right-start' })\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: menuMaxHeight,\r\n hasViewportHeightLimit: true,\r\n offsets: DEFAULT_OFFSETS,\r\n state,\r\n })\r\n\r\n return (\r\n \r\n {items.map((item, index) => {\r\n if (item.type === 'divider') {\r\n return {item.label}\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 items={item.options}\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 className=\"shrink-0\"\r\n >\r\n {item.label}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n\r\nconst ContextMenuDropdown = 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\nconst DEFAULT_VALUE_KEY = 'value'\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 * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { SelectItem } from '../select'\r\nimport { PopoverStateReturn } from '../toolbar/popover/hooks'\r\n\r\nexport const ListContext = React.createContext(null)\r\n\r\nexport function useListState(options?: Reakit.CompositeInitialState) {\r\n return Reakit.useCompositeState({ ...options, loop: true, unstable_virtual: true })\r\n}\r\n\r\nfunction getSelectedItemIndex(items: SelectItem[], value: unknown) {\r\n if (!value && value !== 0) return -1\r\n\r\n return items.findIndex((item) => item.value === value)\r\n}\r\n\r\n/**\r\n * Hook which handles select state and returns onChange handler\r\n */\r\nexport function useList>(\r\n state: PopoverStateReturn,\r\n defaultValue: ValueType | undefined,\r\n items: ItemType[],\r\n onChange: (item: ItemType) => void\r\n) {\r\n const [selectedIndex, setSelectedIndex] = React.useState(getSelectedItemIndex(items, defaultValue))\r\n const closePopover = React.useRef(() => state.hide())\r\n\r\n // Update select value on change from outside\r\n React.useEffect(() => {\r\n const newIndex = getSelectedItemIndex(items, defaultValue)\r\n setSelectedIndex(newIndex)\r\n }, [items, selectedIndex, defaultValue])\r\n\r\n const onItemChange = React.useCallback(\r\n (index: number, closeOnSelect = true) => {\r\n const selectedItem = items[index]\r\n setSelectedIndex(index)\r\n\r\n if (closeOnSelect) closePopover.current()\r\n onChange(selectedItem)\r\n },\r\n [items, onChange, setSelectedIndex]\r\n )\r\n\r\n return { selectedIndex, onItemChange }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { BUTTON_DEFAULT_ELEMENT, Button, ButtonComponentProps, ButtonTheme } from '../button'\r\nimport { ListContext } from './hooks'\r\n\r\nexport interface ListItemProps {\r\n /**\r\n * Theme when the button is selected\r\n */\r\n activeTheme?: keyof typeof ButtonTheme\r\n\r\n /**\r\n * Close parent popover when the item is clicked\r\n */\r\n closeOnSelect?: boolean\r\n\r\n /**\r\n * OnChange callback when item is clicked or navigated to\r\n * @private\r\n */\r\n onSelectItem?: (item: string, closeOnSelect?: boolean) => void\r\n}\r\n\r\nexport function ListItem({\r\n as,\r\n activeTheme = 'blue',\r\n onSelectItem,\r\n onClick,\r\n onKeyPress,\r\n className,\r\n closeOnSelect = true,\r\n children,\r\n ...props\r\n}: React.PropsWithChildren & ButtonComponentProps) {\r\n const state = React.useContext(ListContext)\r\n\r\n return (\r\n {\r\n onClick?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n onKeyPress={(ev) => {\r\n onKeyPress?.(ev)\r\n onSelectItem?.(ev.currentTarget.id, closeOnSelect)\r\n }}\r\n >\r\n {(itemProps: ButtonComponentProps) => {\r\n const active = Boolean(itemProps['aria-selected'])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n }}\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Composite'\r\n\r\nimport { ListContext } from './hooks'\r\nimport { ListItem } from './list-item'\r\n\r\nexport enum ListDirection {\r\n row,\r\n column,\r\n}\r\n\r\nexport interface ListProps extends Omit {\r\n /**\r\n * The returned object from `useListState`\r\n */\r\n state: Reakit.CompositeStateReturn\r\n\r\n /**\r\n * The selected option\r\n */\r\n selectedIndex?: number\r\n\r\n /**\r\n * Callback when selected option index changes\r\n */\r\n onChange?: (selectedIndex: number, closeParent?: boolean) => void\r\n\r\n /**\r\n * Direction to render items\r\n * @default col\r\n */\r\n direction?: keyof typeof ListDirection\r\n\r\n /**\r\n * Whether or not default styles should be included for the list\r\n * @default true\r\n */\r\n includeBaseStyles?: boolean\r\n}\r\n\r\nexport function List({\r\n state,\r\n selectedIndex,\r\n direction = 'column',\r\n includeBaseStyles = true,\r\n onChange,\r\n children,\r\n ...props\r\n}: ListProps) {\r\n const prevSelected = React.useRef(null)\r\n\r\n // Select option when `selectedIndex` changes\r\n React.useEffect(() => {\r\n if (\r\n selectedIndex !== undefined &&\r\n selectedIndex >= 0 &&\r\n prevSelected.current !== selectedIndex &&\r\n state.items.length > selectedIndex\r\n ) {\r\n state.move(state.items[selectedIndex].id)\r\n prevSelected.current = selectedIndex\r\n }\r\n }, [selectedIndex, state, state.items.length])\r\n\r\n const onSelectItem = React.useCallback(\r\n (id: string, closeParent: boolean) => {\r\n onChange?.(\r\n state.items.findIndex((item) => item.id === id),\r\n closeParent\r\n )\r\n },\r\n [onChange, state.items]\r\n )\r\n\r\n return (\r\n \r\n \r\n {React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) return child\r\n\r\n if (child.type === ListItem) {\r\n return React.cloneElement(child, { ...child.props, onSelectItem: onSelectItem })\r\n }\r\n\r\n return child\r\n })}\r\n \r\n \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 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 { 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 p-1.5 bg-white dark:bg-gray-800', {\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 'relative z-10 rounded-md border border-gray-100 dark:border-gray-600': isMobile,\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 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 // reason for key is that popover is sealing initial state, description in\r\n // https://github.com/finvizhq/Finviz-Website/pull/402\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n","import 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 theme,\r\n isActive,\r\n isStretched,\r\n isInAction,\r\n}: {\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 {\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 '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 item: IToolbarItem\r\n disabledTooltip?: string\r\n isInAction?: boolean\r\n isLoading?: boolean\r\n}\r\n\r\nexport function ToolbarButton({\r\n item,\r\n disabledTooltip,\r\n isInAction: isInActionProp,\r\n isLoading,\r\n ...props\r\n}: PropsWithAs & ToolbarButtonProps) {\r\n const { theme, isStretched } = useToolbarContext()\r\n const isInAction = isInActionProp && item.iconAction !== undefined\r\n const buttonSettings = getButtonThemeSettings({\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 & ToolbarButtonProps)}\r\n appearance={props.appearance ?? 'square'}\r\n title={props.disabled && disabledTooltip ? disabledTooltip : (props.active && item.titleActive) || item.title}\r\n size={\r\n buttonSettings.size ??\r\n (theme === ToolbarTheme.chipTransparent || FinvizSettings.hasRedesignEnabled ? 'medium' : 'large')\r\n }\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","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { COMPONENT_ANIMATION_DURATION } from '../../constants'\r\n\r\nexport type PopoverStateReturn = ReturnType\r\n\r\nconst DEFAULT_OFFSET: [number, number] = [0, 5]\r\nconst HOVER_TIMEOUT = 150\r\n\r\nconst preventDefault = (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n}\r\n\r\n/**\r\n * Hook which provides state to dialogs\r\n */\r\nexport function usePopoverState(settings?: Reakit.PopoverInitialState) {\r\n const offsets = (settings?.unstable_offset ?? DEFAULT_OFFSET) as [number, number]\r\n const popover = Reakit.usePopoverState({\r\n ...settings,\r\n placement: settings?.placement ?? 'bottom-start',\r\n unstable_offset: offsets,\r\n animated: COMPONENT_ANIMATION_DURATION,\r\n modal: false,\r\n })\r\n\r\n return { ...popover, offsets }\r\n}\r\n\r\nexport function useHoverPopover(settings?: Reakit.PopoverInitialState) {\r\n const popover = usePopoverState(settings)\r\n const showTimeout = React.useRef(null)\r\n const hideTimeout = React.useRef(null)\r\n\r\n const clearTimeouts = React.useRef(() => {\r\n if (showTimeout.current !== null) {\r\n window.clearTimeout(showTimeout.current)\r\n }\r\n if (hideTimeout.current !== null) {\r\n window.clearTimeout(hideTimeout.current)\r\n }\r\n })\r\n\r\n const showPopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n showTimeout.current = window.setTimeout(() => {\r\n popover.show()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n const hidePopover = React.useRef(() => {\r\n clearTimeouts.current()\r\n hideTimeout.current = window.setTimeout(() => {\r\n popover.hide()\r\n }, HOVER_TIMEOUT)\r\n })\r\n\r\n // Unmount cleanup\r\n React.useEffect(() => () => clearTimeouts.current(), [])\r\n\r\n return {\r\n ...popover,\r\n show: showPopover.current,\r\n hide: hidePopover.current,\r\n onMouseOver: showPopover.current,\r\n onMouseOut: hidePopover.current,\r\n onMouseDown: preventDefault,\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\nimport { Portal } from 'reakit/Portal'\r\n\r\nimport { usePopoverMaxHeight } from '../../../hooks/use-popover-maxHeight'\r\nimport { useWindowSize } from '../../../hooks/use-window-size'\r\nimport { Box, BoxProps } from '../../box'\r\nimport { getExtendedDialogState, useZIndex } from '../../dialog'\r\nimport { PopoverStateReturn } from './hooks'\r\n\r\nexport interface PopoverProps extends BoxProps, Pick {\r\n /**\r\n * The returned object from `usePopoverState`\r\n */\r\n state: PopoverStateReturn\r\n\r\n /**\r\n * Focus the popover when it opens\r\n *\r\n * @default true\r\n */\r\n focusOnShow?: Reakit.PopoverProps['unstable_autoFocusOnShow']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default true\r\n */\r\n focusOnHide?: Reakit.PopoverProps['unstable_autoFocusOnHide']\r\n\r\n /**\r\n * Focus the anchor element when it closes\r\n *\r\n * @default undefined\r\n */\r\n finalFocusRef?: Reakit.PopoverProps['unstable_finalFocusRef']\r\n\r\n /**\r\n * Hides when clicked outside of popover, works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside?: Reakit.PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Overlay click callback or if false is provided, overlay click calls hide func on popover state object\r\n *\r\n * @default undefined\r\n */\r\n onOverlayClick?: (() => void) | false\r\n\r\n /**\r\n * Popover wrapper css style object\r\n *\r\n * @default undefined\r\n */\r\n popoverWrapperStyle?: React.CSSProperties\r\n\r\n /**\r\n * Show popover arrow\r\n *\r\n * @default false\r\n */\r\n hasArrow?: boolean\r\n\r\n /**\r\n * Enable or disable backdrop click events\r\n *\r\n * @default true\r\n */\r\n hasBackdrop?: boolean\r\n\r\n /**\r\n * Set the popover to height to be limited by the viewport instead of having full height\r\n *\r\n * @default false\r\n */\r\n hasViewportHeightLimit?: boolean\r\n\r\n /**\r\n * Set the popover max-width to be limited by the trigger button\r\n */\r\n hasButtonWidthLimit?: boolean\r\n\r\n /**\r\n * Can be used together with `hasViewportHeightLimit` to limit the height of the popover\r\n *\r\n * @default undefined\r\n */\r\n popoverMaxHeight?: number\r\n}\r\n\r\nexport function Popover({\r\n state,\r\n children,\r\n focusOnShow = true,\r\n focusOnHide = true,\r\n finalFocusRef,\r\n 'aria-label': ariaLabel,\r\n hide,\r\n hideOnClickOutside = true,\r\n hasBackdrop = true,\r\n onOverlayClick,\r\n popoverWrapperStyle,\r\n popoverMaxHeight = Number.MAX_SAFE_INTEGER,\r\n theme = 'light',\r\n hasViewportHeightLimit = false,\r\n hasButtonWidthLimit = false,\r\n ...props\r\n}: PopoverProps) {\r\n const zIndex = useZIndex()\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const { innerHeight } = useWindowSize({ isWatching: !isFullyClosed })\r\n\r\n const buttonElement = state.unstable_referenceRef.current\r\n const maxHeightStyle = usePopoverMaxHeight({\r\n maxHeightLimit: popoverMaxHeight,\r\n hasViewportHeightLimit,\r\n offsets: state.offsets,\r\n state,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!buttonElement || !state.visible || !(hasViewportHeightLimit || hasButtonWidthLimit)) return\r\n\r\n const buttonRect = buttonElement.getBoundingClientRect()\r\n const popoverId = buttonElement.getAttribute('aria-controls')\r\n const popoverWrapper = popoverId ? document.getElementById(popoverId) : null\r\n\r\n // Limit popover max-width to be width of the trigger button\r\n if (hasButtonWidthLimit) {\r\n popoverWrapper?.style.setProperty('max-width', `${buttonRect.width}px`)\r\n }\r\n }, [\r\n state.visible,\r\n state.offsets,\r\n buttonElement,\r\n hasViewportHeightLimit,\r\n hasButtonWidthLimit,\r\n innerHeight,\r\n state.placement,\r\n popoverMaxHeight,\r\n ])\r\n\r\n if (isFullyClosed) return null\r\n\r\n return (\r\n \r\n \r\n {({ onTransitionEnd, onAnimationEnd, ...innerProps }) => (\r\n <>\r\n {\r\n // prevents from page scroll when clicked outside of popover\r\n event.preventDefault()\r\n }}\r\n />\r\n \r\n \r\n {children}\r\n \r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport * as Reakit from 'reakit/Popover'\r\n\r\nimport { useZIndex } from '../../dialog'\r\n\r\ninterface PopoverButtonProps extends Reakit.PopoverDisclosureHTMLProps {\r\n state: Reakit.PopoverStateReturn\r\n as?: React.ElementType\r\n}\r\n/**\r\n * The trigger button component which handles ref & focus return, etc.\r\n */\r\nexport const PopoverTrigger = React.forwardRef(\r\n ({ state, ...props }: PopoverButtonProps, ref: React.ForwardedRef) => {\r\n const zIndex = useZIndex()\r\n\r\n return (\r\n \r\n {props.children}\r\n \r\n )\r\n }\r\n)\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { isMobile } from '../../../app/shared/isMobile'\r\nimport { Icon } from '../icon'\r\nimport { List, ListItem, useListState } from '../list'\r\nimport { useList } from '../list/hooks'\r\nimport { NativeSelect } from '../select/NativeSelect'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\r\nimport { useHoverPopover } from './popover/hooks'\r\nimport { Popover } from './popover/popover'\r\nimport { PopoverTrigger } from './popover/popover-trigger'\r\nimport { ToolbarButton } from './toolbar-button'\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\r\nexport function ToolbarGroup({\r\n defaultItem,\r\n isActive,\r\n isLoading,\r\n groupItems,\r\n groupTitle,\r\n onChange,\r\n useNativeSelect = isMobile(),\r\n disabled,\r\n disabledTooltip,\r\n}: ToolbarGroupProps) {\r\n const listState = useListState({ currentId: null })\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 const popoverState = useHoverPopover({\r\n placement: isAlternativeTheme && isStretched ? 'bottom' : 'right-start',\r\n })\r\n const select = useList(\r\n popoverState,\r\n selectedItem.id,\r\n groupItems?.map((i) => ({ value: i.id, label: i.title })) ?? [],\r\n (option) => {\r\n setSelectedItem(groupItems![groupItems!.findIndex((item) => item.id === option.value)])\r\n onChange(option.value, 'select')\r\n }\r\n )\r\n\r\n return (\r\n \r\n ) => {\r\n ev.preventDefault()\r\n ev.stopPropagation()\r\n onChange(selectedItem.id, 'group')\r\n }}\r\n >\r\n \r\n \r\n \r\n\r\n {useNativeSelect ? (\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 {groupItems.map((item) => (\r\n }\r\n data-testid={`toolbar-group-${groupId}-${item.id}`}\r\n >\r\n {item.title}\r\n \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}: 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, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipProps, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\ninterface TooltipSettingsProps extends Pick, Pick {\r\n content?: React.ReactNode\r\n color?: keyof typeof TooltipColor\r\n}\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Settings for Tooltip component and useTooltipStore\r\n */\r\n tooltipSettings?: TooltipSettingsProps\r\n}\r\n\r\nfunction TooltipInputWrapper({ children, tooltipSettings = {}, name }: TooltipInputWrapperProps) {\r\n const { content, color, gutter, placement = 'bottom' } = tooltipSettings\r\n const tooltip = useTooltipState({ placement })\r\n\r\n return (\r\n <>\r\n \r\n {React.cloneElement(children, {\r\n onFocus: (event: React.FocusEvent) => {\r\n children.props.onFocus?.(event)\r\n tooltip.show()\r\n },\r\n onBlur: (event: React.FocusEvent) => {\r\n children.props.onBlur?.(event)\r\n tooltip.hide()\r\n },\r\n })}\r\n \r\n {content && (\r\n \r\n {content}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n { tooltipSettings, isInteractive = true, ...props }: TooltipInputProps & Omit,\r\n ref: React.ForwardedRef\r\n) {\r\n const input = \r\n\r\n if (!isInteractive) {\r\n return input\r\n }\r\n\r\n return (\r\n \r\n {input}\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 throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\ninterface Props {\r\n throttleWaitInMs?: number\r\n isWatching?: boolean\r\n}\r\n\r\nexport function useWindowSize({ throttleWaitInMs = 300, isWatching = true }: Props = {}) {\r\n const [size, setSize] = React.useState({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n\r\n React.useEffect(() => {\r\n if (!isWatching) return\r\n\r\n const handleResize = throttle(() => {\r\n setSize({\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n }, throttleWaitInMs)\r\n\r\n window.addEventListener('resize', handleResize)\r\n\r\n return () => {\r\n handleResize.cancel()\r\n window.removeEventListener('resize', handleResize)\r\n }\r\n }, [throttleWaitInMs, isWatching])\r\n\r\n return size\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Notification, useNotification } from '../components/notification'\r\nimport { Paragraph } from '../components/typography'\r\nimport { useIsMounted } from '../hooks/use-is-mounted'\r\nimport { importWithRetry } from './import-with-retry'\r\n\r\nconst cache: any = {}\r\nconst errorsCache: any = {}\r\n\r\nenum ErrorSeverity {\r\n medium,\r\n high,\r\n}\r\n\r\nfunction defaultCaptureException(exception: Error, captureContext?: { extra: Record }) {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.error(exception)\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport interface ControlledModuleConfig {\r\n /**\r\n * Suspense mode shouldn’t be used together with controlled loading as it could lead to bugs.\r\n * If you know what you’re doing, add an ignore comment explaining the decision\r\n */\r\n isSuspenseMode?: never\r\n shouldLoadModule?: boolean\r\n}\r\nexport interface SuspenseModuleConfig {\r\n /**\r\n * Controlled loading shouldn’t be used together with suspense mode as it could lead to bugs.\r\n * If you know what you’re doing, add an ignore comment explaining the decision\r\n */\r\n shouldLoadModule?: never\r\n isSuspenseMode?: SuspenseMode\r\n}\r\n\r\n/**\r\n * Hook used to asynchronously load a module\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\r\n */\r\nexport function useAsyncModule({\r\n importFn,\r\n onError,\r\n errorSeverity,\r\n cacheKey,\r\n captureException = defaultCaptureException,\r\n shouldLoadModule = false,\r\n isSuspenseMode = false as SuspenseMode,\r\n}: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n errorSeverity?: keyof typeof ErrorSeverity\r\n captureException?: typeof defaultCaptureException\r\n} & (ControlledModuleConfig | SuspenseModuleConfig)) {\r\n const notificationContext = useNotification()\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const [isError, setIsError] = React.useState(false)\r\n const getIsMounted = useIsMounted()\r\n\r\n const handleError = () => {\r\n onError?.()\r\n setIsError(true)\r\n\r\n if (errorSeverity === undefined) {\r\n return\r\n }\r\n\r\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.high) {\r\n window.handleScriptNotLoaded()\r\n window.renderScriptNotLoaded()\r\n }\r\n\r\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.medium) {\r\n notificationContext.show(\r\n \r\n \r\n One or more of the required application components couldn’t be loaded.
Please try to repeat the\r\n action or{' '}\r\n window.location.reload()}>\r\n refresh the page\r\n {' '}\r\n if the problem persists.\r\n
\r\n
\r\n )\r\n }\r\n }\r\n\r\n const loadModule = async () => {\r\n if (cache[cacheKey]) {\r\n return cache[cacheKey]\r\n }\r\n\r\n setIsLoading(true)\r\n\r\n try {\r\n cache[cacheKey] = await importWithRetry(importFn)\r\n } catch (error) {\r\n captureException(error as Error)\r\n handleError()\r\n } finally {\r\n if (getIsMounted()) {\r\n setIsLoading(false)\r\n }\r\n }\r\n\r\n return cache[cacheKey]\r\n }\r\n\r\n React.useEffect(() => {\r\n if (shouldLoadModule) {\r\n loadModule()\r\n }\r\n // We want to run it only on shouldLoadModule change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [shouldLoadModule])\r\n\r\n const cachedModule = cache[cacheKey]\r\n if (isSuspenseMode) {\r\n if (errorsCache[cacheKey]) throw errorsCache[cacheKey]\r\n if (!cachedModule) {\r\n throw importFn()\r\n .then((mod) => (cache[cacheKey] = mod))\r\n .catch((err) => {\r\n handleError()\r\n errorsCache[cacheKey] = err\r\n })\r\n }\r\n }\r\n\r\n return [cachedModule ?? null, { isLoading, loadModule, isError }] as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n}\r\n\r\n/**\r\n * HOC which wraps component in React.Suspense\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\r\n */\r\nexport function withSuspense

>(\r\n Component: React.ComponentType

,\r\n fallback: React.ReactNode = null\r\n) {\r\n return function WrappedComponent(props: P) {\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n}\r\n","const NUM_OF_RETRIES = 3\r\n\r\nexport function importWithRetry(importFn: () => Promise, retries = 0) {\r\n const result = importFn().catch(async (err) => {\r\n if (retries > NUM_OF_RETRIES) {\r\n throw err\r\n }\r\n\r\n await new Promise((r) => setTimeout(r, 1000 * retries))\r\n\r\n return importWithRetry(importFn, retries + 1)\r\n }) as Promise\r\n\r\n return result\r\n}\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IArrowAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Arrow extends Element {\r\n static type = CanvasElementType.arrow\r\n\r\n declare scaled: Pick\r\n name = 'Arrow'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 3,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineCap', 'round')\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const angle = Math.PI / 8\r\n const d = 20\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\r\n const h = Math.abs(d / Math.cos(angle))\r\n\r\n const angle1 = lineAngle + angle\r\n const topx = roundedXY.x1 + Math.cos(angle1) * h\r\n const topy = roundedXY.y1 + Math.sin(angle1) * h\r\n const angle2 = lineAngle - angle\r\n const botx = roundedXY.x1 + Math.cos(angle2) * h\r\n const boty = roundedXY.y1 + Math.sin(angle2) * h\r\n\r\n context.beginPath()\r\n context.moveTo(topx, topy)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(botx, boty)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nArrow.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Arrow\r\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element, { EdgeValues } from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport type BrushPoints = Array<[x: number, y: number]>\r\n\r\nexport interface IBrushAttrs {\r\n points: BrushPoints\r\n fill: string\r\n border: DrawingBorder\r\n isPolyLineClosed: boolean\r\n positionPointsTimestamps: BrushPoints\r\n}\r\n\r\nclass Brush extends Element {\r\n static type = CanvasElementType.brushV1\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n\r\n name = 'Brush'\r\n\r\n brushPath: Path2D | null = null\r\n\r\n cachedFill = {\r\n previousFill: '',\r\n shouldRenderFill: false,\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this.setFillCache()\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultTransparentFill,\r\n border: {\r\n width: 3,\r\n color: ElementSettings.Colors.border,\r\n },\r\n isPolyLineClosed: false,\r\n } as Partial\r\n }\r\n\r\n setFillCache() {\r\n this.cachedFill.previousFill = this.attrs.fill\r\n if (this.attrs.fill.length === 9) {\r\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\r\n } else {\r\n this.cachedFill.shouldRenderFill = true\r\n }\r\n }\r\n\r\n getShouldRenderFill() {\r\n if (this.attrs.fill !== this.cachedFill.previousFill) {\r\n this.setFillCache()\r\n }\r\n return this.cachedFill.shouldRenderFill\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (this.attrs.border != null) {\r\n context.set('strokeStyle', this.attrs.border.color)\r\n }\r\n context.set('lineCap', 'round')\r\n context.set('lineJoin', 'round')\r\n\r\n const brushPath = new Path2D()\r\n const { points } = this.attrs\r\n context.beginPath()\r\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\r\n let i\r\n if (points.length > 3) {\r\n for (i = 0; i < points.length - 2; i++) {\r\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\r\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\r\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\r\n }\r\n brushPath.quadraticCurveTo(\r\n this.fx(points[i][0]),\r\n this.fy(points[i][1]),\r\n this.fx(points[i + 1][0]),\r\n this.fy(points[i + 1][1])\r\n )\r\n } else {\r\n for (const point of points) {\r\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\r\n }\r\n }\r\n\r\n if (this.attrs.isPolyLineClosed) {\r\n brushPath.closePath()\r\n }\r\n this.brushPath = brushPath\r\n if (this.attrs.fill && this.getShouldRenderFill()) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.fill(brushPath)\r\n }\r\n if (this.attrs?.border?.width) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.stroke(brushPath)\r\n }\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n const [firstX, firstY] = this.attrs.points[0]\r\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\r\n\r\n return [\r\n new Thumb(\r\n 'first',\r\n () => firstX,\r\n () => firstY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'last',\r\n () => lastX,\r\n () => lastY,\r\n this.moveByThumb,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n moveByThumb = ({ difX, difY }: RequireByKey) => {\r\n this.moveBy(difX, difY)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n if (this.getIsCreator()) return\r\n for (const point of this.attrs.points) {\r\n point[0] += x\r\n point[1] += y\r\n }\r\n }\r\n\r\n onMouseUp() {\r\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\r\n for (const point of this.attrs.points) {\r\n point[0] = this.roundToFixed(point[0], 2)\r\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\r\n }\r\n super.onMouseUp()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { points } = this.attrs\r\n if (\r\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\r\n this.brushPath &&\r\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\r\n ) {\r\n return true\r\n } else if (points.length > 1) {\r\n for (let i = 0; i < points.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(points[i][0]),\r\n y1: this.fy(points[i][1]),\r\n x2: this.fx(points[i + 1][0]),\r\n y2: this.fy(points[i + 1][1]),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionPointsTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\r\n this.set({ points } as Partial)\r\n }\r\n\r\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\r\n\r\n roundY = (y: number, domainDiff: number) => {\r\n if (domainDiff < 1) {\r\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\r\n if (numberOfLeadingZeros > 0) {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\r\n } else {\r\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\r\n }\r\n } else if (domainDiff < 10) {\r\n return this.roundToFixed(y, 3)\r\n }\r\n return this.roundToFixed(y, 2)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(([x, y]) => {\r\n edgeXYValues.minX = Math.min(x, edgeXYValues.minX ?? x)\r\n edgeXYValues.minY = Math.min(y, edgeXYValues.minY ?? y)\r\n edgeXYValues.maxX = Math.max(x, edgeXYValues.maxX ?? x)\r\n edgeXYValues.maxY = Math.max(y, edgeXYValues.maxY ?? y)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nBrush.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\r\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\r\n ],\r\n}\r\n\r\nexport default Brush\r\n","import math from '../../helpers/math'\r\n\r\ninterface ICoordinates {\r\n x: number\r\n y: number\r\n}\r\nexport interface IRectangleSidesCoordinates {\r\n topLeft: ICoordinates\r\n topRight: ICoordinates\r\n rightTop: ICoordinates\r\n rightBottom: ICoordinates\r\n bottomRight: ICoordinates\r\n bottomLeft: ICoordinates\r\n leftBottom: ICoordinates\r\n leftTop: ICoordinates\r\n}\r\n\r\nexport interface ITailCoordinates {\r\n tailRoot: ICoordinates\r\n tailTip: ICoordinates\r\n}\r\n\r\nexport enum TailDirection {\r\n noTail,\r\n topLeftCorner,\r\n topRightCorner,\r\n bottomLeftCorner,\r\n bottomRightCorner,\r\n topSide,\r\n rightSide,\r\n bottomSide,\r\n leftSide,\r\n}\r\n\r\nexport const getRectangleSidesCoordinates = ({\r\n padding,\r\n radius,\r\n x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n}: {\r\n padding: number\r\n radius: number\r\n x2: number\r\n y2: number\r\n textWidth: number\r\n measuredHeight: number\r\n}): IRectangleSidesCoordinates => ({\r\n topLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 - padding,\r\n },\r\n topRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 - padding,\r\n },\r\n rightTop: {\r\n x: x2 + textWidth + padding,\r\n y: y2 - padding + radius,\r\n },\r\n rightBottom: {\r\n x: x2 + textWidth + padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n bottomRight: {\r\n x: x2 + textWidth + padding - radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n bottomLeft: {\r\n x: x2 - padding + radius,\r\n y: y2 + padding + measuredHeight,\r\n },\r\n leftBottom: {\r\n x: x2 - padding,\r\n y: y2 + padding + measuredHeight - radius,\r\n },\r\n leftTop: {\r\n x: x2 - padding,\r\n y: y2 - padding + radius,\r\n },\r\n})\r\n\r\nexport const getTailCoordinates = ({\r\n rectangleSides,\r\n x1,\r\n y1,\r\n}: {\r\n rectangleSides: IRectangleSidesCoordinates\r\n x1: number\r\n y1: number\r\n}): ITailCoordinates => ({\r\n tailRoot: {\r\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\r\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\r\n },\r\n tailTip: {\r\n x: x1,\r\n y: y1,\r\n },\r\n})\r\n\r\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\r\n const dist = math.distance(p1, p2)\r\n if (dist < halfWidth * 2) {\r\n return dist / 2\r\n } else {\r\n return halfWidth\r\n }\r\n}\r\n\r\nexport const getTailToSideIntersection = ({\r\n tail,\r\n rectangleSides,\r\n}: {\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n}): TailDirection => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\r\n return TailDirection.topLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\r\n return TailDirection.topRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\r\n return TailDirection.bottomLeftCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\r\n return TailDirection.bottomRightCorner\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\r\n return TailDirection.topSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\r\n return TailDirection.rightSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\r\n return TailDirection.bottomSide\r\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\r\n return TailDirection.leftSide\r\n } else {\r\n return TailDirection.noTail\r\n }\r\n}\r\n\r\ninterface IRenderCallout {\r\n context: any\r\n radius: number\r\n requiredTailHalfWidth: number\r\n tail: ITailCoordinates\r\n rectangleSides: IRectangleSidesCoordinates\r\n tailDirection: TailDirection\r\n}\r\n\r\nexport const renderCallout = ({\r\n context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n}: IRenderCallout): void => {\r\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\r\n const { tailTip, tailRoot } = tail\r\n\r\n // draw rounded rectangle from top left corner clockwise\r\n // !!! ORDER OF RENDER MATTERS !!!\r\n\r\n // renderTopLeftCorner\r\n if (tailDirection === TailDirection.topLeftCorner) {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x, topLeft.y)\r\n } else {\r\n context.moveTo(leftTop.x, leftTop.y)\r\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\r\n }\r\n\r\n // renderTopLine\r\n if (tailDirection === TailDirection.topSide) {\r\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\r\n if (!tailLineToTopLineIntersection) {\r\n context.lineTo(topRight.x, topRight.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\r\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\r\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n } else {\r\n context.lineTo(topRight.x, topRight.y)\r\n }\r\n\r\n // renderTopRightCorner\r\n if (tailDirection === TailDirection.topRightCorner) {\r\n context.lineTo(topRight.x, topRight.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y)\r\n } else {\r\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\r\n }\r\n\r\n // renderRightLine\r\n if (tailDirection === TailDirection.rightSide) {\r\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\r\n if (!tailLineToRightLineIntersection) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\r\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\r\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\r\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n } else {\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n } else {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n }\r\n\r\n // renderBottomRightCorner\r\n if (tailDirection === TailDirection.bottomRightCorner) {\r\n context.lineTo(rightBottom.x, rightBottom.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x, bottomRight.y)\r\n } else {\r\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\r\n }\r\n\r\n // renderBottomLine\r\n if (tailDirection === TailDirection.bottomSide) {\r\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\r\n tailTip,\r\n tailRoot,\r\n bottomLeft,\r\n bottomRight\r\n )\r\n if (!tailLineToBottomLineIntersection) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\r\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\r\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\r\n } else {\r\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n } else {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n }\r\n\r\n // renderBottomLeftCorner\r\n if (tailDirection === TailDirection.bottomLeftCorner) {\r\n context.lineTo(bottomLeft.x, bottomLeft.y)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y)\r\n } else {\r\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\r\n }\r\n\r\n // renderLeftLine\r\n if (tailDirection === TailDirection.leftSide) {\r\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\r\n if (!tailLineToLeftLineIntersection) {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n return\r\n }\r\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\r\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\r\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\r\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n } else {\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\r\n context.lineTo(tailTip.x, tailTip.y)\r\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n } else {\r\n context.lineTo(leftTop.x, leftTop.y)\r\n }\r\n}\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\r\nimport { PADDING } from '../../constants/common'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\nimport {\r\n getRectangleSidesCoordinates,\r\n getTailCoordinates,\r\n getTailToSideIntersection,\r\n renderCallout,\r\n} from './callout_utils'\r\n\r\nexport interface ICalloutAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\r\n\r\nclass Callout extends Text {\r\n static type = CanvasElementType.calloutV1\r\n\r\n name = 'Callout'\r\n\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare isActualBoundingBoxAvailable: boolean\r\n declare lastAttrs: Attrs\r\n declare scaled: Pick\r\n declare measuredHeight: number\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tail',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n },\r\n ],\r\n }\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n text: '',\r\n font: {\r\n size: 15,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n fillStyle: ElementSettings.Colors.textWithoutBackground,\r\n lineHeight: 15,\r\n // left | right | center | start | end\r\n textAlign: 'left',\r\n // top | middle | alphabetic | bottom\r\n textBaseline: 'alphabetic',\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n background: ElementSettings.defaultFill,\r\n border: { color: ElementSettings.Colors.line, width: 1 },\r\n } as Partial\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y2 + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\r\n this.context.fillText(this.lines[i].text, this.scaled.x2 + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n getCalloutProperties() {\r\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\r\n const requiredTailHalfWidth = this.attrs.font.size * 0.5\r\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\r\n const radius = textWidth < requiredTailHalfWidth ? textWidth / 2 : requiredTailHalfWidth\r\n\r\n const measuredHeight = this.measuredHeight < requiredTailHalfWidth ? radius * 2 : this.measuredHeight\r\n const y2 = this.scaled.y2 - (this.lines?.[0]?.metrics.actualBoundingBoxAscent || measuredHeight)\r\n\r\n // Points diagram\r\n //.......X-----------------X.......\r\n //.................................\r\n //...X.........................X...\r\n //...|.........................|...\r\n //...|.........................|...\r\n //...X.........................X...\r\n //.................................\r\n //.......X-----------------X.......\r\n\r\n const rectangleSides = getRectangleSidesCoordinates({\r\n padding,\r\n radius,\r\n x2: this.scaled.x2,\r\n y2,\r\n textWidth,\r\n measuredHeight,\r\n })\r\n const tail = getTailCoordinates({ rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\r\n const tailDirection = getTailToSideIntersection({ tail, rectangleSides })\r\n\r\n return {\r\n radius,\r\n requiredTailHalfWidth,\r\n rectangleSides,\r\n tail,\r\n tailDirection,\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { radius, requiredTailHalfWidth, tail, tailDirection, rectangleSides } = this.getCalloutProperties()\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.lineJoin = 'round'\r\n renderCallout({\r\n context: this.context,\r\n radius,\r\n requiredTailHalfWidth,\r\n tail,\r\n rectangleSides,\r\n tailDirection,\r\n })\r\n this.context.closePath()\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // is in rectangle\r\n const { tail, rectangleSides, requiredTailHalfWidth } = this.getCalloutProperties()\r\n if (\r\n this.lines &&\r\n rectangleSides &&\r\n rectangleSides.leftTop.x < area.scaled.x &&\r\n rectangleSides.topLeft.y < area.scaled.y &&\r\n rectangleSides.rightBottom.x > area.scaled.x &&\r\n rectangleSides.bottomRight.y > area.scaled.y\r\n ) {\r\n return true\r\n }\r\n // is in tail\r\n if (tail) {\r\n const tailP1 = math.perpendicularPointToLine({\r\n distance: requiredTailHalfWidth,\r\n line: { x1: tail.tailTip.x, y1: tail.tailTip.y, x2: tail.tailRoot.x, y2: tail.tailRoot.y },\r\n })\r\n const pointOffsetX = tailP1.x - tail.tailRoot.x\r\n const pointOffsetY = tailP1.y - tail.tailRoot.y\r\n const tailP2 = { x: tail.tailRoot.x + -1 * pointOffsetX, y: tail.tailRoot.y + -1 * pointOffsetY }\r\n const polygon = [tail.tailTip, tailP1, tailP2]\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tail') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n }\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator() || !this.lines) {\r\n return true\r\n }\r\n\r\n const { tail, rectangleSides } = this.getCalloutProperties()\r\n\r\n return [...Object.values(rectangleSides), tail.tailRoot, tail.tailTip].some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n )\r\n }\r\n}\r\n\r\nexport default Callout\r\n","import { Bezier } from 'bezier-js'\r\n\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ICurveAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n border: DrawingBorder\r\n}\r\n\r\nclass Curve extends Element {\r\n static type = CanvasElementType.curve\r\n\r\n name = 'Curve'\r\n declare scaled: Pick\r\n declare curve: Bezier\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3 || this.attrs.x2,\r\n () => this.attrs.y3 || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\r\n const { points } = curve\r\n context.beginPath()\r\n context.moveTo(points[0].x, points[0].y)\r\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\r\n context.stroke()\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if (!x3 || !y3) {\r\n context.beginPath()\r\n context.moveTo(x1, y1)\r\n context.lineTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n context.stroke()\r\n } else {\r\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\r\n this.drawQuadraticCurve(context, this.curve)\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.x3 += x\r\n this.attrs.cp1x += x\r\n this.attrs.cp2x += x\r\n\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n this.attrs.y3 += y\r\n this.attrs.cp1y += y\r\n this.attrs.cp2y += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n if (!x3 || !y3) {\r\n return true\r\n }\r\n const isInView =\r\n Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5).points.some(\r\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\r\n ) ?? true\r\n\r\n return isInView\r\n }\r\n}\r\n\r\nCurve.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default Curve\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n cp1x: number\r\n cp2x: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n cp1y: number\r\n cp2y: number\r\n width: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface ICoordinates {\r\n topCenterX: number\r\n topCenterY: number\r\n topRightX: number\r\n topRightY: number\r\n topLeftX: number\r\n topLeftY: number\r\n centerLeftX: number\r\n centerLeftY: number\r\n centerRightX: number\r\n centerRightY: number\r\n bottomCenterX: number\r\n bottomCenterY: number\r\n bottomLeftX: number\r\n bottomLeftY: number\r\n bottomRightX: number\r\n bottomRightY: number\r\n}\r\n\r\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current Ellipse tool located in ellipse folder\r\nclass Ellipse extends Element {\r\n static type = CanvasElementType.ellipse\r\n\r\n name = 'Ellipse'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'x1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'x2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'lw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rw',\r\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\r\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const c = this.getCoordinates()\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\r\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\r\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\r\n context.closePath()\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'x1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'x2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'lw':\r\n this.attrs.width += difX\r\n break\r\n case 'rw':\r\n this.attrs.width -= difX\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getCoordinates(): ICoordinates {\r\n // TODO cache?\r\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\r\n const rotationAngle =\r\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\r\n\r\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\r\n const radiusX = this.scaled.width / 2\r\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\r\n if (this.scaled.y1 === this.scaled.y2) {\r\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\r\n }\r\n\r\n const width_two_thirds = (radiusX * 4) / 3\r\n\r\n const dx1 = Math.sin(rotationAngle) * radiusY\r\n const dy1 = Math.cos(rotationAngle) * radiusY\r\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\r\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\r\n\r\n const x = this.scaled.x1 + dx1\r\n const y = this.scaled.y1 - dy1\r\n\r\n const topCenterX = x - dx1\r\n const topCenterY = y + dy1\r\n const topRightX = topCenterX + dx2\r\n const topRightY = topCenterY + dy2\r\n const topLeftX = topCenterX - dx2\r\n const topLeftY = topCenterY - dy2\r\n\r\n const bottomCenterX = x + dx1\r\n const bottomCenterY = y - dy1\r\n const bottomRightX = bottomCenterX + dx2\r\n const bottomRightY = bottomCenterY + dy2\r\n const bottomLeftX = bottomCenterX - dx2\r\n const bottomLeftY = bottomCenterY - dy2\r\n\r\n const centerRightX = x + dx2\r\n const centerRightY = y + dy2\r\n const centerLeftX = x - dx2\r\n const centerLeftY = y - dy2\r\n\r\n return {\r\n topCenterX,\r\n topCenterY,\r\n topRightX,\r\n topRightY,\r\n topLeftX,\r\n topLeftY,\r\n centerLeftX,\r\n centerLeftY,\r\n centerRightX,\r\n centerRightY,\r\n bottomCenterX,\r\n bottomCenterY,\r\n bottomLeftX,\r\n bottomLeftY,\r\n bottomRightX,\r\n bottomRightY,\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const c = this.getCoordinates()\r\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\r\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\r\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\r\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipse.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Ellipse\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\r\n\r\nexport interface IRotatedRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n height: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\r\n// current RotatedRectangle tool located in rotated_rectangle folder\r\nclass RotatedRectangle extends Element {\r\n static type = CanvasElementType.rotatedRectangle\r\n\r\n name = 'Rotated rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n const x = this.model.scale.x.invert\r\n const y = this.model.scale.y.invert\r\n this._thumbs = [\r\n new Thumb(\r\n 'ml',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'mr',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => x(this.getRectCoordinates()[0][0]),\r\n () => y(this.getRectCoordinates()[0][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tr',\r\n () => x(this.getRectCoordinates()[1][0]),\r\n () => y(this.getRectCoordinates()[1][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bl',\r\n () => x(this.getRectCoordinates()[2][0]),\r\n () => y(this.getRectCoordinates()[2][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => x(this.getRectCoordinates()[3][0]),\r\n () => y(this.getRectCoordinates()[3][1]),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n const boundingPointKeys = this.getBoundingPointKeys()\r\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.beginPath()\r\n const coords = this.getRectCoordinates()\r\n for (const point of coords) {\r\n context.lineTo(point[0], point[1])\r\n }\r\n context.lineTo(coords[0][0], coords[0][1])\r\n context.fill()\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(): RotatedRectangleCoordiantes {\r\n const mx1 = this.scaled.x1\r\n const mx2 = this.scaled.x2\r\n const my1 = this.scaled.y1\r\n const my2 = this.scaled.y2\r\n const { height } = this.scaled\r\n\r\n const k = (my2 - my1) / (mx2 - mx1)\r\n const nk = -1 / k\r\n\r\n const sign = my1 > my2 ? 1 : -1\r\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\r\n const dy = nk * dx\r\n\r\n let x1 = mx1 - dx\r\n let y1 = my1 - dy\r\n let x2 = mx2 - dx\r\n let y2 = my2 - dy\r\n\r\n let x3 = mx2 + dx\r\n let y3 = my2 + dy\r\n let x4 = mx1 + dx\r\n let y4 = my1 + dy\r\n\r\n if (my1 === my2) {\r\n x1 = mx1\r\n y1 = my1 - height / 2\r\n x2 = mx2\r\n y2 = my2 - height / 2\r\n\r\n x3 = mx2\r\n y3 = my2 + height / 2\r\n x4 = mx1\r\n y4 = my1 + height / 2\r\n }\r\n\r\n return [\r\n [x1, y1],\r\n [x2, y2],\r\n [x3, y3],\r\n [x4, y4],\r\n ]\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'ml':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'mr':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'tl':\r\n case 'tr':\r\n this.attrs.height += difY\r\n break\r\n case 'bl':\r\n case 'br':\r\n this.attrs.height -= difY\r\n break\r\n default:\r\n return\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coords = this.getRectCoordinates()\r\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangle\r\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\r\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ISymbolAttrs {\r\n x1: number\r\n scaleX: number\r\n y1: number\r\n scaleY: number\r\n angle: number\r\n fill: string\r\n symbol: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass SymbolElement extends Element {\r\n static type = CanvasElementType.symbol\r\n\r\n name = 'Symbol'\r\n\r\n declare textWidth: number\r\n declare textHeight: number\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n const sx = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\r\n const sy = (sign: number) =>\r\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\r\n this._thumbs = [\r\n new Thumb(\r\n 'xr',\r\n () => this.model.scale.x.invert(sx(+1).x),\r\n () => this.model.scale.y.invert(sx(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'xl',\r\n () => this.model.scale.x.invert(sx(-1).x),\r\n () => this.model.scale.y.invert(sx(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yt',\r\n () => this.model.scale.x.invert(sy(+1).x),\r\n () => this.model.scale.y.invert(sy(+1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'yb',\r\n () => this.model.scale.x.invert(sy(-1).x),\r\n () => this.model.scale.y.invert(sy(-1).y),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.attrs.angle = this.attrs.angle || 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('font', '36px FontAwesome')\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('textAlign', 'left')\r\n context.set('textBaseline', 'top')\r\n\r\n this.textWidth = context.measureText(this.attrs.symbol).width\r\n this.textHeight = 36\r\n const xScale = this.attrs.scaleX\r\n const yScale = this.attrs.scaleY\r\n\r\n const xOffset = this.textWidth / -2\r\n const yOffset = this.textHeight / -2\r\n\r\n context.save()\r\n context.translate(this.scaled.x1, this.scaled.y1)\r\n context.rotate(this.attrs.angle)\r\n context.scale(xScale, yScale)\r\n context.fillText(this.attrs.symbol, xOffset, yOffset)\r\n context.restore()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRotatedCoordinates(x: number, y: number) {\r\n const cx = this.scaled.x1\r\n const cy = this.scaled.y1\r\n const dx = x - cx\r\n const dy = y - cy\r\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\r\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\r\n return { x: cx + rx, y: cy + ry }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n return (this.attrs.y1 += y)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'xl':\r\n this.attrs.scaleX -= difX\r\n break\r\n case 'xr':\r\n this.attrs.scaleX += difX\r\n break\r\n case 'yt':\r\n this.attrs.scaleY -= difY\r\n break\r\n case 'yb':\r\n this.attrs.scaleY += difY\r\n break\r\n case 'c':\r\n this.attrs.angle += difX / 5\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\r\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\r\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\r\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\r\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\r\n\r\nSymbolElement.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\r\n}\r\n\r\nexport default SymbolElement\r\n","import { CanvasElementType } from '../constants/common'\r\nimport arrow from './arrow'\r\nimport brush_v1 from './brush/brush_v1'\r\nimport callout_v1 from './callout/callout_v1'\r\nimport curve from './curve'\r\nimport element from './element'\r\nimport elliottWaves from './elliott_waves/elliott_waves'\r\nimport ellipse from './ellipse'\r\nimport ellipse_v1 from './ellipse/ellipse_v1'\r\nimport fibonacci from './fibonacci_retracements'\r\nimport horizontalLine from './horizontal_line'\r\nimport line from './line'\r\nimport measure from './measure'\r\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\r\nimport polygon from './polygon'\r\nimport position from './position'\r\nimport rectangle from './rectangle'\r\nimport rotatedRectangle from './rotated_rectangle'\r\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\r\nimport scaledLine from './scaled_line'\r\nimport scaledText from './scaled_text'\r\nimport symbolElement from './symbol'\r\nimport text from './text'\r\nimport triangle from './triangle'\r\nimport verticalLine from './vertical_line'\r\nimport xabcd from './xabcd'\r\n\r\nexport const drawingToolsByType = Object.freeze({\r\n [CanvasElementType.element]: element,\r\n [CanvasElementType.arrow]: arrow,\r\n [CanvasElementType.brushV1]: brush_v1,\r\n [CanvasElementType.calloutV1]: callout_v1,\r\n [CanvasElementType.curve]: curve,\r\n [CanvasElementType.elliottWaves]: elliottWaves,\r\n [CanvasElementType.ellipse]: ellipse,\r\n [CanvasElementType.ellipseV1]: ellipse_v1,\r\n [CanvasElementType.fibonacciRetracements]: fibonacci,\r\n [CanvasElementType.horizontalLine]: horizontalLine,\r\n [CanvasElementType.line]: line,\r\n [CanvasElementType.measure]: measure,\r\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\r\n [CanvasElementType.polygon]: polygon,\r\n [CanvasElementType.position]: position,\r\n [CanvasElementType.rectangle]: rectangle,\r\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\r\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\r\n [CanvasElementType.scaledLine]: scaledLine,\r\n [CanvasElementType.scaledText]: scaledText,\r\n [CanvasElementType.symbol]: symbolElement,\r\n [CanvasElementType.text]: text,\r\n [CanvasElementType.triangle]: triangle,\r\n [CanvasElementType.verticalLine]: verticalLine,\r\n [CanvasElementType.xabcd]: xabcd,\r\n})\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\nimport mergewith from 'lodash.mergewith'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport Thumb from '../canvas/thumb'\r\nimport {\r\n CanvasElementType,\r\n ChartElementType,\r\n ChartEventType,\r\n IVisibility,\r\n IndicatorType,\r\n MacroTimeframe,\r\n MicroMacroTimeframe,\r\n OverlayType,\r\n SetVisibilityTo,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isInRange } from '../utils/helpers'\r\n\r\nexport type TodoModalConfig = TodoObjectHashAnyType\r\ntype TodoPositionTimestamps = TodoObjectHashAnyType\r\n\r\nexport interface DefaultAttrs extends ObjectHash {\r\n positionTimestamps?: TodoPositionTimestamps\r\n visibility?: IVisibility\r\n}\r\n\r\nexport type EdgeValues = { minX?: number; maxX?: number; minY?: number; maxY?: number }\r\n\r\nclass Element extends Spine.Module {\r\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\r\n CanvasElementType.element\r\n\r\n static fromObject(obj: T['attrs'], model: T['model']) {\r\n return new this(obj, model) as T\r\n }\r\n\r\n static getNumOfBarsBuffer(\r\n _?: RequireByKey | RequireByKey\r\n ) {\r\n return 0\r\n }\r\n\r\n isCreator = false\r\n isCreatorDialogOpen = false\r\n attrs: Attrs = {} as Attrs\r\n\r\n model: any\r\n _thumbs: Thumb[]\r\n\r\n getDefaults?(): Partial\r\n renderCross?(ctx: RenderingContext2DType): void\r\n renderCrossText?(\r\n ctx: RenderingContext2DType,\r\n crossIndex: number,\r\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\r\n ): void\r\n\r\n renderContent?(ctx: RenderingContext2DType): void\r\n renderGrid?(ctx: RenderingContext2DType): void\r\n renderLabels?(ctx: RenderingContext2DType): void\r\n declare defaults?: Partial\r\n getModalConfigBase?(): TodoModalConfig\r\n declare modalConfig?: TodoModalConfig\r\n getMinMax?(): { min: number; max: number }\r\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\r\n\r\n activeThumb: Thumb | null = null\r\n isMouseDown = false\r\n isSelected = false\r\n isHovered = false\r\n isEditInProgress = false\r\n edgeXYValues: EdgeValues | null = null\r\n declare scaled?: ObjectHash | Partial\r\n\r\n declare toolsCallback: () => void\r\n\r\n constructor(values: Partial, model: Model) {\r\n super(values, model)\r\n this.model = model\r\n if (this.getDefaults) {\r\n this.set(this.getDefaults() || {})\r\n } else {\r\n this.set(this.defaults || {})\r\n }\r\n this.set(values)\r\n this._thumbs = []\r\n\r\n this.onMouseDown = this.onMouseDown.bind(this)\r\n this.onMouseMove = this.onMouseMove.bind(this)\r\n this.onMouseUp = this.onMouseUp.bind(this)\r\n this.bind('mousedown', this.onMouseDown)\r\n this.bind('mousemove', this.onMouseMove)\r\n this.bind('mouseup', this.onMouseUp)\r\n this.bind('change', () => {\r\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\r\n const element = this.getIsChartEvent()\r\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\r\n : this.model.elements?.()?.findByAttribute('instance', this)\r\n\r\n element?.trigger('change', element)\r\n })\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Element).type\r\n }\r\n\r\n getThumbs() {\r\n return this._thumbs\r\n }\r\n\r\n moveBy(_: number, __: number) {}\r\n\r\n setIsSelected(isSelected: boolean) {\r\n this.isSelected = isSelected\r\n this.trigger('change')\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n this.isHovered = isHovered\r\n this.trigger('change')\r\n }\r\n\r\n getShouldRenderThumbs() {\r\n return this.isSelected || this.isHovered\r\n }\r\n\r\n getIsPaneSelection(): boolean {\r\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\r\n return paneModel?.selection === this\r\n }\r\n\r\n set(obj: Partial) {\r\n const attrsSubset = Object.keys(obj).reduce(\r\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\r\n {} as Partial\r\n )\r\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\r\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\r\n if (this.getIsDrawing() && key === 'visibility') {\r\n return srcValue ?? {}\r\n }\r\n }\r\n mergewith(this.attrs, obj, customizer)\r\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n this.edgeXYValues = null\r\n return this\r\n }\r\n\r\n get(key: T) {\r\n return this.attrs[key]\r\n }\r\n\r\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\r\n\r\n fx = (x: number) => this.model.scale.x(x)\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n scale({ x, y }: { x: string[]; y: string[] }) {\r\n this.scaled = {}\r\n x.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fx(this.attrs[el]),\r\n })\r\n })\r\n\r\n y.forEach((el) => {\r\n Object.defineProperty(this.scaled, el, {\r\n get: () => this.fy(this.attrs[el]),\r\n })\r\n })\r\n }\r\n\r\n render(_: RenderingContext2DType) {}\r\n\r\n renderThumbs(context: CanvasRenderingContext2D) {\r\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\r\n if (isHoveredThumbStyle) {\r\n context.globalAlpha = 0.5\r\n }\r\n this.getThumbs().map((thumb) => thumb.render(context))\r\n context.globalAlpha = 1\r\n }\r\n\r\n onMouseDown(area: PaneArea) {\r\n this.isMouseDown = true\r\n this.isEditInProgress = true\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n this.activeThumb = thumb\r\n this.activeThumb.startEditing(area)\r\n return\r\n }\r\n }\r\n }\r\n\r\n onMouseMove(area: PaneArea) {\r\n if (!area.mouseDown) {\r\n return\r\n }\r\n if (this.activeThumb != null) {\r\n this.activeThumb.moveTo(area)\r\n this.trigger('change')\r\n }\r\n }\r\n\r\n onMouseUp(_?: PaneArea) {\r\n this.isMouseDown = false\r\n this.isEditInProgress = false\r\n this.activeThumb = null\r\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\r\n this.cachePointPositionTimestamp()\r\n }\r\n this.trigger('change', this)\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const { x: xPointKeys } = this.getBoundingPointKeys()!\r\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\r\n const positionX = this.attrs[key]\r\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\r\n return {\r\n ...acc,\r\n [key]: timeStamp,\r\n }\r\n }, {}) as TodoPositionTimestamps\r\n this.set({ positionTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionTimestamps } = this.attrs\r\n if (!quote || !positionTimestamps) {\r\n // positionTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\r\n (acc, [key, timestamp]) => ({\r\n ...acc,\r\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\r\n }),\r\n {}\r\n )\r\n this.set(pointPoitionsFromTimestamp)\r\n }\r\n\r\n thumbsAreInArea(area: PaneArea) {\r\n for (const thumb of this.getThumbs()) {\r\n if (thumb.isInArea(area)) {\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n isDrawingElementLockedOrInvisible() {\r\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\r\n }\r\n\r\n getModalConfig() {\r\n let config\r\n if (this.getModalConfigBase) {\r\n config = merge({}, this.getModalConfigBase())\r\n } else {\r\n config = merge({}, this.modalConfig)\r\n }\r\n if (this.getIsDrawing()) {\r\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\r\n }\r\n if (config.title == null) {\r\n config.title = this.name\r\n }\r\n for (const input of config.inputs) {\r\n if (input.default != null) {\r\n input.value = input.default\r\n }\r\n if (this.attrs[input.name] != null) {\r\n input.value = this.attrs[input.name]\r\n }\r\n }\r\n return config\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return this.toObject()\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\r\n }\r\n\r\n toAutosaveConfig() {\r\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\r\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\r\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\r\n }\r\n\r\n replaceMyself(element: Element) {\r\n setTimeout(() => {\r\n element.cachePointPositionTimestamp()\r\n const el = this.model.elements().findByAttribute('instance', this)\r\n if (!el) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('element.ts replaceMyself', {\r\n extra: {\r\n oldElement: {\r\n type: this?.type,\r\n isCreator: this?.isCreator,\r\n isMouseDown: this?.isMouseDown,\r\n isSelected: this?.isSelected,\r\n isHovered: this?.isHovered,\r\n isEditInProgress: this?.isEditInProgress,\r\n },\r\n newElement: {\r\n type: element?.type,\r\n isCreator: element?.isCreator,\r\n isMouseDown: element?.isMouseDown,\r\n isSelected: element?.isSelected,\r\n isHovered: element?.isHovered,\r\n isEditInProgress: element?.isEditInProgress,\r\n },\r\n },\r\n })\r\n } else {\r\n el.replace(element)\r\n }\r\n })\r\n }\r\n\r\n toString() {\r\n return this.name\r\n }\r\n\r\n getIsCreator() {\r\n return this.isCreator\r\n }\r\n\r\n getIsCreatorDialogOpen() {\r\n return this.isCreatorDialogOpen\r\n }\r\n\r\n release() {\r\n this.cachePointPositionTimestamp()\r\n this.unbind()\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n getIsDrawing() {\r\n return !!this.type.startsWith('canvas/')\r\n }\r\n\r\n getIsChartEvent() {\r\n return !!this?.type.startsWith('chartEvent/')\r\n }\r\n\r\n getIsVisible() {\r\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const visibility = this.attrs.visibility?.[macro]\r\n\r\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\r\n if (visibility === undefined) return true\r\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\r\n if (Object.keys(visibility).length === 0) return false\r\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\r\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\r\n }\r\n\r\n setVisibilityTo(setTo: SetVisibilityTo) {\r\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\r\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\r\n\r\n let timeframesToSet: string[] = []\r\n let attrsToSet: { from?: number; to?: number } = {}\r\n\r\n switch (setTo) {\r\n case SetVisibilityTo.currentAndAbove: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\r\n attrsToSet = { from: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentAndBelow: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\r\n attrsToSet = { to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.currentOnly: {\r\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\r\n attrsToSet = { from: micro, to: micro }\r\n break\r\n }\r\n case SetVisibilityTo.all:\r\n default: {\r\n this.set({ visibility: {} } as Partial)\r\n return\r\n }\r\n }\r\n\r\n this.set({\r\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\r\n } as Partial)\r\n }\r\n\r\n getEdgeXYValues() {\r\n const { x: xPoints, y: yPoints } = this.getBoundingPointKeys() ?? {}\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n xPoints?.forEach((key) => {\r\n const positionX = this.attrs[key]\r\n if (positionX !== undefined) {\r\n edgeXYValues.minX = Math.min(positionX, edgeXYValues.minX ?? positionX)\r\n edgeXYValues.maxX = Math.max(positionX, edgeXYValues.maxX ?? positionX)\r\n }\r\n })\r\n yPoints?.forEach((key) => {\r\n const positionY = this.attrs[key]\r\n if (positionY !== undefined) {\r\n edgeXYValues.minY = Math.min(positionY, edgeXYValues.minY ?? positionY)\r\n edgeXYValues.maxY = Math.max(positionY, edgeXYValues.maxY ?? positionY)\r\n }\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n\r\n getIsInChartView(chart: Chart, options?: { omitX?: boolean; omitY?: boolean }) {\r\n const { minX, maxX, minY, maxY } = this.getEdgeXYValues()\r\n\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!options?.omitX) {\r\n const isMaxXInvalid = maxX === undefined || isNaN(maxX)\r\n const isMinXInvalid = minX === undefined || isNaN(minX)\r\n if (\r\n !isMaxXInvalid &&\r\n !isMinXInvalid &&\r\n !(this.fx(maxX) >= -chart.leftOffset && this.fx(minX) <= -chart.leftOffset + chart.width)\r\n ) {\r\n return false\r\n }\r\n }\r\n\r\n if (!options?.omitY) {\r\n if (minY === undefined || maxY === undefined) {\r\n return true\r\n }\r\n\r\n const topBound = this.model.scale.y.invert(0)\r\n const bottomBound = this.model.scale.y.invert(this.model.height)\r\n return topBound >= minY && bottomBound <= maxY\r\n }\r\n\r\n // If all checks fall through, render element\r\n return true\r\n }\r\n}\r\n\r\nexport default Element\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Text from '../text'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IElliottWavesAttrs {\r\n waves: Array<{ x: number; y: number }>\r\n positionWavesTimestamps?: Array<{ x: number; y: number }>\r\n border: DrawingBorder\r\n}\r\n\r\nclass ElliottWaves extends Element {\r\n static type = CanvasElementType.elliottWaves\r\n\r\n name = 'Elliott Wave'\r\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 2,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\r\n for (const p of this.attrs.waves.slice(1)) {\r\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\r\n }\r\n context.stroke()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.center,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n this.model\r\n )\r\n for (let i = 0; i < this.attrs.waves.length; i++) {\r\n let y\r\n const p = this.attrs.waves[i]\r\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\r\n y = this.fy(p.y) + 8\r\n } else {\r\n y = this.fy(p.y) - 8\r\n }\r\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.waves.map(\r\n (wave, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => wave.x,\r\n () => wave.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart().quote()\r\n if (quote) {\r\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\r\n ...wave,\r\n x: quote.getTimestampFomPositionX(wave.x),\r\n }))\r\n\r\n this.set({ positionWavesTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionWavesTimestamps } = this.attrs\r\n if (!quote || !positionWavesTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const waves = positionWavesTimestamps.map((wave) => ({\r\n ...wave,\r\n x: quote.getPositionXFromTimestamp(wave.x),\r\n }))\r\n this.set({ waves } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.waves) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs.waves[+type].x += difX\r\n this.attrs.waves[+type].y += difY\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const waves = this.attrs.waves\r\n for (let i = 0; i < waves.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: this.fx(waves[i].x),\r\n y1: this.fy(waves[i].y),\r\n x2: this.fx(waves[i + 1].x),\r\n y2: this.fy(waves[i + 1].y),\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['waves']\r\n }\r\n}\r\n\r\nElliottWaves.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ElliottWaves\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { getContextWithCache } from '../../utils/canvas'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IEllipseAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\ninterface Coordinates {\r\n P1: Point\r\n P2: Point\r\n P3: Point\r\n P4: Point\r\n CP1: Point\r\n CP2: Point\r\n CP3: Point\r\n CP4: Point\r\n}\r\n\r\nclass EllipseV1 extends Element {\r\n static type = CanvasElementType.ellipseV1\r\n\r\n name = 'Ellipse'\r\n\r\n untranslatedContext: CanvasRenderingContext2D | null = null\r\n declare ellipsePath: Path2D\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\r\n this._thumbs = [\r\n new Thumb(\r\n 'left',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'right',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'top',\r\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\r\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottom',\r\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\r\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const coordinates = this.getEllipsePoints() as Coordinates\r\n const ellipse = new Path2D()\r\n context.set('fillStyle', this.attrs.fill)\r\n context.beginPath()\r\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\r\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\r\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\r\n } else {\r\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\r\n ellipse.bezierCurveTo(\r\n coordinates.CP4.x,\r\n coordinates.CP4.y,\r\n coordinates.CP1.x,\r\n coordinates.CP1.y,\r\n coordinates.P2.x,\r\n coordinates.P2.y\r\n )\r\n ellipse.bezierCurveTo(\r\n coordinates.CP2.x,\r\n coordinates.CP2.y,\r\n coordinates.CP3.x,\r\n coordinates.CP3.y,\r\n coordinates.P4.x,\r\n coordinates.P4.y\r\n )\r\n ellipse.closePath()\r\n this.ellipsePath = ellipse\r\n context.fill(ellipse)\r\n }\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke(ellipse)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getEllipsePoints(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n\r\n const P1 = { x: x2, y: y2 }\r\n const P3 = { x: x1, y: y1 }\r\n\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: P3,\r\n P2: P1,\r\n P3: P1,\r\n P4: P3,\r\n }\r\n }\r\n\r\n const lineCenterX = (P1.x + P3.x) / 2\r\n const lineCenterY = (P1.y + P3.y) / 2\r\n const pointOffsetX = perpendicularPoint.x - P1.x\r\n const pointOffsetY = perpendicularPoint.y - P1.y\r\n\r\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\r\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n\r\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\r\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\r\n\r\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\r\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\r\n\r\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\r\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\r\n\r\n const CP1 = {\r\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\r\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\r\n }\r\n const controlPointOffsetX = CP1.x - P1WithOffsetX\r\n const controlPointOffsetY = CP1.y - P1WithOffsetY\r\n\r\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\r\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\r\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\r\n\r\n return {\r\n P1,\r\n P2,\r\n P3,\r\n P4,\r\n CP1,\r\n CP2,\r\n CP3,\r\n CP4,\r\n }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: { x: number; y: number }\r\n pointToRotate: { x: number; y: number }\r\n oldLinePoint: { x: number; y: number }\r\n newLinePoint: { x: number; y: number }\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'left':\r\n const newLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newLeftPoint.x,\r\n y1: newLeftPoint.y,\r\n cursorTargetX: leftRotatedCursorPoint.x,\r\n cursorTargetY: leftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'right':\r\n const newRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newRightPoint.x,\r\n y2: newRightPoint.y,\r\n cursorTargetX: rightRotatedCursorPoint.x,\r\n cursorTargetY: rightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'top':\r\n case 'bottom':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nEllipseV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default EllipseV1\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ntype Coefficients = string\r\n\r\nexport interface IFibonacciRetracementsAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n coefficients: Coefficients\r\n border: DrawingBorder\r\n}\r\n\r\nclass FibonacciRetracements<\r\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\r\n> extends Element {\r\n static type = CanvasElementType.fibonacciRetracements\r\n\r\n name = 'Fibonacci Retracements'\r\n declare coefficients: { default: string; parsed: number[]; max: number; min: number }\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'oneCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'oneCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'zeroCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.parseCoefficients(this.attrs.coefficients)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n },\r\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n parseCoefficients(coefficients: Coefficients) {\r\n if (!this.coefficients || coefficients !== this.coefficients.default) {\r\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\r\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed), min: Math.min(...parsed) }\r\n }\r\n }\r\n\r\n getMaxCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\r\n }\r\n\r\n getMinCoefficientUnscaledY() {\r\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.min * (this.scaled.y2 - this.scaled.y1))\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n this.parseCoefficients(this.attrs.coefficients)\r\n\r\n const height = this.attrs.y2 - this.attrs.y1\r\n const heightScaled = roundedXY.y2 - roundedXY.y1\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n for (const p of this.coefficients.parsed) {\r\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\r\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\r\n }\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n const text = new Text(\r\n {\r\n x: roundedXY.x1,\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: TextBaseline.bottom,\r\n fillStyle: this.attrs.border.color,\r\n textAlign: TextAlign.left,\r\n },\r\n this.model\r\n )\r\n if (roundedXY.x1 > roundedXY.x2) {\r\n text.set({ textAlign: TextAlign.right })\r\n }\r\n\r\n for (const p of this.coefficients.parsed) {\r\n const y = this.attrs.y2 - p * height\r\n text.set({\r\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\r\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\r\n } as Partial)\r\n text.render(context)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n if (this.coefficients.max > 1 && !this._thumbs.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'maxCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'maxCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMaxCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.max <= 1 && this._thumbs.some(({ type }) => type.includes('maxCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('maxCoefficient'))\r\n }\r\n\r\n if (this.coefficients.min < 0 && !this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = [\r\n ...this._thumbs,\r\n new Thumb(\r\n 'minCoefficient_1',\r\n () => this.attrs.x1,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'minCoefficient_2',\r\n () => this.attrs.x2,\r\n () => this.getMinCoefficientUnscaledY(),\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n if (this.coefficients.min >= 0 && this._thumbs.some(({ type }) => type.includes('minCoefficient'))) {\r\n this._thumbs = this._thumbs.filter(({ type }) => !type.includes('minCoefficient'))\r\n }\r\n\r\n return this._thumbs\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'oneCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'oneCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'zeroCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'zeroCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'maxCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'maxCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y1 += difY / this.coefficients.max\r\n break\r\n case 'minCoefficient_1':\r\n this.attrs.x1 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n case 'minCoefficient_2':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY / (Math.abs(this.coefficients.min) + 1)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\r\n const minCoefficientY = this.coefficients.min < 0 && this.getMinCoefficientUnscaledY()\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const allYValues = [this.attrs.y1, this.attrs.y2, maxCoefficientY, minCoefficientY].filter((item) => item !== false)\r\n const top = Math.min(...allYValues)\r\n const bottom = Math.max(...allYValues)\r\n\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getEdgeXYValues() {\r\n this.edgeXYValues = super.getEdgeXYValues()\r\n\r\n // Because minY, maxY can go outside of control points boundaries [0,1] we need to compensate\r\n // for that in getEdgeXYValues(), otherwise getIsInChartView() hide drawings sooner than it should\r\n const min = this.getMinCoefficientUnscaledY()\r\n const max = this.getMaxCoefficientUnscaledY()\r\n\r\n if (!isNaN(min) && !isNaN(max)) {\r\n this.edgeXYValues.minY = Math.min(min, max)\r\n this.edgeXYValues.maxY = Math.max(min, max)\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nFibonacciRetracements.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\r\n ],\r\n}\r\n\r\nexport default FibonacciRetracements\r\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\nimport Text from './text'\r\n\r\nconst DEFAULT_DECIMAL_PLACES = 2\r\n\r\nclass HorizontalLine extends ScaledLine {\r\n static type = CanvasElementType.horizontalLine\r\n\r\n name = 'Horizontal line'\r\n decimalPlaces = DEFAULT_DECIMAL_PLACES\r\n declare scaled: Pick\r\n declare model: PaneModel\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.updateDecimalPlaces()\r\n\r\n if (this.attrs.y1) {\r\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\r\n }\r\n if (this.modalConfig) {\r\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\r\n this.modalConfig.inputs[1] = {\r\n ...this.modalConfig.inputs[1],\r\n step,\r\n min: Number(step),\r\n }\r\n }\r\n this.renderContent = this.renderContent.bind(this)\r\n this._thumbs = []\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n updateDecimalPlaces() {\r\n const quote = this.model.chart().quote()\r\n this.decimalPlaces = quote\r\n ? math.getInstrumentDecimalPlaces({\r\n instrument: quote.instrument,\r\n value: quote.lastClose,\r\n })\r\n : DEFAULT_DECIMAL_PLACES\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n this.attrs.y2 = this.attrs.y1\r\n // mixing scaled and unscaled values, do not copy paste as solution\r\n this.attrs.x1 = ChartSettings.left.width * -1\r\n this.attrs.x2 =\r\n this.model\r\n .chart()\r\n .quote()\r\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\r\n super.renderContent(context)\r\n }\r\n\r\n renderLabels(context: CanvasRenderingContext2D) {\r\n if (this.attrs.y1) {\r\n this.updateDecimalPlaces()\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const isIndicatorPane = this.model\r\n .elements()\r\n .all()\r\n .some((element) => element.isIndicator())\r\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\r\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\r\n new Text(\r\n {\r\n x: 6,\r\n y: this.scaled.y1,\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n fillStyle: '#fff',\r\n background: '#000',\r\n textBaseline: TextBaseline.middle,\r\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n }\r\n\r\n moveBy(x: Maybe, y: number) {\r\n this.attrs.y1 += y\r\n }\r\n\r\n resize({ difY }: RequireByKey) {\r\n this.moveBy(0, difY)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitX: true })\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'border' },\r\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\r\n ],\r\n}\r\n\r\nexport default HorizontalLine\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\ninterface ILineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n}\r\n\r\nclass Line extends Element {\r\n static type = CanvasElementType.line\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.render = this.render.bind(this)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'l',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'r',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n lineWidth: 1,\r\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { x1, y1, x2, y2, lineWidth } = this.attrs\r\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.lineWidth)\r\n context.set('strokeStyle', this.attrs.strokeStyle)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([])\r\n }\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'l') {\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area, this.attrs) <= 10) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nexport default Line\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport { numberToStringWithUnitsSuffix } from '../utils'\r\nimport { getRoundedString } from '../utils/helpers'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IMeasureAttrs extends Coordinates {\r\n fill: string\r\n}\r\n\r\nclass Measure extends Element {\r\n static type = CanvasElementType.measure\r\n\r\n name = 'Measure'\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n startingX1: number\r\n startingX2: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n getVolumeSumString = () => {\r\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\r\n const roundedX1 = Math.round(this.attrs.x1)\r\n const roundedX2 = Math.round(this.attrs.x2)\r\n // min/max values are offset by 1 so there's no value on such index\r\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\r\n const minIndexLimit = barIndex[0] - 1\r\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\r\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\r\n\r\n let volumeSum = 0\r\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\r\n const volumeIndex = barIndex.indexOf(i)\r\n if (volumeIndex >= 0) {\r\n volumeSum += volume[volumeIndex]\r\n }\r\n }\r\n\r\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n context.fillRect(x1, roundedXY.y1, width, height)\r\n\r\n const priceDif = this.attrs.y2 - this.attrs.y1\r\n const percentage = (100 / this.attrs.y1) * priceDif\r\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\r\n\r\n const text = new Text(\r\n {\r\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\r\n fillStyle: '#333',\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n const baseX = x1 + width / 2\r\n const baseY = roundedXY.y1 + height / 2\r\n let textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY - text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: heightStr })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY,\r\n } as Partial)\r\n text.render(context)\r\n\r\n text.set({ text: this.getVolumeSumString() })\r\n textWidth = text.measure(context)\r\n text.set({\r\n x: baseX - textWidth / 2,\r\n y: baseY + text.getHeight(),\r\n } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n this.attrs.y1 += difs.y1 || 0\r\n this.attrs.y2 += difs.y2 || 0\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n\r\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\r\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x1 - newX1 !== 0) {\r\n this.attrs.x1 = newX1\r\n }\r\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\r\n if (~~this.attrs.x2 - newX2 !== 0) {\r\n this.attrs.x2 = newX2\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n y1: y,\r\n x2: x,\r\n y2: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.addToCoordinates({ x1: difX, y1: difY })\r\n } else {\r\n this.addToCoordinates({ x2: difX, y2: difY })\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n onMouseDown(paneArea: PaneArea) {\r\n super.onMouseDown(paneArea)\r\n this.startingX1 = this.attrs.x1\r\n this.startingX2 = this.attrs.x2\r\n }\r\n\r\n onMouseUp(paneArea?: PaneArea) {\r\n super.onMouseUp(paneArea)\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n}\r\n\r\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\r\n\r\nMeasure.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Measure\r\n","import { Point } from '../../../types/shared'\r\nimport { getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport { isInRange } from '../../utils/helpers'\r\nimport { ITrendAttrs } from './pitchfork_v1'\r\n\r\ninterface IGetEdgeIntersectionPointArguments {\r\n sides: { x: number; y: number }[][]\r\n rayOrigin: Point\r\n rayDirection: Point\r\n}\r\n\r\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\r\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\r\n\r\n let intersection = rayDirection\r\n let intersectionDistance = 0\r\n for (let index = 0; index < sides.length; index++) {\r\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\r\n rayOrigin,\r\n rayDirection,\r\n sides[index][0],\r\n sides[index][1]\r\n )\r\n if (rayToLineIntersection) {\r\n const distance = math.distance(rayToLineIntersection, rayOrigin)\r\n if (distance > intersectionDistance && isInRange({ value: distance })) {\r\n intersectionDistance = distance\r\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\r\n }\r\n }\r\n }\r\n\r\n return intersection\r\n}\r\n\r\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\r\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\r\n const { leftOffset, width } = paneModel.chart()\r\n\r\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\r\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\r\n const chartVisibleAreaTopY = 0\r\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\r\n\r\n const chartVisibleAreaTopLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaTopRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaTopY,\r\n }\r\n const chartVisibleAreaBottomLeftPoint = {\r\n x: chartVisibleAreaLeftX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const chartVisibleAreaBottomRightPoint = {\r\n x: chartVisibleAreaRightX,\r\n y: chartVisibleAreaBottomY,\r\n }\r\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\r\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\r\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\r\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\r\n\r\n const sides = [topSide, rightSide, bottomSide, leftSide]\r\n\r\n return sides\r\n}\r\n\r\ninterface IGetPitchforkCoordinates {\r\n paneModel: PaneModel\r\n rayOrigin: Point\r\n rayDirectionControlPoint1: Point\r\n rayDirectionControlPoint2?: Point\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\ninterface ILineSegment {\r\n P1: Point\r\n P2: Point\r\n}\r\n\r\ninterface ICoordinates {\r\n medianRay: ILineSegment\r\n trend1Ray1: ILineSegment | undefined\r\n trend1Ray2: ILineSegment | undefined\r\n trend2Ray1: ILineSegment | undefined\r\n trend2Ray2: ILineSegment | undefined\r\n}\r\n\r\nexport const getPitchforkCoordinates = ({\r\n paneModel,\r\n rayOrigin,\r\n rayDirectionControlPoint1,\r\n rayDirectionControlPoint2,\r\n trend1,\r\n trend2,\r\n}: IGetPitchforkCoordinates) => {\r\n const sides = getChartVisibleAreaBoundaries(paneModel)\r\n\r\n const coordinates: ICoordinates = {\r\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\r\n trend1Ray1: undefined,\r\n trend2Ray1: undefined,\r\n trend1Ray2: undefined,\r\n trend2Ray2: undefined,\r\n }\r\n\r\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\r\n if (!rayDirectionControlPoint2) {\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: rayDirectionControlPoint1,\r\n })\r\n ),\r\n }\r\n return coordinates\r\n }\r\n\r\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\r\n const rayOriginToRayDirectionVector = {\r\n x: medianRayDirectionPoint.x - rayOrigin.x,\r\n y: medianRayDirectionPoint.y - rayOrigin.y,\r\n }\r\n\r\n const rayDirectionControlPoint1ToPoint2Vector = {\r\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\r\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\r\n }\r\n\r\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\r\n rayDirectionControlPoint1ToPoint2Vector\r\n )\r\n\r\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\r\n medianRayDirectionPoint,\r\n rayDirectionControlPoint1\r\n )\r\n\r\n coordinates.medianRay = {\r\n P1: getRoundedObject(rayOrigin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin,\r\n rayDirection: medianRayDirectionPoint,\r\n })\r\n ),\r\n }\r\n if (trend1.active) {\r\n const trend1Ray = getTrendRayCoordinates({\r\n trend: trend1.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend1Ray1 = trend1Ray.trendRay1\r\n coordinates.trend1Ray2 = trend1Ray.trendRay2\r\n }\r\n if (trend2.active) {\r\n const trend2Ray = getTrendRayCoordinates({\r\n trend: trend2.trend,\r\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\r\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n })\r\n\r\n coordinates.trend2Ray1 = trend2Ray.trendRay1\r\n coordinates.trend2Ray2 = trend2Ray.trendRay2\r\n }\r\n\r\n return coordinates\r\n}\r\n\r\ninterface IGetTrendRayCoordinates {\r\n trend: number\r\n medianToControlPointDistance: number\r\n normalizedControlToControlPointVector: Point\r\n rayOriginToRayDirectionVector: Point\r\n medianRayDirectionPoint: Point\r\n sides: Point[][]\r\n}\r\n\r\nconst getTrendRayCoordinates = ({\r\n trend,\r\n medianToControlPointDistance,\r\n normalizedControlToControlPointVector,\r\n rayOriginToRayDirectionVector,\r\n medianRayDirectionPoint,\r\n sides,\r\n}: IGetTrendRayCoordinates) => {\r\n const medianToTrendLineDistance = medianToControlPointDistance * trend\r\n\r\n const trendRayPoint1Origin = math.addPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\r\n medianRayDirectionPoint,\r\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\r\n )\r\n\r\n const trendRayPoint1DirectionPoint = {\r\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\r\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\r\n }\r\n const trendPoint2RayDirectionPoint = {\r\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\r\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\r\n }\r\n\r\n return {\r\n trendRay1: {\r\n P1: getRoundedObject(trendRayPoint1Origin),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendRayPoint1Origin,\r\n rayDirection: trendRayPoint1DirectionPoint,\r\n })\r\n ),\r\n },\r\n trendRay2: {\r\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\r\n P2: getRoundedObject(\r\n getEdgeIntersectionPoint({\r\n sides,\r\n rayOrigin: trendPoint2RayOriginPoint2,\r\n rayDirection: trendPoint2RayDirectionPoint,\r\n })\r\n ),\r\n },\r\n }\r\n}\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport Chart from '../../models/chart'\r\nimport PaneModel from '../../models/pane'\r\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\nimport { getPitchforkCoordinates } from './pitchfork_utils'\r\n\r\nexport interface ITrendAttrs {\r\n active: boolean\r\n trend: number\r\n color: string\r\n}\r\n\r\nexport interface IPitchforkAttrs {\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n x3: number\r\n y3: number\r\n median: { color: string; width: number }\r\n trend1: ITrendAttrs\r\n trend2: ITrendAttrs\r\n}\r\n\r\nclass Pitchfork extends Element {\r\n static type = CanvasElementType.pitchforkV1\r\n\r\n declare scaled: Pick\r\n name = 'Pitchfork'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'medianRayOrigin',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint1',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'rayDirectionControlPoint2',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n median: { color: '#e72f2f', width: 1 },\r\n trend1: {\r\n color: '#004ad31c',\r\n active: true,\r\n trend: 1,\r\n },\r\n trend2: {\r\n color: '#00ca4e1f',\r\n active: true,\r\n trend: 0.5,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\r\n context.translate(offset, offset)\r\n\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n\r\n context.set('lineWidth', this.attrs.median.width)\r\n\r\n const trendLines = [\r\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\r\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\r\n ].sort((a, b) => {\r\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\r\n return -1\r\n }\r\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\r\n return 1\r\n }\r\n return 0\r\n })\r\n\r\n // Draw trend lines and fill\r\n trendLines.forEach((trendLine, trendLineIndex) => {\r\n if (trendLine.line1 && trendLine.line2) {\r\n const { line1, line2 } = trendLine\r\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\r\n const nextTrendLine = trendLines[trendLineIndex + 1]\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\r\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\r\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\r\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\r\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\r\n }\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.lineTo(line2.P1.x, line2.P1.y)\r\n context.closePath()\r\n context.set('fillStyle', trendLine.trend.color)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.moveTo(line1.P1.x, line1.P1.y)\r\n context.lineTo(line1.P2.x, line1.P2.y)\r\n context.moveTo(line2.P1.x, line2.P1.y)\r\n context.lineTo(line2.P2.x, line2.P2.y)\r\n context.set('strokeStyle', solidTrendColor)\r\n context.stroke()\r\n }\r\n })\r\n\r\n // Draw median ray line\r\n context.beginPath()\r\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\r\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\r\n\r\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\r\n const outerTrendLines =\r\n trendLines.filter(\r\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\r\n )[0] ?? {}\r\n\r\n if (outerTrendLines.line1 && outerTrendLines.line2) {\r\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\r\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\r\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\r\n context.moveTo(x2, y2)\r\n context.lineTo(x3, y3)\r\n }\r\n\r\n context.set('strokeStyle', this.attrs.median.color)\r\n context.stroke()\r\n\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'medianRayOrigin':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'rayDirectionControlPoint1':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'rayDirectionControlPoint2':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\r\n paneModel: this.model,\r\n rayOrigin: { x: x1, y: y1 },\r\n rayDirectionControlPoint1: { x: x2, y: y2 },\r\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\r\n trend1: this.attrs.trend1,\r\n trend2: this.attrs.trend2,\r\n })\r\n const outerTrendLines =\r\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\r\n ? { line1: trend1Ray1, line2: trend1Ray2 }\r\n : { line1: trend2Ray1, line2: trend2Ray2 }\r\n\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: medianRay.P1.x,\r\n y1: medianRay.P1.y,\r\n x2: medianRay.P2.x,\r\n y2: medianRay.P2.y,\r\n }) <= 10\r\n ) {\r\n // cursor is near median ray\r\n return true\r\n } else if (\r\n !Number.isNaN(x3) &&\r\n !Number.isNaN(y3) &&\r\n math.distanceToSegment(area.scaled, {\r\n x1: x2,\r\n y1: y2,\r\n x2: x3,\r\n y2: y3,\r\n }) <= 10\r\n ) {\r\n // cursor is near line connecting direction control points\r\n return true\r\n } else if (\r\n outerTrendLines.line1 &&\r\n outerTrendLines.line2 &&\r\n math.pointInPolygon(area.scaled, [\r\n outerTrendLines.line1.P1,\r\n outerTrendLines.line1.P2,\r\n outerTrendLines.line2.P2,\r\n outerTrendLines.line2.P1,\r\n ])\r\n ) {\r\n // cursor is on polygon created by outer trend lines\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n}\r\n\r\nPitchfork.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'line', name: 'median' },\r\n { type: 'trend', name: 'trend1' },\r\n { type: 'trend', name: 'trend2' },\r\n ],\r\n}\r\n\r\nexport default Pitchfork\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element, { EdgeValues } from './element'\r\nimport Thumb from './thumb'\r\n\r\ntype Points = Array<{ x: number; y: number }>\r\n\r\nexport interface IPolygonAttrs {\r\n points: Points\r\n fill: string\r\n border: DrawingBorder\r\n positionPointsTimestamps?: Points\r\n}\r\n\r\nclass Polygon extends Element {\r\n static type = CanvasElementType.polygon\r\n\r\n name = 'Polygon'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n const { points } = this.attrs\r\n context.beginPath()\r\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\r\n for (const p of points.slice(1)) {\r\n context.lineTo(this.fx(p.x), this.fy(p.y))\r\n }\r\n\r\n if (this.isPolygon()) {\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getThumbs() {\r\n return this.attrs.points.map(\r\n (point, index) =>\r\n new Thumb(\r\n `${index}`,\r\n () => point.x,\r\n () => point.y,\r\n this.resize,\r\n this.model\r\n )\r\n )\r\n }\r\n\r\n cachePointPositionTimestamp = () => {\r\n const quote = this.model?.chart()?.quote()\r\n if (quote) {\r\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\r\n ...point,\r\n x: quote.getTimestampFomPositionX(point.x),\r\n }))\r\n\r\n this.set({ positionPointsTimestamps } as Partial)\r\n }\r\n }\r\n\r\n updateScales() {\r\n const quote = this.model.chart().quote()\r\n const { positionPointsTimestamps } = this.attrs\r\n if (!quote || !positionPointsTimestamps) {\r\n // positionWavesTimestamps check is temporary to prevent app from crashing\r\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\r\n return\r\n }\r\n const points = positionPointsTimestamps.map((point) => ({\r\n ...point,\r\n x: quote.getPositionXFromTimestamp(point.x),\r\n }))\r\n this.set({ points } as Partial)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const point of this.attrs.points) {\r\n point.x += x\r\n point.y += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const last = this.attrs.points.length - 1\r\n if (this.isPolygon() && (+type === 0 || +type === last)) {\r\n this.attrs.points[0].x += difX\r\n this.attrs.points[0].y += difY\r\n this.attrs.points[last].x += difX\r\n this.attrs.points[last].y += difY\r\n } else {\r\n this.attrs.points[+type].x += difX\r\n this.attrs.points[+type].y += difY\r\n }\r\n }\r\n\r\n isPolygon() {\r\n return (\r\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\r\n )\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const scaledPoints = this.attrs.points.map((p) => ({\r\n x: this.fx(p.x),\r\n y: this.fy(p.y),\r\n }))\r\n if (this.isPolygon()) {\r\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\r\n return true\r\n }\r\n } else {\r\n for (let i = 0; i < scaledPoints.length - 1; i++) {\r\n if (\r\n math.distanceToSegment(area.scaled, {\r\n x1: scaledPoints[i].x,\r\n y1: scaledPoints[i].y,\r\n x2: scaledPoints[i + 1].x,\r\n y2: scaledPoints[i + 1].y,\r\n }) <= 10\r\n ) {\r\n return true\r\n }\r\n }\r\n }\r\n\r\n return super.isInArea(area)\r\n }\r\n\r\n getAutosaveOmittedProperties() {\r\n return ['points']\r\n }\r\n\r\n getEdgeXYValues() {\r\n if (this.edgeXYValues === null) {\r\n const edgeXYValues = {} as EdgeValues\r\n this.attrs.points.forEach(({ x, y }) => {\r\n const xPoint = x\r\n const yPoint = y\r\n edgeXYValues.minX = Math.min(xPoint, edgeXYValues.minX ?? xPoint)\r\n edgeXYValues.minY = Math.min(yPoint, edgeXYValues.minY ?? yPoint)\r\n edgeXYValues.maxX = Math.max(xPoint, edgeXYValues.maxX ?? xPoint)\r\n edgeXYValues.maxY = Math.max(yPoint, edgeXYValues.maxY ?? yPoint)\r\n })\r\n\r\n this.edgeXYValues = edgeXYValues\r\n }\r\n\r\n return this.edgeXYValues\r\n }\r\n}\r\n\r\nPolygon.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Polygon\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\ninterface Coordinates {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport interface IPositionAttrs extends Coordinates {\r\n targetColor: string\r\n stopColor: string\r\n targetY: number\r\n centerY: number\r\n stopY: number\r\n}\r\n\r\nclass Position extends Element {\r\n static type = CanvasElementType.position\r\n\r\n name = 'Position'\r\n\r\n declare scaled: Pick\r\n\r\n x1Dif: number\r\n x2Dif: number\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 't1',\r\n () => this.attrs.x1,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 't2',\r\n () => this.attrs.x2,\r\n () => this.attrs.targetY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's1',\r\n () => this.attrs.x1,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 's2',\r\n () => this.attrs.x2,\r\n () => this.attrs.stopY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c1',\r\n () => this.attrs.x1,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c2',\r\n () => this.attrs.x2,\r\n () => this.attrs.centerY,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, targetY, centerY, stopY } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\r\n let sign, stopBaseline, targetBaseline\r\n const width = roundedXY.x2 - roundedXY.x1\r\n\r\n context.set('fillStyle', this.attrs.targetColor)\r\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\r\n\r\n context.set('fillStyle', this.attrs.stopColor)\r\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\r\n\r\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\r\n const targetPerc = (100 / this.attrs.centerY) * targetDif\r\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\r\n\r\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\r\n const stopPerc = (100 / this.attrs.centerY) * stopDif\r\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\r\n\r\n if (this.attrs.targetY > this.attrs.centerY) {\r\n sign = 1\r\n targetBaseline = TextBaseline.bottom\r\n stopBaseline = TextBaseline.top\r\n } else {\r\n sign = -1\r\n targetBaseline = TextBaseline.top\r\n stopBaseline = TextBaseline.bottom\r\n }\r\n\r\n const text = new Text(\r\n {\r\n text: targetStr,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n font: { size: 10, family: 'Arial', weight: 'bold' },\r\n y: roundedXY.targetY - sign * 4,\r\n textBaseline: targetBaseline,\r\n },\r\n this.model\r\n )\r\n let textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n text.set({\r\n text: stopStr,\r\n y: roundedXY.stopY + sign * 4,\r\n textBaseline: stopBaseline,\r\n })\r\n textWidth = text.measure(context)\r\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\r\n text.render(context)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n addToCoordinates(difs: Partial) {\r\n let middle, middle1, result\r\n if (difs.targetY) {\r\n result = this.attrs.targetY + difs.targetY\r\n if (\r\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.targetY = result\r\n }\r\n\r\n if (difs.stopY) {\r\n result = this.attrs.stopY + difs.stopY\r\n if (\r\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\r\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\r\n ) {\r\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\r\n }\r\n this.attrs.stopY = result\r\n }\r\n\r\n if (\r\n difs.centerY &&\r\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\r\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\r\n ) {\r\n this.attrs.centerY += difs.centerY\r\n }\r\n\r\n this.x1Dif += difs.x1 || 0\r\n this.x2Dif += difs.x2 || 0\r\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\r\n if (roundDif !== 0) {\r\n if (difs.x1 != null) {\r\n this.attrs.x1 += roundDif\r\n }\r\n if (difs.x2 != null) {\r\n this.attrs.x2 += roundDif\r\n }\r\n this.x1Dif = this.x2Dif = 0\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n return this.addToCoordinates({\r\n x1: x,\r\n x2: x,\r\n targetY: y,\r\n centerY: y,\r\n stopY: y,\r\n })\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n const [coordType, coordIndex] = (type as string).split('')\r\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\r\n const obj: Partial = {\r\n [`x${coordIndex}`]: difX,\r\n [yPoints[coordType]]: difY,\r\n }\r\n return this.addToCoordinates(obj)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const x1 = Math.round(this.attrs.x1)\r\n const x2 = Math.round(this.attrs.x2)\r\n const left = Math.min(x1, x2)\r\n const right = Math.max(x1, x2)\r\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\r\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nPosition.prototype.defaults = {\r\n targetColor: 'rgba(0,200,0,0.3)',\r\n stopColor: 'rgba(200,0,0,0.3)',\r\n}\r\n\r\nPosition.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'targetColor' },\r\n { type: 'background', name: 'stopColor' },\r\n ],\r\n}\r\n\r\nexport default Position\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IRectangleAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass Rectangle extends Element {\r\n static type = CanvasElementType.rectangle\r\n\r\n name = 'Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'br',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'tl',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const width = roundedXY.x2 - roundedXY.x1\r\n const height = roundedXY.y2 - roundedXY.y1\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\r\n\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\r\n }\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.x2 += x\r\n this.attrs.y1 += y\r\n this.attrs.y2 += y\r\n\r\n // @todo - Live sync of elements while they are being moved around\r\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\r\n // this.set(this.attrs)\r\n // this.trigger('change', this)\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n if (type === 'tl') {\r\n this.attrs.x1 += difX\r\n return (this.attrs.y1 += difY)\r\n } else {\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const left = Math.min(this.attrs.x1, this.attrs.x2)\r\n const right = Math.max(this.attrs.x1, this.attrs.x2)\r\n const top = Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\r\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nRectangle.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default Rectangle\r\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\r\nimport { CanvasElementType } from '../../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\r\nimport math from '../../helpers/math'\r\nimport PaneModel from '../../models/pane'\r\nimport Element from '../element'\r\nimport Thumb from '../thumb'\r\n\r\nexport interface IRotatedRectangleV1Attrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n cursorTargetX: number\r\n cursorTargetY: number\r\n fill: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass RotatedRectangleV1 extends Element {\r\n static type = CanvasElementType.rotatedRectangleV1\r\n\r\n name = 'New Rotated Rectangle'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.resize = this.resize.bind(this)\r\n this._thumbs = [\r\n new Thumb(\r\n 'middleLeft',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'middleRight',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topRight',\r\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'topLeft',\r\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\r\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomLeft',\r\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'bottomRight',\r\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\r\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\r\n const roundedXY = {\r\n P1: getRoundedObject(P1),\r\n P2: getRoundedObject(P2),\r\n P3: getRoundedObject(P3),\r\n P4: getRoundedObject(P4),\r\n }\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n } else {\r\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\r\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\r\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\r\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\r\n context.closePath()\r\n context.fill()\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n context.stroke()\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n getRectCoordinates(inverted = false) {\r\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\r\n let perpendicularPoint\r\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\r\n const cursor = { x: cursorTargetX, y: cursorTargetY }\r\n const line = { x1, y1, x2, y2 }\r\n const distance = math.distanceToLine(cursor, line)\r\n perpendicularPoint = math.perpendicularPointToLine({\r\n distance,\r\n line,\r\n })\r\n } else {\r\n return {\r\n P1: { x: x2, y: y2 },\r\n P2: { x: x1, y: y1 },\r\n P3: { x: x1, y: y1 },\r\n P4: { x: x2, y: y2 },\r\n }\r\n }\r\n\r\n const pointOffsetX = perpendicularPoint.x - x2\r\n const pointOffsetY = perpendicularPoint.y - y2\r\n\r\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\r\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\r\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\r\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\r\n\r\n const invertX = this.model.scale.x.invert\r\n const invertY = this.model.scale.y.invert\r\n if (inverted) {\r\n return {\r\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\r\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\r\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\r\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\r\n }\r\n }\r\n return { P1, P2, P3, P4 }\r\n }\r\n\r\n getRotatedPointCoordinates = ({\r\n rotationAxisPoint,\r\n pointToRotate,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n rotationAxisPoint: Point\r\n pointToRotate: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) => {\r\n const angle = math.sharedPointLinesAngle({\r\n sharedPoint: rotationAxisPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n })\r\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n })\r\n return {\r\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\r\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.cursorTargetX += x\r\n this.attrs.cursorTargetY += y\r\n }\r\n\r\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'middleLeft':\r\n const newMiddleLeftPoint = {\r\n x: this.attrs.x1 + difX,\r\n y: this.attrs.y1 + difY,\r\n }\r\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x1: newMiddleLeftPoint.x,\r\n y1: newMiddleLeftPoint.y,\r\n cursorTargetX: middleLeftRotatedCursorPoint.x,\r\n cursorTargetY: middleLeftRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'middleRight':\r\n const newMiddleRightPoint = {\r\n x: this.attrs.x2 + difX,\r\n y: this.attrs.y2 + difY,\r\n }\r\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\r\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\r\n pointToRotate: {\r\n x: this.scaled.cursorTargetX,\r\n y: this.scaled.cursorTargetY,\r\n },\r\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\r\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\r\n })\r\n this.attrs = {\r\n ...this.attrs,\r\n x2: newMiddleRightPoint.x,\r\n y2: newMiddleRightPoint.y,\r\n cursorTargetX: middleRightRotatedCursorPoint.x,\r\n cursorTargetY: middleRightRotatedCursorPoint.y,\r\n }\r\n break\r\n case 'topRight':\r\n case 'topLeft':\r\n case 'bottomLeft':\r\n case 'bottomRight':\r\n this.attrs = {\r\n ...this.attrs,\r\n cursorTargetX: area.x,\r\n cursorTargetY: area.y,\r\n }\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const coordinates = this.getRectCoordinates()\r\n const polygon = Object.keys(coordinates).map((point) => ({\r\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\r\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n\r\n getIsInChartView() {\r\n return true\r\n }\r\n}\r\n\r\nRotatedRectangleV1.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1, default: {} },\r\n ],\r\n}\r\n\r\nexport default RotatedRectangleV1\r\n","import { DrawingBorder, PaneArea } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Line from './line'\r\n\r\nexport interface IScaledLineAttrs {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n dashLength: number\r\n lineWidth: number\r\n strokeStyle: string\r\n border: DrawingBorder\r\n}\r\n\r\nclass ScaledLine extends Line {\r\n static type = CanvasElementType.scaledLine\r\n\r\n name = 'Line'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n border: {\r\n width: 1,\r\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, y1, y2 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\r\n\r\n context.translate(translateXY.x, translateXY.y)\r\n context.beginPath()\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n if (this.attrs.dashLength) {\r\n context.setLineDash([this.attrs.dashLength])\r\n }\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n}\r\n\r\nScaledLine.prototype.modalConfig = {\r\n inputs: [{ type: 'line', name: 'border' }],\r\n}\r\n\r\nexport default ScaledLine\r\n","import merge from 'lodash.merge'\r\n\r\nimport { PaneArea } from '../../types/shared'\r\nimport { PADDING } from '../constants/common'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport Text, { ITextAttrs } from './text'\r\n\r\ninterface FontFamilyHeightCoefficient {\r\n Arial: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n Verdana: {\r\n firstLine: number\r\n otherLines: number\r\n }\r\n}\r\n\r\nclass ScaledText extends Text {\r\n static type = CanvasElementType.scaledText\r\n\r\n name = 'Text'\r\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\r\n declare lastAttrs: Attrs\r\n declare scaled: Partial\r\n declare measuredHeight: number\r\n\r\n declare font: string\r\n declare context?: CanvasRenderingContext2D\r\n declare lines: {\r\n text: string\r\n metrics: TextMetrics\r\n }[]\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale({ x: ['x'], y: ['y'] })\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n this.render(context)\r\n }\r\n\r\n setupTextMetricsCache() {\r\n const ctx = this.context\r\n\r\n if (\r\n (this.attrs.text !== this.lastAttrs?.text ||\r\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)) &&\r\n ctx\r\n ) {\r\n this.lastAttrs = merge({}, this.attrs)\r\n this.lines = this.getLines().map((line) => ({\r\n text: line,\r\n metrics: ctx.measureText(line),\r\n }))\r\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\r\n const lineHeight =\r\n current.metrics.actualBoundingBoxAscent +\r\n current.metrics.actualBoundingBoxDescent +\r\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\r\n return acc + lineHeight\r\n }, 0)\r\n }\r\n }\r\n\r\n // private\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle!)\r\n context.set('textAlign', this.attrs.textAlign!)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n this.setupTextMetricsCache()\r\n }\r\n\r\n // private\r\n renderText() {\r\n if (!this.context) return\r\n let y = this.scaled.y! + this.attrs.padding.top\r\n let previousDescent = 0\r\n for (let i = 0; i < this.lines.length; i++) {\r\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\r\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\r\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\r\n }\r\n }\r\n\r\n // private\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n\r\n this.context.beginPath()\r\n this.context.rect(\r\n this.scaled.x! - padding,\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\r\n this.width + padding * 2,\r\n this.measuredHeight + padding * 2\r\n )\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle!)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n // TODO\r\n // if @attrs.textBaseline == 'middle'\r\n // rect.y = @attrs.y - rect.height/2\r\n if (\r\n this.lines &&\r\n this.scaled.x! < area.scaled.x &&\r\n area.scaled.x < this.scaled.x! + this.width &&\r\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\r\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\r\n ) {\r\n return true\r\n }\r\n return this.thumbsAreInArea(area)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (this.getIsCreator()) {\r\n return true\r\n }\r\n\r\n if (!this.lines) {\r\n return true\r\n }\r\n\r\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\r\n const textBoxX = this.scaled.x! - padding\r\n const textBoxY = this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding\r\n const textBoxWidth = this.width + padding * 2\r\n const textBoxHeight = this.measuredHeight + padding * 2\r\n\r\n if (\r\n textBoxX <= -chart.leftOffset + chart.width &&\r\n textBoxX + textBoxWidth >= -chart.leftOffset &&\r\n textBoxY <= this.model.height &&\r\n textBoxY + textBoxHeight >= 0\r\n ) {\r\n return true\r\n }\r\n\r\n return false\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += x\r\n this.attrs.y! += y\r\n }\r\n}\r\n\r\nexport default ScaledText\r\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport Element, { TodoModalConfig } from './element'\r\n\r\nexport interface Area {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type ITextAttrs = RequireByKey & Partial\r\n\r\nconst DEFAULTS: Partial = {\r\n text: '',\r\n font: {\r\n size: 20,\r\n family: 'Arial',\r\n style: 'normal',\r\n weight: 'normal',\r\n },\r\n lineHeight: 20,\r\n // left | right | center | start | end\r\n textAlign: TextAlign.left,\r\n // top | hanging | middle | alphabetic | ideographic | bottom\r\n textBaseline: TextBaseline.alphabetic,\r\n padding: {\r\n top: 0,\r\n right: 0,\r\n bottom: 0,\r\n left: 0,\r\n },\r\n}\r\n\r\nclass Text extends Element {\r\n static type = CanvasElementType.text\r\n\r\n static getMergedPropsWithDefaults>(\r\n propKey: T,\r\n props: Partial = {}\r\n ) {\r\n return {\r\n ...DEFAULTS[propKey],\r\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\r\n }\r\n }\r\n\r\n name = 'Anchored text'\r\n declare context?: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare font: string\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\r\n if (this.context) {\r\n this.setupContext(this.context)\r\n }\r\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const count = this.getLines().length\r\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'font', {\r\n get() {\r\n const f = this.attrs.font\r\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\r\n },\r\n })\r\n }\r\n\r\n getModalConfigBase() {\r\n return {\r\n inputs: [\r\n { type: 'multiline_string', name: 'text', required: true },\r\n { type: 'font', name: 'font' },\r\n {\r\n type: 'background',\r\n name: 'fillStyle',\r\n label: 'Color',\r\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n },\r\n {\r\n type: 'background',\r\n name: 'background',\r\n label: 'Background',\r\n default: 'rgba(0,0,0,0)',\r\n },\r\n {\r\n type: 'border',\r\n name: 'border',\r\n min: 0,\r\n default: { color: 'rgba(0,0,0)', width: 0 },\r\n },\r\n ],\r\n } as unknown as TodoModalConfig\r\n }\r\n\r\n getDefaults() {\r\n return {\r\n ...DEFAULTS,\r\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (obj.font?.size && !obj.lineHeight) {\r\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\r\n }\r\n return this\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.setupContext(context)\r\n if (this.attrs.angle && this.context) {\r\n // TODO background & multiline text\r\n this.context.save()\r\n this.context.translate(this.attrs.x!, this.attrs.y!)\r\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\r\n this.context.fillText(this.attrs.text, 0, 0)\r\n this.context.restore()\r\n } else {\r\n this.renderBackground()\r\n this.renderText()\r\n }\r\n }\r\n\r\n measure(context?: CanvasRenderingContext2D) {\r\n if (context) {\r\n this.setupContext(context)\r\n }\r\n const lines = this.getLines()\r\n let max = 0\r\n for (const line of lines) {\r\n max = Math.max(this.context?.measureText(line).width ?? Number.MIN_SAFE_INTEGER, max)\r\n }\r\n return ~~max\r\n }\r\n\r\n isInArea(testArea: PaneArea) {\r\n const area = this.convertArea(testArea)\r\n // TODO iny align\r\n if (\r\n this.attrs.x! < area.x &&\r\n area.x < this.attrs.x! + this.width &&\r\n this.attrs.y! - this.attrs.font.size < area.y &&\r\n area.y < this.attrs.y! - this.attrs.font.size + this.height\r\n ) {\r\n return true\r\n }\r\n return super.isInArea(testArea)\r\n }\r\n\r\n setupContext(context: CanvasRenderingContext2D) {\r\n this.context = context\r\n context.set('font', this.font)\r\n context.set('fillStyle', this.attrs.fillStyle)\r\n context.set('textAlign', this.attrs.textAlign)\r\n context.set('textBaseline', this.attrs.textBaseline)\r\n }\r\n\r\n getLines() {\r\n return this.attrs.text.toString().split('\\n')\r\n }\r\n\r\n renderText() {\r\n if (!this.context) return\r\n let { y } = this.attrs // + @attrs.padding.top\r\n for (const line of this.getLines()) {\r\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\r\n y! += this.attrs.lineHeight\r\n }\r\n }\r\n\r\n renderBackground() {\r\n if (!this.attrs.background || !this.context) {\r\n return\r\n }\r\n\r\n const { width } = this\r\n const { height } = this\r\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\r\n const { x } = this.attrs\r\n let y = this.attrs.y! - height\r\n\r\n if (this.attrs.textBaseline === 'middle') {\r\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\r\n } else if (this.attrs.textBaseline === 'alphabetic') {\r\n y = this.attrs.y! - this.attrs.lineHeight\r\n }\r\n\r\n this.context.beginPath()\r\n this.context.set('fillStyle', this.attrs.background)\r\n this.context.rect(x!, y, width, height)\r\n this.context.fill()\r\n this.context.set('fillStyle', this.attrs.fillStyle)\r\n this.renderBorder()\r\n this.context.closePath()\r\n }\r\n\r\n renderBorder() {\r\n const { lineWidth = 0, strokeStyle, border } = this.attrs\r\n const borderWidth = border?.width ?? 0\r\n\r\n if ((lineWidth || this.attrs.strokeStyle || borderWidth > 0) && this.context) {\r\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\r\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n private convertArea(area: PaneArea) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n return {\r\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\r\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x! += this.model.scale.x(x) + 1\r\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\r\n }\r\n\r\n getHeight() {\r\n return this.height\r\n }\r\n}\r\n\r\nText.initClass()\r\n\r\nexport default Text\r\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\r\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\r\nimport PaneModel from '../models/pane'\r\n\r\ntype Area = PaneArea\r\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\r\ntype ScaleFunc = () => number\r\n\r\nclass Thumb {\r\n type: ThumbType\r\n lastX = 0\r\n lastY = 0\r\n fx: ScaleFunc\r\n fy: ScaleFunc\r\n resize: ResizeFunc\r\n model: PaneModel\r\n\r\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\r\n this.type = type\r\n this.fx = fx\r\n this.fy = fy\r\n this.resize = resize\r\n this.model = model\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n context.set('fillStyle', ThumbSettings.color)\r\n context.set('strokeStyle', ThumbSettings.borderColor)\r\n context.set('lineWidth', ThumbSettings.borderWidth)\r\n const x = ~~this.x()\r\n const y = ~~this.y()\r\n const thumbWidth = this.getThumbWidth()\r\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\r\n context.beginPath()\r\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\r\n context.fill()\r\n context.stroke()\r\n }\r\n\r\n startEditing(area: Area) {\r\n this.lastX = area.x\r\n return (this.lastY = area.y)\r\n }\r\n\r\n moveTo(area: Area) {\r\n const difX = area.x - this.lastX\r\n const difY = area.y - this.lastY\r\n this.resize({ type: this.type, difX, difY, area })\r\n this.lastX = area.x\r\n this.lastY = area.y\r\n }\r\n\r\n isInArea(area: Area) {\r\n const width = this.model.scale.x.invert(this.getThumbWidth())\r\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\r\n // +- width/2 because we have coordinates of a center\r\n if (\r\n this.fx() + width / 2 >= area.x &&\r\n this.fx() - width / 2 <= area.x &&\r\n this.fy() + height / 2 > area.y &&\r\n this.fy() - height / 2 < area.y\r\n ) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getThumbWidth() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n }\r\n\r\n x() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\r\n }\r\n\r\n y() {\r\n const { ThumbSettings } = this.model.getChartLayoutSettings()\r\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\r\n }\r\n}\r\n\r\nexport default Thumb\r\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Thumb from './thumb'\r\n\r\nexport interface ITriangleAttrs {\r\n x1: number\r\n x2: number\r\n x3: number\r\n y1: number\r\n y2: number\r\n y3: number\r\n fill: string\r\n border: string\r\n}\r\n\r\nclass Triangle extends Element {\r\n static type = CanvasElementType.triangle\r\n\r\n declare scaled: Pick\r\n name = 'Triangle'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.x1,\r\n () => this.attrs.y1,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.x2,\r\n () => this.attrs.y2,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.x3,\r\n () => this.attrs.y3,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\r\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n\r\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\r\n\r\n context.translate(offset, offset)\r\n context.beginPath()\r\n context.moveTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.lineTo(roundedXY.x3, roundedXY.y3)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.fill()\r\n context.translate(offset * -1, offset * -1)\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n context.set('strokeStyle', this.attrs.border)\r\n context.stroke()\r\n this.renderThumbs(context)\r\n }\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n this.attrs.x1 += x\r\n this.attrs.y1 += y\r\n this.attrs.x2 += x\r\n this.attrs.y2 += y\r\n this.attrs.x3 += x\r\n this.attrs.y3 += y\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n switch (type) {\r\n case 'a':\r\n this.attrs.x1 += difX\r\n this.attrs.y1 += difY\r\n break\r\n case 'b':\r\n this.attrs.x2 += difX\r\n this.attrs.y2 += difY\r\n break\r\n case 'c':\r\n this.attrs.x3 += difX\r\n this.attrs.y3 += difY\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n const polygon = [1, 2, 3].map((i) => ({\r\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\r\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\r\n }))\r\n if (math.pointInPolygon(area.scaled, polygon)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nTriangle.prototype.modalConfig = {\r\n inputs: [{ type: 'background', name: 'fill' }],\r\n}\r\n\r\nexport default Triangle\r\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport PaneModel from '../models/pane'\r\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\r\n\r\nclass VerticalLine extends ScaledLine {\r\n static type = CanvasElementType.verticalLine\r\n\r\n name = 'Vertical line'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.renderContent = this.renderContent.bind(this)\r\n\r\n this.attrs.x2 = this.attrs.x1\r\n this._thumbs = [this._thumbs[0]]\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const domain = this.model.scale.y.domain()\r\n this.attrs.y1 = domain[0]\r\n this.attrs.y2 = domain[1]\r\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\r\n super.renderContent(context)\r\n }\r\n\r\n moveBy(x: number) {\r\n return (this.attrs.x1 = this.attrs.x2 += x)\r\n }\r\n\r\n resize({ difX }: RequireByKey) {\r\n return this.moveBy(difX)\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n return super.getIsInChartView(chart, { omitY: true })\r\n }\r\n}\r\n\r\nexport default VerticalLine\r\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\r\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport PaneModel from '../models/pane'\r\nimport Element from './element'\r\nimport Text, { ITextAttrs } from './text'\r\nimport Thumb from './thumb'\r\n\r\nexport interface IXABCDPositionAttrs {\r\n xx: number\r\n xy: number\r\n ax: number\r\n ay: number\r\n bx: number\r\n by: number\r\n cx: number\r\n cy: number\r\n dx: number\r\n dy: number\r\n}\r\n\r\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\r\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\r\n\r\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\r\n fill: string\r\n border: DrawingBorder\r\n lineWidth: number\r\n}\r\n\r\nclass XABCD extends Element {\r\n static type = CanvasElementType.xabcd\r\n\r\n name = 'XABCD pattern'\r\n\r\n declare scaled: Pick\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n\r\n this.resize = this.resize.bind(this)\r\n\r\n this._thumbs = [\r\n new Thumb(\r\n 'x',\r\n () => this.attrs.xx,\r\n () => this.attrs.xy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'a',\r\n () => this.attrs.ax,\r\n () => this.attrs.ay,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'b',\r\n () => this.attrs.bx,\r\n () => this.attrs.by,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'c',\r\n () => this.attrs.cx,\r\n () => this.attrs.cy,\r\n this.resize,\r\n this.model\r\n ),\r\n new Thumb(\r\n 'd',\r\n () => this.attrs.dx,\r\n () => this.attrs.dy,\r\n this.resize,\r\n this.model\r\n ),\r\n ]\r\n if (this.attrs.lineWidth == null) {\r\n this.attrs.lineWidth = 1\r\n }\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getDefaults() {\r\n const { ElementSettings } = this.getChartLayoutSettings()\r\n return {\r\n fill: ElementSettings.defaultFill,\r\n border: {\r\n width: 1,\r\n color: ElementSettings.Colors.border,\r\n },\r\n } as Partial\r\n }\r\n\r\n getBoundingPointKeys = () => ({\r\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\r\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\r\n })\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\r\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\r\n\r\n context.set('fillStyle', this.attrs.fill)\r\n context.set('lineWidth', this.attrs.border.width)\r\n context.set('strokeStyle', this.attrs.border.color)\r\n\r\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\r\n context.translate(offset, offset)\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.xx, roundedXY.xy)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.bx, roundedXY.by)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.lineTo(roundedXY.bx, roundedXY.by)\r\n context.fill()\r\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\r\n context.stroke()\r\n }\r\n\r\n context.beginPath()\r\n context.moveTo(roundedXY.ax, roundedXY.ay)\r\n context.lineTo(roundedXY.cx, roundedXY.cy)\r\n context.moveTo(roundedXY.xx, roundedXY.xy)\r\n context.lineTo(roundedXY.dx, roundedXY.dy)\r\n context.stroke()\r\n\r\n const text = new Text(\r\n {\r\n font: { size: 8, style: 'bold' },\r\n lineHeight: 8,\r\n padding: {\r\n top: 2,\r\n right: 2,\r\n bottom: 2,\r\n left: 2,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.start,\r\n fillStyle: '#ffffff',\r\n background: this.attrs.fill || '#000000',\r\n },\r\n this.model\r\n )\r\n\r\n for (const t of Array.from('xabcd')) {\r\n text\r\n .set({\r\n text: t.toUpperCase(),\r\n x: roundedXY[(t + 'x') as xPoints] - 6,\r\n y: roundedXY[(t + 'y') as yPoints] + 12,\r\n } as Partial)\r\n .render(context)\r\n }\r\n\r\n const retLabel = (y1: string, y2: string, y3: string) => {\r\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\r\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\r\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\r\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\r\n return text\r\n .set({\r\n text: ret.toFixed(3),\r\n x,\r\n y,\r\n })\r\n .render(context)\r\n }\r\n\r\n retLabel('x', 'a', 'b')\r\n retLabel('a', 'b', 'c')\r\n retLabel('b', 'c', 'd')\r\n retLabel('x', 'a', 'd')\r\n\r\n if (this.getShouldRenderThumbs()) {\r\n this.renderThumbs(context)\r\n }\r\n context.translate(offset * -1, offset * -1)\r\n }\r\n\r\n moveBy(x: number, y: number) {\r\n for (const t of Array.from('xabcd')) {\r\n this.attrs[(t + 'x') as xPoints] += x\r\n this.attrs[(t + 'y') as yPoints] += y\r\n }\r\n }\r\n\r\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\r\n this.attrs[(type + 'x') as xPoints] += difX\r\n return (this.attrs[(type + 'y') as yPoints] += difY)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (super.isDrawingElementLockedOrInvisible()) return false\r\n let t\r\n const xab = (() => {\r\n const result = []\r\n for (t of Array.from('xab')) {\r\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result\r\n })()\r\n const bcd = (() => {\r\n const result1 = []\r\n for (t of Array.from('bcd')) {\r\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\r\n }\r\n return result1\r\n })()\r\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\r\n return true\r\n }\r\n return super.isInArea(area)\r\n }\r\n}\r\n\r\nXABCD.prototype.modalConfig = {\r\n inputs: [\r\n { type: 'background', name: 'fill' },\r\n { type: 'border', name: 'border', min: 1 },\r\n ],\r\n}\r\n\r\nexport default XABCD\r\n","import Utils from '../utils'\r\nimport { getContextWithCache } from '../utils/canvas'\r\nimport { captureException, getIsSSr } from '../utils/helpers'\r\n\r\nclass Cache {\r\n constructor() {\r\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\r\n }\r\n\r\n set(callback, width, height) {\r\n this.callback = callback\r\n this.width = width\r\n this.height = height\r\n this.rendered = false\r\n }\r\n\r\n render(context, x, y) {\r\n if (x == null) {\r\n x = 0\r\n }\r\n if (y == null) {\r\n y = 0\r\n }\r\n if (!this.rendered) {\r\n this.refresh()\r\n }\r\n if (this.width < 1 || this.height < 1) {\r\n return\r\n }\r\n\r\n try {\r\n if (this.ratio >= 1 && this.canvas) {\r\n context.drawImage(\r\n this.canvas,\r\n 0,\r\n 0,\r\n ~~(this.width * this.ratio),\r\n ~~(this.height * this.ratio),\r\n x,\r\n y,\r\n this.width,\r\n this.height\r\n )\r\n } else {\r\n context.save()\r\n context.translate(x, y)\r\n this.callback(context)\r\n context.restore()\r\n }\r\n } catch (e) {\r\n captureException(\r\n e,\r\n this.canvas\r\n ? {\r\n extra: {\r\n width: this.width,\r\n height: this.height,\r\n ratio: this.ratio,\r\n cWidth: this.canvas.width,\r\n cHeight: this.canvas.height,\r\n sWidth: window.screen.width,\r\n sHeight: window.screen.height,\r\n },\r\n }\r\n : {}\r\n )\r\n }\r\n }\r\n\r\n refresh() {\r\n if (getIsSSr()) {\r\n return\r\n }\r\n this.canvas.width = this.width\r\n this.canvas.height = this.height\r\n this.context = getContextWithCache(this.canvas)\r\n this.ratio = Utils.getScaleRatio()\r\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\r\n this.context.scale(this.ratio, this.ratio)\r\n\r\n this.callback(this.context)\r\n this.rendered = true\r\n }\r\n}\r\n\r\nexport default Cache\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { TextAlign, TextBaseline } from '../../constants/common'\r\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\r\n\r\nexport enum OHLCType {\r\n singleLine = 'singleLine',\r\n dateOnly = 'dateOnly',\r\n timeOnly = 'timeOnly',\r\n}\r\n\r\nexport interface IMargin {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IPadding {\r\n top?: number\r\n right?: number\r\n bottom?: number\r\n left?: number\r\n}\r\n\r\ninterface IGenericText {\r\n margin: IMargin\r\n font: IFont\r\n}\r\n\r\ninterface IFont {\r\n size?: number\r\n style?: string\r\n weight?: string\r\n family?: string\r\n lineHeight?: number\r\n padding?: IPadding\r\n baseline?: TextBaseline\r\n textAlign?: TextAlign\r\n}\r\n\r\ninterface ISettingsGeneralBase {\r\n Colors: IChartThemeColors\r\n}\r\n\r\nexport interface ISettingsCenterBase {\r\n barWidth: number\r\n barMargin: number\r\n border: number\r\n volumeHeight?: number\r\n}\r\n\r\ninterface ISettingsTopBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsBottomBase {\r\n height: number\r\n}\r\n\r\ninterface ISettingsLeftBase {\r\n width: number\r\n}\r\n\r\ninterface ISettingsRightBase {\r\n width: number\r\n}\r\n\r\nexport interface ISettings {\r\n ChartSettings: IChartSettings\r\n IndicatorSettings: IIndicatorSettings\r\n MarketSentimentSettings: IMarketSentimentChartSettings\r\n ColorsSettings: Array\r\n ThumbSettings: IThumbSettings\r\n ElementSettings: IElementSettings\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport interface IChartSettings {\r\n general: IChartGeneral\r\n center: ISettingsCenterBase\r\n top: IChartTop\r\n bottom: IChartBottom\r\n left: IChartLeft\r\n right: IChartRight\r\n}\r\n\r\ninterface IChartGeneral {\r\n settingsHeight: number\r\n tickerTimeframeChangeHeight: number\r\n Colors: IChartThemeColors & ObjectHash\r\n}\r\n\r\ninterface IChartTop extends ISettingsTopBase {\r\n baseline: TextBaseline\r\n ticker: IGenericText\r\n ohlc: IOHLC\r\n change: IGenericText\r\n}\r\n\r\ninterface IOHLC extends IGenericText {\r\n type?: OHLCType\r\n}\r\n\r\ninterface IChartBottom extends ISettingsBottomBase {\r\n baseline: TextBaseline\r\n axis: IGenericText\r\n}\r\n\r\ninterface IChartLeft extends ISettingsLeftBase {\r\n overlayLabel: IOverlayLabel\r\n timeframe: IGenericText\r\n volumeAxis: IGenericText\r\n}\r\n\r\ninterface IOverlayLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IChartRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\nexport interface IIndicatorSettings {\r\n general: IIndicatorGeneral\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: IIndicatorLeft\r\n right: IIndicatorRight\r\n}\r\n\r\ninterface IIndicatorRight extends ISettingsRightBase {\r\n axis: IGenericText\r\n}\r\n\r\ninterface IIndicatorLeft extends ISettingsLeftBase {\r\n indicatorLabel: IIndicatorLabel\r\n}\r\n\r\ninterface IIndicatorLabel extends IGenericText {\r\n labelSpacing: number\r\n}\r\n\r\ninterface IIndicatorGeneral {\r\n Colors: IIndicatorThemeColors\r\n height: number\r\n}\r\n\r\ninterface IMarketSentimentChartSettings {\r\n general: ISettingsGeneralBase\r\n center: ISettingsCenterBase\r\n top: ISettingsTopBase\r\n bottom: ISettingsBottomBase\r\n left: ISettingsLeftBase\r\n right: ISettingsRightBase\r\n}\r\n\r\ninterface IThumbSettings {\r\n size: number\r\n touchSize: number\r\n color: string\r\n borderWidth: number\r\n borderColor: string\r\n}\r\n\r\ninterface IElementSettings {\r\n Colors: IElementThemeColors\r\n defaultFill: string\r\n defaultTransparentFill: string\r\n}\r\n","export enum ChartMinWidthBreakpoints {\r\n xs = 0,\r\n s = 480,\r\n m = 768,\r\n l = 1024,\r\n}\r\n\r\nexport function getChartBreakpoints(chartWidthInPx: number) {\r\n return {\r\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\r\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\r\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\r\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n Instrument,\r\n Maybe,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Cache from '../canvas/cache'\r\nimport Element from '../canvas/element'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n CHART_MARGIN,\r\n ChartElementType,\r\n FONT_SIZE,\r\n IndicatorType,\r\n IntradayTimeframeInterval,\r\n LINE_HEIGHT,\r\n MONTHS,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAMES_WITH_PRE_MARKET,\r\n TextAlign,\r\n TextBaseline,\r\n getTimeframeLabel,\r\n} from '../constants/common'\r\nimport {\r\n getIsSmallIndexChart,\r\n getPercentageFromValue,\r\n getTranslate,\r\n getValueFromPercentage,\r\n} from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport { getColorOverwrites } from '../models/chart_settings'\r\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\r\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\r\nimport mouseModel from '../models/mouse'\r\nimport PaneModel, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Overlay from '../overlays/overlay'\r\nimport { overlaysByType } from '../overlays/overlays'\r\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\r\nimport {\r\n ITickerChange,\r\n getBarWidthWithMargin,\r\n getBarWithoutMarginWidth,\r\n getChangeColor,\r\n getHalfBarWidth,\r\n getShouldUseDarkerWickColors,\r\n getTickerChange,\r\n getTickerChangeFromCloseValues,\r\n getVirtualTimeframeTradedDates,\r\n renderCross,\r\n round,\r\n unmountCanvas,\r\n} from '../utils/chart'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\r\nimport { setElementCursor } from '../utils/cursor'\r\nimport { drawInVisibleArea, getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getChartBreakpoints } from './utils'\r\n\r\nexport interface BaseChartAttrs {\r\n overlays: Required['overlays']\r\n}\r\n\r\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\r\n\r\ninterface LastOHLCAttrs {\r\n text: string\r\n x: number\r\n y: number\r\n width: number\r\n textBaseline: TextBaseline\r\n textAlign: TextAlign\r\n}\r\n\r\ninterface IRenderOHLCParameters {\r\n context: CanvasRenderingContext2D\r\n date: Maybe\r\n open?: Maybe\r\n high?: Maybe\r\n low?: Maybe\r\n close?: Maybe\r\n volume?: Maybe\r\n afterHour?: string\r\n isSmallIndexChart?: boolean\r\n isNewestOHLC?: boolean\r\n directRender?: boolean\r\n time?: string\r\n changePercentage?: Maybe\r\n}\r\n\r\ninterface XAxisLabel {\r\n x: number\r\n text: string\r\n textWidth: number\r\n hasPriority?: boolean\r\n allowedOverflow?: number\r\n}\r\n\r\ninterface IRenderXAxisProps {\r\n textRenderer: Text\r\n startBarIndex: number\r\n endBarIndex: number\r\n}\r\n\r\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n const t =\r\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\r\n ':' +\r\n date.getMinutes().toString().padLeft('00') +\r\n (date.getHours() < 12 ? 'AM' : 'PM')\r\n dateString = `${MONTHS[month]} ${day} ${t}`\r\n break\r\n case TIMEFRAME.d:\r\n case TIMEFRAME.w:\r\n dateString = `${MONTHS[month]} ${day}`\r\n break\r\n case TIMEFRAME.m:\r\n dateString = `${MONTHS[month]} ${year}`\r\n break\r\n default:\r\n break\r\n }\r\n\r\n return dateString\r\n}\r\n\r\nconst getIsOverlapping = ({\r\n x,\r\n textWidth,\r\n renderedLabelRanges,\r\n}: {\r\n x: number\r\n textWidth: number\r\n renderedLabelRanges: Array<{ from: number; to: number }>\r\n}) =>\r\n renderedLabelRanges.some(({ from, to }) => {\r\n const minX = x - textWidth / 2\r\n const maxX = x + textWidth / 2\r\n return (from < maxX && maxX < to) || (from < minX && minX < to)\r\n })\r\n\r\nfunction getClosestDifferentMinMaxValueIndices(\r\n currentMinIndex: number,\r\n currentMaxIndex: number,\r\n high: number[],\r\n low: number[]\r\n): { minIndex: number; maxIndex: number } {\r\n const hasPreviousIndex = currentMinIndex > 0\r\n const hasNextIndex = currentMaxIndex < high.length - 1\r\n let minIndex = currentMinIndex\r\n let maxIndex = currentMaxIndex\r\n if (hasPreviousIndex) {\r\n minIndex -= 1\r\n }\r\n if (hasNextIndex) {\r\n maxIndex += 1\r\n }\r\n\r\n if (low[minIndex] === high[maxIndex] && (hasPreviousIndex || hasNextIndex)) {\r\n return getClosestDifferentMinMaxValueIndices(minIndex, maxIndex, high, low)\r\n }\r\n\r\n return low[minIndex] < high[maxIndex] ? { minIndex, maxIndex } : { minIndex: maxIndex, maxIndex: minIndex }\r\n}\r\n\r\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\r\n\r\nconst gray300 = tailwindColors.gray[300]\r\n\r\nclass BaseChart extends Element {\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\r\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\r\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\r\n }\r\n\r\n static label = 'Chart'\r\n static iconName = ''\r\n\r\n paneModel: PaneModel\r\n model: Chart\r\n data: Quote\r\n specificChartFunctionality: SpecificChartFunctionality\r\n tickerWidth = 0\r\n changeWidth = 0\r\n lastOhlc: Array> = []\r\n overlays: Overlay[] = []\r\n isLargeChart?: boolean\r\n shouldRenderVolume = true\r\n afterChange: {\r\n x: number\r\n y: number\r\n width: number\r\n } | null = null\r\n\r\n declare setupAxisTimeFrame: string\r\n declare volumeFY: d3.ScaleLinear\r\n declare tickerText: Text\r\n declare baseCache: Cache\r\n declare leftOffset: number\r\n declare context: CanvasRenderingContext2D\r\n declare width: number\r\n declare height: number\r\n declare isMobile: boolean\r\n\r\n constructor(values: Partial, paneModel: PaneModel) {\r\n super(values, paneModel)\r\n\r\n this.paneModel = paneModel\r\n this.model = this.paneModel.chart()\r\n this.data = this.model.quote()\r\n const chartLayoutModel = this.model.chart_layout()\r\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\r\n this.isLargeChart = chartLayoutModel.isLargeChart\r\n this.isMobile = utils.isMobile(true)\r\n\r\n this.overlays = []\r\n if (values.overlays) {\r\n for (const overlayDefinition of values.overlays) {\r\n // overlayDefinition.color coming from DB is always string however overlays\r\n // internaly didn't use format as in db (type, color, period) but rather\r\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\r\n // thus overlayDefinition.color might be undefined\r\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\r\n // but for now (!overlayDefinition.color) check solve issue as well\r\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\r\n {\r\n ...overlayDefinition,\r\n color:\r\n !overlayDefinition.color || overlayDefinition.color.includes('|')\r\n ? ''\r\n : convertColorToHEX(overlayDefinition.color),\r\n },\r\n this.paneModel\r\n )\r\n this.addOverlay(overlay)\r\n }\r\n delete values.overlays\r\n }\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n\r\n // this.paneModel.bind('update', this.setupAxis.bind(this))\r\n this.paneModel.bind('update', this.setupCache)\r\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\r\n this.model = this.paneModel.chart()\r\n // this.model.bind('change', this.setupAxis.bind(this))\r\n this.model.bind('change', this.setupCache)\r\n this.model.bind('change', this.trigger.bind(this, 'change'))\r\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n this.model.unbind('change', this.setupCache)\r\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n unmountCanvas(this.baseCache.canvas)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart_layout().bind('theme', this.setupCache)\r\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\r\n\r\n this.setupCache()\r\n }\r\n\r\n renderChart() {\r\n throw Error('Implement renderChart')\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n\r\n if (this.data.close.length === 0) {\r\n this.renderChartNotAvailable()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n return\r\n }\r\n\r\n this.context.save()\r\n this.clip()\r\n this.renderVolume()\r\n this.renderChart()\r\n this.renderOverlays()\r\n this.renderPrevClose()\r\n this.renderFadeExtendedHours()\r\n this.context.restore()\r\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\r\n }\r\n\r\n renderGrid(context: CanvasRenderingContext2D) {\r\n this.data = this.model.quote()\r\n this.leftOffset = this.model.leftOffset\r\n this.context = context\r\n // text, xAxis, volumeAxis\r\n this.renderXAxis()\r\n this.baseCache.render(context)\r\n }\r\n\r\n renderTicker(context: CanvasRenderingContext2D) {\r\n if (this.tickerText) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.translate(ChartSettings.left.width, 0)\r\n this.tickerText.render(context)\r\n\r\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\r\n const { Colors } = ChartSettings.general\r\n new Text(\r\n {\r\n text: 'ETF',\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\r\n font: { size: FONT_SIZE.XXS },\r\n fillStyle: Colors.text,\r\n textBaseline: ChartSettings.top.baseline,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n context.translate(-ChartSettings.left.width, 0)\r\n }\r\n }\r\n\r\n renderTimeframe(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const quote = this.model.quote()\r\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\r\n\r\n return new Text(\r\n {\r\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\r\n x: ChartSettings.left.timeframe.margin.left,\r\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\r\n angle: -90,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n } else {\r\n this.tickerText = new Text(\r\n {\r\n text: this.data.name || this.data.ticker,\r\n x: ChartSettings.top.ticker.margin.left,\r\n y: ChartSettings.top.ticker.margin.top,\r\n font: { size: FONT_SIZE.L, style: 'bold' },\r\n fillStyle: Colors.text,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n this.tickerWidth = this.tickerText.measure(context)\r\n\r\n // render watermark on backend chart\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n let yOffset = 0\r\n if (!isOurSiteRequest) {\r\n yOffset = this.isLargeChart ? -2 : -3\r\n }\r\n new Text(\r\n {\r\n text: '© finviz.com',\r\n x: this.width + ChartSettings.right.width - 2,\r\n y: 1 + yOffset,\r\n font: { size: isOurSiteRequest ? FONT_SIZE.XS : FONT_SIZE.M },\r\n textAlign: TextAlign.right,\r\n textBaseline: TextBaseline.top,\r\n fillStyle: isOurSiteRequest ? 'rgb(136, 193, 233)' : tailwindColors.finviz.blue,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderChange({ context })\r\n if (!this.lastOhlc[0]) {\r\n this.getOHLC({ context, directRender: false })\r\n }\r\n this.getOHLC({ context })\r\n }\r\n\r\n context.restore()\r\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderTimeframe(context)\r\n }\r\n }\r\n\r\n getOHLC({\r\n context,\r\n directRender = true,\r\n data,\r\n date,\r\n dateString = null,\r\n changePercentage = null,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n directRender?: boolean\r\n data?: {\r\n open?: string\r\n high?: string\r\n low?: string\r\n close?: string\r\n volume?: string\r\n }\r\n date?: Date\r\n dateString?: string | null\r\n changePercentage?: ITickerChange | null\r\n }) {\r\n if (!this.data.lastDate) return\r\n\r\n // modulo \"parsing\" is 100% faster than with str.slice()\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n isSmallIndexChart: true,\r\n isNewestOHLC: true,\r\n directRender,\r\n })\r\n } else if (data && date) {\r\n this.renderOHLC({\r\n context,\r\n date: getDateString({ date, timeframe: this.data.timeframe }),\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\r\n directRender,\r\n changePercentage,\r\n })\r\n } else if (dateString !== null) {\r\n this.renderOHLC({\r\n context,\r\n date: dateString,\r\n open: null,\r\n high: null,\r\n low: null,\r\n close: null,\r\n volume: null,\r\n directRender,\r\n })\r\n } else {\r\n this.renderOHLC({\r\n context,\r\n date: lastDate,\r\n afterHour:\r\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\r\n ? this.roundOhlc(this.data.afterClose)\r\n : undefined,\r\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\r\n isNewestOHLC: true,\r\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n }),\r\n directRender,\r\n ...this.getRoundedLastData(),\r\n })\r\n }\r\n }\r\n\r\n getRoundedLastData() {\r\n return {\r\n open: this.roundOhlc(this.data.lastOpen),\r\n high: this.roundOhlc(this.data.lastHigh),\r\n low: this.roundOhlc(this.data.lastLow),\r\n close: this.roundOhlc(this.data.lastClose),\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabelsQuotePage(context)\r\n } else if (this.data.close.length !== 0) {\r\n this.renderOverlaysLabelsChartsPage(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.overlayLabel.margin.left,\r\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n text\r\n .set({\r\n text: overlay.toString(),\r\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\r\n fillStyle: overlay.getLabelColor(),\r\n })\r\n .render(context)\r\n }\r\n }\r\n\r\n getYAxisLeftMargin() {\r\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\r\n return 3\r\n }\r\n return 8\r\n }\r\n\r\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\r\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\r\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\r\n }\r\n return this.round(lastClose)\r\n }\r\n\r\n renderYAxis(\r\n context: CanvasRenderingContext2D,\r\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\r\n renderLabels = true\r\n ) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y, lineTicks, textTicks, lastCloseLabel\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n translate.do()\r\n const tickCount = Math.floor(this.paneModel.height / 35)\r\n const minMax = this.getMinMax()\r\n const { firstVisibleClose } = minMax\r\n const height = this.height\r\n let stepPrice = 0\r\n let placesAxis\r\n\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n\r\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\r\n\r\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\r\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\r\n\r\n const percScale = d3.scaleLinear().range([0, this.height]).domain([maxPerc, minPerc]).nice(10)\r\n textTicks = percScale.ticks(Math.min(tickCount, 9))\r\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n break\r\n }\r\n case ScaleType.Logarithmic: {\r\n if (!firstVisibleClose) return\r\n\r\n const scaleRange = this.paneModel.scaleRange\r\n const { min, max } = scaleRange || minMax\r\n lineTicks = [Math.floor(min)]\r\n const pixelGap = 30\r\n\r\n const negativeScale = []\r\n if (min < 0) {\r\n let previousNegativeTick = Math.min(0, max)\r\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\r\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\r\n if (previousNegativeTick === tick) {\r\n break\r\n }\r\n const range = d3.nice(-previousNegativeTick, -tick, 2)\r\n previousNegativeTick = -range[range.length - 1]\r\n negativeScale.unshift(previousNegativeTick)\r\n }\r\n }\r\n\r\n const positiveScale = []\r\n if (max > 0) {\r\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\r\n }\r\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\r\n const previousTick = positiveScale[positiveScale.length - 1]\r\n const positiveScaleY = this.paneModel.scale.y(positiveScale[positiveScale.length - 1])\r\n const tick = this.paneModel.scale.y.invert(positiveScaleY - pixelGap)\r\n if (previousTick === tick) {\r\n break\r\n }\r\n\r\n const range = d3.nice(previousTick, tick, 2)\r\n positiveScale.push(range[range.length - 1])\r\n }\r\n lineTicks = [...negativeScale, ...positiveScale]\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n break\r\n }\r\n default:\r\n // default to linear scale type\r\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\r\n textTicks = lineTicks\r\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\r\n }\r\n\r\n if (textTicks.length >= 2) {\r\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\r\n }\r\n if (\r\n stepPrice > 10 ||\r\n (getIsSmallIndexChart(this.specificChartFunctionality) && Math.round(textTicks[0]).toString().length > 3) // if small index chart max tick is less than 999 (3 digits) allow for decimals in axis labels\r\n ) {\r\n placesAxis = 0\r\n }\r\n\r\n const getYLineText = (val: number, places?: number) => {\r\n switch (this.model.scale) {\r\n case ScaleType.Percentage:\r\n return `${val}%`\r\n default:\r\n return this.round(val, places)\r\n }\r\n }\r\n\r\n const yTickText = new Text(\r\n {\r\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n\r\n let yTickLine = this.getYLine()\r\n const resetYTicksStyles = () => {\r\n yTickText.set({\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n })\r\n yTickLine = this.getYLine()\r\n }\r\n for (let i = 0; i < lineTicks.length; i++) {\r\n y = Math.round(this.fy(lineTicks[i]))\r\n if (y < 0 || y > height) continue\r\n yTickLine.set({ y1: y, y2: y })\r\n yTickText.set({\r\n text: getYLineText(textTicks[i], placesAxis),\r\n y,\r\n })\r\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\r\n yTickLine.set({ strokeStyle: Colors.text })\r\n yTickText.set({\r\n font: { weight: 'bold', size: yTickText.attrs.font.size },\r\n fillStyle: Colors.percentageZeroLineText,\r\n })\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n resetYTicksStyles()\r\n } else {\r\n yTickLine.render(context)\r\n yTickText.render(context)\r\n }\r\n }\r\n translate.undo()\r\n\r\n if (renderLabels) {\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\r\n // if (typeof this.data.afterClose === 'number') {\r\n // this.renderYAxisLabel({\r\n // context,\r\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n // mainLabelValue: lastClose,\r\n // secondaryLabelValue: this.data.afterClose,\r\n // }),\r\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\r\n // background: this.getSecondaryLabelBackgroundColor(),\r\n // })\r\n // }\r\n }\r\n }\r\n\r\n getSecondaryLabelBackgroundColor() {\r\n return stringifyHSVAColor(\r\n {\r\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\r\n s: 0.3,\r\n },\r\n 'hex'\r\n )\r\n }\r\n\r\n getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue,\r\n secondaryLabelValue,\r\n }: {\r\n mainLabelValue: number\r\n secondaryLabelValue: number\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\r\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\r\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\r\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\r\n const offsetedY = mainLabelValuePosition + offset * direction\r\n\r\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\r\n ? secondaryLabelValuePosition\r\n : offsetedY\r\n }\r\n\r\n renderYAxisLabel({\r\n context,\r\n yCoordinate,\r\n label,\r\n background,\r\n }: {\r\n context: CanvasRenderingContext2D\r\n yCoordinate: number\r\n label: string\r\n background?: string\r\n }) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\r\n const { Colors } = ChartSettings.general\r\n const { size, lineHeight } = ChartSettings.right.axis.font\r\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\r\n\r\n translate.do()\r\n new Text(\r\n {\r\n text: label,\r\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\r\n y: yCoordinate,\r\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\r\n lineHeight,\r\n padding,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle:\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\r\n background: background || Colors.currentBackground,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { leftOffset, width } = this\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n this.context.save()\r\n if (\r\n this.data.getDrawDays() !== 1 &&\r\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\r\n this.data.instrument !== Instrument.MarketSentiment\r\n ) {\r\n this.clip(true)\r\n }\r\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\r\n const textRenderer = new Text(\r\n {\r\n y: this.height + ChartSettings.bottom.axis.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n\r\n // Ticks are placed at the start of each timeframe period (hour/day/month/year).\r\n // The \"-1\" in the code ensures we start searching from one bar outside the visible area,\r\n // avoiding a tick on the first visible index unless it marks the start of a new timeframe period.\r\n // For example, if the start of December is on December 3rd and the first visible bar is on December 14th,\r\n // we won't display a tick.\r\n const startBarIndex = Math.max(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n }).index - 1,\r\n 0\r\n )\r\n\r\n const endBarIndex = Math.min(\r\n getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset,\r\n chartWidth: width,\r\n }).index + 1,\r\n this.data.close.length - 1\r\n )\r\n\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n if (this.data.instrument === Instrument.Stock) {\r\n if (\r\n this.type === ChartElementType.LineChart &&\r\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\r\n this.data.timeframe === 'i5'\r\n ) {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n } else {\r\n this.renderIntradayXAxis(textRenderer)\r\n }\r\n } else {\r\n this.renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i10:\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n this.renderIntradayXAxis(textRenderer)\r\n } else {\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n }\r\n break\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n this.render15MinXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.d:\r\n this.renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.w:\r\n this.renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n case TIMEFRAME.m:\r\n this.renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex })\r\n break\r\n default:\r\n break\r\n }\r\n this.context.restore()\r\n }\r\n\r\n isXPointVisible(x: number, buffer = 0) {\r\n return x >= 0 - buffer && x <= this.width + buffer\r\n }\r\n\r\n renderXAxisLabels({\r\n labels,\r\n textRenderer,\r\n allowedOverflow = 0,\r\n }: {\r\n labels: Omit[]\r\n textRenderer: Text\r\n allowedOverflow?: number\r\n }) {\r\n const sortedLabels: XAxisLabel[] = []\r\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\r\n labels.reverse().forEach((label) => {\r\n textRenderer.set({ text: label.text })\r\n const textWidth = Math.floor(textRenderer.measure(this.context))\r\n const newLabel = { ...label, textWidth }\r\n if (label.hasPriority) {\r\n sortedLabels.unshift(newLabel)\r\n } else {\r\n sortedLabels.push(newLabel)\r\n }\r\n })\r\n\r\n sortedLabels.forEach(({ x, text, textWidth }) => {\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n return\r\n }\r\n const halfOfTextWidth = textWidth / 2\r\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\r\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\r\n let labelX = x\r\n if (overflowLeft < 0) {\r\n labelX = Math.round(x - overflowLeft)\r\n } else if (overflowRight < 0) {\r\n labelX = Math.round(x + overflowRight)\r\n }\r\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\r\n return\r\n }\r\n renderedLabelRanges.push({\r\n from: labelX - halfOfTextWidth - OFFSET.M,\r\n to: labelX + halfOfTextWidth + OFFSET.M,\r\n })\r\n textRenderer.set({ text, x: labelX })\r\n textRenderer.render(this.context)\r\n })\r\n }\r\n\r\n renderIntradayXAxis(textRenderer: Text) {\r\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\r\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\r\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\r\n const labels = []\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n marketEndHour = 16\r\n }\r\n\r\n const xLine = this.getXLine()\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n\r\n const dayToOffset = this.data.getDayToOffset()\r\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\r\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\r\n for (const day in dayToOffset) {\r\n const dayIndex = dayToOffset[day]\r\n const date = dateFromDateString(day)\r\n\r\n for (let i = marketStartHour; i <= marketEndHour; i++) {\r\n let x =\r\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\r\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\r\n this.leftOffset\r\n if (!this.isXPointVisible(x, allowedOverflow)) {\r\n continue\r\n }\r\n let roundedX = Math.round(x)\r\n\r\n if (i === marketStartHour) {\r\n if (isSmallIndexChart) {\r\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\r\n // ~9:30AM\r\n xLine\r\n .set({\r\n x1: roundedX,\r\n x2: roundedX,\r\n })\r\n .render(this.context)\r\n continue\r\n }\r\n if (this.data.premarketLengthMinutes === 0) {\r\n // If there is no premarket, day starts at 9:30 AM\r\n x += (30 / interval) * barWidth\r\n }\r\n roundedX = Math.round(x)\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n hasPriority: true,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x: roundedX,\r\n })\r\n } else {\r\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\r\n labels.push({\r\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\r\n x: roundedX,\r\n })\r\n }\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer, allowedOverflow })\r\n }\r\n\r\n renderIntradayXAxisFutures({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let lastHours = NaN\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n const hours = date.getHours()\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n\r\n if (day !== lastDay) {\r\n lastDay = day\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n x,\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n })\r\n } else if (hours % 2 === 0 && hours !== lastHours) {\r\n lastHours = hours\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n render15MinXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastDay = ''\r\n let x = 0\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const day = date.getDate() + '-' + date.getMonth()\r\n if (day !== lastDay) {\r\n lastDay = day\r\n if (this.data.instrument === Instrument.Stock) {\r\n const barAtMinute = date.getMinutes() + date.getHours() * 60\r\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\r\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\r\n } else {\r\n x = Math.round(this.fx(i) + this.leftOffset)\r\n }\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\r\n x,\r\n })\r\n }\r\n }\r\n\r\n // Offscreen only - if lastDate !== lastBarDate add tick\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\r\n .toString()\r\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\r\n\r\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\r\n const barsInDay = this.data.getBarsInDay()!\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor: this.model.zoomFactor,\r\n chartLayout: this.model.chart_layout(),\r\n })\r\n const dayWidth = barsInDay * barWidth\r\n x += dayWidth\r\n labels.push({\r\n text: lastDate,\r\n x,\r\n })\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n }\r\n }\r\n\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderDailyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n hasPriority: date.getMonth() === 0,\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderWeeklyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastMonth = ''\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n if (date.getMonth() % 3 === 0) {\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n } else {\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: Colors.gridSecondary,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n const isYearLabel = date.getMonth() === 0\r\n labels.push({\r\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\r\n hasPriority: isYearLabel,\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n renderMonthlyXAxis({ textRenderer, startBarIndex, endBarIndex }: IRenderXAxisProps) {\r\n let lastYear = null\r\n\r\n const labels = []\r\n const xLine = this.getXLine()\r\n for (let i = startBarIndex; i <= endBarIndex; i++) {\r\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\r\n const year = date.getFullYear()\r\n const isJanuary = date.getMonth() === 0\r\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\r\n lastYear = year\r\n const x = Math.round(this.fx(i) + this.leftOffset)\r\n if (!this.isXPointVisible(x)) {\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n labels.push({\r\n text: date.getFullYear().toString(),\r\n x,\r\n })\r\n }\r\n }\r\n this.renderXAxisLabels({ labels, textRenderer })\r\n }\r\n\r\n handleIndicatorsChange() {\r\n this.updateShouldRenderVolume()\r\n this.setupCache()\r\n this.trigger('change')\r\n }\r\n\r\n updateShouldRenderVolume() {\r\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\r\n }\r\n\r\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\r\n const maxCount = 5\r\n const minCount = 1\r\n if (count > maxCount) {\r\n count = maxCount\r\n }\r\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\r\n if (count <= minCount) {\r\n return [ticks[ticks.length - 1]]\r\n }\r\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\r\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\r\n // dynamically, we add 3px of space per tick gap\r\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\r\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\r\n }\r\n return ticks\r\n }\r\n\r\n renderVolumeAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\r\n context.save()\r\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\r\n\r\n const x = 20\r\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\r\n const height = this.height * (0.5 * relativeVolume)\r\n\r\n const label = new Text(\r\n {\r\n x: 15,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n for (let i = 0.5; i <= 2; i += 0.5) {\r\n const y = Math.round(fy(i))\r\n label\r\n .set({\r\n text: i.toFixed(1),\r\n y: y,\r\n })\r\n .render(context)\r\n\r\n context.set('strokeStyle', 'rgb(130, 130, 130)')\r\n context.beginPath()\r\n context.setLineDash([2, 3])\r\n context.translate(0, 0.5)\r\n context.moveTo(x, y)\r\n context.lineTo(x + 7, y)\r\n context.translate(0, -0.5)\r\n context.stroke()\r\n }\r\n\r\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', Colors.grid)\r\n context.setLineDash([])\r\n\r\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\r\n context.translate(0.5, 0.5)\r\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\r\n context.translate(-0.5, -0.5)\r\n\r\n new Text(\r\n {\r\n text: 'RELATIVE\\nVOLUME',\r\n x: 33,\r\n y: ChartSettings.top.height + this.height + 6,\r\n font: { size: FONT_SIZE.XXS },\r\n lineHeight: LINE_HEIGHT.XS,\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.top,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n context.restore()\r\n return\r\n }\r\n const rangeMax = this.volumeFY.range()[1]\r\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\r\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\r\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\r\n const format = this.volumeFY.tickFormat(4, 's')\r\n const text = new Text(\r\n {\r\n x: ChartSettings.left.volumeAxis.margin.left,\r\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n ticks.forEach((tick) =>\r\n text\r\n .set({\r\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\r\n })\r\n .render(context)\r\n )\r\n }\r\n\r\n renderVolume() {\r\n if (!this.shouldRenderVolume) return\r\n\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n // Return if the domain bounds are equal, this would put any value in the middle\r\n const [domainFrom, domainTo] = this.volumeFY.domain()\r\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height + this.height - 59,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n const barWidthWithoutMargin = getBarWithoutMarginWidth(this.model)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n // Skip render if the value is <= 0\r\n if (this.data.volume[i] <= 0) {\r\n return\r\n }\r\n\r\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.volumeFY(this.data.volume[i]))\r\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n renderOverlays() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n for (const overlay of this.overlays) {\r\n overlay.renderContent(this.context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n const isRendered = renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.paneModel,\r\n contentWidth: this.width,\r\n contentHeight: this.height,\r\n quote: this.data,\r\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\r\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\r\n })\r\n if (this.getIsRedesignedChart()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\r\n }\r\n\r\n if (isRendered !== undefined) {\r\n setElementCursor({\r\n elementId: this.model.chart_layout().getHTMLElementId(),\r\n cursor: isRendered ? 'crosshair' : 'default',\r\n conditionalCursor: 'grabbing',\r\n })\r\n }\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const n = this.data.getDataByBarIndex(key, crossIndex)\r\n if (n !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const crossClose = this.data.close[crossDataIndex] ?? null\r\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n context.save()\r\n context.translate(ChartSettings.left.width, 0)\r\n\r\n if (this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n if (Number.isNaN(crossIndex)) {\r\n this.getOHLC({ context })\r\n context.restore()\r\n return\r\n }\r\n }\r\n\r\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\r\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\r\n\r\n if (date === null) {\r\n const virtualTradedDates =\r\n this.data.date.length > 0\r\n ? getVirtualTimeframeTradedDates({\r\n dateStart: this.data.date[0],\r\n dateEnd: this.data.date[this.data.date.length - 1],\r\n quote: this.data,\r\n })\r\n : []\r\n this.getOHLC({\r\n context,\r\n dateString: virtualTradedDates[crossIndex]\r\n ? getDateString({\r\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\r\n timeframe: this.data.timeframe,\r\n })\r\n : null,\r\n })\r\n context.restore()\r\n return\r\n }\r\n\r\n this.getOHLC({\r\n context,\r\n date,\r\n data: {\r\n open: this.getDataByCrossIndex(crossIndex, 'open'),\r\n high: this.getDataByCrossIndex(crossIndex, 'high'),\r\n low: this.getDataByCrossIndex(crossIndex, 'low'),\r\n close: this.getDataByCrossIndex(crossIndex, 'close'),\r\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\r\n },\r\n changePercentage: this.getCrossIndexChange(crossIndex),\r\n })\r\n\r\n context.restore()\r\n }\r\n\r\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\r\n const CHANGE_SPACER = 10\r\n const { ChartSettings, isOurSiteRequest } = this.getChartLayoutSettings()\r\n const { ticker, change, ohlc } = ChartSettings.top\r\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\r\n\r\n if (!tickerChange) {\r\n return\r\n }\r\n\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n const finvizWatermarkOffset = !isOffscreen || isOurSiteRequest || this.isLargeChart ? 0 : 15\r\n const changeText = new Text(\r\n {\r\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\r\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\r\n ? this.width - ChartSettings.top.change.margin.right! - finvizWatermarkOffset\r\n : this.width,\r\n y: ChartSettings.top.change.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n this.changeWidth = changeText.measure(context)\r\n changeText.render(context)\r\n\r\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\r\n return\r\n }\r\n if (tickerAfterChange) {\r\n const afterChangeText = new Text(\r\n {\r\n text: tickerAfterChange?.string,\r\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\r\n textAlign: TextAlign.right,\r\n textBaseline: ChartSettings.top.baseline,\r\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\r\n },\r\n this.paneModel\r\n )\r\n const afterChangeTextWidth = afterChangeText.measure(context)\r\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\r\n\r\n if (\r\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\r\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\r\n y: ChartSettings.top.change.margin.top,\r\n })\r\n .render(context)\r\n this.afterChange = null\r\n this.changeWidth = oneLineAHChangeWidth\r\n } else if (\r\n this.lastOhlc[0] &&\r\n ChartSettings.left.width +\r\n this.tickerWidth +\r\n ticker.margin.left! +\r\n this.lastOhlc[0].width! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! <\r\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\r\n ) {\r\n afterChangeText\r\n .set({\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n })\r\n .render(context)\r\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\r\n this.afterChange = {\r\n x: this.width - ChartSettings.top.change.margin.right!,\r\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\r\n width: afterChangeTextWidth,\r\n }\r\n }\r\n }\r\n }\r\n\r\n renderOHLC(parameters: IRenderOHLCParameters) {\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOHLCQuotePage(parameters)\r\n } else {\r\n this.renderOHLCChartsPage(parameters)\r\n }\r\n }\r\n\r\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const OhlcText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n },\r\n this.paneModel\r\n )\r\n\r\n const dateElements = date ? [{ text: date, color: gray300 }] : []\r\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\r\n const oElements = open\r\n ? [\r\n { text: 'O', color: gray300 },\r\n { text: open, color: trendColor },\r\n ]\r\n : []\r\n const hElements = high\r\n ? [\r\n { text: 'H', color: gray300 },\r\n { text: high, color: trendColor },\r\n ]\r\n : []\r\n const lElements = low\r\n ? [\r\n { text: 'L', color: gray300 },\r\n { text: low, color: trendColor },\r\n ]\r\n : []\r\n const cElements = close\r\n ? [\r\n { text: 'C', color: gray300 },\r\n { text: close, color: trendColor },\r\n ]\r\n : []\r\n const volElements = volume\r\n ? [\r\n { text: 'Vol', color: gray300 },\r\n { text: volume, color: trendColor },\r\n ]\r\n : []\r\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\r\n\r\n const lines: OhlcLineElements[] = []\r\n\r\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\r\n lineElements.flatMap((elements, index) =>\r\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\r\n )\r\n if (chartBreakpoints.isM) {\r\n lines.push(\r\n getFlatLineArrayWithSpaces([\r\n dateElements,\r\n oElements,\r\n hElements,\r\n lElements,\r\n cElements,\r\n volElements,\r\n changeElements,\r\n ])\r\n )\r\n } else if (chartBreakpoints.isS) {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\r\n } else {\r\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\r\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\r\n }\r\n\r\n const startX = OFFSET.M - ChartSettings.left.width\r\n let x = startX\r\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\r\n\r\n lines.forEach((line) => {\r\n x = startX\r\n line.forEach((lineElement, index, lineElements) => {\r\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\r\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\r\n if (index === 0) {\r\n padding.left = 5\r\n } else if (index === lineElements.length - 1) {\r\n padding.right = 5\r\n } else if (lineElement === 'space') {\r\n padding.left = 7\r\n padding.right = 7\r\n if (!chartBreakpoints.isS) {\r\n padding.left = 5\r\n padding.right = 5\r\n }\r\n }\r\n OhlcText.set({ text, fillStyle: color, x, y, padding })\r\n OhlcText.render(context)\r\n x += OhlcText.width\r\n })\r\n y += OhlcText.attrs.lineHeight\r\n })\r\n }\r\n\r\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const chartBreakpoints = getChartBreakpoints(this.width)\r\n const LabelsText = new Text(\r\n {\r\n font: { size: FONT_SIZE.S },\r\n lineHeight: 18,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\r\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\r\n x: OFFSET.M - ChartSettings.left.width,\r\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\r\n },\r\n this.paneModel\r\n )\r\n\r\n let numberOfNewOhlcLines = 2\r\n if (chartBreakpoints.isM) {\r\n numberOfNewOhlcLines = 1\r\n } else if (chartBreakpoints.isS) {\r\n numberOfNewOhlcLines = 2\r\n }\r\n\r\n // We assume lineheight is the same as OHLC text\r\n const { lineHeight } = LabelsText.attrs\r\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\r\n\r\n for (const overlay of this.overlays) {\r\n if (!overlay.isRenderedOverlaysLabel()) {\r\n continue\r\n }\r\n LabelsText.set({\r\n text: overlay.toString(),\r\n y,\r\n fillStyle: overlay.getLabelColor(),\r\n }).render(context)\r\n y += lineHeight\r\n }\r\n }\r\n\r\n renderOHLCQuotePage({\r\n context,\r\n date,\r\n open,\r\n high,\r\n low,\r\n close,\r\n volume,\r\n afterHour,\r\n isSmallIndexChart = false,\r\n isNewestOHLC = false,\r\n time,\r\n directRender = false,\r\n changePercentage,\r\n }: IRenderOHLCParameters) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { ohlc } = ChartSettings.top\r\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isGroupInstrument = this.data.instrument === Instrument.Group\r\n if (isOffscreen && isGroupInstrument) {\r\n ohlc.type = OHLCType.dateOnly\r\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\r\n ohlc.type = OHLCType.timeOnly\r\n }\r\n\r\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\r\n const OHLCFontSize = ohlc.font.size!\r\n const centerXOffset =\r\n this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n (this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n this.changeWidth +\r\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\r\n 2\r\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\r\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\r\n const OHLC = hasOhlc\r\n ? {\r\n date: [date ?? ''],\r\n singleLine: [\r\n `${date} O:${open} H:${high} L:${low} C:${close}${\r\n afterHour ? ` AH:${afterHour}` : ''\r\n } Vol:${volume} `,\r\n /*\r\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\r\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\r\n * */\r\n changePercentage ? changePercentage.string : undefined,\r\n ].filter((value) => value !== undefined),\r\n }\r\n : {\r\n date: [date ?? ''],\r\n singleLine: [`${date ?? ''}`],\r\n }\r\n\r\n const OHLC_TEXT = new Text(\r\n {\r\n font: { size: OHLCFontSize },\r\n },\r\n this.paneModel\r\n )\r\n\r\n const getOHLCType = () => {\r\n if (!isSmallIndexChart) {\r\n return OHLCType.singleLine\r\n }\r\n return OHLCType.dateOnly\r\n }\r\n\r\n const getOHLCSettings = () => {\r\n switch (ohlc.type || getOHLCType()) {\r\n case OHLCType.singleLine:\r\n return {\r\n text: OHLC.singleLine,\r\n x: [leftXOffset, leftXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n case OHLCType.dateOnly:\r\n if (isOffscreen && isGroupInstrument) {\r\n const text = `${OHLC.date} Volume: ${volume}`\r\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\r\n return {\r\n text: [text],\r\n x: [\r\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\r\n ],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else if (isSmallIndexChart) {\r\n return {\r\n text: OHLC.date,\r\n x: [centerXOffset],\r\n y: [ohlc.margin.top],\r\n textAlign: TextAlign.center,\r\n textBaseline: [TextBaseline.alphabetic],\r\n }\r\n } else {\r\n const isEnoughSpace =\r\n this.width -\r\n (this.tickerWidth +\r\n ChartSettings.top.ticker.margin.left! +\r\n ohlc.margin.left! +\r\n ohlc.margin.right! +\r\n this.changeWidth +\r\n ChartSettings.top.change.margin.right!) >\r\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\r\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\r\n return {\r\n text: OHLC.date,\r\n x: [leftXOffset],\r\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\r\n textAlign: TextAlign.left,\r\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\r\n }\r\n }\r\n case OHLCType.timeOnly:\r\n return {\r\n text: [time],\r\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\r\n y: [lineTopY],\r\n textAlign: TextAlign.center,\r\n textBaseline: [ohlc.font.baseline],\r\n }\r\n default:\r\n return\r\n }\r\n }\r\n\r\n if (!isNewestOHLC) {\r\n context.fillStyle = Colors.canvasFill\r\n this.lastOhlc.forEach((line) => {\r\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\r\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\r\n context.fillRect(\r\n x - PADDING.XXS,\r\n y - PADDING.XXS,\r\n PADDING.XXS + line.width! + PADDING.XXS,\r\n PADDING.XXS + OHLCFontSize + PADDING.XXS\r\n )\r\n })\r\n\r\n if (this.afterChange) {\r\n context.fillRect(\r\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\r\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\r\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\r\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\r\n )\r\n }\r\n } else {\r\n this.lastOhlc = []\r\n }\r\n\r\n const ohlcSettings = getOHLCSettings()\r\n\r\n const renderOHLCToCanvas = ({\r\n ohlcSet,\r\n render = true,\r\n }: {\r\n ohlcSet?: {\r\n text: (string | undefined)[]\r\n x: number[]\r\n y: (number | undefined)[]\r\n textAlign: TextAlign\r\n textBaseline: (TextBaseline | undefined)[]\r\n }\r\n render?: boolean\r\n }) => {\r\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\r\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\r\n let i = index\r\n let leftOffset = 0\r\n let fillStyle = Colors.text\r\n let text = line\r\n if (index > 0 && isSingleLineWithChange) {\r\n i -= 1\r\n leftOffset = OHLC_TEXT.measure(context)\r\n text = line\r\n\r\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\r\n }\r\n const options = {\r\n text,\r\n x: ohlcSet.x[i] + leftOffset,\r\n y: ohlcSet.y[i],\r\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\r\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\r\n fillStyle,\r\n }\r\n OHLC_TEXT.set(options)\r\n if (isNewestOHLC) {\r\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\r\n }\r\n if (render) {\r\n OHLC_TEXT.render(context)\r\n }\r\n })\r\n }\r\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\r\n\r\n return {\r\n ohlcSettings,\r\n renderOHLCToCanvas,\r\n }\r\n }\r\n\r\n // only for stocks on i1/i3/i5 and one day view\r\n renderFadeExtendedHours() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = this.model.quote().timeframe\r\n if (this.data.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\r\n return\r\n }\r\n\r\n const interval = parseInt(period.substring(1), 10)\r\n const dayToOffset = this.data.getDayToOffset()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const halfBarWidth = getHalfBarWidth(this.model)\r\n for (const day in dayToOffset) {\r\n // todo aftermarket\r\n const dayIndex = dayToOffset[day]\r\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\r\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\r\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n this.context.set('fillStyle', Colors.premarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n\r\n if (this.data.aftermarketLengthMinutes > 0) {\r\n n0 =\r\n (this.data.drawMinutesPerDay / interval) * dayIndex +\r\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\r\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\r\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\r\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\r\n\r\n this.context.set('fillStyle', Colors.aftermarketFade)\r\n this.context.fillRect(x0, 0, width, this.height + 1)\r\n }\r\n }\r\n translate.undo()\r\n }\r\n\r\n shouldShowPrevClose() {\r\n const quote = this.model.quote()\r\n const isStock = quote.instrument === Instrument.Stock\r\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\r\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\n return isStock && (isIntradayWithPreMarket || isIndexChart)\r\n }\r\n\r\n renderPrevClose() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.shouldShowPrevClose()) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n let y = Math.round(this.fy(this.model.quote().prevClose))\r\n if (y === this.height) y -= 1 // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\r\n\r\n new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.prevClose,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n translate.undo()\r\n }\r\n\r\n renderChartNotAvailable() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\r\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\r\n new Text(\r\n {\r\n text: 'Chart not available',\r\n x,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n ).render(this.context)\r\n }\r\n\r\n // private\r\n setupCache() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n /*\r\n * Don't create new Cache instances, because Safari takes too long to free up memory\r\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n *\r\n * To further improve performance, cache.set shouldn't be called when unnecessary,\r\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\r\n */\r\n this.baseCache = this.baseCache || new Cache()\r\n\r\n this.baseCache.set(\r\n (context: CanvasRenderingContext2D) => {\r\n if (this.data.close.length === 0) {\r\n this.renderText(context)\r\n return\r\n }\r\n this.renderYAxis(context)\r\n this.renderText(context)\r\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\r\n this.renderVolumeAxis(context)\r\n }\r\n if (!this.getIsRedesignedChart()) {\r\n this.renderOverlaysLabels(context)\r\n }\r\n },\r\n this.width + ChartSettings.left.width + ChartSettings.right.width,\r\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\r\n )\r\n }\r\n\r\n // called by controllers/pane on recountScale\r\n setupAxis(fx: ScaleAxis) {\r\n this.data = this.model.quote()\r\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\r\n\r\n if (typeof fx !== 'function') {\r\n return\r\n }\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n const volumes = []\r\n if (areNoBarsVisible) {\r\n volumes.push(\r\n this.data.volume[firstBarToRenderIndex.index],\r\n Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)\r\n )\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n volumes.push(this.data.volume[i])\r\n }\r\n }\r\n\r\n const max = utils.max(volumes) ?? 0\r\n const rangeMax = volumeHeight || 60\r\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\r\n this.setupAxisTimeFrame = this.data.timeframe\r\n }\r\n\r\n // private\r\n clip(addMarginBottom?: boolean) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n if (addMarginBottom == null) {\r\n addMarginBottom = false\r\n }\r\n this.context.beginPath()\r\n let marginBottom = 0\r\n if (addMarginBottom) {\r\n marginBottom = ChartSettings.bottom.height\r\n }\r\n // due pixel perfect rendering of lines, line on bottom edge is moved outside of \"chart area\" because of 0.5px translate,\r\n // to compensate for this we clip canvas 1px taller than chart height\r\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom + 1)\r\n this.context.clip()\r\n }\r\n\r\n addOverlay(overlay: Overlay) {\r\n overlay.chart = this\r\n this.overlays.push(overlay)\r\n return this.trigger('change')\r\n }\r\n\r\n setOverlays(overlays: Overlay[]) {\r\n this.overlays = overlays\r\n return this.trigger('change')\r\n }\r\n\r\n removeOverlay(overlay: Overlay) {\r\n for (let index = 0; index < this.overlays.length; index++) {\r\n const el = this.overlays[index]\r\n if (el === overlay) {\r\n this.attrs.overlays.splice(index, 1)\r\n this.overlays.splice(index, 1)\r\n this.trigger('change')\r\n break\r\n }\r\n }\r\n }\r\n\r\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\r\n this.data = this.model.quote()\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n let minIndex = -1\r\n let maxIndex = -1\r\n let firstVisibleClose = null\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n leftOffset: this.model.leftOffset,\r\n paneModel: this.paneModel,\r\n quote: this.data,\r\n chartWidth: this.width,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n // If no bars are visible min/max are first available bar before visible and first after\r\n if (areNoBarsVisible) {\r\n min = this.data.low[firstBarToRenderIndex.index]\r\n max = this.data.high[Math.min(lastBarToRenderIndex.index, this.data.barIndex.length - 1)]\r\n if (min > max) {\r\n const prevMin = min\r\n min = max\r\n max = prevMin\r\n }\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n } else {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (minIndex === -1 || this.data.low[minIndex] > this.data.low[i]) {\r\n minIndex = i\r\n }\r\n if (maxIndex === -1 || this.data.high[maxIndex] < this.data.high[i]) {\r\n maxIndex = i\r\n }\r\n }\r\n\r\n // If only a single bar is visible get min/max index range from closes values outside of visible area\r\n if (this.data.low[minIndex] === this.data.high[maxIndex]) {\r\n const closestMinMaxIndices = getClosestDifferentMinMaxValueIndices(\r\n minIndex,\r\n maxIndex,\r\n this.data.high,\r\n this.data.low\r\n )\r\n minIndex = closestMinMaxIndices.minIndex\r\n maxIndex = closestMinMaxIndices.maxIndex\r\n }\r\n\r\n min = this.data.low[minIndex]\r\n max = this.data.high[maxIndex]\r\n\r\n firstVisibleClose = this.data.close[firstBarToRenderIndex.index]\r\n }\r\n\r\n // Apply scale min & max buffer if min/max is the same\r\n if (min === max) {\r\n min *= 0.99\r\n max *= 1.01\r\n }\r\n\r\n // Update min/max so prevClose is in range and can be rendered if it should\r\n if (this.shouldShowPrevClose() && this.data.prevClose !== null) {\r\n min = Math.min(min, this.data.prevClose)\r\n max = Math.max(max, this.data.prevClose)\r\n }\r\n\r\n // Update min/max so lastClose is in range and can be rendered if it should\r\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\r\n min = Math.min(min, this.data.lastClose)\r\n max = Math.max(max, this.data.lastClose)\r\n }\r\n\r\n return { min, max, firstVisibleClose }\r\n }\r\n\r\n moveBy() {}\r\n\r\n isInArea() {\r\n return false\r\n }\r\n\r\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.paneModel.scale.y(y)\r\n\r\n round(n: number, overridePlaces?: number) {\r\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\r\n }\r\n\r\n roundOhlc(n: number) {\r\n const placesLastClose = this.getPlacesLastClose()\r\n return round({\r\n data: this.data,\r\n num: n,\r\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\r\n })\r\n }\r\n\r\n toObject() {\r\n const overlays = this.overlays.map((overlay) => overlay.toObject())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n toConfig() {\r\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\r\n return merge({}, this.attrs, { type: this.type, overlays })\r\n }\r\n\r\n getPlacesLastClose(price?: number) {\r\n const { lastClose, instrument } = this.data\r\n const priceAbs = price && Math.abs(price)\r\n if (lastClose >= 100000) {\r\n return 0\r\n } else if (lastClose >= 10000) {\r\n return 1\r\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\r\n return 4\r\n } else if (lastClose === undefined) {\r\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\r\n return 2\r\n }\r\n\r\n return undefined\r\n }\r\n\r\n hasOverlay(type: string) {\r\n return this.overlays.some((x) => x.type === 'overlays/' + type)\r\n }\r\n\r\n getXLine(): Line {\r\n return new Line(\r\n {\r\n y1: 0,\r\n y2: this.height,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getYLine(): Line {\r\n return new Line(\r\n {\r\n x1: 0,\r\n x2: this.width,\r\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.paneModel\r\n )\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart_layout())\r\n }\r\n\r\n getIsMobileChartPage() {\r\n return (\r\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n )\r\n }\r\n\r\n getCandleLikeChartsRenderingColors() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { theme, specificChartFunctionality } = this.model.chart_layout()\r\n let colors = Colors\r\n const overwrittenColors = getColorOverwrites({\r\n colors,\r\n theme,\r\n })\r\n const overwrittenColorKeys = Object.keys(overwrittenColors)\r\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\r\n (colorKey) => overwrittenColorKeys.includes(colorKey)\r\n )\r\n\r\n const shouldUseDarkerColors =\r\n theme === Theme.light &&\r\n getShouldUseDarkerWickColors({\r\n specificChartFunctionality: specificChartFunctionality,\r\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\r\n })\r\n\r\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...darkerWickColors }\r\n }\r\n const isNodeChartWithThinBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\r\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\r\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\r\n }\r\n\r\n return colors\r\n }\r\n\r\n getIsRedesignedChart() {\r\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\r\n }\r\n}\r\n\r\nBaseChart.initClass()\r\n\r\nexport default BaseChart\r\n","import { RendererChartBarProps } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport utils from '../utils'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './base_chart'\r\n\r\nconst WICK_WIDTH = 1\r\n\r\nclass CandleStick extends Chart {\r\n static type = ChartElementType.CandleStick\r\n static label = 'Candle'\r\n static iconName = 'candleBarBasic'\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\r\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const trendColor = close < open ? trendDown : trendUp\r\n const wickColor = close < open ? wickDown : wickUp\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n barFillColor: trendColor,\r\n borderColor: close < open ? borderDown : borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n renderChart() {\r\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\r\n return\r\n }\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: this.model.chart_layout(),\r\n zoomFactor: this.model.zoomFactor,\r\n })\r\n const shouldRenderFillAndBorder =\r\n barFillWidth + barBorderWidth * 2 >= 2 &&\r\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n const translateForWick = getTranslate({\r\n context: this.context,\r\n xOffset: WICK_WIDTH / 2,\r\n yOffset: 0,\r\n })\r\n\r\n translate.do()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, center: number) => {\r\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\r\n index: i,\r\n chartSettingsColors: Colors,\r\n hasFillAndBorder: shouldRenderFillAndBorder,\r\n })\r\n\r\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\r\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\r\n const candleWickHigh = Math.round(this.fy(high))\r\n const candleWickLow = Math.round(this.fy(low))\r\n\r\n const candleBodyHeight = candleBodyLow - candleBodyHigh\r\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\r\n const halfBorderWidth = barBorderWidth / 2\r\n\r\n // TODO: revisit for better approach, this solve issue with candlesticks\r\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\r\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\r\n return\r\n }\r\n\r\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\r\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\r\n\r\n translateForWick.do()\r\n this.context.set('strokeStyle', wickColor)\r\n this.context.beginPath()\r\n this.context.moveTo(center, candleWickHigh)\r\n if (shouldRenderFillAndBorder) {\r\n this.context.lineTo(center, candleBodyHigh)\r\n this.context.moveTo(\r\n center,\r\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\r\n )\r\n }\r\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\r\n this.context.stroke()\r\n translateForWick.undo()\r\n\r\n if (shouldRenderFillAndBorder) {\r\n const hasBorder = barBorderWidth > 0\r\n if (hasBorder) {\r\n this.context.set('strokeStyle', borderColor)\r\n if (isBodyHeightGreaterOrEqualBorders) {\r\n this.context.set('lineWidth', barBorderWidth)\r\n this.context.strokeRect(\r\n candleBodyLeftX + halfBorderWidth,\r\n candleBodyHigh + halfBorderWidth,\r\n barFillWidth + 2 * halfBorderWidth,\r\n candleBodyHeight - 2 * halfBorderWidth\r\n )\r\n this.context.set('lineWidth', WICK_WIDTH)\r\n } else {\r\n this.context.beginPath()\r\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\r\n const hasFill = fillHeight > 0\r\n if (hasFill || !hasBorder) {\r\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\r\n this.context.fillRect(\r\n candleBodyLeftX + barBorderWidth,\r\n candleBodyHigh + barBorderWidth,\r\n barFillWidth,\r\n hasFill ? fillHeight : WICK_WIDTH\r\n )\r\n }\r\n }\r\n },\r\n })\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default CandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport CandleStick from './candle_stick'\r\n\r\nclass HollowCandleStick extends CandleStick {\r\n static type = ChartElementType.HollowCandleStick\r\n static label = 'Hollow Candle'\r\n static iconName = 'candleBarHollow'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\r\n const open = this.data.open[index]\r\n const close = this.data.close[index]\r\n const isHollow = close > open\r\n const generalTrendColor =\r\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\r\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\r\n return {\r\n open,\r\n close,\r\n high: this.data.high[index],\r\n low: this.data.low[index],\r\n // hollow candles have transparend bodies that's why rgba is here\r\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\r\n borderColor: trendColor,\r\n wickColor: trendColor,\r\n }\r\n }\r\n\r\n toString() {\r\n return `Hollow Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HollowCandleStick\r\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\r\nimport { ChartElementType, ScaleType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\r\nimport CandleStick from './candle_stick'\r\n\r\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\r\n\r\nclass HeikinAshi extends CandleStick {\r\n static type = ChartElementType.HeikinAshi\r\n static label = 'Heikin Ashi'\r\n static iconName = 'candleBarHeikinAshi'\r\n\r\n static getNumOfBarsBuffer(element: RequireByKey) {\r\n return Math.max(1, super.getNumOfBarsBuffer(element))\r\n }\r\n\r\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\r\n const haData = this.data.getHeikinAshiData()\r\n\r\n const open = haData.open[index]\r\n const close = haData.close[index]\r\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\r\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\r\n return {\r\n open,\r\n close,\r\n high: Math.max(this.data.high[index], open, close),\r\n low: Math.min(open, close, this.data.low[index]),\r\n barFillColor: trendColor,\r\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\r\n wickColor: hasFillAndBorder ? wickColor : trendColor,\r\n }\r\n }\r\n\r\n getLastValues = () => {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const {\r\n open: lastOpen,\r\n close: lastClose,\r\n high: lastHigh,\r\n low: lastLow,\r\n } = this.getRenderChartBarProps({\r\n index: this.data.date.length - 1,\r\n chartSettingsColors: Colors,\r\n })\r\n\r\n return { lastOpen, lastClose, lastHigh, lastLow }\r\n }\r\n\r\n getRoundedLastData() {\r\n const lastOhlc = this.getLastValues()\r\n return {\r\n open: this.roundOhlc(lastOhlc.lastOpen),\r\n high: this.roundOhlc(lastOhlc.lastHigh),\r\n low: this.roundOhlc(lastOhlc.lastLow),\r\n close: this.roundOhlc(lastOhlc.lastClose),\r\n }\r\n }\r\n\r\n renderYAxis = (context: CanvasRenderingContext2D) => {\r\n const { lastClose } = this.getLastValues()\r\n super.renderYAxis(context, { lastClose }, false)\r\n\r\n const { firstVisibleClose } = this.getMinMax()\r\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\r\n\r\n const originalLatestClose = this.data.close[this.data.close.length - 1]\r\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\r\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\r\n\r\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\r\n\r\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\r\n\r\n this.renderYAxisLabel({\r\n context,\r\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\r\n mainLabelValue: lastClose,\r\n secondaryLabelValue: originalLatestClose,\r\n }),\r\n label: originalLatestCloseLabel,\r\n background: this.getSecondaryLabelBackgroundColor(),\r\n })\r\n }\r\n\r\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\r\n const Colors = this.getCandleLikeChartsRenderingColors()\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n if (barIndex > -1) {\r\n let value = null\r\n if (['high', 'low', 'open', 'close'].includes(key)) {\r\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\r\n value = data[key as OhlcKeys]\r\n }\r\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\r\n if (value !== null) {\r\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\r\n }\r\n }\r\n }\r\n\r\n getCrossIndexChange(crossIndex: number) {\r\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\r\n const haData = this.data.getHeikinAshiData()\r\n const crossClose = haData.close[barIndex] ?? null\r\n const previousClose = haData.close[barIndex - 1] ?? null\r\n if (crossClose !== null && previousClose !== null) {\r\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\r\n }\r\n\r\n return null\r\n }\r\n\r\n toString() {\r\n return `HA Candle stick ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default HeikinAshi\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass LineChart extends Chart {\r\n static type = ChartElementType.LineChart\r\n static label = 'Line'\r\n static iconName = 'lineChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let first: number | undefined, last: number | undefined\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n this.context.set('strokeStyle', Colors.line)\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const y = Math.round(this.fy(this.data.close[i]))\r\n this.context.lineTo(x, y)\r\n last = x\r\n if (first === undefined) {\r\n first = x\r\n }\r\n },\r\n })\r\n if (first !== undefined && last !== undefined) {\r\n this.context.stroke()\r\n this.context.set('fillStyle', Colors.background)\r\n this.context.lineTo(last!, this.height)\r\n this.context.lineTo(first!, this.height)\r\n this.context.fill()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default LineChart\r\n","import Text from '../canvas/text'\r\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst interval = 3\r\nconst domainMin = -1\r\nconst domainMax = 1\r\nconst red = 'rgba(200, 0, 0, 0.392)'\r\nconst redLine = 'rgb(120, 0, 0)'\r\nconst green = 'rgba(0, 180, 0, 0.392)'\r\nconst greenLine = 'rgb(0, 100, 0)'\r\n\r\nclass MarketSentiment extends Chart {\r\n static type = ChartElementType.MarketSentiment\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'width', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\r\n },\r\n })\r\n\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n declare _data: number[]\r\n declare _dataLastIndex: number | null\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.setupCache = this.setupCache.bind(this)\r\n }\r\n\r\n setupCache() {\r\n super.setupCache()\r\n if (!this.data) {\r\n return\r\n }\r\n const arr: number[] = []\r\n this.data.close.forEach((sum, i) => {\r\n arr[i] = sum / this.data.volume[i]\r\n })\r\n this._data = arr\r\n\r\n let lastIndex = null\r\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\r\n if (this.data.volume[i] !== 0) {\r\n lastIndex = i\r\n break\r\n }\r\n }\r\n this._dataLastIndex =\r\n lastIndex === null\r\n ? null\r\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\r\n }\r\n\r\n renderChart() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\r\n yOffset: MarketSentimentSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\r\n translate.undo()\r\n }\r\n\r\n renderLineBullBear(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n overbought: number\r\n ) {\r\n if (this._dataLastIndex === null) {\r\n return\r\n }\r\n const isRedesign = isRedesignEnabled()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n const domain = [domainMax, domainMin]\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[1]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', red)\r\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n\r\n context.save()\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(domain[0]),\r\n this.fx(this._dataLastIndex),\r\n Math.round(this.fy(overbought)) - 0.5\r\n )\r\n context.clip()\r\n context.set('fillStyle', green)\r\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\r\n context.beginPath()\r\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\r\n for (let i = from; i < this.data.close.length; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\r\n }\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\r\n context.fill()\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n renderXAxis() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n const { Colors } = MarketSentimentSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const xLine = this.getXLine()\r\n const text = new Text(\r\n {\r\n y: this.height + 12,\r\n font: { size: 7 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n let x\r\n\r\n x = this.fx(0)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10) + 2 /* remove overflow */\r\n text.set({ text: '10AM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 20)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 40)\r\n text.set({ text: '12PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 60)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 80)\r\n text.set({ text: '2PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 100)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n x = this.fx(10 + 120 - 1)\r\n text.set({ text: '4PM', x }).render(this.context)\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText() {}\r\n\r\n renderCrossText() {}\r\n\r\n renderOverlaysLabels() {}\r\n\r\n _compute() {\r\n return { min: domainMin, max: domainMax }\r\n }\r\n\r\n computeVisibleMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const isRedesign = isRedesignEnabled()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: MarketSentimentSettings.left.width,\r\n yOffset: MarketSentimentSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const yLine = this.getYLine()\r\n for (const tick of [domainMin, 0, domainMax]) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n }\r\n\r\n const text = new Text(\r\n {\r\n x: this.width + 27,\r\n font: { size: 8 },\r\n textBaseline: TextBaseline.middle,\r\n textAlign: TextAlign.right,\r\n },\r\n this.paneModel\r\n )\r\n\r\n const fillUp = isRedesign ? Colors.marketUp : greenLine\r\n const fillDown = isRedesign ? Colors.marketDown : redLine\r\n const last = this._data[this._dataLastIndex!]\r\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\r\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\r\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\r\n\r\n translate.undo()\r\n }\r\n\r\n clip() {\r\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\r\n this.context.beginPath()\r\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\r\n this.context.clip()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n toString() {\r\n return `Market sentiment chart`\r\n }\r\n}\r\nMarketSentiment.initClass()\r\n\r\nexport default MarketSentiment\r\n","import { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\ninterface MultiLineChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nclass MultiLineChart extends Chart {\r\n static type = ChartElementType.MultiLineChart\r\n tickersDimensions: number[] = []\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.set('lineWidth', 1)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n\r\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\r\n const ticker = this.attrs.tickers[index]\r\n const quote = quotes[ticker]\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\r\n // margin?\r\n continue\r\n }\r\n const y = Math.round(this.fy(quote.close[i]))\r\n this.context.lineTo(x, y)\r\n }\r\n this.context.stroke()\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const text = this.attrs.label || ''\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n return this.renderCrossText(context, this.data.close.length - 1)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\r\n\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n const isLastDate = crossIndex === this.data.close.length - 1\r\n\r\n new Text(\r\n {\r\n text: `${months[month]} ${day} ${year} `,\r\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n\r\n const quotes: ObjectHash = {}\r\n for (const quote of this.getQuotes()) {\r\n quotes[quote.ticker] = quote\r\n }\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\r\n if (this.tickersDimensions[index]) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n y - PADDING.XXXS,\r\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n }\r\n const ticker = this.attrs.tickers[index]\r\n const closeValue = quotes[ticker].close[crossIndex]\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\r\n x: ChartSettings.left.width,\r\n y,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n lineHeight: LINE_HEIGHT.M,\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n if (isLastDate) {\r\n this.tickersDimensions[index] = text.measure(context)\r\n }\r\n text.render(context)\r\n }\r\n }\r\n\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n getMinMax() {\r\n const quotes = this.getQuotes()\r\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\r\n if (typeof this.attrs.min !== 'undefined') {\r\n min = this.attrs.min\r\n }\r\n if (typeof this.attrs.max !== 'undefined') {\r\n max = this.attrs.max\r\n }\r\n return { min, max }\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Line chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default MultiLineChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { getBarWithoutMarginWidth } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Chart from './base_chart'\r\n\r\nclass OHLCChart extends Chart {\r\n static type = ChartElementType.OhlcChart\r\n static label = 'OHLC'\r\n static iconName = 'ohlcChartType'\r\n\r\n renderChart() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n\r\n const barWithoutMarginWidth = getBarWithoutMarginWidth(this.model)\r\n\r\n let lineWidth = 1\r\n if (barWithoutMarginWidth >= 40) {\r\n lineWidth = 4\r\n } else if (barWithoutMarginWidth >= 30) {\r\n lineWidth = 3\r\n } else if (barWithoutMarginWidth >= 15) {\r\n lineWidth = 2\r\n }\r\n const lineThickness = lineWidth / 2\r\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\r\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\r\n this.context.set('lineWidth', lineWidth)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.paneModel,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const barX = ~~(x - 1) + lineOffset // move 1px to left so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\r\n\r\n this.context.beginPath()\r\n this.context.set(\r\n 'strokeStyle',\r\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\r\n )\r\n\r\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\r\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\r\n\r\n if (handleLengthFromWick >= 1) {\r\n const open = Math.round(this.fy(this.data.open[i]))\r\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\r\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\r\n\r\n const close = Math.round(this.fy(this.data.close[i]))\r\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\r\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\r\n }\r\n\r\n this.context.stroke()\r\n },\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n toString() {\r\n return `OHLC ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default OHLCChart\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport utils from '../utils'\r\nimport Chart, { BaseChartAttrs } from './base_chart'\r\n\r\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\ninterface PerfChartAttrs extends BaseChartAttrs {\r\n tickers: string[]\r\n label?: string\r\n fromDate: string\r\n toDate: string\r\n min?: number\r\n max?: number\r\n}\r\n\r\nclass PerfChart extends Chart {\r\n static type = ChartElementType.PerfChart\r\n\r\n overlayLabelWidth: ObjectHash\r\n perf: ObjectHash = {}\r\n\r\n constructor(values: Partial, model: Pane) {\r\n super(values, model)\r\n this.renderText = this.renderText.bind(this)\r\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.overlayLabelWidth = {}\r\n }\r\n\r\n renderChart() {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\r\n yOffset: ChartSettings.top.height + 0.5,\r\n })\r\n translate.do()\r\n\r\n this.context.beginPath()\r\n this.context.set('lineWidth', 1)\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\r\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n this.context.beginPath()\r\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\r\n }\r\n this.context.stroke()\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderText(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const period = (() => {\r\n switch (this.model.quote().timeframe) {\r\n case 'd':\r\n return 'DAILY'\r\n case 'w':\r\n return 'WEEKLY'\r\n case 'm':\r\n return 'MONTHLY'\r\n default:\r\n return\r\n }\r\n })()\r\n const y = (this.height - 4) / 2\r\n new Text(\r\n {\r\n text: period,\r\n x: 28,\r\n y: ChartSettings.top.height + y,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\r\n let dateString = ''\r\n const month = date.getMonth() // 20141126\r\n const year = date.getFullYear()\r\n const day = date.getDate()\r\n switch (this.data.timeframe) {\r\n case 'd':\r\n case 'w':\r\n dateString = `${months[month]} ${day}`\r\n break\r\n case 'm':\r\n dateString = `${months[month]} ${year}`\r\n break\r\n default:\r\n return\r\n }\r\n\r\n let shouldRenderDate = false\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n ChartSettings.left.width - PADDING.XXXS,\r\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\r\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\r\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\r\n )\r\n const hasData = Number.isFinite(tickerData[crossIndex])\r\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\r\n shouldRenderDate = shouldRenderDate || hasData\r\n new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n if (shouldRenderDate) {\r\n new Text(\r\n {\r\n text: `${dateString} `,\r\n x: ChartSettings.left.width + 132,\r\n y: 30,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n background: Colors.canvasFill,\r\n },\r\n this.paneModel\r\n ).render(context)\r\n }\r\n }\r\n\r\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\r\n super.renderOverlaysLabels(context)\r\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n\r\n for (let index = 0; index < this.attrs.tickers.length; index++) {\r\n const ticker = this.attrs.tickers[index]\r\n const tickerData = this.perf[ticker]\r\n if (tickerData?.length) {\r\n const lastCrossIndex = this.perf[ticker].length - 1\r\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\r\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\r\n const text = new Text(\r\n {\r\n text: `${ticker} ${percentageText}`,\r\n x: ChartSettings.left.width,\r\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\r\n font: { size: FONT_SIZE.M, style: 'bold' },\r\n fillStyle: ColorsSettings[index % ColorsSettings.length],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.paneModel\r\n )\r\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\r\n text.render(context)\r\n }\r\n }\r\n }\r\n\r\n _compute() {\r\n this.perf = {}\r\n const quotes = this.getQuotes()\r\n\r\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\r\n const toDate = new Date(this.attrs.toDate + ' 23:59')\r\n const filteredQuotes = []\r\n for (const quote of quotes) {\r\n const closes = []\r\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = utils.dateFromUnixTimestamp(quote.date[i])\r\n if (fromDate <= date && date <= toDate) {\r\n closes.push(quote.close[i])\r\n }\r\n }\r\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\r\n }\r\n\r\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\r\n for (const quote of filteredQuotes) {\r\n this.perf[quote.ticker] = []\r\n const first = quote.close[0]\r\n let offset = 0\r\n if (daysCount > quote.close.length) {\r\n offset = daysCount - quote.close.length\r\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\r\n this.perf[quote.ticker][i] = NaN\r\n }\r\n }\r\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\r\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\r\n }\r\n }\r\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\r\n return { min, max }\r\n }\r\n\r\n // TODO refactor into ?utils\r\n computeVisibleMinMax(...arrays: Array) {\r\n let min = Number.MAX_VALUE\r\n let max = Number.MIN_VALUE\r\n\r\n const { leftOffset } = this.model\r\n for (const arr of arrays) {\r\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\r\n // margin?\r\n continue\r\n }\r\n\r\n if (min > arr[i]) {\r\n min = arr[i]\r\n }\r\n if (max < arr[i]) {\r\n max = arr[i]\r\n }\r\n }\r\n }\r\n\r\n return { min, max }\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.paneModel.scale.y.ticks(10)\r\n const yLine = this.getYLine()\r\n const text = new Text(\r\n {\r\n x: this.width + 8,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.paneModel\r\n )\r\n for (const tick of ticks) {\r\n const y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n text.set({ text: tick.toFixed(2), y }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderXAxis() {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context: this.context,\r\n xOffset: this.leftOffset + ChartSettings.left.width,\r\n yOffset: ChartSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n y: this.height + 18,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.bottom,\r\n textAlign: TextAlign.center,\r\n },\r\n this.paneModel\r\n )\r\n const textWidth = text.set({ text: '2020' }).measure(this.context)\r\n\r\n let date = new Date(this.data.date[0] * 1000)\r\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n let monthsInData = 0\r\n this.data.date.forEach((d, index) => {\r\n if (index < 1) {\r\n return\r\n }\r\n\r\n const date = new Date(d * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n monthsInData++\r\n }\r\n lastMonth = month\r\n })\r\n\r\n const availableTickSpots = ~~(this.width / textWidth)\r\n const monthsToAvail = monthsInData / availableTickSpots\r\n let renderMonth\r\n if (monthsToAvail <= 1) {\r\n renderMonth = () => true\r\n } else if (monthsToAvail <= 2) {\r\n renderMonth = (x: number) => x % 2 === 0\r\n } else if (monthsToAvail <= 3) {\r\n renderMonth = (x: number) => x % 3 === 0\r\n } else if (monthsToAvail <= 4) {\r\n renderMonth = (x: number) => x % 4 === 0\r\n } else if (monthsToAvail <= 6) {\r\n renderMonth = (x: number) => x % 6 === 0\r\n } else {\r\n renderMonth = (x: number) => x === 0\r\n }\r\n\r\n date = new Date(this.data.date[0] * 1000)\r\n lastMonth = date.getMonth() + '-' + date.getFullYear()\r\n\r\n const xLine = this.getXLine()\r\n\r\n for (let i = 0; i < this.data.date.length; i++) {\r\n date = new Date(this.data.date[i] * 1000)\r\n const month = date.getMonth() + '-' + date.getFullYear()\r\n if (month !== lastMonth) {\r\n lastMonth = month\r\n const x = this.fx(i)\r\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(this.context)\r\n\r\n if (!renderMonth(date.getMonth())) {\r\n continue\r\n }\r\n\r\n text\r\n .set({\r\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\r\n x: x,\r\n })\r\n .render(this.context)\r\n }\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n getMinMax() {\r\n return this._compute()\r\n }\r\n\r\n renderVolumeAxis() {}\r\n\r\n renderVolume() {}\r\n\r\n getQuotes() {\r\n return Quote.select(\r\n (q: Quote) =>\r\n this.attrs.tickers.includes(q.ticker) &&\r\n q.timeframe === this.data?.timeframe &&\r\n this.model.chart_layout().isIdeaId(q.ideaID)\r\n )\r\n }\r\n\r\n toString() {\r\n return `Perf chart ${this.data.ticker}`\r\n }\r\n}\r\n\r\nexport default PerfChart\r\n","import { ChartElementType } from '../constants/common'\r\nimport candleStick from './candle_stick'\r\nimport hollowCandleStick from './candle_stick_hollow'\r\nimport heikinAshi from './heikin_ashi'\r\nimport lineChart from './line_chart'\r\nimport marketSentiment from './market_sentiment'\r\nimport multiLineCharts from './multi_line_chart'\r\nimport ohlcChart from './ohlc_chart'\r\nimport perfChart from './perf_chart'\r\n\r\nexport const chartsByType = Object.freeze({\r\n [ChartElementType.CandleStick]: candleStick,\r\n [ChartElementType.HeikinAshi]: heikinAshi,\r\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\r\n [ChartElementType.LineChart]: lineChart,\r\n [ChartElementType.MarketSentiment]: marketSentiment,\r\n [ChartElementType.MultiLineChart]: multiLineCharts,\r\n [ChartElementType.OhlcChart]: ohlcChart,\r\n [ChartElementType.PerfChart]: perfChart,\r\n})\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 180000,\r\n Elite = Default,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n","import { ChartConfigChartPane } from '../../../types/shared'\r\nimport { IndicatorType } from '../../constants/common'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Element from '../../models/element'\r\nimport PaneModel from '../../models/pane'\r\nimport { HLC, compareHlc, incrementHlc, receiveHlc } from '../../utils/hlc'\r\nimport {\r\n AutoSaveChangeType,\r\n AutoSaveElement,\r\n AutoSaveElementDBRecord,\r\n DrawingChangeTimestamp,\r\n DrawingContainerType,\r\n} from './constants'\r\n\r\nexport function getContainerTypeFromPaneConfig(pane: ChartConfigChartPane) {\r\n const indicatorElement = pane.elements.find((el) => el.type.startsWith('indicators/'))\r\n if (indicatorElement) {\r\n return indicatorElement.type as DrawingContainerType\r\n }\r\n const chartElement = pane.elements.find((el) => el.type.startsWith('charts/'))\r\n if (chartElement) {\r\n return 'chart'\r\n }\r\n return null\r\n}\r\n\r\nexport function getContainerType(model: PaneModel) {\r\n const mainElement = model.mainElement()\r\n const indicatorType = mainElement?.instance?.type ?? null\r\n if (mainElement?.isIndicator() && indicatorType !== IndicatorType.None) {\r\n return indicatorType as DrawingContainerType\r\n }\r\n if (mainElement?.isChart()) {\r\n return 'chart'\r\n }\r\n return null\r\n}\r\n\r\nexport function updateInternalStoreWithChangedElement({\r\n element,\r\n changeType,\r\n currentInternalStore,\r\n lastUpdateTimestamp,\r\n}: {\r\n element: Element\r\n changeType: AutoSaveChangeType\r\n currentInternalStore: AutoSaveElement[]\r\n lastUpdateTimestamp: HLC\r\n}) {\r\n const paneModel = element.pane()\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const containerType = getContainerType(paneModel)\r\n if (ticker && paneModel && containerType && (!element.destroyed || changeType === 'destroy')) {\r\n const instanceJson = element.instance.toAutosaveConfig()\r\n const newDrawing: AutoSaveElement = {\r\n elementId: element.elementId!,\r\n zIndex: element.zIndex,\r\n ticker,\r\n lastChange: lastUpdateTimestamp,\r\n changeType,\r\n containerType,\r\n elementAttrs: JSON.stringify(instanceJson),\r\n }\r\n\r\n const newInternalStore = [...currentInternalStore]\r\n const updateDrawingIndex = newInternalStore.findIndex(\r\n (drawingElement) => drawingElement.elementId === newDrawing.elementId\r\n )\r\n\r\n let shouldSyncAndSave = false\r\n if (updateDrawingIndex > -1) {\r\n const updatedRecord = newInternalStore[updateDrawingIndex]\r\n const hasChangedZIndex = updatedRecord.zIndex !== newDrawing.zIndex\r\n const hasChangedType = updatedRecord.changeType !== newDrawing.changeType\r\n const hasChangedAttrs = updatedRecord.elementAttrs !== newDrawing.elementAttrs\r\n const hasChange = hasChangedType || hasChangedAttrs || hasChangedZIndex\r\n if (\r\n !element.instance.isEditInProgress &&\r\n updatedRecord.ticker === ticker &&\r\n hasChange &&\r\n updatedRecord.changeType !== 'destroy'\r\n ) {\r\n newInternalStore[updateDrawingIndex] = newDrawing\r\n shouldSyncAndSave = true\r\n }\r\n } else {\r\n newInternalStore.push(newDrawing)\r\n shouldSyncAndSave = true\r\n }\r\n\r\n return {\r\n newInternalStore,\r\n shouldSyncAndSave,\r\n newDrawing,\r\n }\r\n }\r\n}\r\n\r\nexport function getTickersAndContainerTypesInLayoutModel(chartLayout: ChartLayout) {\r\n const tickers: string[] = []\r\n const containerTypes: Array = ['note']\r\n\r\n chartLayout.getAllPanes().forEach((paneModel) => {\r\n const ticker = paneModel.getQuoteRawTicker()\r\n const containerType = getContainerType(paneModel)\r\n if (ticker && !tickers.includes(ticker)) {\r\n tickers.push(ticker)\r\n }\r\n if (containerType && !containerTypes.includes(containerType)) {\r\n containerTypes.push(containerType)\r\n }\r\n })\r\n return { tickers, containerTypes }\r\n}\r\n\r\nexport function mergeUpdatedDrawingsToInternalStore({\r\n updatedDrawings,\r\n currentInternalStore,\r\n lastUpdateTimestamp,\r\n isRefetchAll,\r\n}: {\r\n updatedDrawings: AutoSaveElement[]\r\n currentInternalStore: AutoSaveElement[]\r\n lastUpdateTimestamp: DrawingChangeTimestamp\r\n isRefetchAll: boolean\r\n}) {\r\n let newLastUpdateTimestamp = lastUpdateTimestamp\r\n const newInternalStore = [...currentInternalStore]\r\n const updatedElementIds: string[] = []\r\n\r\n updatedDrawings.forEach((drawing) => {\r\n newLastUpdateTimestamp = receiveHlc(newLastUpdateTimestamp, drawing.lastChange)\r\n const drawingIndex = newInternalStore.findIndex(({ elementId }) => drawing.elementId === elementId)\r\n const currentDrawing = drawingIndex > -1 ? newInternalStore[drawingIndex] : null\r\n if (currentDrawing === null) {\r\n newInternalStore.push(drawing)\r\n updatedElementIds.push(drawing.elementId)\r\n } else if (currentDrawing.containerType === 'note' && isRefetchAll) {\r\n const currentNote = getElementNoteText(currentDrawing)\r\n const autoSavedNote = getElementNoteText(drawing)\r\n if (currentNote !== autoSavedNote) {\r\n newInternalStore[drawingIndex] = {\r\n ...drawing,\r\n lastChange: incrementHlc(receiveHlc(currentDrawing.lastChange, drawing.lastChange), Date.now()),\r\n elementAttrs: JSON.stringify({\r\n ...JSON.parse(drawing.elementAttrs),\r\n text: `${currentNote}\\r\\n${autoSavedNote}`,\r\n }),\r\n }\r\n }\r\n updatedElementIds.push(drawing.elementId)\r\n } else if (compareHlc(newInternalStore[drawingIndex].lastChange, drawing.lastChange) < 0) {\r\n newInternalStore[drawingIndex] = drawing\r\n updatedElementIds.push(drawing.elementId)\r\n }\r\n })\r\n return { newLastUpdateTimestamp, newInternalStore, updatedElementIds }\r\n}\r\n\r\nexport function getInitialStoreDrawings(): null | AutoSaveElement[] {\r\n const initialDrawings = (\r\n window.FinvizSettings?.initialDrawingsStore ?? window.FinvizChartsSettings?.initialDrawingsStore\r\n )?.drawings as null | AutoSaveElementDBRecord[]\r\n\r\n return initialDrawings?.map((item) => getAutosaveElementFromDBRecord(item)) ?? null\r\n}\r\n\r\nexport function handleCallMethodOnAllDrawings({\r\n chartLayoutModel,\r\n elementMethod,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n elementMethod: keyof Pick\r\n}) {\r\n chartLayoutModel.getAllElements().forEach((element) => {\r\n if (element.isDrawing()) {\r\n element[elementMethod]()\r\n }\r\n })\r\n}\r\n\r\nexport function getNoteElementId(ticker: string) {\r\n return `note-${ticker}`\r\n}\r\n\r\nexport function getElementNoteText(noteElement?: AutoSaveElement) {\r\n return (noteElement ? JSON.parse(noteElement.elementAttrs)?.text : '') ?? ''\r\n}\r\n\r\nexport function getTickerNoteText({ ticker, elements }: { ticker: string; elements: AutoSaveElement[] }) {\r\n const noteElement = elements.find(({ elementId }) => elementId === getNoteElementId(ticker))\r\n return getElementNoteText(noteElement)\r\n}\r\n\r\nexport function getAutosaveElementFromDBRecord(item: AutoSaveElementDBRecord): AutoSaveElement {\r\n return {\r\n elementId: item.elementId,\r\n ticker: item.ticker,\r\n zIndex: item.zIndex,\r\n changeType: item.changeType,\r\n containerType: item.containerType,\r\n elementAttrs: item.elementAttrs,\r\n lastChange: {\r\n ts: item.lastChangeTimestamp,\r\n count: item.lastChangeCounter,\r\n uuid: item.lastChangeNodeUUID,\r\n },\r\n }\r\n}\r\n\r\nexport function getDBRecordFromAutosaveElement(item: AutoSaveElement): Omit {\r\n return {\r\n elementId: item.elementId,\r\n ticker: item.ticker,\r\n zIndex: item.zIndex,\r\n changeType: item.changeType,\r\n containerType: item.containerType,\r\n elementAttrs: JSON.stringify(item.elementAttrs),\r\n lastChangeTimestamp: item.lastChange.ts,\r\n lastChangeCounter: item.lastChange.count,\r\n lastChangeNodeUUID: item.lastChange.uuid,\r\n }\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ConfirmationDialog,\r\n Delayed,\r\n DialogDismiss,\r\n Popover,\r\n PopoverPlacement,\r\n PopoverRounding,\r\n PopoverStateReturn,\r\n PopoverTheme,\r\n PopoverTrigger,\r\n Spinner,\r\n usePopoverState,\r\n} from '@finviz/website'\r\nimport classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { CHART_ELEMENT_ID, SpecificChartFunctionality } from '../../constants/common'\r\nimport { chartSettingsAsyncModule } from '../../controllers/chart-settings/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\n\r\nconst utmCampaign: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-settings-button',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-settings-button',\r\n [SpecificChartFunctionality.forexPage]: 'forex-settings-button',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-settings-button',\r\n}\r\n\r\ninterface ScrollableChartSettingsPopoverProps {\r\n isOpen: boolean\r\n state: PopoverStateReturn\r\n}\r\n\r\nexport function PopoverInner({ hidePopover }: { hidePopover: () => void }) {\r\n const [chartSettingsModule] = useAsyncModule({\r\n ...chartSettingsAsyncModule,\r\n isSuspenseMode: true,\r\n errorSeverity: 'medium',\r\n onError: () => hidePopover(),\r\n })\r\n\r\n const { ChartSettings } = chartSettingsModule ?? {}\r\n\r\n return \r\n}\r\n\r\nexport const ScrollableChartSettingsPopover = React.memo(function ScrollableChartSettingsPopover({\r\n state,\r\n isOpen,\r\n}: ScrollableChartSettingsPopoverProps) {\r\n const { forceGlobalRerender, getIsConfigChanged, chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const confirmationDialogState = usePopoverState()\r\n const hidePopover = state.hide\r\n\r\n const checkChangesAndOpenDiscard = React.useCallback(\r\n (ev: Event | React.MouseEvent) => {\r\n if (getIsConfigChanged()) {\r\n ev.preventDefault()\r\n confirmationDialogState.show()\r\n return\r\n }\r\n hidePopover()\r\n },\r\n [confirmationDialogState, getIsConfigChanged, hidePopover]\r\n )\r\n\r\n const discardChangesAndHide = React.useCallback(() => {\r\n forceGlobalRerender()\r\n // We need to defer the hide so that the rerender finishes first\r\n setTimeout(hidePopover)\r\n }, [forceGlobalRerender, hidePopover])\r\n\r\n const buttonPosition = React.useMemo(() => {\r\n const popoverContentElement = state.getState().disclosureElement\r\n const { top = 0, height = 32 } = popoverContentElement?.getBoundingClientRect() ?? {}\r\n return top + height + window.scrollY\r\n // Only recount on open\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isOpen])\r\n\r\n const chartHeight = React.useMemo(() => {\r\n const chartElement = document.getElementById(CHART_ELEMENT_ID)\r\n return chartElement?.clientHeight ?? 0\r\n // Only recount on open\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [isOpen])\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n Discard changes\r\n \r\n \r\n }\r\n >\r\n Are you sure you want to discard changes?\r\n \r\n \r\n )\r\n})\r\n\r\ninterface ChartSettingsButtonProps extends ButtonComponentProps {\r\n isPremium: boolean\r\n placement?: PopoverPlacement\r\n model: ChartLayout\r\n}\r\n\r\nexport function ChartSettingsButton({\r\n isPremium,\r\n model,\r\n placement,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom' })\r\n const isOpen = settingsPopoverState.useState('open')\r\n\r\n const buttonProps = React.useMemo(() => {\r\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\r\n return {\r\n as: 'a',\r\n href: `/elite.ashx?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign[model.specificChartFunctionality],\r\n })}`,\r\n } as ButtonComponentProps<'a'>\r\n }\r\n\r\n return {\r\n as: PopoverTrigger,\r\n state: settingsPopoverState,\r\n active: isOpen,\r\n } as ButtonComponentProps\r\n }, [model.specificChartFunctionality, isPremium, settingsPopoverState, isOpen])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { useModelRef } from '../../model-hooks/useModelRef'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { QuoteFetchType } from '../../models/quote/constants'\r\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\nimport { getLeftOffset } from '../renderUtils'\r\n\r\nconst getQuoteRequestKey = (chartModel: Chart) =>\r\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\r\n\r\nexport function useChartControls({\r\n chartModel: unwatchedChartModel,\r\n isInteractive,\r\n}: {\r\n chartModel: Chart | null\r\n isInteractive: boolean\r\n}) {\r\n const location = useLocation()\r\n const navigate = useNavigate()\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\r\n })\r\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\r\n watchProperties: ['idea', 'settings'],\r\n })\r\n const chartModelRef = useModelRef(chartModel)\r\n const [isLoading, setIsLoading] = React.useState(false)\r\n const abortControllerKeyRef = React.useRef('')\r\n const isIdeaChart = !!chartLayoutModel?.idea?.id\r\n\r\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\r\n const chart = chartModelRef.current\r\n if (!chart) {\r\n return\r\n }\r\n\r\n const chartLayoutModel = chart.chart_layout()\r\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\r\n\r\n chart.getAllPanes().forEach((pane) => {\r\n if (!!pane.getChartOrIndicatorElement()) {\r\n pane.updateAttribute('scaleRange', null)\r\n }\r\n })\r\n\r\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\r\n\r\n // Refetch all other chart quotes as the main one is already refetched so we can filter it out but other quotes (from perf for example) should be refetched as well\r\n chart\r\n .getAllQuotes()\r\n .filter((chartQuote) => !chartQuote.eql(quote))\r\n .forEach((quote) => {\r\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\r\n })\r\n\r\n const chartPane = chart.getChartPane()\r\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\r\n\r\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\r\n for (const element of elements) {\r\n const isDrawing = element.isDrawing()\r\n const isChartEvent = element.isChartEvent()\r\n if (isDrawing || isChartEvent) {\r\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\r\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\r\n element.instance.updateScales()\r\n } else {\r\n element.destroyCascade()\r\n }\r\n }\r\n }\r\n\r\n chart.setChartEvents(quote.chartEvents, true)\r\n\r\n chartPane?.updateChartEventsZIndexes()\r\n\r\n // The only dependency here is a ref , so no need to add it to dependencies\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const fetchQuote = React.useCallback(async () => {\r\n if (!isInteractive || !chartModel || isIdeaChart) {\r\n return\r\n }\r\n setIsLoading(true)\r\n\r\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\r\n const { premarket, aftermarket } = Quote.first()\r\n const patterns = chartModel.getHasPatterns()\r\n const currentQuote = chartModel.quote()\r\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\r\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\r\n const abortController = createRequestAbortController({\r\n key: abortControllerKeyRef.current,\r\n shouldAbortRunningRequest: !Quote.select(\r\n (quote) =>\r\n quote.ticker === ticker &&\r\n quote.timeframe === timeframe &&\r\n quote.isFetching &&\r\n chartModel.chart_layout().isIdeaId(quote.ideaID)\r\n ),\r\n })\r\n\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n events: hasChartEvents,\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n abortController,\r\n })\r\n\r\n if (quote.wasFetchAborted) {\r\n // Check if the quote is also used in other chars, as the quote may be reused if we already have a quote with the same options\r\n const isQuoteUsedInOtherCharts = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .filter((chart) => !chartModel.eql(chart))\r\n .some((chart) => quote.eql(chart.quote()))\r\n\r\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\r\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\r\n quote.destroy()\r\n }\r\n\r\n return\r\n }\r\n\r\n removeFromAbortCache(abortControllerKeyRef.current)\r\n\r\n updateChartModelWithNewQuote(quote)\r\n }\r\n\r\n setIsLoading(false)\r\n\r\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [\r\n chartModel?.id,\r\n chartModel?.ticker,\r\n chartModel?.timeframe,\r\n chartModel?.instrument,\r\n isIdeaChart,\r\n updateChartModelWithNewQuote,\r\n isInteractive,\r\n ])\r\n\r\n React.useEffect(() => {\r\n fetchQuote()\r\n }, [fetchQuote])\r\n\r\n // There are several ways how to turn off dateRange, e.g. moving the charts\r\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\r\n // Consider refactoring this part so we only update chart models on route changes not the other way around\r\n React.useEffect(() => {\r\n if (chartModel) {\r\n const decodedQueryString = decodeQueryString(location.search)\r\n const rangesArray = chartModel\r\n .chart_layout()\r\n .getAllCharts()\r\n .map((chart) => chart.dateRange)\r\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\r\n\r\n if (decodedQueryString.r !== ranges) {\r\n navigate({\r\n search: `?${encodeQueryString({\r\n ...decodedQueryString,\r\n r: ranges,\r\n })}`,\r\n })\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.dateRange])\r\n\r\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\r\n // React.useEffect(\r\n // () => () => {\r\n // if (isInteractive && abortControllerKeyRef.current !== '') {\r\n // abortRequest(abortControllerKeyRef.current)\r\n // }\r\n // },\r\n // [isInteractive]\r\n // )\r\n\r\n React.useEffect(() => {\r\n const chart = chartModelRef.current\r\n const quote = chart?.quote()\r\n\r\n let shouldRecalculateOnCharts = false\r\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\r\n const settings = chartLayoutModel?.settings\r\n const barWidth = 3\r\n const barMargin = 1\r\n if (settings) {\r\n const hasSameBarWidth = [\r\n settings.ChartSettings.center.barWidth,\r\n settings.IndicatorSettings.center.barWidth,\r\n ].every((value) => value === barWidth)\r\n const hasSameBarMargin = [\r\n settings.ChartSettings.center.barMargin,\r\n settings.IndicatorSettings.center.barMargin,\r\n ].every((value) => value === barMargin)\r\n\r\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\r\n if (shouldRecalculateOnCharts) {\r\n settings.ChartSettings.center.barWidth = barWidth\r\n settings.IndicatorSettings.center.barWidth = barWidth\r\n settings.ChartSettings.center.barMargin = barMargin\r\n settings.IndicatorSettings.center.barMargin = barMargin\r\n\r\n chartLayoutModel.updateAttributes({ settings })\r\n }\r\n }\r\n }\r\n\r\n if (\r\n chart &&\r\n quote &&\r\n (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage ||\r\n shouldRecalculateOnCharts) &&\r\n !isIdeaChart\r\n ) {\r\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\r\n chart.updateAttributes({ leftOffset })\r\n }\r\n // This effect should run only on timeframe change & idea change\r\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\r\n\r\n return { isLoading }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nexport function useModelRef(model: Model | null) {\r\n const modelRef = React.useRef(model)\r\n\r\n React.useEffect(() => {\r\n modelRef.current = model\r\n }, [model])\r\n\r\n return modelRef\r\n}\r\n","import {\r\n Notification,\r\n Paragraph,\r\n generatePathForTimeframeDateRange,\r\n getDateRangeGroupsWithHref,\r\n timeframeUtm,\r\n useNotification,\r\n} from '@finviz/website'\r\nimport React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport { SpecificChartFunctionality, TIMEFRAME, TimeframeAndIntradayType } from '../../constants/common'\r\nimport Chart from '../../models/chart'\r\nimport Quote from '../../models/quote'\r\nimport { dateFromUnixTimestamp } from '../../utils'\r\nimport { getChartStartEndDates, getVisibleBarsNumber } from '../renderUtils'\r\nimport { useChartsPathLocation } from './use-charts-path-location'\r\nimport { getTimeframeGroupsWithHref } from './utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TimeframeAndIntradayType\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\nexport interface IDateRange {\r\n value: string\r\n timeframe: TIMEFRAME\r\n}\r\n\r\nexport function useChartModelCustomDateRangeValues({\r\n chartModel,\r\n isPremium,\r\n}: {\r\n chartModel: Chart | null\r\n isPremium: boolean\r\n}) {\r\n const notificationContext = useNotification()\r\n const location = useLocation()\r\n const [isFetching, setIsFetching] = React.useState(false)\r\n const chartLayoutModel = chartModel?.chart_layout() || null\r\n const chartIndex = chartLayoutModel?.getAllCharts().findIndex((chart) => chartModel!.eql(chart)) ?? -1\r\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel, chartIndex })\r\n const specificChartFunctionality = chartLayoutModel?.specificChartFunctionality ?? SpecificChartFunctionality.default\r\n\r\n const anchorDate = React.useMemo(() => {\r\n if (!chartModel) return new Date()\r\n const quote = chartModel.quote()\r\n return dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n }, [chartModel])\r\n\r\n const generateChartLayoutRouterPath = React.useCallback(\r\n ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n if (specificChartFunctionality === SpecificChartFunctionality.chartPage) {\r\n return getChartsToPath({\r\n ticker: ticker,\r\n timeframe: timeframe as TIMEFRAME,\r\n dateRange: dateRange,\r\n })\r\n }\r\n\r\n return generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname: location.pathname,\r\n timeframe: timeframe,\r\n dateRange: dateRange,\r\n utmCampaign: timeframeUtm[specificChartFunctionality],\r\n })\r\n },\r\n [getChartsToPath, isPremium, specificChartFunctionality, location.pathname]\r\n )\r\n\r\n const timeframeGroupsWithHref = (isPremium: boolean) =>\r\n getTimeframeGroupsWithHref({\r\n isPremium,\r\n generatePath: (timeFrame) => generateChartLayoutRouterPath({ timeframe: timeFrame.value, dateRange: null }),\r\n })\r\n\r\n const dateRangeGroupsWithHref = ({\r\n isPremium,\r\n customRange,\r\n instrument,\r\n }: {\r\n isPremium: boolean\r\n customRange?: string\r\n instrument: Instrument\r\n }) =>\r\n getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n instrument,\r\n generatePath: (dateRange: { timeframe?: TIMEFRAME; value: string }) =>\r\n generateChartLayoutRouterPath({ timeframe: dateRange.timeframe!, dateRange: dateRange.value }),\r\n })\r\n\r\n const handleCustomDateRangeValidation = async (dateRangeState: { value: string | null; timeframe: TIMEFRAME }) => {\r\n if (dateRangeState.value !== null) {\r\n const { timeframe, ticker, instrument, premarket, aftermarket } = chartModel?.quote() || {}\r\n const patterns = !!chartModel?.getHasPatterns()\r\n if (!anchorDate || !instrument || !ticker || !timeframe || !dateRangeState.value) return false\r\n setIsFetching(true)\r\n const quote = await Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe: dateRangeState.timeframe,\r\n options: {\r\n premarket,\r\n aftermarket,\r\n patterns,\r\n cachePredicate: (quote) => quote.ideaID === undefined,\r\n fetchNewDataOnCachedQuote: true,\r\n },\r\n })\r\n setIsFetching(false)\r\n\r\n const { numOfVisibleBars } = getVisibleBarsNumber({\r\n ...getChartStartEndDates({ dateRange: dateRangeState.value, quote }),\r\n quote,\r\n dateRange: dateRangeState.value,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n notificationContext.show(\r\n } timeoutInMs={6000}>\r\n \r\n There are no data for the selected date range. Try selecting different dates.\r\n \r\n \r\n )\r\n\r\n return false\r\n }\r\n }\r\n return true\r\n }\r\n\r\n return {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { ChartsPageQueryParams, LAYOUTS, LayoutType, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport { ChartSyncablePart } from '../../models/chart/contstants'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\r\n\r\nexport function useChartsPathLocation({\r\n chartLayoutModel: unwatchedChartLayoutModel,\r\n chartIndex = -1,\r\n}: {\r\n chartLayoutModel: ChartLayout | null\r\n chartIndex?: number\r\n}) {\r\n const location = useLocation()\r\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, {\r\n watchProperties: ['syncChartParts'],\r\n })\r\n const hasSyncedTimeframe = React.useMemo(\r\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Timeframe),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [chartLayoutModel?.syncChartParts]\r\n )\r\n const hasSyncedTicker = React.useMemo(\r\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Ticker),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [chartLayoutModel?.syncChartParts]\r\n )\r\n\r\n const getChartsToPath = React.useCallback(\r\n ({\r\n ticker,\r\n timeframe,\r\n dateRange,\r\n layout,\r\n }: {\r\n timeframe?: TIMEFRAME\r\n dateRange?: string | null\r\n ticker?: string\r\n layout?: LayoutType\r\n }) => {\r\n if (!chartLayoutModel) {\r\n return {\r\n pathname: location.pathname,\r\n search: '',\r\n }\r\n }\r\n\r\n const decodedSearch = decodeQueryString(location.search)\r\n const { count } = LAYOUTS[(layout ?? chartLayoutModel.layout) as LayoutType]\r\n const urlTickers = decodedSearch.t?.split(',') ?? []\r\n const urlTimeframes = decodedSearch.p?.split(',') ?? []\r\n const urlDateRanges = decodedSearch.r?.split(',')\r\n\r\n const chartsArrayPlaceholder = Array.from({ length: count })\r\n const tickers = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentTicker = urlTickers[index] ?? urlTickers[urlTickers.length - 1]\r\n return (chartIndex === index || hasSyncedTicker) && ticker ? ticker : currentTicker\r\n })\r\n .join(',')\r\n const timeframes = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentTimeframe = urlTimeframes[index] ?? urlTimeframes[urlTimeframes.length - 1]\r\n return (chartIndex === index || hasSyncedTimeframe) && timeframe ? timeframe : currentTimeframe\r\n })\r\n .join(',')\r\n const ranges = chartsArrayPlaceholder\r\n .map((_, index) => {\r\n const currentDaterange = urlDateRanges\r\n ? urlDateRanges[index] ?? urlDateRanges[urlDateRanges.length - 1]\r\n : undefined\r\n return (chartIndex === index || hasSyncedTimeframe) && dateRange !== undefined ? dateRange : currentDaterange\r\n })\r\n .join(',')\r\n\r\n return {\r\n pathname: location.pathname,\r\n search: `?${encodeQueryString({\r\n t: tickers,\r\n p: timeframes,\r\n r: ranges.split(',').some(Boolean) ? ranges : undefined,\r\n l: layout ?? chartLayoutModel.layout,\r\n sidebar: getIsMobilePortrait() ? undefined : decodedSearch.sidebar,\r\n })}`,\r\n }\r\n },\r\n [chartLayoutModel, chartIndex, location, hasSyncedTicker, hasSyncedTimeframe]\r\n )\r\n\r\n return { getChartsToPath }\r\n}\r\n","import { IconNameType, getTimeframeGroups } from '@finviz/website'\r\nimport { type To } from 'react-router-dom'\r\n\r\nimport { TimeframeAndIntradayType } from '../../constants/common'\r\n\r\ninterface ITimeFrame {\r\n value: TimeframeAndIntradayType\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\ninterface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\nexport function getTimeframeGroupsWithHref({\r\n isPremium,\r\n generatePath,\r\n}: {\r\n isPremium: boolean\r\n generatePath: (timeframe: ITimeFrame) => To\r\n}) {\r\n return getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\r\n label: timeFrameGroup.label,\r\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\r\n ...timeFrame,\r\n href: generatePath(timeFrame),\r\n })),\r\n }))\r\n}\r\n\r\nexport enum QuoteNodeChartTypes {\r\n candlesticksimple = 'candlesticksimple',\r\n candlestick = 'candlestick',\r\n line = 'line',\r\n ohlc = 'ohlc',\r\n heikinashi = 'heikinashi',\r\n hollowcandlestick = 'hollowcandlestick',\r\n}\r\n\r\nexport enum QuoteUrlChartTypes {\r\n cs = 'cs',\r\n c = 'c',\r\n l = 'l',\r\n o = 'o',\r\n ha = 'ha',\r\n hc = 'hc',\r\n}\r\n\r\nexport const QuoteShortToLongType = {\r\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\r\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\r\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\r\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\r\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\r\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\r\n} as const\r\n\r\nexport const QuoteLongToShortType = {\r\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\r\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\r\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\r\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\r\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\r\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\r\n} as const\r\n\r\nexport type TypeBaseOption = {\r\n label: string\r\n value: QuoteNodeChartTypes\r\n icon: IconNameType\r\n href?: string\r\n}\r\nexport const DEFAULT_TYPES: TypeBaseOption[] = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\r\n { icon: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\r\n { icon: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\r\n { icon: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\r\n { icon: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE: TypeBaseOption[] = [\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlesticksimple, label: 'Candle - simple' },\r\n { icon: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle - advanced' },\r\n // Filter out the candle from DEFAULT_TYPES, we’re naming it differently\r\n ...DEFAULT_TYPES.filter((type) => type.value !== QuoteNodeChartTypes.candlestick),\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE_VALUES = ['candlesticksimple', 'candlestick', 'line']\r\n","export const chartEventsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-events\" */ './module-entry'),\r\n cacheKey: 'chart-events',\r\n}\r\n","export const chartSettingsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-settings\" */ './module-entry'),\r\n cacheKey: 'chart-settings',\r\n}\r\n\r\nexport const useChartLayoutGlobalModelAsyncModule = {\r\n importFn: () =>\r\n import(/* webpackChunkName: \"use-chart-layout-global-model\" */ './useChartLayoutGlobalModel/module-entry'),\r\n cacheKey: 'use-chart-layout-global-model',\r\n}\r\n\r\nexport const preventClosingUnsavedChangesAsyncModule = {\r\n importFn: () =>\r\n import(/* webpackChunkName: \"prevent-closing-unsaved-changes\" */ './PreventClosingUnsavedChanges/module-entry'),\r\n cacheKey: 'prevent-closing-unsaved-changes',\r\n}\r\n","import { InputColorPicker, convertColorToHEX } from '@finviz/website'\r\nimport * as React from 'react'\r\n\r\ninterface BackgroundInputProps {\r\n label: string\r\n value: string\r\n onChange: (color: string) => void\r\n}\r\n\r\nexport function BackgroundInput({ label = 'Background', value, onChange }: BackgroundInputProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import { InputColorPicker, Paragraph, RangeSlider } from '@finviz/website'\r\nimport React, { useCallback } from 'react'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface ColorRangeRowInputProps {\r\n label: string\r\n colorValue: string\r\n colorTestId: string\r\n rangeValue: string\r\n rangeTestId: string\r\n rangeLabel: string\r\n rangeProps: ObjectHash\r\n onChange: (colorValue: string, value: string) => void\r\n}\r\n\r\nexport function ColorRangeRowInput({\r\n label,\r\n colorValue,\r\n colorTestId,\r\n rangeValue,\r\n rangeTestId,\r\n rangeLabel,\r\n rangeProps,\r\n onChange,\r\n}: ColorRangeRowInputProps) {\r\n const handleRangeChange = useCallback(\r\n (ev) => {\r\n const value = ev.currentTarget.value\r\n onChange(colorValue, value)\r\n },\r\n [onChange, colorValue]\r\n )\r\n const handleColorChange = useCallback(\r\n (color) => {\r\n onChange(color, rangeValue)\r\n },\r\n [onChange, rangeValue]\r\n )\r\n return (\r\n

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

(Component: React.ComponentType

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

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

(Component: React.ComponentType

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

(Component: React.ComponentType

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

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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

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

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

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

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

(\r\n Component: React.ComponentType

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

(\r\n Component: React.ComponentType

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

\r\n

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

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

{idea.note}

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

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

\r\n
\r\n\r\n
\r\n {\r\n setIsConfirmDelete(false)\r\n }}\r\n >\r\n Cancel\r\n \r\n {\r\n onDeleteIdeaClick.current(idea)\r\n }}\r\n >\r\n Delete\r\n \r\n
\r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Badge, Tab, TabList, TabPanel, Tabs } from '@finviz/website'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { getInstrument } from '../../utils/chart'\r\nimport fetchApi from '../../utils/fetch_api'\r\nimport IdeaItem from './IdeaItem'\r\nimport { IIdea, IIdeaCategory, categorizeIdeas } from './utils'\r\n\r\nexport default function IdeasTabs() {\r\n const [hasError, setHasError] = React.useState(false)\r\n const [hasFetched, setHasFetched] = React.useState(false)\r\n const [categorizedIdeas, setCategorizedIdeas] = React.useState([])\r\n const [params] = useSearchParams()\r\n const queryTickers = params.get('t')!.split(',') // there always be some t param defined\r\n\r\n React.useEffect(() => {\r\n async function fetchIdeas() {\r\n window.gtag?.('event', 'load', { event_category: 'ideas' })\r\n try {\r\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\r\n const ideas = data.ideas.map((idea: IIdea) => {\r\n const dateParts = idea.date.split(' ')\r\n return {\r\n ...idea,\r\n instrument: getInstrument(idea.ticker),\r\n date: dateParts[0].replace('-', ' ').replace('-', ', '),\r\n time: dateParts[1],\r\n }\r\n })\r\n\r\n setCategorizedIdeas(categorizeIdeas(ideas, queryTickers))\r\n setHasFetched(true)\r\n } catch {\r\n setHasError(true)\r\n }\r\n }\r\n\r\n fetchIdeas()\r\n\r\n // run only on mount\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [])\r\n\r\n const handleIdeaDeleted = (idea: IIdea) => {\r\n setCategorizedIdeas((prev) => {\r\n const modifiedCategories = [...prev]\r\n\r\n // remove from specific ticker category\r\n const categoryIndex = modifiedCategories.findIndex((c) => c.ticker === idea.ticker)\r\n if (categoryIndex >= 0) {\r\n const updatedCategory = {\r\n ...modifiedCategories[categoryIndex],\r\n ideas: modifiedCategories[categoryIndex].ideas.filter((i) => i.id !== idea.id),\r\n }\r\n modifiedCategories[categoryIndex] = updatedCategory\r\n }\r\n\r\n // remove from all\r\n const updatedAll = {\r\n ...modifiedCategories[0],\r\n ideas: modifiedCategories[0].ideas.filter((i) => i.id !== idea.id),\r\n }\r\n modifiedCategories[0] = updatedAll\r\n\r\n // remove empty categories\r\n return modifiedCategories.filter((c) => c.ideas.length !== 0)\r\n })\r\n }\r\n\r\n if (!hasFetched || hasError) {\r\n return (\r\n
\r\n {hasError ? 'Unexpected error occurred, please refresh the page.' : 'Loading…'}\r\n
\r\n )\r\n }\r\n\r\n if (categorizedIdeas.length === 0) {\r\n return (\r\n \r\n No saved ideas.\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {categorizedIdeas.map((category) => (\r\n {category.ideas.length}}>\r\n {category.ticker}\r\n \r\n ))}\r\n \r\n {categorizedIdeas.map((category) => (\r\n \r\n
\r\n {category.ideas.map((idea) => (\r\n \r\n ))}\r\n
\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import { Dialog, DialogBody, DialogHeader, DialogStateReturn } from '@finviz/website'\r\n\r\nimport IdeasTabs from './IdeasTabs'\r\n\r\ntype IdeasDialogProps = {\r\n state: DialogStateReturn\r\n}\r\n\r\nexport default function IdeasDialog({ state }: IdeasDialogProps) {\r\n return (\r\n \r\n Your Ideas\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonComponentProps,\r\n ButtonProps,\r\n Dropdown,\r\n DropdownItem,\r\n Spinner,\r\n Tooltip,\r\n TooltipTrigger,\r\n useDialogState,\r\n useDropdownState,\r\n useTooltipState,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport IdeasDialog from '../../modals/ideas/Ideas'\r\nimport { saveIdea } from '../../modals/ideas/utils'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport Quote from '../../models/quote'\r\nimport { getIsMobileScreenSize } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\ninterface IdeaDropdownProps {\r\n model: ChartLayout\r\n rounding?: 'none' | 'regular'\r\n theme?: ButtonProps['theme']\r\n size?: ButtonProps['size']\r\n dropdownButtonClassName?: string\r\n}\r\n\r\nexport function IdeasDropdown({\r\n model,\r\n rounding,\r\n dropdownButtonClassName,\r\n ...props\r\n}: React.PropsWithChildren) {\r\n const tooltipState = useTooltipState({ placement: 'right-start' })\r\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\r\n const ref = React.useRef(null)\r\n const dialog = useDialogState()\r\n const dropdown = useDropdownState()\r\n const hideTooltip = tooltipState.hide\r\n\r\n const dropdownItemProps = isAnyQuoteLoading\r\n ? ({\r\n as: TooltipTrigger,\r\n state: tooltipState,\r\n } as ButtonComponentProps)\r\n : ({} as ButtonComponentProps)\r\n\r\n React.useEffect(() => {\r\n const checkIfAnyQuoteIsLoading = () => {\r\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\r\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\r\n }\r\n\r\n Quote.bind('change', checkIfAnyQuoteIsLoading)\r\n return () => {\r\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\r\n }\r\n }, [])\r\n\r\n React.useEffect(() => {\r\n if (!isAnyQuoteLoading || !dropdown.visible) {\r\n hideTooltip()\r\n }\r\n }, [isAnyQuoteLoading, dropdown.visible, hideTooltip])\r\n\r\n if (!window.FinvizSettings.hasUserPremium) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n <>\r\n \r\n }\r\n >\r\n {\r\n if (isAnyQuoteLoading) {\r\n tooltipState.show()\r\n return\r\n }\r\n saveIdea(model)\r\n }}\r\n >\r\n Save idea\r\n \r\n dialog.show()}>\r\n Load idea\r\n \r\n \r\n \r\n {isAnyQuoteLoading && (\r\n \r\n
\r\n \r\n
\r\n \r\n Some data is still loading. Please wait.\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { Button, ButtonComponentProps, Delayed, Icon, Spinner, useDialogState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\n\r\ninterface PublishProps extends Pick {\r\n model: ChartLayout\r\n}\r\n\r\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\r\n const dialog = useDialogState()\r\n const isDialogOpen = dialog.useState('open')\r\n const [publishModalModule, { isLoading }] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: isDialogOpen,\r\n errorSeverity: 'medium',\r\n onError: () => dialog.hide(),\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n\r\n return (\r\n <>\r\n dialog.show()}\r\n leftContent={\r\n isLoading ? (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n 'share'\r\n )\r\n }\r\n />\r\n {PublishDialog && }\r\n \r\n )\r\n}\r\n","import {\r\n Button,\r\n ButtonSizeType,\r\n ButtonThemeType,\r\n Delayed,\r\n Icon,\r\n Spinner,\r\n TourDefinition,\r\n useTour,\r\n} from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\r\nimport { encodeQueryString } from '../../utils/query_string'\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\n\r\n// If we need to update / discontinue some tour we can use skip flag on legacy version to ensure that it won't reset users tour but won't include it in new tours\r\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\r\n return [\r\n {\r\n id: 'chart-tour',\r\n steps: [\r\n {\r\n title: 'Chart Tour',\r\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\r\n },\r\n ...(isPremium\r\n ? [\r\n {\r\n title: 'Scale the Timeline',\r\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\r\n },\r\n {\r\n title: 'Scale the Price Axis',\r\n body: 'Grab the Price Axis to zoom it in and out. Move the chart around freely in any direction when Price Axis has custom scale. Double-click the Price Axis to reset the scaling.',\r\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\r\n },\r\n {\r\n title: 'Drawing tools & settings',\r\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\r\n target: '#toolbar',\r\n },\r\n {\r\n title: 'Fine-tune Drawings',\r\n body: 'Double-click on a chart drawing to tweak its color and style. Right-click on a drawing to access other options, such as changing its visibility, order, and more.',\r\n target: '[data-testid=\"chart-0-pane-0\"]',\r\n },\r\n ]\r\n : [\r\n {\r\n title: 'Enable Drawing mode',\r\n body: (\r\n <>\r\n \r\n Finviz*Elite\r\n {' '}\r\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\r\n chart.
\r\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\r\n \r\n ),\r\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\r\n placement: 'bottom-start',\r\n },\r\n ]),\r\n {\r\n title: 'Save your best Ideas',\r\n body: isPremium\r\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\r\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\r\n target: '[data-testid=\"chart-toolbar-ideas\"]',\r\n placement: 'bottom-start',\r\n },\r\n ...(page === SpecificChartFunctionality.quotePage\r\n ? []\r\n : [\r\n {\r\n title: 'Chart Layouts & Charts Sync',\r\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\r\n target: '[data-testid=\"chart-layout-layout\"]',\r\n },\r\n ]),\r\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\r\n ? []\r\n : [\r\n {\r\n title: 'Fullscreen mode',\r\n body:\r\n page === SpecificChartFunctionality.quotePage\r\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\r\n : 'Toggle the window to fill your entire screen.',\r\n target: '[data-testid=\"chart-layout-fullscreen\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ]),\r\n {\r\n title: 'Share chart',\r\n body: 'Share a chart together with your analysis and ideas.',\r\n target: '[data-testid=\"chart-toolbar-publish\"]',\r\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\r\n placement: 'bottom',\r\n },\r\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\r\n ? [\r\n {\r\n title: 'Theme',\r\n body: 'Switch between the Light and Dark theme.',\r\n target: '[data-testid=\"chart-layout-theme\"]',\r\n },\r\n ]\r\n : []),\r\n {\r\n title: 'Study Settings',\r\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\r\n target: '[data-testid=\"chart-settings-open-btn\"]',\r\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\r\n },\r\n ],\r\n },\r\n page === SpecificChartFunctionality.chartPage && {\r\n id: 'sidebar-watchlist',\r\n steps: [\r\n {\r\n title: 'Explore Your Portfolios',\r\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\r\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\r\n placement: 'left-start',\r\n },\r\n ],\r\n },\r\n ].filter(Boolean) as TourDefinition[]\r\n}\r\n\r\ninterface TourButtonProps {\r\n page: SpecificChartFunctionality\r\n rounding?: 'none' | 'regular'\r\n size?: ButtonSizeType\r\n theme?: ButtonThemeType\r\n className?: string\r\n}\r\n\r\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\r\n const tour = useTour()\r\n const pageTours = getTour(page)\r\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\r\n const buttonTheme: ButtonThemeType = userTour.hasNewTours ? 'blue' : theme ?? 'headerItem'\r\n\r\n return (\r\n \r\n }\r\n >\r\n \r\n \r\n ) : (\r\n \r\n )\r\n }\r\n className={className}\r\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\r\n title=\"Explore new features\"\r\n onClick={async () => {\r\n if (userTour) {\r\n const activeTour = await tour.startTour(userTour.tour)\r\n activeTour?.once('inactive', () => {\r\n setCurrentTour(tour.getStepsForUser(pageTours))\r\n })\r\n }\r\n }}\r\n />\r\n )\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { getChartStartEndDates } from '../controllers/renderUtils'\r\nimport Quote from '../models/quote'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\r\n// *********************************\r\n\r\nexport enum CustomDateRangePrefixEnum {\r\n Range = 'range',\r\n Prev = 'prev',\r\n}\r\n\r\nexport const CUSTOM_DATE_RANGE = 'custom'\r\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\r\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\r\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\r\n\r\nexport function getParsedDateRange(dateRange: string) {\r\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\r\n}\r\n\r\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\r\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\r\n const dateFrom = dateFromString ? new Date(dateFromString) : null\r\n const dateTo = dateToString ? new Date(dateToString) : null\r\n return {\r\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\r\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\r\n }\r\n }\r\n\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\r\n\r\n if ([years, months, days].some(Number.isNaN)) {\r\n return { start: null, end: null }\r\n }\r\n\r\n return {\r\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\r\n end: anchorDate,\r\n }\r\n }\r\n\r\n return { start: null, end: anchorDate }\r\n}\r\n\r\n// **************END**************\r\n// Functions below don't need to be\r\n// in sync with Website repository\r\n// *******************************\r\n\r\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\r\n const parsedRange = getChartStartEndDates({ dateRange, quote })\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n\r\n let startQuoteDate: Date | null = null\r\n let endQuoteDate: Date | null = null\r\n let numOfDaysToRender: number | null = null\r\n\r\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const reversedDaysInQuote = [...daysInQuote].reverse()\r\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\r\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\r\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\r\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\r\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\r\n }\r\n\r\n return {\r\n start: parsedRange.start,\r\n end: parsedRange.end,\r\n startQuoteDate,\r\n endQuoteDate,\r\n numOfDaysToRender,\r\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\r\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\r\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\r\n }\r\n}\r\n","import * as d3 from 'd3'\r\nimport * as dateFns from 'date-fns'\r\n\r\nimport { Instrument, ObjectHash } from '../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n DateRangeType,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport ChartLayout from '../models/chart_layout'\r\nimport { IChartSettings, IIndicatorSettings, ISettings } from '../models/chart_settings/interfaces'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport Element from '../models/element'\r\nimport Pane, { ScaleAxis } from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport Utils from '../utils'\r\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\r\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\r\nimport {\r\n DATE_RANGE_PREFIX_DELMITER,\r\n getParsedDateRangeMetaData,\r\n parseCustomDateRangeUrlParam,\r\n} from '../utils/chart-date-range-utils'\r\n\r\ninterface VisibleBarNumberProps {\r\n start: Date | null\r\n end: Date\r\n quote: Quote\r\n dateRange: string\r\n}\r\n\r\ninterface ChartZoomAndLeftOffsetProps extends Omit {\r\n chartVisibleWidth: number\r\n numOfBarsToRender?: number\r\n chartModel: Chart\r\n}\r\n\r\ninterface ChartStartEndDatesProps {\r\n dateRange: string\r\n quote: Quote\r\n}\r\n\r\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\r\n const startInSec = start ? start.getTime() / 1000 : 0\r\n const endInSec = end.getTime() / 1000\r\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\r\n const lastQuoteDateIndex = quote.barIndex[quote.barIndex.length - 1]\r\n let lastVisibleBarIndex = lastQuoteDateIndex\r\n let numOfVisibleBars = 0\r\n if (\r\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\r\n quote.instrument === Instrument.Stock\r\n ) {\r\n numOfVisibleBars = quote.drawMinutesPerDay\r\n } else {\r\n let firstVisibleBarIndex = -1\r\n lastVisibleBarIndex = -1\r\n quote.date.forEach((quoteDate, index) => {\r\n if (isQuoteDateInRange(quoteDate)) {\r\n if (firstVisibleBarIndex === -1) {\r\n firstVisibleBarIndex = quote.barIndex[index]\r\n }\r\n lastVisibleBarIndex = quote.barIndex[index]\r\n }\r\n })\r\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\r\n\r\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\r\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\r\n }\r\n }\r\n\r\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\r\n}\r\n\r\nexport const getChartZoomAndLeftOffset = ({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n chartModel,\r\n numOfBarsToRender,\r\n}: ChartZoomAndLeftOffsetProps) => {\r\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\r\n start,\r\n end,\r\n quote,\r\n dateRange: chartModel.dateRange,\r\n })\r\n if (numOfVisibleBars === 0) {\r\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\r\n }\r\n\r\n const chartLayout = chartModel.chart_layout()\r\n const zoomFactor = getZoomFactorForBarsToDisplay({\r\n chartLayout,\r\n chartVisibleWidth,\r\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\r\n })\r\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\r\n const leftOffset =\r\n getLeftOffset({\r\n quote,\r\n chartModel,\r\n config: {},\r\n barWidth,\r\n numberOfBarsToDraw: numOfBarsToRender,\r\n }) +\r\n numOfBarsOffset * barWidth\r\n return { zoomFactor, leftOffset }\r\n}\r\n\r\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\r\n const daysInQuote = quote.getDaysInQuote()\r\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\r\n\r\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\r\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\r\n const end = convertLocalToNyTime(\r\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\r\n false\r\n )\r\n return {\r\n start: range.start && convertLocalToNyTime(range.start, false),\r\n end,\r\n }\r\n }\r\n\r\n let start\r\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\r\n switch (dateRange) {\r\n case DateRangeType.d1:\r\n lastDate.setHours(23, 59, 59, 999)\r\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\r\n break\r\n case DateRangeType.d5:\r\n lastDate.setHours(23, 59, 59, 999)\r\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\r\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\r\n break\r\n case DateRangeType.m1:\r\n start = dateFns.subMonths(lastDate, 1)\r\n break\r\n case DateRangeType.m3:\r\n start = dateFns.subMonths(lastDate, 3)\r\n break\r\n case DateRangeType.m6:\r\n start = dateFns.subMonths(lastDate, 6)\r\n break\r\n case DateRangeType.ytd:\r\n start = dateFns.startOfYear(lastDate)\r\n break\r\n case DateRangeType.y1:\r\n start = dateFns.subYears(lastDate, 1)\r\n break\r\n case DateRangeType.y2:\r\n start = dateFns.subYears(lastDate, 2)\r\n break\r\n case DateRangeType.y5:\r\n start = dateFns.subYears(lastDate, 5)\r\n break\r\n case DateRangeType.max:\r\n default:\r\n start = null\r\n break\r\n }\r\n\r\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\r\n}\r\n\r\ninterface GetLeftOffsetProps {\r\n quote: Quote\r\n chartModel: Chart\r\n config?: { stretch?: boolean }\r\n barWidth?: number\r\n barIndex?: number\r\n numberOfBarsToDraw?: number\r\n shouldAlignDaysToLeftApplied?: boolean\r\n}\r\n\r\nexport const getMinMaxLeftOffset = ({\r\n newLeftOffset,\r\n chartModel,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex,\r\n}: {\r\n newLeftOffset: number\r\n chartModel: Chart\r\n barWidth?: number\r\n barIndex: number\r\n}) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const numOfBarsInView = Math.floor(width / barWidth)\r\n const fx = (index: number) => index * barWidth\r\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\r\n}\r\n\r\nexport function getFullChartWidth({\r\n hasAftermarket,\r\n hasPremarket,\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n}) {\r\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\r\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\r\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\r\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n}\r\n\r\nexport function getIntradayChartConfig({\r\n timeframeMinutes,\r\n barWidthWithMargin,\r\n hasPremarket,\r\n hasAftermarket,\r\n maxWidth,\r\n canCropChart,\r\n}: {\r\n hasPremarket: boolean\r\n hasAftermarket: boolean\r\n timeframeMinutes: number\r\n barWidthWithMargin: number\r\n maxWidth: number\r\n canCropChart: boolean\r\n}) {\r\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\r\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\r\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\r\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\r\n const chartWidthWithOffset = fullChartWidth - offsetInPx\r\n const shouldCropChart =\r\n canCropChart && hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\r\n\r\n return {\r\n fullChartWidth,\r\n offsetInPx: shouldCropChart ? offsetInPx : 0,\r\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\r\n offsetChartAfter,\r\n }\r\n}\r\n\r\nexport const getLeftOffset = ({\r\n quote,\r\n chartModel,\r\n config,\r\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\r\n barIndex = getBarIndex(quote),\r\n numberOfBarsToDraw,\r\n shouldAlignDaysToLeftApplied = true,\r\n}: GetLeftOffsetProps) => {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\r\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\r\n if (config?.stretch) {\r\n return 0\r\n }\r\n if (getIsSmallIndexChart(specificChartFunctionality)) {\r\n return barWidth\r\n }\r\n const fx = (index: number) => index * barWidth\r\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\r\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\r\n if (\r\n shouldAlignDaysToLeftApplied &&\r\n shouldAlignDaysToLeft({\r\n quote,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n dateRange: chartModel.dateRange,\r\n })\r\n ) {\r\n let drawDaysInOneChart = 1\r\n if (numberOfBarsToDraw) {\r\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\r\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\r\n drawDaysInOneChart = 5\r\n } else if (quote.interval === 15) {\r\n drawDaysInOneChart = 6\r\n } else if (quote.interval === 30) {\r\n drawDaysInOneChart = 12\r\n } else if (quote.interval === 60) {\r\n drawDaysInOneChart = 22\r\n } else if (quote.interval === 120) {\r\n drawDaysInOneChart = 39\r\n } else if (quote.interval === 240) {\r\n drawDaysInOneChart = 78\r\n } else if (quote.interval > 240) {\r\n drawDaysInOneChart = (quote.interval / 30) * 10\r\n }\r\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\r\n hasPremarket: quote.premarket,\r\n hasAftermarket: quote.aftermarket,\r\n barWidthWithMargin: barWidth,\r\n timeframeMinutes: quote.interval,\r\n maxWidth: chartModel.width,\r\n canCropChart: !chartModel.dateRange,\r\n })\r\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\r\n\r\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\r\n if (drawDaysWidth <= width + 1) {\r\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\r\n // Align start of day to left if we have enough space to show all bars in day\r\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\r\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\r\n // Math.max(1, ~~num) is to mimic imlementation from getHalfBarWidth(),\r\n // we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n leftOffset = Math.round(-fx(barsToOffset) + Math.max(1, ~~(barWidth / 2))) - offsetChartInPx\r\n }\r\n }\r\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\r\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n return leftOffset\r\n }\r\n return getMinMaxLeftOffset({\r\n newLeftOffset: leftOffset,\r\n chartModel,\r\n barWidth,\r\n barIndex,\r\n })\r\n}\r\n\r\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\r\n\r\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\r\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\r\n\r\ninterface ShouldAlignDaysToLeftProps {\r\n quote: Quote\r\n numberOfBarsToDraw?: number\r\n specificChartFunctionality: SpecificChartFunctionality\r\n dateRange: DateRangeType | null\r\n}\r\n\r\n/**\r\n * Evaluate if days should be aligned to the left\r\n * @param {object} object.quote - Quote model\r\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\r\n * @returns {boolean} boolean\r\n * */\r\nexport const shouldAlignDaysToLeft = ({\r\n quote,\r\n dateRange,\r\n numberOfBarsToDraw,\r\n specificChartFunctionality,\r\n}: ShouldAlignDaysToLeftProps) => {\r\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\r\n const isIntradayDateRange = !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\r\n const isOffScreen = specificChartFunctionality === SpecificChartFunctionality.offScreen\r\n const isOffScreenWithNoDateRange = isOffScreen && !dateRange\r\n const isOffScreenIntradayDateRange = isOffScreen && isIntradayDateRange\r\n const isOffScreenWithFixedBars = isOffScreen && numberOfBarsToDraw\r\n\r\n const isQuotePage = specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuotePageWithNoDateRange = isQuotePage && !dateRange\r\n const isQuotePageIntradayDateRange = isQuotePage && isIntradayDateRange\r\n const isQuotePageWithFixedBars = isQuotePage && numberOfBarsToDraw\r\n\r\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isChartsInradayDateRange = isChartPage && isIntradayDateRange\r\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\r\n return (\r\n isStockIntraday &&\r\n (isOffScreenWithNoDateRange ||\r\n isOffScreenIntradayDateRange ||\r\n isOffScreenWithFixedBars ||\r\n isQuotePageWithNoDateRange ||\r\n isQuotePageIntradayDateRange ||\r\n isQuotePageWithFixedBars ||\r\n isChartsInradayDateRange ||\r\n isChartPageWithFixedBars)\r\n )\r\n}\r\n\r\ninterface ClipProps {\r\n canvasCtx: RenderingContext2DType\r\n width: number\r\n height: number\r\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\r\n}\r\n// pane canvasCtx clip\r\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\r\n const contentWidth = width - Settings.left.width - Settings.right.width\r\n const contentHeight = height - Settings.top.height - Settings.bottom.height\r\n canvasCtx.beginPath()\r\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\r\n canvasCtx.clip()\r\n}\r\n\r\nexport const getSettings = (paneModel: Pane): IIndicatorSettings | IChartSettings => {\r\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\r\n for (const element of paneModel.elements().all()) {\r\n if (element.isIndicator()) {\r\n return IndicatorSettings\r\n }\r\n }\r\n return ChartSettings\r\n}\r\n\r\ninterface RecountScaleProps {\r\n chartModel: Chart\r\n paneModel: Pane\r\n}\r\n\r\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\r\n\r\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\r\n const quote = elementModel.pane().chart().quote()\r\n\r\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\r\n}\r\n\r\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\r\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\r\n const chartLayout = chartModel.chart_layout()\r\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\r\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\r\n const el = elementModel.instance\r\n const isChart = elementModel.isChart()\r\n if (isChart || elementModel.isIndicator()) {\r\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\r\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\r\n if (isChart) {\r\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\r\n } else {\r\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\r\n }\r\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\r\n\r\n if (chartModel.stretch) {\r\n width = chartModel.width - Settings.left.width - Settings.right.width\r\n fx = d3\r\n .scaleLinear()\r\n .range([0, width])\r\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\r\n } else {\r\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\r\n fx.invert = (x: number) => x / barWidthWithMargin\r\n fx.width = function (w) {\r\n return this.invert(w) - this.invert(0)\r\n }\r\n }\r\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\r\n\r\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\r\n let fy\r\n\r\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\r\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\r\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\r\n const minPx = currentScale(min)\r\n const domain = currentScale.domain()\r\n if (minPx > protectedHeightPx) {\r\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\r\n const extendedMin = tempScale.invert(contentHeight)\r\n currentScale.domain([domain[0], extendedMin])\r\n }\r\n }\r\n }\r\n\r\n switch (scaleType) {\r\n case ScaleType.Logarithmic:\r\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n handleDomainOffset(fy, d3.scaleSymlog)\r\n break\r\n default:\r\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\r\n if (!paneModel.scaleRange) {\r\n fy = fy.nice(10)\r\n handleDomainOffset(fy, d3.scaleLinear)\r\n }\r\n break\r\n }\r\n fy.height = function (h: number) {\r\n return this.invert(h) - this.invert(0)\r\n }\r\n paneModel.updateAttribute('scale', {\r\n x: fx,\r\n y: fy,\r\n })\r\n\r\n if (isChart) {\r\n el.setupAxis!(fx as ScaleAxis)\r\n }\r\n break\r\n }\r\n }\r\n}\r\n\r\n// general, only when blurry ends won't be visible or didn't matter\r\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\r\n\r\ninterface IXYOffsetFromLine {\r\n lineWidth: number\r\n x1: number\r\n y1: number\r\n x2: number\r\n y2: number\r\n}\r\n\r\n// return x,y offsets for pixel perfect line rendering\r\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\r\n // don't add offset is lineWidth is even\r\n if (lineWidth % 2 === 0) {\r\n return { x: 0, y: 0 }\r\n }\r\n if (y1 === y2) {\r\n return { x: 0, y: 0.5 } // horizontal line\r\n } else if (x1 === x2) {\r\n return { x: 0.5, y: 0 } // vertical line\r\n } else {\r\n return { x: 0.5, y: 0.5 } // diagonal line\r\n }\r\n}\r\n\r\nexport const getRoundedObject = (obj: T): T => {\r\n const rounded = Object.entries(obj)\r\n for (let i = 0; i < rounded.length; i++) {\r\n rounded[i][1] = Math.round(rounded[i][1])\r\n }\r\n return Object.fromEntries(rounded) as T\r\n}\r\n\r\ninterface ITranslate {\r\n context: CanvasRenderingContext2D\r\n xOffset: number\r\n yOffset: number\r\n}\r\n\r\ninterface ITranslateObj {\r\n do: () => void\r\n undo: () => void\r\n}\r\n\r\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\r\n do: () => context.translate(xOffset, yOffset),\r\n undo: () => context.translate(xOffset * -1, yOffset * -1),\r\n})\r\n\r\ninterface IPercentageScaleValue {\r\n number: number\r\n base: number\r\n}\r\n\r\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\r\n\r\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\r\n\r\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\r\n chartModel: Chart\r\n quote: Quote\r\n}\r\n\r\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\r\n const { ChartSettings } = chartModel.getChartLayoutSettings()\r\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\r\n\r\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\r\n dateRange: chartModel.dateRange,\r\n quote,\r\n })\r\n\r\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\r\n chartVisibleWidth,\r\n start,\r\n end,\r\n quote,\r\n numOfBarsToRender,\r\n chartModel: chartModel,\r\n })\r\n\r\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\r\n chartModel.updateAttributes({ zoomFactor, leftOffset })\r\n }\r\n}\r\n\r\nexport function renderPane({\r\n chartLayoutModel,\r\n chartModel,\r\n paneModel,\r\n canvasCtx,\r\n shouldRenderCross = false,\r\n}: {\r\n chartLayoutModel: ChartLayout\r\n chartModel: Chart\r\n paneModel: Pane\r\n canvasCtx: CanvasRenderingContext2D\r\n shouldRenderCross?: boolean\r\n}) {\r\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\r\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\r\n } else {\r\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\r\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\r\n }\r\n const elements = paneModel.getAllElements()\r\n for (const { instance: elementInstance } of elements) {\r\n if (typeof elementInstance.renderGrid === 'function') {\r\n canvasCtx.save()\r\n elementInstance.renderGrid(canvasCtx)\r\n canvasCtx.restore()\r\n }\r\n }\r\n\r\n const chartEvents = paneModel.getAllChartEvents()\r\n const Settings = getSettings(paneModel)\r\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\r\n const isDrawing = elementInstance.getIsDrawing()\r\n const isChartEvent = elementInstance.getIsChartEvent()\r\n\r\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\r\n continue\r\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\r\n continue\r\n }\r\n\r\n canvasCtx.save()\r\n if (elementInstance.renderContent != null) {\r\n canvasCtx.save()\r\n clip({\r\n canvasCtx,\r\n width: chartModel.width,\r\n height: paneModel.height,\r\n Settings,\r\n })\r\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\r\n elementInstance.renderContent(canvasCtx)\r\n canvasCtx.restore()\r\n if (typeof elementInstance.renderLabels === 'function') {\r\n elementInstance.renderLabels(canvasCtx)\r\n }\r\n } else {\r\n elementInstance.render(canvasCtx)\r\n }\r\n if (\r\n shouldRenderCross &&\r\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\r\n isRedesignedPage(chartLayoutModel)) &&\r\n elementInstance.renderCross != null\r\n ) {\r\n elementInstance.renderCross(canvasCtx)\r\n }\r\n canvasCtx.restore()\r\n }\r\n}\r\n","export const DEFAULT_WIDTHS = {\r\n min: 200,\r\n max: 400,\r\n}\r\n\r\nexport enum SidebarDirection {\r\n vertical,\r\n horizontal,\r\n}\r\n","import React from 'react'\r\n\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\r\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\r\n\r\nexport type SidebarContextType = {\r\n isOpen: boolean\r\n isCloseVisible: boolean\r\n direction: SidebarDirection\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n activeModule: SidebarModuleType | null\r\n close: () => void\r\n onResize: () => void\r\n selectModule: (module?: SidebarModule) => void\r\n}\r\n\r\nconst DEFAULT_CONTEXT: SidebarContextType = {\r\n activeModule: null,\r\n isOpen: false,\r\n isCloseVisible: false,\r\n direction: SidebarDirection.horizontal,\r\n width: DEFAULT_WIDTHS,\r\n close: () => {},\r\n onResize: () => {},\r\n selectModule: () => {},\r\n}\r\n\r\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\r\nexport const useSidebarContext = () => React.useContext(SidebarContext)\r\n","import { DefaultErrorBoundary } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\n\r\nexport function ModuleLoadFailed(props: Partial) {\r\n return (\r\n \r\n )\r\n}\r\n","export const portfolioWatchlistAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\r\n cacheKey: 'portfolio-watchlist',\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\r\nimport { withModuleAsyncLoad } from './with-module-async-load'\r\n\r\nexport enum SidebarModule {\r\n portfolio = 'portfolio',\r\n}\r\n\r\nexport type SidebarModuleType = {\r\n key: SidebarModule\r\n icon: IconNameType\r\n description: string\r\n content: React.ComponentType\r\n width?: {\r\n min?: number | string\r\n max?: number | string\r\n default?: { desktop?: number; mobile?: number }\r\n }\r\n}\r\n\r\nexport const sidebarModules: Record = Object.freeze({\r\n [SidebarModule.portfolio]: {\r\n key: SidebarModule.portfolio,\r\n icon: 'briefcase',\r\n description: 'Portfolio watchlist',\r\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\r\n width: { min: 200, default: { mobile: 275 } },\r\n },\r\n})\r\n","import { Delayed, Spinner } from '@finviz/website'\r\nimport React from 'react'\r\n\r\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\r\nimport { ModuleLoadFailed } from './module-load-failed'\r\n\r\nexport function withModuleAsyncLoad<\r\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\r\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\r\n return function InnerFunction() {\r\n const [isComponentReady, setIsComponentReady] = React.useState(false)\r\n const [sidebarModule, { isError }] = useAsyncModule({\r\n ...asyncModule,\r\n isSuspenseMode: true,\r\n })\r\n\r\n const SidebarModule = sidebarModule?.default\r\n\r\n if (isError) {\r\n return \r\n }\r\n\r\n return (\r\n <>\r\n {!isComponentReady && withInitialLoading && (\r\n \r\n
\r\n \r\n
\r\n
\r\n )}\r\n {!!SidebarModule && }\r\n \r\n )\r\n }\r\n}\r\n","import { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '@finviz/website'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\nimport { sidebarModules } from './modules/modules'\r\n\r\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\r\n\r\ntype SidebarTabsProps = {\r\n className?: string\r\n}\r\n\r\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\r\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\r\n const tooltipState = useTooltipState({ placement: 'left', showTimeout: 300 })\r\n\r\n return (\r\n \r\n {/* reserved space for drawing button on mobile devices */}\r\n {direction === SidebarDirection.horizontal && (\r\n \r\n )}\r\n\r\n {Object.entries(sidebarModules).map(([key, value]) => {\r\n const isActive = activeModule?.key === key\r\n return (\r\n \r\n {\r\n selectModule(isActive ? undefined : value.key)\r\n }}\r\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\r\n data-testid={`sidebar-${key}-btn`}\r\n >\r\n \r\n \r\n }\r\n state={tooltipState}\r\n aria-label={value.description}\r\n isHideOnClick\r\n />\r\n\r\n \r\n {value.description}\r\n \r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { Resizable } from 're-resizable'\r\nimport React from 'react'\r\n\r\nimport Utils from '../../utils'\r\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\r\nimport { useSidebarContext } from './hooks/sidebar-context'\r\n\r\ntype SidebarContentProps = {\r\n children: React.ReactNode\r\n}\r\n\r\nexport default function SidebarContent({ children }: SidebarContentProps) {\r\n const { direction, onResize, close, width } = useSidebarContext()\r\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\r\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\r\n const defaultMobile = width?.default?.mobile ?? minWidth\r\n const defaultDesktop = width?.default?.desktop ?? maxWidth\r\n\r\n return (\r\n <>\r\n {direction === SidebarDirection.vertical && (\r\n \r\n {children}\r\n \r\n )}\r\n {direction === SidebarDirection.horizontal && (\r\n <>\r\n
\r\n
\r\n {children}\r\n
\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { Delayed, Spinner, localStorage } from '@finviz/website'\r\nimport * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate, useSearchParams } from 'react-router-dom'\r\n\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { SidebarDirection } from './constants'\r\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\r\nimport { ModuleLoadFailed } from './modules/module-load-failed'\r\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\r\nimport SidebarContent from './sidebar-content'\r\nimport SidebarTabs from './sidebar-tabs'\r\n\r\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\r\n\r\n// This is a temp function, to remove unused property from localstorage\r\nfunction removeSidebarFromLocalstorage() {\r\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\r\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\r\n}\r\nremoveSidebarFromLocalstorage()\r\n\r\ntype SidebarProps = {\r\n onShouldResize: () => void\r\n direction: SidebarDirection\r\n tabsClassName?: string\r\n}\r\n\r\n// Todo - this is not correct approach but this component can unmount/mount on mobile orientation change so we can't keep it inside the component\r\nlet isInit = false\r\n\r\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\r\n const navigate = useNavigate()\r\n const [urlSearchParams] = useSearchParams()\r\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\r\n const [activeModule, setActiveModule] = React.useState(null)\r\n\r\n const isOpen = !!activeModule\r\n const handleSelectModule = React.useCallback(\r\n (key?: SidebarModule) => {\r\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\r\n if (key) {\r\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\r\n } else {\r\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\r\n }\r\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\r\n },\r\n [urlSearchParams, navigate]\r\n )\r\n\r\n const handleCloseSidebar = React.useCallback(() => {\r\n handleSelectModule(undefined)\r\n }, [handleSelectModule])\r\n\r\n // Resize charts every time the sidebar is opened/closed or active module is changed\r\n React.useEffect(() => {\r\n onShouldResize()\r\n }, [activeModule, onShouldResize])\r\n\r\n // Set active module based on sidebarModuleKey\r\n React.useEffect(() => {\r\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\r\n\r\n if (!isInit && getIsMobilePortrait()) {\r\n sidebarModule = null\r\n handleCloseSidebar()\r\n }\r\n\r\n setActiveModule(sidebarModule)\r\n isInit = true\r\n }, [sidebarModuleKey, handleCloseSidebar])\r\n\r\n const contextValue: SidebarContextType = React.useMemo(\r\n () => ({\r\n direction,\r\n isOpen,\r\n isCloseVisible: direction === SidebarDirection.horizontal,\r\n width: activeModule?.width,\r\n activeModule,\r\n onResize: onShouldResize,\r\n close: handleCloseSidebar,\r\n selectModule: handleSelectModule,\r\n }),\r\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\r\n )\r\n\r\n return (\r\n \r\n {activeModule && (\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n }\r\n >\r\n \r\n \r\n
\r\n
\r\n )}\r\n \r\n
\r\n )\r\n}\r\n","import { IconNameType } from '@finviz/website'\r\n\r\nimport ChartLayout from '../../models/chart_layout'\r\n\r\nexport enum DrawingTool {\r\n Arrow = 'arrow',\r\n Brush = 'brush',\r\n Callout = 'callout',\r\n Curve = 'curve',\r\n ElliottWaves = 'elliott-wave',\r\n Ellipse = 'ellipse',\r\n FibonacciRetracements = 'fibonacci-retracements',\r\n HorizontalLine = 'horizontal-line',\r\n Measure = 'measure',\r\n Mouse = 'mouse',\r\n Pitchfork = 'pitchfork',\r\n Polygon = 'polygon',\r\n Position = 'position',\r\n Rectangle = 'rectangle',\r\n RotatedRectangle = 'rotated-rectangle',\r\n ScaledLine = 'scaled-line',\r\n ScaledText = 'scaled-text',\r\n Triangle = 'triangle',\r\n VerticalLine = 'vertical-line',\r\n Xabcd = 'xabcd',\r\n}\r\n\r\nexport enum DrawingActions {\r\n AddNote = 'add-note',\r\n DeleteDrawings = 'delete-drawings',\r\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\r\n}\r\n\r\nexport enum DrawingSetting {\r\n PreserveDrawings = 'preserve-drawings',\r\n DrawingModeContinuous = 'drawing-mode-continuous',\r\n HideDrawings = 'hide-drawings',\r\n LockDrawings = 'lock-drawings',\r\n}\r\n\r\nexport interface IToolBarProps {\r\n chartLayoutModel: ChartLayout\r\n isSidebar?: boolean\r\n isHorizontal?: boolean\r\n isMobileOverlay?: boolean\r\n /**\r\n * Current selected tool id\r\n */\r\n activeTool: DrawingTool\r\n /**\r\n * On tool item select callback\r\n */\r\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\r\n /**\r\n * On drawing actions item select callback\r\n */\r\n onDrawingActionClick?: (actionId: DrawingActions) => void\r\n /**\r\n * On drawing settings item select callback\r\n */\r\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\r\n /**\r\n * On drawing end callback\r\n */\r\n onDrawingEnd?: () => void\r\n /**\r\n * Current state of drawing settings\r\n */\r\n drawingSettings: Record\r\n isAlternativeTheme?: boolean\r\n /**\r\n * Are tools disabled\r\n */\r\n areToolsDisabled?: boolean\r\n}\r\n\r\nexport interface IToolbarItemProperties {\r\n icon: IconNameType\r\n iconActive?: IconNameType\r\n iconAction?: IconNameType\r\n title: string\r\n titleActive?: string\r\n titleAction?: string\r\n}\r\n\r\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\r\n id: DrawingTool\r\n}\r\n\r\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\r\n id: DrawingActions\r\n}\r\n\r\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\r\n id: DrawingSetting\r\n}\r\n\r\nexport interface IToolbarDrawingToolItem {\r\n defaultItem: IToolbarDrawingTool\r\n toolGroup?: Array\r\n toolGroupTitle?: string\r\n}\r\n\r\nexport interface IToolbarDrawingActionItem {\r\n defaultItem: IToolbarDrawingAction\r\n isDisabled?: boolean\r\n disabledTooltip?: string\r\n}\r\n\r\nexport interface IToolbarDrawingsSettingItem {\r\n defaultItem: IToolbarDrawingSetting\r\n isDisabled?: boolean\r\n isInAction?: boolean\r\n disabledTooltip?: string\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport { ChartElementType } from '../constants/common'\r\nimport QuoteModel from '../models/quote'\r\n\r\nexport function getInstrumentLabel(instrument: Instrument) {\r\n switch (instrument) {\r\n case Instrument.Stock:\r\n return 'Stock'\r\n case Instrument.Futures:\r\n return 'Futures'\r\n case Instrument.Forex:\r\n return 'Forex'\r\n case Instrument.Crypto:\r\n return 'Crypto'\r\n case Instrument.MarketSentiment:\r\n return 'Market Sentiment'\r\n }\r\n}\r\n\r\nexport function getChartAlt(quoteModel: QuoteModel) {\r\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\r\n}\r\n\r\nexport const getResponseChartType = (chartType: ChartElementType) => {\r\n switch (chartType) {\r\n case ChartElementType.HeikinAshi:\r\n return 'heikinashi'\r\n case ChartElementType.HollowCandleStick:\r\n return 'hollowcandlestick'\r\n case ChartElementType.LineChart:\r\n return 'line'\r\n case ChartElementType.OhlcChart:\r\n return 'ohlc'\r\n case ChartElementType.CandleStick:\r\n default:\r\n return 'candlestick'\r\n }\r\n}\r\n\r\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\r\n chartResponseType === null\r\n ? null\r\n : Object.values(ChartElementType).find(\r\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\r\n )\r\n","import utils from '../utils'\r\n\r\nclass AverageTrueRange {\r\n period: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(high: number, low: number, prevClose: number) {\r\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\r\n\r\n if (this.count < this.period) {\r\n this.sum += tr\r\n this.value = this.sum / (this.count + 1)\r\n if (this.count === this.period - 1) {\r\n this.sum /= this.period\r\n }\r\n } else {\r\n this.value = (this.value * (this.period - 1) + tr) / this.period\r\n }\r\n this.count++\r\n }\r\n}\r\n\r\nexport default AverageTrueRange\r\n","import { PaneArea } from '../../types/shared'\r\nimport Element, { DefaultAttrs } from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\r\nimport { getRoundedObject } from '../controllers/renderUtils'\r\nimport Chart from '../models/chart'\r\nimport ChartEventElement from '../models/chart-event-element'\r\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\r\nimport type PaneModel from '../models/pane'\r\nimport { ChartEventBadgeState } from '../utils/chart-events-utils'\r\n\r\ninterface ChartEventAttrs extends DefaultAttrs {\r\n x: number\r\n}\r\n\r\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\r\n if (chartEvent.isOpen) {\r\n return ChartEventBadgeState.selected\r\n }\r\n if (chartEvent.isHovered) {\r\n return ChartEventBadgeState.hover\r\n }\r\n return ChartEventBadgeState.default\r\n}\r\n\r\nclass ChartEvent extends Element {\r\n static type = ChartEventType.ChartEvent\r\n static label = 'ChartEvent'\r\n\r\n declare scaled: Pick\r\n\r\n declare chart: BaseChart\r\n\r\n declare model: PaneModel\r\n\r\n declare chartEventModel: ChartEventElement | undefined\r\n\r\n isOpen = false\r\n\r\n left = 0\r\n top = 0\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.scale(this.getBoundingPointKeys())\r\n }\r\n\r\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\r\n\r\n get type() {\r\n return (this.constructor as typeof ChartEvent).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof ChartEvent).label\r\n }\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n switch (this.type) {\r\n case ChartEventType.Dividends:\r\n return ChartEventBadgeType.Dividends\r\n case ChartEventType.Split:\r\n return ChartEventBadgeType.Split\r\n }\r\n\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n getChartEventModel(): ChartEventElement | undefined {\r\n if (!this.chartEventModel) {\r\n this.chartEventModel = this.model.chartEvents()?.findByAttribute('instance', this)\r\n }\r\n\r\n return this.chartEventModel\r\n }\r\n\r\n getXYPosition() {\r\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\r\n const chartEventModel = this.getChartEventModel()\r\n const { x } = this.scaled\r\n const roundedXY = getRoundedObject({ x })\r\n const y =\r\n (this.model as PaneModel).height -\r\n top.height -\r\n bottom.height -\r\n CHART_EVENT_BADGE_SIZE -\r\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\r\n\r\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\r\n }\r\n\r\n getIsVisible() {\r\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (!this.getIsVisible() || !this.chartEventModel) return\r\n\r\n this.attrs.x = Math.round(this.attrs.x)\r\n const chart = this.model.chart()\r\n const chartLayout = chart.chart_layout()\r\n const { x, y } = this.getXYPosition()\r\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\r\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\r\n return\r\n }\r\n const item = this.chartEventModel.getChartEventBadgeImage({\r\n theme: chartLayout.theme,\r\n state: getChartEventState(this),\r\n badgeType: this.getChartEvenBadgeType(),\r\n })\r\n\r\n if (!item) return\r\n\r\n const { left, top } = this.getChartLayoutSettings().ChartSettings\r\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\r\n this.top = y + top.height\r\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\r\n }\r\n\r\n setIsHovered(isHovered: boolean) {\r\n if (!this.getIsVisible()) return\r\n\r\n this.isHovered = isHovered\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n // If isOpenOverride is undefined, the function works as toggle\r\n toggleIsOpen(isOpenOverride?: boolean) {\r\n const chartLayout = this.model.chart().chart_layout()\r\n const chartEventModel = this.getChartEventModel()\r\n\r\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\r\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\r\n this.isOpen = isOpen\r\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\r\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\r\n }\r\n if (isOpen || isCurrentEventActive) {\r\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\r\n }\r\n\r\n this.model.updateChartEventsZIndexes()\r\n this.trigger('change')\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const scaledArea = area.scaled\r\n const { x, y } = this.getXYPosition()\r\n const isInArea =\r\n x <= scaledArea.x &&\r\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\r\n y <= scaledArea.y &&\r\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\r\n return isInArea\r\n }\r\n\r\n getIsInChartView(chart: Chart) {\r\n if (!this.getIsVisible()) return false\r\n\r\n const { x } = this.getXYPosition()\r\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\r\n return isInView\r\n }\r\n}\r\n\r\nexport default ChartEvent\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Dividends extends ChartEvent {\r\n static type = ChartEventType.Dividends\r\n static label = ChartEventLabels[ChartEventType.Dividends]\r\n}\r\n\r\nexport default Dividends\r\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport { IEarnings } from '../utils/chart-events-utils'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Earnings extends ChartEvent {\r\n static type = ChartEventType.Earnings\r\n static label = ChartEventLabels[ChartEventType.Earnings]\r\n\r\n getChartEvenBadgeType(): ChartEventBadgeType {\r\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\r\n\r\n if (!eventItem) {\r\n return ChartEventBadgeType.EarningsNeutral\r\n }\r\n\r\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\r\n const now = Date.now() / 1000\r\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\r\n }\r\n return eventItem.epsActual - eventItem.epsEstimate < 0\r\n ? ChartEventBadgeType.EarningsNegative\r\n : ChartEventBadgeType.EarningsPositive\r\n }\r\n}\r\n\r\nexport default Earnings\r\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\r\nimport ChartEvent from './chart-event'\r\n\r\nclass Split extends ChartEvent {\r\n static type = ChartEventType.Split\r\n static label = ChartEventLabels[ChartEventType.Split]\r\n}\r\n\r\nexport default Split\r\n","import { ChartEventType } from '../constants/common'\r\nimport chartEvent from './chart-event'\r\nimport dividends from './dividends'\r\nimport earnings from './earnings'\r\nimport split from './split'\r\n\r\nexport const chartEventsByType = Object.freeze({\r\n [ChartEventType.ChartEvent]: chartEvent,\r\n [ChartEventType.Dividends]: dividends,\r\n [ChartEventType.Split]: split,\r\n [ChartEventType.Earnings]: earnings,\r\n})\r\n","import { ChartConfigChartPaneElement } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport { chartEventsByType } from '../chart-events'\r\nimport { chartsByType } from '../charts/charts'\r\nimport { indicatorsByType } from '../indicators/indicators'\r\nimport { overlaysByType } from '../overlays/overlays'\r\n\r\nconst canvasElements = {\r\n ...overlaysByType,\r\n ...indicatorsByType,\r\n ...drawingToolsByType,\r\n ...chartsByType,\r\n ...chartEventsByType,\r\n}\r\n\r\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\r\n return canvasElements[elementType]\r\n}\r\n","import { Instrument, Point } from '../../types/shared'\r\n\r\ninterface LinePoints {\r\n x1: number\r\n x2: number\r\n y1: number\r\n y2: number\r\n}\r\n\r\nexport enum BigNumber {\r\n Thousand,\r\n Million,\r\n Billion,\r\n Trillion,\r\n}\r\n\r\nexport const BIG_NUMBER_VALUES = {\r\n [BigNumber.Thousand]: 1e3,\r\n [BigNumber.Million]: 1e6,\r\n [BigNumber.Billion]: 1e9,\r\n [BigNumber.Trillion]: 1e12,\r\n}\r\n\r\nconst BIG_NUMBER_ZEROES = {\r\n [BigNumber.Thousand]: 3,\r\n [BigNumber.Million]: 6,\r\n [BigNumber.Billion]: 9,\r\n [BigNumber.Trillion]: 12,\r\n}\r\n\r\nconst BIG_NUMBER_SUFFIX = {\r\n [BigNumber.Thousand]: 'K',\r\n [BigNumber.Million]: 'M',\r\n [BigNumber.Billion]: 'B',\r\n [BigNumber.Trillion]: 'T',\r\n}\r\n\r\nconst math = {\r\n dotProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.x + p1.y * p2.y\r\n },\r\n\r\n crossProduct(p1: Point, p2: Point) {\r\n return p1.x * p2.y - p1.y * p2.x\r\n },\r\n\r\n distance(p1: Point, p2: Point) {\r\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\r\n },\r\n\r\n lineEquation(line: LinePoints) {\r\n // ax + by + c = 0\r\n if (line.x1 === line.x2) {\r\n return {\r\n a: 1,\r\n b: 0,\r\n c: -line.x1,\r\n }\r\n }\r\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\r\n return {\r\n a: -k,\r\n b: 1,\r\n c: k * line.x1 - line.y1,\r\n k,\r\n }\r\n },\r\n\r\n pointInPolygon(point: Point, polygon: Point[]) {\r\n // http://alienryderflex.com/polygon/\r\n let j = polygon.length - 1\r\n let oddNodes = false\r\n for (let i = 0; i < polygon.length; i++) {\r\n const p = polygon[i]\r\n if (\r\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\r\n (p.x <= point.x || polygon[j].x <= point.x)\r\n ) {\r\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\r\n oddNodes = !oddNodes\r\n }\r\n }\r\n j = i\r\n }\r\n return oddNodes\r\n },\r\n\r\n distanceToLine(point: Point, line: LinePoints) {\r\n const { a, b, c } = this.lineEquation(line)\r\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\r\n return dist\r\n },\r\n\r\n distanceToSegment(point: Point, line: LinePoints) {\r\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\r\n if (l2 === 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\r\n if (t < 0) {\r\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\r\n }\r\n if (t > 1) {\r\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\r\n }\r\n const x = line.x1 + t * (line.x2 - line.x1)\r\n const y = line.y1 + t * (line.y2 - line.y1)\r\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\r\n },\r\n\r\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\r\n if (instrument === Instrument.Crypto && value <= 0.001) {\r\n return 8\r\n }\r\n\r\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\r\n return 4\r\n }\r\n\r\n return 2\r\n },\r\n\r\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\r\n const absNum = Math.abs(number)\r\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\r\n const str = num.toString()\r\n if (str.includes('e')) {\r\n const splitString = str.split('e')\r\n const addZeroes = Number(splitString[1]) - zeroes\r\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\r\n }\r\n const sign = Math.sign(num)\r\n const numberByZeroesCount = Math.pow(10, zeroes)\r\n const result = (absNum / numberByZeroesCount) * sign\r\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\r\n }\r\n\r\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\r\n })\r\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\r\n return getString({\r\n num: number,\r\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\r\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\r\n })\r\n } else {\r\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\r\n }\r\n },\r\n\r\n round({\r\n value,\r\n lastClose = 0,\r\n instrument,\r\n overridePlaces,\r\n }: {\r\n value: number\r\n lastClose?: number\r\n instrument?: Instrument\r\n overridePlaces?: number\r\n }) {\r\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\r\n return this.formatBigNumber(value, overridePlaces)\r\n }\r\n\r\n const places =\r\n typeof overridePlaces === 'number'\r\n ? overridePlaces\r\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\r\n\r\n if (value < 0.000001) {\r\n // There was an issue with getting NaN when rounding small numbers with latter method\r\n return value.toFixed(places)\r\n }\r\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\r\n },\r\n\r\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\r\n if (distance === 0) {\r\n return { x: line.x2, y: line.y2 }\r\n }\r\n\r\n let yAxisCoeficient\r\n let xAxisCoeficient\r\n\r\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = -1\r\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\r\n xAxisCoeficient = -1\r\n yAxisCoeficient = 1\r\n } else {\r\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\r\n xAxisCoeficient = 1\r\n yAxisCoeficient = 1\r\n }\r\n\r\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\r\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\r\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\r\n return { x, y }\r\n },\r\n\r\n rotatedPointCoordinates({\r\n rotationAxisPoint,\r\n angle,\r\n pointToRotate,\r\n }: {\r\n rotationAxisPoint: Point\r\n angle: number\r\n pointToRotate: Point\r\n }) {\r\n // return newCoordinates for pointToRotate after rotation defined by\r\n // angle around rotationAxisPoint\r\n const sin = Math.sin(angle)\r\n const cos = Math.cos(angle)\r\n const rotatedX =\r\n cos * (pointToRotate.x - rotationAxisPoint.x) +\r\n sin * (pointToRotate.y - rotationAxisPoint.y) +\r\n rotationAxisPoint.x\r\n const rotatedY =\r\n cos * (pointToRotate.y - rotationAxisPoint.y) -\r\n sin * (pointToRotate.x - rotationAxisPoint.x) +\r\n rotationAxisPoint.y\r\n return { x: rotatedX, y: rotatedY }\r\n },\r\n sharedPointLinesAngle({\r\n sharedPoint,\r\n oldLinePoint,\r\n newLinePoint,\r\n }: {\r\n sharedPoint: Point\r\n oldLinePoint: Point\r\n newLinePoint: Point\r\n }) {\r\n // return angle between line from sharedPoint to oldLinePoint and\r\n // line from sharedPoint to newLinePoint\r\n const numerator =\r\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\r\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\r\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\r\n const denominator =\r\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\r\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\r\n const ratio = numerator / denominator\r\n\r\n return Math.atan(ratio)\r\n },\r\n\r\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\r\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\r\n // Determine the intersection point of two line segments\r\n // Return FALSE if the lines don't intersect\r\n\r\n // Check if none of the lines are of length 0\r\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\r\n return false\r\n }\r\n\r\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\r\n\r\n // Lines are parallel\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\r\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\r\n\r\n // is the intersection along the segments\r\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\r\n return false\r\n }\r\n\r\n // Return a object with the x and y coordinates of the intersection\r\n const x = p1.x + ua * (p2.x - p1.x)\r\n const y = p1.y + ua * (p2.y - p1.y)\r\n\r\n return { x, y }\r\n },\r\n\r\n // https://stackoverflow.com/a/60368757\r\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\r\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\r\n let a, b\r\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\r\n x: 0,\r\n y: 0,\r\n onLine1: false,\r\n onLine2: false,\r\n }\r\n const denominator =\r\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\r\n if (denominator === 0) {\r\n return false\r\n }\r\n\r\n a = line1_p1.y - line2_p1.y\r\n b = line1_p1.x - line2_p1.x\r\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\r\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\r\n a = numerator1 / denominator\r\n b = numerator2 / denominator\r\n\r\n // if we cast these lines infinitely in both directions, they intersect here:\r\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\r\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\r\n\r\n // if line1 is a segment and line2 is infinite, they intersect if:\r\n if (a > 0 && a < 1) {\r\n result.onLine1 = true\r\n }\r\n // if line2 is a segment and line1 is infinite, they intersect if:\r\n if (b > 0 && b < 1) {\r\n result.onLine2 = true\r\n }\r\n // if line1 and line2 are segments, they intersect if both of the above are true\r\n return result\r\n },\r\n\r\n // ray is considered line1, segment is considered line2\r\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\r\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\r\n\r\n if (\r\n !lineIntersection ||\r\n lineIntersection.onLine1 ||\r\n this.dotProduct(\r\n this.subtractPoints(rayOrigin, lineIntersection as Point),\r\n this.subtractPoints(rayOrigin, rayEnd)\r\n ) <= 0\r\n )\r\n return false\r\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\r\n },\r\n\r\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\r\n const x = (P1.x - P2.x) / 2 + P2.x\r\n const y = (P1.y - P2.y) / 2 + P2.y\r\n return { x, y }\r\n },\r\n\r\n normalizeVector(v: Point) {\r\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\r\n return { x: v.x / length, y: v.y / length }\r\n },\r\n\r\n multiplyVectorByScalar(v: Point, scalar: number) {\r\n return { x: v.x * scalar, y: v.y * scalar }\r\n },\r\n\r\n addPoints(P1: Point, P2: Point) {\r\n return { x: P1.x + P2.x, y: P1.y + P2.y }\r\n },\r\n\r\n subtractPoints(P1: Point, P2: Point): Point {\r\n return { x: P1.x - P2.x, y: P1.y - P2.y }\r\n },\r\n\r\n isSamePoint(P1: Point, P2: Point, margin = { x: 0, y: 0 }) {\r\n return P1.x - margin.x <= P2.x && P2.x <= P1.x + margin.x && P1.y - margin.y <= P2.y && P2.y <= P1.y + margin.y\r\n },\r\n}\r\n\r\nexport default math\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nexport class ExponentialMovingAverage {\r\n period: number\r\n multiplier: number\r\n sum: number\r\n count: number\r\n value: number\r\n\r\n constructor(period: number) {\r\n this.period = period\r\n this.multiplier = 2 / (this.period + 1)\r\n this.sum = 0\r\n this.count = 0\r\n this.value = 0\r\n }\r\n\r\n add(d: number) {\r\n if (this.count < this.period) {\r\n this.sum += d\r\n this.count++\r\n this.value = this.sum / this.count\r\n } else {\r\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\r\n }\r\n }\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n ema: number[]\r\n}\r\n\r\nexport class EMACalculation extends MainCalculation {\r\n static type = OverlayType.Ema\r\n\r\n getDefaultCalculatedValues() {\r\n return { ema: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema.add(close[index])\r\n this.calculatedValues.ema[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\nimport { IndicatorType, OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\n\r\ntype OptionValuesType = ObjectHash\r\ntype CalculatedValuesType = ObjectHash\r\ninterface MainProps {\r\n quote?: Quote\r\n options: T\r\n}\r\n\r\nexport type OnValueCalculatedReturnValue = boolean | undefined\r\nexport type OnValueCalculated = ((value: T, dataIndex: number) => OnValueCalculatedReturnValue) | undefined\r\n\r\nexport class MainCalculation<\r\n TOptionValues extends OptionValuesType | undefined = undefined,\r\n TCalculatedValues extends CalculatedValuesType = CalculatedValuesType,\r\n> {\r\n static type: IndicatorType | OverlayType = IndicatorType.Indicator\r\n\r\n quote: NonNullable['quote']>\r\n options: MainProps['options']\r\n\r\n protected _calculatedValues: TCalculatedValues\r\n\r\n constructor({ quote, options }: MainProps) {\r\n this.quote = quote ?? new Quote()\r\n this.options = options\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n }\r\n\r\n get calculatedValues() {\r\n return this._calculatedValues\r\n }\r\n\r\n getDefaultCalculatedValues(): TCalculatedValues {\r\n throw Error('Implement getDefaultCalculatedValues')\r\n }\r\n\r\n calculate(_: OnValueCalculated) {\r\n throw Error('Implement calculate')\r\n }\r\n\r\n getAllCalculatedValues(lastNItems: number) {\r\n const calculatedValues = {} as TCalculatedValues\r\n Object.keys(this.calculatedValues).forEach((key) => {\r\n calculatedValues[key as keyof TCalculatedValues] = this.getCalculatedValues(key, lastNItems)\r\n })\r\n return calculatedValues\r\n }\r\n\r\n getCalculatedValues(key: keyof TCalculatedValues, lastNItems: number) {\r\n return (this.calculatedValues[key] as number[]).slice(-lastNItems) as TCalculatedValues[keyof TCalculatedValues]\r\n }\r\n\r\n /**\r\n * This function is used to construct sql script for db table creation\r\n * and also to build precalculated data object used on node server.\r\n *\r\n * Precalculated data object uses database column names as property keys to simplify data mapping on BE\r\n */\r\n getDbColumnName() {\r\n const { type } = this.constructor as typeof MainCalculation\r\n const typeLabel = type.split('/')[1]\r\n const optionKeys = Object.keys(this.options ?? {}).sort((key1, key2) => key1.localeCompare(key2))\r\n\r\n const optionsStrings = optionKeys.map((key) => `${key.slice(0, 1)}${this.options![key]}`)\r\n return [typeLabel, ...optionsStrings].join('_')\r\n }\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport {\r\n ChartConfigChartPaneElement,\r\n CustomSpineEvents,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n PaneArea,\r\n RequireByKey,\r\n Theme,\r\n} from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport {\r\n FONT_SIZE,\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n OFFSET,\r\n PADDING,\r\n SpecificChartFunctionality,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport mouseModel from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport { isRedesignEnabled } from '../utils'\r\nimport { roundedRect } from '../utils/canvas-render'\r\nimport { renderCross } from '../utils/chart'\r\nimport {\r\n drawInVisibleArea,\r\n getAreNoBarsVisible,\r\n getCompensatedFirstBarToRenderIndex,\r\n getVisibleBarToRenderIndex,\r\n} from '../utils/draw_in_visible_area'\r\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nconst MAX_POSITIVE_DEFAULT_VALUE = Number.MAX_VALUE\r\nconst MAX_NEGATIVE_DEFAULT_VALUE = -Number.MAX_VALUE\r\n\r\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\r\n switch (indicator) {\r\n case IndicatorType.Rvol:\r\n return { min: 0, max: 2 }\r\n case IndicatorType.Atr:\r\n return { min: 0, max: 10 }\r\n case IndicatorType.Adx:\r\n case IndicatorType.Aro:\r\n case IndicatorType.Mfi:\r\n case IndicatorType.Perf:\r\n case IndicatorType.Rmi:\r\n case IndicatorType.Rsi:\r\n case IndicatorType.Stofu:\r\n case IndicatorType.Ult:\r\n return { min: 0, max: 100 }\r\n case IndicatorType.Macd:\r\n case IndicatorType.Rwi:\r\n case IndicatorType.Trix:\r\n return { min: -1, max: 1 }\r\n case IndicatorType.Wr:\r\n return { min: -100, max: 0 }\r\n case IndicatorType.Aroosc:\r\n case IndicatorType.Roc:\r\n return { min: -100, max: 100 }\r\n case IndicatorType.Cci:\r\n case IndicatorType.Fi:\r\n return { min: -200, max: 200 }\r\n default:\r\n return { min: 0, max: 100 }\r\n }\r\n}\r\n\r\nexport interface IIndicatorIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\r\n static type = IndicatorType.Indicator\r\n static label = 'Indicator'\r\n\r\n static initClass() {\r\n Object.defineProperty(this.prototype, 'height', {\r\n get() {\r\n return this.model.height\r\n },\r\n })\r\n Object.defineProperty(this.prototype, 'contentHeight', {\r\n get() {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\r\n },\r\n })\r\n }\r\n\r\n static fromObject(values: ObjectHash, model: Pane) {\r\n const indicator = new this(values, model)\r\n indicator.set(values)\r\n return indicator\r\n }\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare min: number\r\n declare max: number\r\n declare contentHeight: number\r\n declare height: number\r\n\r\n attrs: Attrs\r\n model: Pane\r\n labelWidth = 0\r\n fetchedAt = -1\r\n leftOffset = 0\r\n width = 0\r\n contentWidth = 0\r\n lastValue: number | null = null\r\n shouldUpdate = true\r\n tickers: string | null = null\r\n period?: string | number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.attrs = attrs\r\n this.model = model\r\n this.data = this.model.chart().quote()\r\n\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n this.renderCrossText = this.renderCrossText.bind(this)\r\n\r\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\r\n this.model.bind('update change', this.trigger.bind(this, 'change'))\r\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\r\n this.model.bind('destroy', () => {\r\n mouseModel.unbind('change', mouseModelChangeHandler)\r\n })\r\n mouseModel.bind('change', mouseModelChangeHandler)\r\n\r\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\r\n }\r\n\r\n get type() {\r\n return (this.constructor as typeof Indicator).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Indicator).label\r\n }\r\n\r\n render(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.data = this.model.chart().quote()\r\n this.leftOffset = this.model.chart().leftOffset\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n this.compute()\r\n\r\n this.setupCache()\r\n\r\n this.renderYAxis(context)\r\n\r\n context.save()\r\n this.clip(context)\r\n this.renderXAxis(context)\r\n const translate = getTranslate({\r\n context,\r\n xOffset: this.leftOffset + IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n this.renderIndicator(context)\r\n translate.undo()\r\n context.restore()\r\n\r\n if (!this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabel(context)\r\n }\r\n }\r\n\r\n isComputeNecessary() {\r\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\r\n // or indicator setting was changed via modal (this.shouldUpdate)\r\n // allow compute and update variables to prevent another unless\r\n // those variables change again\r\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\r\n this.fetchedAt = this.data.fetchedAt\r\n this.shouldUpdate = false\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let y\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const ticks = this.model.scale.y.ticks(10)\r\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\r\n const yLine = new Line(\r\n {\r\n x1: 0,\r\n x2: this.contentWidth,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n fillStyle: Colors.text,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n for (let index = 0; index < ticks.length; index++) {\r\n const tick = ticks[index]\r\n y = Math.round(this.fy(tick))\r\n yLine.set({ y1: y, y2: y }).render(context)\r\n if (index % 2 === 0) {\r\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\r\n }\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\r\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\r\n new Text(\r\n {\r\n text: math.formatBigNumber(this.lastValue, 2),\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n y: valueY,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n background: Colors.indicatorCurrentBackground,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n translate.undo()\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const xLine = new Line(\r\n {\r\n x1: 0,\r\n x2: 0,\r\n y1: 0,\r\n y2: this.contentHeight,\r\n strokeStyle: Colors.grid,\r\n dashLength: 3,\r\n },\r\n this.model\r\n )\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\r\n const x = Math.round(this.fx(tick) + this.leftOffset)\r\n if (x < -15 || x > this.width + 15) {\r\n // margin?\r\n continue\r\n }\r\n xLine.set({ x1: x, x2: x }).render(context)\r\n }\r\n translate.undo()\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n } else {\r\n this.renderLabelQuotePage(context)\r\n }\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y: IndicatorSettings.left.indicatorLabel.margin.top,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context)\r\n return label.render(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isDarkMode = theme === Theme.dark\r\n const x =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n ? OFFSET.S\r\n : IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n const label = new Text(\r\n {\r\n text: this.toString(),\r\n x: x * 2,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\r\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\r\n roundedRect({\r\n ctx: context,\r\n x,\r\n y,\r\n height: INDICATOR_LABEL_HEIGHT,\r\n width: this.labelWidth,\r\n radius: 6,\r\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\r\n })\r\n label.render(context)\r\n\r\n return { x, y, labelWidth: this.labelWidth }\r\n }\r\n\r\n renderCross(context: CanvasRenderingContext2D) {\r\n renderCross({\r\n context,\r\n mouseModel,\r\n paneModel: this.model,\r\n quote: this.data,\r\n contentWidth: this.contentWidth,\r\n contentHeight: this.contentHeight,\r\n isIndicator: true,\r\n isPerfIndicator: this.type === IndicatorType.Perf,\r\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\r\n })\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\r\n }\r\n }\r\n\r\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\r\n this.data = this.model.chart().quote()\r\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n this.renderLabelChartsPage(context)\r\n\r\n this.renderCrossTextChartsPage(context, index)\r\n } else {\r\n this.renderCrossTextQuotePage(context, index)\r\n }\r\n }\r\n\r\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\r\n\r\n renderOversoldOverbought(\r\n context: CanvasRenderingContext2D,\r\n array: number[],\r\n from: number,\r\n oversold: number,\r\n zero: number,\r\n overbought: number,\r\n drawLines?: boolean\r\n ) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.data.close.length === 0) return\r\n const drawInVisibleAreaProps = {\r\n fromIndexOffset: from,\r\n leftOffset: this.leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width: this.width,\r\n }\r\n\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex(drawInVisibleAreaProps)\r\n\r\n if (drawLines == null) {\r\n drawLines = true\r\n }\r\n\r\n context.save()\r\n\r\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\r\n if (clipHeight <= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\r\n this.contentWidth,\r\n clipHeight < 0 ? clipHeight - 1 : -1 // clipHeight - 1 is a compensation to addition of 1 in clip function ; fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n context.clip()\r\n context.set('fillStyle', '#87ceef')\r\n\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(oversold)),\r\n y2: Math.round(this.fy(oversold)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n if (drawLines) {\r\n this.renderZeroLine(context, zero)\r\n }\r\n\r\n context.save()\r\n clipHeight = Math.round(this.fy(overbought))\r\n if (clipHeight >= 0 || getIsSSr()) {\r\n context.beginPath()\r\n context.rect(\r\n -this.leftOffset,\r\n this.fy(this.model.scale.y.domain()[0]),\r\n this.contentWidth,\r\n clipHeight > 0 ? clipHeight : 1 // // fix bug in skia-canvas when clip is incorrect if height is 0 or clip is outside of previous clip https://github.com/samizdatco/skia-canvas/issues/87\r\n )\r\n }\r\n\r\n context.clip()\r\n context.set('fillStyle', '#dc9fe5')\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRenderIndex), Math.round(this.fy(this.model.scale.y.domain()[1])))\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\r\n context.fill()\r\n context.restore()\r\n if (drawLines) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(overbought)),\r\n y2: Math.round(this.fy(overbought)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.set('fillStyle', '#dc9fe5')\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(zero)),\r\n y2: Math.round(this.fy(zero)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n setupCache() {}\r\n\r\n clip(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n context.beginPath()\r\n context.rect(IndicatorSettings.left.width, IndicatorSettings.top.height, this.contentWidth, this.contentHeight + 1) // +1 shows one more pixel which is needed to be able to see a line at very bottom of an indicaor\r\n return context.clip()\r\n }\r\n\r\n formatAxis(value: number, tickStep?: number) {\r\n if (tickStep !== undefined && 10 > tickStep) {\r\n return value.toFixed(2)\r\n }\r\n return value.toString()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n fy = (y: number) => this.model.scale.y(y)\r\n\r\n set(values: Partial) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n this.shouldUpdate = true\r\n for (const key in values) {\r\n if (key !== 'type') {\r\n // @ts-expect-error - values keys don't have to always match variables on the instance\r\n this[key] = values[key]\r\n }\r\n }\r\n this.width = this.model.chart().width\r\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\r\n\r\n const newAttrs = this.getModalConfig()\r\n .inputs.map(({ value }) => value.toString())\r\n .join(',')\r\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\r\n\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n\r\n parsePeriodInt(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n this.period = Number.parseInt(values.period, 10)\r\n this.model.trigger(CustomSpineEvents.ManualChange)\r\n }\r\n }\r\n\r\n setModel(model: Pane) {\r\n return (this.model = model)\r\n }\r\n\r\n isInArea(area: PaneArea) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\r\n let width = OFFSET.M * 2 + this.labelWidth\r\n let height = OFFSET.S * 2 + FONT_SIZE.M\r\n\r\n if (this.getIsChartPageSpecificFunctionality()) {\r\n width = this.labelWidth\r\n height = INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\r\n return true\r\n }\r\n return false\r\n }\r\n\r\n getIsInChartView(_: Chart) {\r\n return true\r\n }\r\n\r\n moveBy() {}\r\n\r\n thumbsAreInArea() {\r\n return false\r\n }\r\n\r\n computeVisibleMinMax(...arrays: number[][]) {\r\n let min = MAX_POSITIVE_DEFAULT_VALUE\r\n let max = MAX_NEGATIVE_DEFAULT_VALUE\r\n\r\n const { leftOffset } = this.model.chart()\r\n\r\n const firstBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRenderIndex = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth: this.contentWidth,\r\n })\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRenderIndex, lastBarToRenderIndex)\r\n\r\n for (const arr of arrays) {\r\n for (let i = firstBarToRenderIndex.index; i <= lastBarToRenderIndex.index; i++) {\r\n if (!isNaN(arr[i])) {\r\n min = Math.min(min, arr[i])\r\n max = Math.max(max, arr[i])\r\n }\r\n }\r\n }\r\n\r\n return !areNoBarsVisible && min !== max && min !== MAX_POSITIVE_DEFAULT_VALUE && max !== MAX_NEGATIVE_DEFAULT_VALUE\r\n ? { min, max }\r\n : this.getDomainDefaults(this.type)\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\r\n\r\n getMinMax() {\r\n this.data = this.model.chart().quote()\r\n this.compute()\r\n return { min: this.min, max: this.max }\r\n }\r\n\r\n toObject() {\r\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n period: this.getModalConfig()\r\n .inputs.map((input: IModalConfigInput) => input.value.toString())\r\n .join(','),\r\n }\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.model.chart().chart_layout())\r\n }\r\n\r\n renderIndicator(_: CanvasRenderingContext2D) {\r\n throw Error('Implement renderIndicator method')\r\n }\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n getIsChartPageSpecificFunctionality() {\r\n const { specificChartFunctionality } = this.model.chart().chart_layout()\r\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n const isRedesignedFuturesForexCrypto =\r\n isRedesignEnabled() &&\r\n [\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.quotePage,\r\n ].includes(specificChartFunctionality)\r\n\r\n return isCharts || isRedesignedFuturesForexCrypto\r\n }\r\n\r\n getIsDrawing() {\r\n return false\r\n }\r\n\r\n getIsChartEvent() {\r\n return false\r\n }\r\n\r\n compute() {\r\n throw Error('Implement compute method')\r\n }\r\n}\r\n\r\nIndicator.initClass()\r\n\r\nexport default Indicator\r\n","export function roundedRect({\r\n ctx,\r\n x,\r\n y,\r\n width,\r\n height,\r\n radius,\r\n color,\r\n}: {\r\n ctx: CanvasRenderingContext2D\r\n x: number\r\n y: number\r\n width: number\r\n height: number\r\n radius: number\r\n color: string\r\n}) {\r\n ctx.translate(0.5, 0.5)\r\n ctx.set('strokeStyle', color)\r\n ctx.set('fillStyle', color)\r\n ctx.beginPath()\r\n ctx.moveTo(x, y + radius)\r\n ctx.lineTo(x, y + height - radius)\r\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\r\n ctx.lineTo(x + width - radius, y + height)\r\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\r\n ctx.lineTo(x + width, y + radius)\r\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\r\n ctx.lineTo(x + radius, y)\r\n ctx.arcTo(x, y, x, y + radius, radius)\r\n ctx.stroke()\r\n ctx.fill()\r\n ctx.translate(-0.5, -0.5)\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ADX extends Indicator {\r\n static type = IndicatorType.Adx\r\n static label = 'ADX'\r\n\r\n declare period: number\r\n pdi: number[] = []\r\n mdi: number[] = []\r\n adx: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let adx, amdm, apdm, mdi, pdi\r\n this.pdi = []\r\n this.mdi = []\r\n this.adx = []\r\n let atr = (apdm = amdm = adx = 0)\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\r\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\r\n\r\n let pdm = 0\r\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\r\n pdm = deltaHigh\r\n }\r\n\r\n let mdm = 0\r\n if (deltaLow > 0 && deltaLow > deltaHigh) {\r\n mdm = deltaLow\r\n }\r\n\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n\r\n atr = (atr * (this.period - 1) + tr) / this.period\r\n apdm = (apdm * (this.period - 1) + pdm) / this.period\r\n amdm = (amdm * (this.period - 1) + mdm) / this.period\r\n\r\n pdi = atr > 0 ? (apdm * 100) / atr : 0\r\n mdi = atr > 0 ? (amdm * 100) / atr : 0\r\n const di = Math.abs(pdi - mdi)\r\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\r\n adx = (adx * (this.period - 1) + dx) / this.period\r\n\r\n this.pdi[i] = pdi\r\n this.mdi[i] = mdi\r\n this.adx[i] = adx\r\n }\r\n this.lastValue = this.adx.last() ?? null\r\n }\r\n const { min, max } =\r\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\r\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#2eb12e')\r\n context.beginPath()\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\r\n },\r\n })\r\n\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#d43737')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ADX ${this.period}`\r\n }\r\n}\r\n\r\nexport default ADX\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n aroonUp: number[]\r\n aroonDown: number[]\r\n oscillator: number[]\r\n}\r\n\r\nexport class AroonCalculation extends MainCalculation {\r\n static type = IndicatorType.Aro\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n aroonUp: [],\r\n aroonDown: [],\r\n oscillator: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { low, high } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = period; i < high.length; i++) {\r\n const highPeriod = high.slice(i - period, i + 1)\r\n const highestInPeriod = Math.max(...highPeriod)\r\n const periodSinceHigh = period - highPeriod.lastIndexOf(highestInPeriod)\r\n this._calculatedValues.aroonUp[i] = 100 * ((period - periodSinceHigh) / period)\r\n\r\n const lowPeriod = low.slice(i - period, i + 1)\r\n const lowestInPeriod = Math.min(...lowPeriod)\r\n const periodSinceLow = period - lowPeriod.lastIndexOf(lowestInPeriod)\r\n this._calculatedValues.aroonDown[i] = 100 * ((period - periodSinceLow) / period)\r\n\r\n this._calculatedValues.oscillator[i] = this._calculatedValues.aroonUp[i] - this._calculatedValues.aroonDown[i]\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Pane from '../models/pane'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst COLORS = {\r\n aroonUp: '#00a000',\r\n aroonDown: '#c80000',\r\n}\r\n\r\nclass Aroon extends Indicator {\r\n static type = IndicatorType.Aro\r\n static label = 'Aroon'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0 || !this.aroonCalculation) return\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', COLORS.aroonUp)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonUp[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', COLORS.aroonDown)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(aroonDown[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n if (!this.aroonCalculation) return\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { aroonUp, aroonDown } = this.aroonCalculation.calculatedValues\r\n\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (aroonDown.length > 0) {\r\n textLabels.push({\r\n text: aroonDown.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonDown.last()!)),\r\n background: COLORS.aroonDown,\r\n })\r\n }\r\n if (aroonUp.length > 0) {\r\n textLabels.push({\r\n text: aroonUp.last()!.toFixed(2),\r\n y: Math.round(this.fy(aroonUp.last()!)),\r\n background: COLORS.aroonUp,\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon ${this.period}`\r\n }\r\n}\r\n\r\nexport default Aroon\r\n","import { IndicatorType } from '../constants/common'\r\nimport { AroonCalculation } from '../indicator-calculation/aroon'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass AroonOscillator extends Indicator {\r\n static type = IndicatorType.Aroosc\r\n static label = 'Aroon Oscillator'\r\n\r\n aroonCalculation: AroonCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.aroonCalculation !== null) return\r\n\r\n this.aroonCalculation = new AroonCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.aroonCalculation.calculate()\r\n\r\n this.lastValue = this.aroonCalculation.calculatedValues.oscillator.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(\r\n context,\r\n this.aroonCalculation?.calculatedValues.oscillator ?? [],\r\n this.period,\r\n 0,\r\n 0,\r\n 0,\r\n false\r\n )\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 25,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Aroon Oscillator ${this.period}`\r\n }\r\n}\r\n\r\nexport default AroonOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ATR extends Indicator {\r\n static type = IndicatorType.Atr\r\n static label = 'Average True Range'\r\n\r\n atr: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.atr = []\r\n const atr = new AverageTrueRange(this.period)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n this.atr[i] = atr.value\r\n }\r\n\r\n this.lastValue = this.atr.last() ?? null\r\n }\r\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ATR ${this.period}`\r\n }\r\n}\r\n\r\nexport default ATR\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nconst constant = 0.015\r\nclass CommodityChannelIndex extends Indicator {\r\n static type = IndicatorType.Cci\r\n static label = 'Commodity Channel Index'\r\n\r\n cci: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n let smaCount\r\n const tp = []\r\n this.cci = []\r\n let smaSum = (smaCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let devCount\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n tp[i] = typicalPrice\r\n\r\n smaSum += typicalPrice\r\n smaCount++\r\n if (smaCount > this.period) {\r\n smaSum -= tp[i - this.period]\r\n smaCount--\r\n }\r\n const sma = smaSum / smaCount\r\n\r\n if (i < this.period - 1) {\r\n continue\r\n }\r\n\r\n let devSum = (devCount = 0)\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n devSum += Math.abs(tp[j] - sma)\r\n devCount++\r\n }\r\n\r\n const dev = devSum / devCount\r\n this.cci[i] = 0\r\n if (dev > 0) {\r\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\r\n }\r\n }\r\n\r\n this.lastValue = this.cci.last() ?? null\r\n }\r\n\r\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `CCI ${this.period}`\r\n }\r\n}\r\n\r\nexport default CommodityChannelIndex\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash, Theme } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport tailwindColors from '../constants/colors'\r\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nexport interface ICOT {\r\n code: string\r\n name: string\r\n units: string\r\n commercialHedgers: number[]\r\n largeTraders: number[]\r\n smallTraders: number[]\r\n}\r\n\r\ninterface Attrs {\r\n period: string\r\n code: string\r\n}\r\n\r\ntype ColorsKeys = keyof Pick\r\n\r\nclass COT extends Indicator {\r\n static type = IndicatorType.Cot\r\n static label = 'COT'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n declare colors: ObjectHash\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() || !this.data.COTs) return\r\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\r\n if (!this.attrs.code && cotQuoteCode) {\r\n this.attrs.code = cotQuoteCode\r\n }\r\n const cot = this.data.COTs[this.attrs.code]\r\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\r\n this.max = Math.max(Math.abs(max), Math.abs(min))\r\n this.min = -this.max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n context.translate(0.5, 0.5)\r\n for (const key in this.colors) {\r\n context.set('strokeStyle', this.colors[key as ColorsKeys])\r\n context.beginPath()\r\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(data[i])))\r\n },\r\n })\r\n context.stroke()\r\n }\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderLabel(context: CanvasRenderingContext2D) {\r\n if (!this.data.COTs) return\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const name = new Text(\r\n {\r\n text: this.toString(),\r\n x: 8,\r\n y: 16,\r\n font: { size: 10, style: 'bold' },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n name.render(context)\r\n\r\n new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: 38 + name.measure(),\r\n y: 16,\r\n font: { size: 8 },\r\n fillStyle: Colors.text,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\r\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\r\n\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\r\n const secondarylabelX = labelWidth + x * 2\r\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\r\n const scaleCoefficient = 0.7\r\n\r\n const secondarylabel = new Text(\r\n {\r\n text: this.data.COTs[this.attrs.code].units as string,\r\n x: secondarylabelX + x,\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...fontSettings,\r\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\r\n style: 'normal',\r\n }),\r\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n },\r\n this.model\r\n )\r\n secondarylabel.set({\r\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\r\n })\r\n secondarylabel.render(context)\r\n\r\n this.renderAdditionalLabels(context)\r\n }\r\n\r\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\r\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n\r\n new Text(\r\n {\r\n text: 'COT',\r\n x: 23,\r\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\r\n angle: -90,\r\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\r\n fillStyle: Colors.textSecondary,\r\n textAlign: TextAlign.center,\r\n textBaseline: TextBaseline.alphabetic,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n const text = new Text(\r\n {\r\n text: 'Commercial Hedgers',\r\n x: IndicatorSettings.left.width,\r\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\r\n font: { size: 8, style: 'bold' },\r\n fillStyle: this.colors.commercialHedgers,\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.bottom,\r\n },\r\n this.model\r\n )\r\n text.render(context)\r\n\r\n let x = text.get('x')! + 8 + text.measure()\r\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\r\n text.render(context)\r\n\r\n x += 8 + text.measure()\r\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\r\n text.render(context)\r\n }\r\n\r\n formatAxis(value: number) {\r\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\r\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\r\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: 'COT',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\r\n }\r\n\r\n toConfig(): T['attrs'] & { type: T['type'] } {\r\n return {\r\n type: this.type,\r\n code: this.attrs.code,\r\n }\r\n }\r\n}\r\n\r\nCOT.prototype.colors = {\r\n commercialHedgers: '#10cc10',\r\n largeTraders: '#cc1010',\r\n smallTraders: '#1010cc',\r\n}\r\n\r\nexport default COT\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n fi: number[]\r\n}\r\n\r\nexport class FICalculation extends MainCalculation {\r\n static type = IndicatorType.Fi\r\n\r\n getDefaultCalculatedValues() {\r\n return { fi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close, volume } = this.quote\r\n const ema = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let index = 1; index < close.length; index++) {\r\n const value = ((close[index] - close[index - 1]) * volume[index]) / 1000000\r\n ema.add(value)\r\n this.calculatedValues.fi[index] = ema.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { FICalculation } from '../indicator-calculation/fi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ForceIndex extends Indicator {\r\n static type = IndicatorType.Fi\r\n static label = 'Force Index'\r\n\r\n fiCalculation: FICalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.fiCalculation = new FICalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.fiCalculation.calculate()\r\n this.lastValue = this.fiCalculation.calculatedValues.fi.last() ?? null\r\n }\r\n const fi = this.fiCalculation?.calculatedValues.fi ?? []\r\n const { min, max } = fi.length > 0 ? this.computeVisibleMinMax(fi) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.fiCalculation?.calculatedValues.fi ?? [], 1, 0, 0, 0, false)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 13,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `FORCE ${this.period}`\r\n }\r\n}\r\n\r\nexport default ForceIndex\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n macd: number[]\r\n signal: number[]\r\n histogram: number[]\r\n}\r\n\r\nexport class MACDCalculation extends MainCalculation {\r\n static type = IndicatorType.Macd\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n macd: [],\r\n signal: [],\r\n histogram: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const { fastPeriod, slowPeriod, signalPeriod } = this.options\r\n const emaFast = new ExponentialMovingAverage(fastPeriod)\r\n const emaSlow = new ExponentialMovingAverage(slowPeriod)\r\n const emaSignal = new ExponentialMovingAverage(signalPeriod)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n for (let i = 0; i < close.length; i++) {\r\n const d = close[i]\r\n\r\n emaFast.add(d)\r\n emaSlow.add(d)\r\n const macd = emaFast.value - emaSlow.value\r\n emaSignal.add(macd)\r\n\r\n this.calculatedValues.macd[i] = macd\r\n this.calculatedValues.signal[i] = emaSignal.value\r\n this.calculatedValues.histogram[i] = macd - emaSignal.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { MACDCalculation } from '../indicator-calculation/macd'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n fastPeriod: number\r\n slowPeriod: number\r\n signalPeriod: number\r\n}\r\n\r\nclass MACD extends Indicator {\r\n static type = IndicatorType.Macd\r\n static label = 'MACD'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\r\n }\r\n\r\n macdCalculation: MACDCalculation | null = null\r\n\r\n declare fastPeriod: number\r\n declare slowPeriod: number\r\n declare signalPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\r\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary() || this.macdCalculation === null) {\r\n this.macdCalculation = new MACDCalculation({\r\n quote: this.data,\r\n options: {\r\n signalPeriod: this.signalPeriod,\r\n fastPeriod: this.fastPeriod,\r\n slowPeriod: this.slowPeriod,\r\n },\r\n })\r\n this.macdCalculation.calculate()\r\n\r\n this.lastValue = this.macdCalculation.calculatedValues.macd.last() ?? null\r\n }\r\n\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n\r\n const { min, max } =\r\n macd.length > 0 || signal.length > 0 || histogram.length > 0\r\n ? this.computeVisibleMinMax(macd, signal, histogram)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { IndicatorSettings } = this.getChartLayoutSettings()\r\n if (this.macdCalculation === null || this.data.close.length === 0) return\r\n const y = Math.round(this.fy(0))\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n }\r\n\r\n context.set('fillStyle', '#79c3e8')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.rect(x - halfBarWidth, y, barWidthWithoutMargin, Math.round(this.fy(histogram[i]) - y))\r\n },\r\n })\r\n context.fill()\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(macd[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.signalLine)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(signal[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const fastPeriod = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'fastPeriod',\r\n value: this.fastPeriod ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const slowPeriod = {\r\n type: 'number',\r\n label: 'Slow',\r\n name: 'slowPeriod',\r\n value: this.slowPeriod ?? 26,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const signalPeriod = {\r\n type: 'number',\r\n label: 'Signal',\r\n name: 'signalPeriod',\r\n value: this.signalPeriod ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [fastPeriod, slowPeriod, signalPeriod],\r\n inputsErrorMessages: {\r\n fastPeriod: `${fastPeriod.label} must be a whole number between ${fastPeriod.min} and ${fastPeriod.max}`,\r\n slowPeriod: `${slowPeriod.label} must be a whole number between ${slowPeriod.min} and ${slowPeriod.max}`,\r\n signalPeriod: `${signalPeriod.label} must be a whole number between ${signalPeriod.min} and ${signalPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'fastPeriod':\r\n case 'slowPeriod':\r\n case 'signalPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `MACD ${this.fastPeriod},${this.slowPeriod},${this.signalPeriod}`\r\n }\r\n}\r\n\r\nexport default MACD\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass MFI extends Indicator {\r\n static type = IndicatorType.Mfi\r\n static label = 'Money Flow Index'\r\n\r\n mfi: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n let negativeMoneyFlow\r\n const mf = []\r\n this.mfi = []\r\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\r\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\r\n const moneyFlow = typicalPrice * this.data.volume[i]\r\n\r\n if (typicalPrice > prevTypicalPrice) {\r\n positiveMoneyFlow += moneyFlow\r\n mf[i] = moneyFlow\r\n } else if (typicalPrice < prevTypicalPrice) {\r\n negativeMoneyFlow += moneyFlow\r\n mf[i] = -moneyFlow\r\n }\r\n\r\n if (i > this.period) {\r\n const oldMF = mf[i - this.period]\r\n if (oldMF > 0) {\r\n positiveMoneyFlow -= oldMF\r\n } else if (oldMF < 0) {\r\n negativeMoneyFlow += oldMF\r\n }\r\n\r\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\r\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\r\n } else {\r\n this.mfi[i] = 50\r\n }\r\n }\r\n\r\n prevTypicalPrice = typicalPrice\r\n }\r\n\r\n this.lastValue = this.mfi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `MFI ${this.period}`\r\n }\r\n}\r\n\r\nexport default MFI\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\nclass None extends Indicator {\r\n static type = IndicatorType.None\r\n static label = 'None'\r\n\r\n compute() {}\r\n\r\n renderIndicator() {}\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nexport default None\r\n","import { IndicatorType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nclass OBV extends Indicator {\r\n static type = IndicatorType.Obv\r\n static label = 'On-Balance Volume'\r\n\r\n obv: number[] = []\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.obv = [0]\r\n\r\n for (let i = 1; i < this.data.volume.length; i++) {\r\n let currentObv = this.obv[i - 1]\r\n if (this.data.close[i] > this.data.close[i - 1]) {\r\n currentObv += this.data.volume[i]\r\n } else if (this.data.close[i] < this.data.close[i - 1]) {\r\n currentObv -= this.data.volume[i]\r\n }\r\n\r\n this.obv[i] = currentObv\r\n }\r\n\r\n this.lastValue = this.obv.last() ?? null\r\n }\r\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return 'OBV'\r\n }\r\n}\r\n\r\nexport default OBV\r\n","import * as d3 from 'd3'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport {\r\n INDICATOR_LABEL_HEIGHT,\r\n IndicatorType,\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n OFFSET,\r\n PADDING,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport Quote from '../models/quote'\r\nimport { getSanitizedTicker } from '../utils'\r\nimport { getInstrument } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n tickers?: string\r\n}\r\n\r\nconst DEFAULT_TICKERS = 'SPY,QQQ'\r\n\r\nclass PricePerformance extends Indicator {\r\n static type = IndicatorType.Perf\r\n static label = 'Price Performance %'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n timeframe: string\r\n tickers = ''\r\n ready = false\r\n firstFetchCalled = false\r\n first: ObjectHash = {}\r\n perf: ObjectHash = {}\r\n quotes: ObjectHash = {}\r\n indicatorLabelWidth: ObjectHash = {}\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n\r\n this.timeframe = this.model.chart().timeframe\r\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\r\n if (this.attrs.period && !this.tickers) {\r\n this.tickers = this.attrs.period\r\n }\r\n }\r\n\r\n async compute() {\r\n const tickers = this.getTickers()\r\n const chartLayoutModel = this.model.chart().chart_layout()\r\n const chartUuid = chartLayoutModel.uuid\r\n const hasCachedData = this.getTickersAndTimeframe().every(\r\n ({ ticker, instrument, timeframe }) =>\r\n Quote.select(\r\n (q: Quote) =>\r\n q.ticker === ticker &&\r\n q.instrument === instrument &&\r\n q.timeframe === timeframe &&\r\n chartLayoutModel.isIdeaId(q.ideaID) &&\r\n chartUuid === q.chartUuid &&\r\n !q.isFetching\r\n ).length > 0\r\n )\r\n\r\n if (this.timeframe !== this.model.chart().quote().timeframe || (!this.ready && !this.firstFetchCalled)) {\r\n this.timeframe = this.model.chart().quote().timeframe\r\n this.firstFetchCalled = true\r\n\r\n if (!hasCachedData) {\r\n const data = await Quote.getAll(this.getTickersAndTimeframe())\r\n if (data) {\r\n this._compute(tickers, data)\r\n this.trigger('change')\r\n }\r\n } else {\r\n this.ready = true\r\n this.compute()\r\n }\r\n } else if (this.ready) {\r\n const data: ObjectHash = {}\r\n for (const ticker of tickers) {\r\n data[ticker] = Quote.select(\r\n (q: Quote) =>\r\n q.ticker === ticker &&\r\n q.timeframe === this.timeframe &&\r\n chartUuid === q.chartUuid &&\r\n chartLayoutModel.isIdeaId(q.ideaID)\r\n )[0]\r\n }\r\n this._compute(tickers, data)\r\n }\r\n }\r\n\r\n _compute(tickers: string[], data: ObjectHash) {\r\n const { leftOffset } = this.model.chart()\r\n let firstBarTime = null\r\n let lastBarTime = null\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const center = this.fx(i)\r\n if (center + leftOffset < 0 || center + leftOffset > this.contentWidth) {\r\n // margin?\r\n continue\r\n }\r\n\r\n // Rendering one extra bar out of viewport ensures continuity of line, if there are missing data on intraday the indicator may have gaps\r\n if (firstBarTime === null) {\r\n firstBarTime = this.data.date[i]\r\n }\r\n\r\n lastBarTime = this.data.date[i]\r\n }\r\n\r\n data[this.data.ticker] = this.data\r\n this.quotes = data\r\n this.perf = {}\r\n const dateToIndex = this.data.getDateToIndex()\r\n for (const ticker of [this.data.ticker, ...tickers]) {\r\n this.perf[ticker] = []\r\n const d = data[ticker]\r\n if (!d) {\r\n continue\r\n }\r\n let first = null\r\n let index = -1\r\n for (let i = 0; i < d.close.length; i++) {\r\n const date = d.date[i]\r\n if (date < firstBarTime! || date > lastBarTime!) {\r\n continue\r\n }\r\n\r\n index = dateToIndex[date]\r\n if (index === undefined || index === null) {\r\n continue\r\n }\r\n\r\n if (first === null) {\r\n first = d.close[i]\r\n this.first[ticker] = first\r\n if (index > 0) {\r\n this.perf[ticker][index - 1] = (d.close[i] * 100) / first - 100\r\n }\r\n }\r\n\r\n this.perf[ticker][index] = (d.close[i] * 100) / first - 100\r\n }\r\n\r\n if (index < this.data.date.length - 1 && first !== null) {\r\n this.perf[ticker][index + 1] = this.perf[ticker][index]\r\n }\r\n }\r\n\r\n const perfArrays = Object.keys(this.perf).map((x) => this.perf[x])\r\n const { min, max } = perfArrays.some((array) => array.length > 0)\r\n ? this.computeVisibleMinMax(...perfArrays)\r\n : this.getDomainDefaults(this.type)\r\n\r\n this.min = min\r\n this.max = max\r\n\r\n const fy = d3\r\n .scaleLinear()\r\n .range([0, this.contentHeight])\r\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\r\n if (!this.model.scaleRange) {\r\n fy.nice(10)\r\n }\r\n // @ts-expect-error - TODO scale.y types dont match\r\n this.model.scale.y = this.fy = fy\r\n this.ready = true\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n const { ColorsSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.translate(0.5, 0.5)\r\n const iterable = this.getTickers()\r\n for (let index = 0; index < iterable.length; index++) {\r\n const ticker = iterable[index]\r\n if (this.perf[ticker].length > 0) {\r\n context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\r\n context.beginPath()\r\n for (let i = 0; i < this.perf[ticker].length; i++) {\r\n const y = Math.round(this.fy(this.perf[ticker][i]))\r\n context.lineTo(this.fx(i), y)\r\n }\r\n context.stroke()\r\n }\r\n }\r\n\r\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\r\n context.beginPath()\r\n for (let i = 0; i < this.perf[this.data.ticker].length; i++) {\r\n const y = Math.round(this.fy(this.perf[this.data.ticker][i]))\r\n if (!isNaN(y)) {\r\n context.lineTo(this.fx(i), y)\r\n }\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || !crossIndex) {\r\n return\r\n }\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n tickers.forEach((key, index) => {\r\n const crossIndexTickerTimeStamp = this.quotes?.[this.data.ticker]?.getDataByBarIndex('date', crossIndex)\r\n const tickerDateToIndex = crossIndexTickerTimeStamp\r\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\r\n : null\r\n const tickerPerformance = tickerDateToIndex\r\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\r\n : null\r\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\r\n context.fillStyle = Colors.canvasFill\r\n context.fillRect(\r\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top! -\r\n PADDING.XXXS,\r\n PADDING.XXXS + this.indicatorLabelWidth[key] + PADDING.XXXS,\r\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\r\n )\r\n new Text(\r\n {\r\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y:\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n })\r\n }\r\n\r\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\r\n if (!context || !crossIndex) {\r\n return\r\n }\r\n\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n let isVertical = true\r\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n const tickers = [this.data.ticker, ...this.getTickers()]\r\n const tickerText = new Text(\r\n {\r\n font: Text.getMergedPropsWithDefaults('font', {\r\n ...IndicatorSettings.left.indicatorLabel.font,\r\n style: 'normal',\r\n }),\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.middle,\r\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\r\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\r\n },\r\n this.model\r\n )\r\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\r\n let y =\r\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\r\n\r\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\r\n\r\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\r\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\r\n isVertical = false\r\n x += x + this.labelWidth\r\n } else {\r\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\r\n }\r\n\r\n const tickerQuote = this.quotes?.[this.data.ticker]\r\n const maxCrossIndex = Math.min(crossIndex, (tickerQuote?.close.length ?? Infinity) - 1)\r\n tickers.forEach((key, index) => {\r\n const crossIndexTickerTimeStamp = tickerQuote?.getDataByBarIndex('date', maxCrossIndex)\r\n const tickerDateToIndex = crossIndexTickerTimeStamp\r\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\r\n : null\r\n const tickerPerformance = tickerDateToIndex\r\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\r\n : null\r\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\r\n tickerText.set({\r\n x,\r\n y,\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\r\n })\r\n const tickerTextWidth =\r\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\r\n if (\r\n !isVertical &&\r\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\r\n x + tickerTextWidth\r\n ) {\r\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\r\n y += tickerText.attrs.lineHeight\r\n tickerText.set({ x, y })\r\n }\r\n tickerText.render(context)\r\n\r\n if (isVertical) {\r\n y += tickerText.attrs.lineHeight\r\n } else {\r\n x += tickerTextWidth\r\n }\r\n }\r\n })\r\n }\r\n\r\n renderXAxis(context: CanvasRenderingContext2D) {\r\n if (!this.ready) {\r\n return\r\n }\r\n return super.renderXAxis(context)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n let ticker\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (!this.ready) {\r\n return\r\n }\r\n if (this.perf[this.data.ticker].length === 0) {\r\n return\r\n }\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', { size }),\r\n lineHeight,\r\n padding: {\r\n left: padding!.left!,\r\n right: padding!.right!,\r\n top: padding!.top!,\r\n bottom: padding!.bottom!,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n },\r\n this.model\r\n )\r\n const iterable = this.getTickers()\r\n const textLabels = []\r\n for (let index = 0; index < iterable.length; index++) {\r\n ticker = iterable[index]\r\n if (this.perf[ticker].length > 0) {\r\n textLabels.push({\r\n text: this.perf[ticker].last().toFixed(2) + '%',\r\n y: Math.round(this.fy(this.perf[ticker].last())),\r\n background: ColorsSettings[index % ColorsSettings.length],\r\n })\r\n }\r\n }\r\n textLabels.push({\r\n text: this.perf[this.data.ticker].last().toFixed(2) + '%',\r\n y: Math.round(this.fy(this.perf[this.data.ticker].last())),\r\n background: Colors.performanceIndicatorLabel,\r\n })\r\n\r\n const minY = 0\r\n const maxY = this.contentHeight\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\r\n super.renderLabelQuotePage(context)\r\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n if (this.ready) {\r\n const tickers = this.getTickers()\r\n const tickerPerformance = [\r\n { [this.data.ticker]: this.perf[this.data.ticker][this.perf[this.data.ticker].length - 1] },\r\n ...tickers.map((ticker) => ({ [ticker]: this.perf[ticker][this.perf[ticker].length - 1] })),\r\n ].reduce((prev, current) => ({ ...prev, ...current }), {})\r\n Object.keys(tickerPerformance).forEach((key, index) => {\r\n if (tickerPerformance[key]) {\r\n const text = new Text(\r\n {\r\n text: `${key} ${tickerPerformance[key].toFixed(2)}%`,\r\n x: IndicatorSettings.left.indicatorLabel.margin.left,\r\n y:\r\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\r\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\r\n (index + 1) +\r\n IndicatorSettings.left.indicatorLabel.margin.top!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\r\n fillStyle:\r\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\r\n textAlign: TextAlign.left,\r\n textBaseline: TextBaseline.top,\r\n },\r\n this.model\r\n )\r\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\r\n text.render(context)\r\n }\r\n })\r\n }\r\n }\r\n\r\n getTickers() {\r\n return this.tickers\r\n .split(',')\r\n .map((ticker) => ticker)\r\n .filter((x) => x)\r\n }\r\n\r\n getTickersAndTimeframe() {\r\n const { timeframe } = this.model.chart().quote()\r\n return this.getTickers().map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n }\r\n\r\n set(values: Partial) {\r\n this.ready = false\r\n this.firstFetchCalled = false\r\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\r\n this.tickers = (this.tickers || '').toUpperCase()\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [\r\n {\r\n type: 'text',\r\n label: 'Tickers',\r\n name: 'tickers',\r\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\r\n required: true,\r\n },\r\n ],\r\n inputsErrorMessages: {\r\n tickers: 'At least one ticker has to be provided',\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'tickers':\r\n return this[key].length > 0\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return this.getIsChartPageSpecificFunctionality() ? 'PERF %' : `PERF% ${this.tickers}`\r\n }\r\n}\r\n\r\nexport default PricePerformance\r\n","import { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: number | string\r\n momentum: number\r\n}\r\n\r\nclass RMI extends Indicator {\r\n static type = IndicatorType.Rmi\r\n static label = 'Relative Momentum Index'\r\n\r\n rmi: number[] = []\r\n declare momentum: number\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, momentum })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.rmi = []\r\n let count = 0\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = this.momentum; i < this.data.close.length; i++) {\r\n u = d = 0\r\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\r\n u = this.data.close[i] - this.data.close[i - this.momentum]\r\n }\r\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\r\n d = this.data.close[i - this.momentum] - this.data.close[i]\r\n }\r\n\r\n if (count < this.period) {\r\n sumu += u\r\n sumd += d\r\n count++\r\n au = sumu / count\r\n ad = sumd / count\r\n } else {\r\n au = (au! * (this.period - 1) + u) / this.period\r\n ad = (ad! * (this.period - 1) + d) / this.period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\r\n }\r\n\r\n this.lastValue = this.rmi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 20,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const momentum = {\r\n type: 'number',\r\n label: 'Momentum',\r\n name: 'momentum',\r\n value: this.momentum ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, momentum],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n momentum: `${momentum.label} must be a whole number between ${momentum.min} and ${momentum.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'momentum':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RMI ${this.period},${this.momentum}`\r\n }\r\n}\r\n\r\nexport default RMI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass ROC extends Indicator {\r\n static type = IndicatorType.Roc\r\n static label = 'Rate of Change %'\r\n\r\n roc: number[] = []\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.roc = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\r\n }\r\n\r\n this.lastValue = this.roc.last() ?? null\r\n }\r\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 12,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ROC ${this.period}`\r\n }\r\n}\r\n\r\nexport default ROC\r\n","import { IndicatorType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n rsi: number[]\r\n}\r\n\r\nexport class RsiCalculation extends MainCalculation {\r\n static type = IndicatorType.Rsi\r\n\r\n getDefaultCalculatedValues() {\r\n return { rsi: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sumu = 0\r\n let sumd = 0\r\n let u: number, d: number, ad: number, au: number\r\n for (let i = 1; i < close.length; i++) {\r\n u = d = 0\r\n if (close[i] > close[i - 1]) {\r\n u = close[i] - close[i - 1]\r\n }\r\n if (close[i] < close[i - 1]) {\r\n d = close[i - 1] - close[i]\r\n }\r\n\r\n if (i <= period) {\r\n sumu += u\r\n sumd += d\r\n au = sumu / i\r\n ad = sumd / i\r\n } else {\r\n au = (au! * (period - 1) + u) / period\r\n ad = (ad! * (period - 1) + d) / period\r\n }\r\n\r\n const rs = ad > 0 ? au / ad : 1\r\n this.calculatedValues.rsi[i] = 100 - 100 * (1 / (1 + rs))\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { IndicatorType } from '../constants/common'\r\nimport { RsiCalculation } from '../indicator-calculation/rsi'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass RSI extends Indicator {\r\n static type = IndicatorType.Rsi\r\n static label = 'Relative Strength Index'\r\n\r\n rsiCalculation: RsiCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary() && this.rsiCalculation !== null) return\r\n\r\n this.rsiCalculation = new RsiCalculation({\r\n quote: this.data,\r\n options: { period: this.period },\r\n })\r\n\r\n this.rsiCalculation.calculate()\r\n\r\n this.lastValue = this.rsiCalculation.calculatedValues.rsi.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.rsiCalculation?.calculatedValues.rsi ?? [], this.period, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RSI ${this.period}`\r\n }\r\n}\r\n\r\nexport default RSI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: number | string\r\n baseLine: number\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 50,\r\n BaseLine: 1.0,\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\r\n\r\n return [period, baseLine]\r\n}\r\n\r\nclass RelativeVolume extends Indicator {\r\n static type = IndicatorType.Rvol\r\n static label = 'Relative Volume'\r\n\r\n rvol: number[] = []\r\n declare period: number\r\n declare baseLine: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\r\n super.set({ ...values, period, baseLine })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.rvol = []\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.period; i++) {\r\n sum += this.data.volume[i]\r\n }\r\n for (let i = this.period; i < this.data.volume.length; i++) {\r\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\r\n this.rvol[i] = this.data.volume[i] / (sum / this.period)\r\n }\r\n\r\n this.lastValue = this.rvol.last() ?? null\r\n }\r\n\r\n const { min, max } =\r\n this.rvol.length > 0\r\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period + 1,\r\n drawBarCallback: (i, x) => {\r\n if (this.rvol[i] === undefined) return\r\n\r\n const baseLine = Math.round(this.fy(this.baseLine))\r\n const y = Math.round(this.fy(this.rvol[i]))\r\n\r\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\r\n },\r\n })\r\n\r\n const baseLineY = this.fy(this.baseLine)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(baseLineY),\r\n y2: Math.round(baseLineY),\r\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const baseLine = {\r\n type: 'number',\r\n label: 'Baseline',\r\n name: 'baseLine',\r\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\r\n required: true,\r\n step: 0.1,\r\n allowDecimal: true,\r\n min: 0,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, baseLine],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n baseLine: `${baseLine.label} must be a number between ${baseLine.min} and ${baseLine.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'baseLine':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RVOL ${this.period}, ${this.baseLine}, SMA`\r\n }\r\n}\r\n\r\nexport default RelativeVolume\r\n","import Text from '../canvas/text'\r\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\r\nimport { getTranslate } from '../controllers/renderUtils'\r\nimport Pane from '../models/pane'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass RWI extends Indicator {\r\n static type = IndicatorType.Rwi\r\n static label = 'Random Walk Index'\r\n\r\n tr: number[] = []\r\n atr: number[] = []\r\n rwiHi: number[] = []\r\n rwiLo: number[] = []\r\n declare period: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.renderYAxis = this.renderYAxis.bind(this)\r\n }\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.tr = []\r\n this.atr = []\r\n this.rwiHi = []\r\n this.rwiLo = []\r\n let atr = 0\r\n\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n const tr = utils.max([\r\n this.data.high[i] - this.data.low[i],\r\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\r\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\r\n ])\r\n this.tr[i] = tr\r\n\r\n if (i < this.period) {\r\n atr += tr\r\n this.atr[i] = atr / (i + 1)\r\n if (i === this.period - 1) {\r\n atr /= this.period\r\n }\r\n } else {\r\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\r\n }\r\n }\r\n\r\n for (let i = this.period + 2; i < this.data.close.length; i++) {\r\n const h = this.data.high[i]\r\n const l = this.data.low[i]\r\n let trSum = this.tr[i - 1] + this.tr[i - 2]\r\n let count = 2\r\n let atrWeight = (trSum / count) * Math.sqrt(count)\r\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\r\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\r\n for (let j = i - 1; j > i - this.period + 1; j--) {\r\n trSum += this.tr[j - 2]\r\n count++\r\n atrWeight = (trSum / count) * Math.sqrt(count)\r\n if (atrWeight === 0) {\r\n continue\r\n }\r\n\r\n const hi = (h - this.data.low[j - 1]) / atrWeight\r\n if (hi > maxHi) {\r\n maxHi = hi\r\n }\r\n\r\n const lo = (this.data.high[j - 1] - l) / atrWeight\r\n if (lo > maxLo) {\r\n maxLo = lo\r\n }\r\n }\r\n this.rwiHi[i] = maxHi\r\n this.rwiLo[i] = maxLo\r\n }\r\n }\r\n const { min, max } =\r\n this.rwiHi.length > 0 || this.rwiLo.length > 0\r\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\r\n : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#00a000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i: number, x: number) => {\r\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n renderYAxis(context: CanvasRenderingContext2D) {\r\n super.renderYAxis(context)\r\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const translate = getTranslate({\r\n context,\r\n xOffset: IndicatorSettings.left.width,\r\n yOffset: IndicatorSettings.top.height,\r\n })\r\n translate.do()\r\n const text = new Text(\r\n {\r\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\r\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\r\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\r\n padding: {\r\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\r\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\r\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\r\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\r\n },\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.indicatorCurrentText,\r\n },\r\n this.model\r\n )\r\n const textLabels = []\r\n if (this.rwiLo.length > 0) {\r\n textLabels.push({\r\n text: this.rwiLo.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiLo.last()!)),\r\n background: '#c80000',\r\n })\r\n }\r\n if (this.rwiHi.length > 0) {\r\n textLabels.push({\r\n text: this.rwiHi.last()!.toFixed(2),\r\n y: Math.round(this.fy(this.rwiHi.last()!)),\r\n background: '#00a000',\r\n })\r\n }\r\n\r\n const minY = 0\r\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\r\n textLabels.forEach((labelSetting) => {\r\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\r\n text.set(labelSetting).render(context)\r\n }\r\n })\r\n\r\n translate.undo()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `RWI ${this.period}`\r\n }\r\n}\r\n\r\nexport default RWI\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass Stochastics extends Indicator {\r\n static type = IndicatorType.Stofu\r\n static label = 'Stochastics FULL'\r\n\r\n k: number[] = []\r\n k1: number[] = []\r\n d: number[] = []\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n const period = Math.min(this.period, this.data.close.length - 1)\r\n let dCount, dSum, k\r\n this.k1 = []\r\n this.k = []\r\n this.d = []\r\n let kSum = (dSum = 0)\r\n let kCount = (dCount = 0)\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\r\n if (highestHigh === lowestLow) {\r\n k = 100\r\n }\r\n this.k1[i] = k\r\n if (this.kPeriod > 1) {\r\n kSum += k\r\n kCount++\r\n if (kCount > this.kPeriod) {\r\n kSum -= this.k1[i - this.kPeriod]\r\n kCount--\r\n }\r\n k = kSum / kCount\r\n }\r\n\r\n dSum += k\r\n dCount++\r\n if (dCount > this.dPeriod) {\r\n dSum -= this.k[i - this.dPeriod]\r\n dCount--\r\n }\r\n\r\n const d = dSum / dCount\r\n this.k[i] = k\r\n this.d[i] = d\r\n }\r\n\r\n this.lastValue = this.k.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n if (this.data.close.length === 0) return\r\n\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(50)),\r\n y2: Math.round(this.fy(50)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(20)),\r\n y2: Math.round(this.fy(20)),\r\n strokeStyle: '#69c1ea',\r\n },\r\n this.model\r\n ).render(context)\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(80)),\r\n y2: Math.round(this.fy(80)),\r\n strokeStyle: '#d386df',\r\n },\r\n this.model\r\n ).render(context)\r\n\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: this.period,\r\n }\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.k[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n context.set('strokeStyle', '#c80000')\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.d[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const kPeriod = {\r\n type: 'number',\r\n label: 'K Period',\r\n name: 'kPeriod',\r\n value: this.kPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, kPeriod, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n kPeriod: `${kPeriod.label} must be a whole number between ${kPeriod.min} and ${kPeriod.max}`,\r\n } as {\r\n period: string\r\n dPeriod: string\r\n kPeriod?: string\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n case 'kPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics FULL ${this.period},${this.kPeriod},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default Stochastics\r\n","import { IndicatorType } from '../constants/common'\r\nimport Pane from '../models/pane'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Stochastics from './stofu'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass StochasticsFast extends Stochastics {\r\n static type = IndicatorType.Stofa\r\n static label = 'Stochastics FAST'\r\n\r\n declare kPeriod: number\r\n declare period: number\r\n declare dPeriod: number\r\n\r\n constructor(attrs: Attrs, model: Pane) {\r\n super(attrs, model)\r\n this.kPeriod = 1\r\n }\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics FAST ${this.period},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default StochasticsFast\r\n","import { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Stochastics from './stofu'\r\n\r\ninterface Attrs {\r\n period: string | number\r\n dPeriod: number\r\n kPeriod: number\r\n}\r\n\r\nclass StochasticsSlow extends Stochastics {\r\n static type = IndicatorType.Stosl\r\n static label = 'Stochastics SLOW'\r\n\r\n kPeriod = 3\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const dPeriod = {\r\n type: 'number',\r\n label: 'D Period',\r\n name: 'dPeriod',\r\n value: this.dPeriod ?? 3,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, dPeriod],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n case 'dPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Stochastics SLOW ${this.period},${this.dPeriod}`\r\n }\r\n}\r\n\r\nexport default StochasticsSlow\r\n","import { IndicatorType } from '../constants/common'\r\nimport { ExponentialMovingAverage } from './ema'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n trix: number[]\r\n}\r\n\r\nexport class TrixCalculation extends MainCalculation {\r\n static type = IndicatorType.Trix\r\n\r\n getDefaultCalculatedValues() {\r\n return { trix: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period } = this.options\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n const ema1 = new ExponentialMovingAverage(period)\r\n const ema2 = new ExponentialMovingAverage(period)\r\n const ema3 = new ExponentialMovingAverage(period)\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let prev = 0\r\n for (let index = 0; index <= lastIndex; index++) {\r\n ema1.add(close[index])\r\n ema2.add(ema1.value)\r\n ema3.add(ema2.value)\r\n if (prev > 0) {\r\n this.calculatedValues.trix[index] = (ema3.value * 100) / prev - 100\r\n }\r\n prev = ema3.value\r\n\r\n if (onValueCalculated?.(this.calculatedValues, index) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import Line from '../canvas/line'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { TrixCalculation } from '../indicator-calculation/trix'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass Trix extends Indicator {\r\n static type = IndicatorType.Trix\r\n static label = 'TRIX'\r\n\r\n trixCalculation: TrixCalculation | null = null\r\n declare period: number\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.trixCalculation = new TrixCalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.period,\r\n },\r\n })\r\n this.trixCalculation.calculate()\r\n this.lastValue = this.trixCalculation.calculatedValues.trix.last() ?? null\r\n }\r\n const trix = this.trixCalculation?.calculatedValues.trix ?? []\r\n const { min, max } = trix.length > 0 ? this.computeVisibleMinMax(trix) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n new Line(\r\n {\r\n x1: -this.leftOffset,\r\n x2: -this.leftOffset + this.contentWidth,\r\n y1: Math.round(this.fy(0)),\r\n y2: Math.round(this.fy(0)),\r\n strokeStyle: '#ff8787',\r\n dashLength: 3,\r\n },\r\n this.model\r\n ).render(context)\r\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i: number, x: number) => {\r\n const value = this.trixCalculation?.calculatedValues.trix[i]\r\n if (value) context.lineTo(x, ~~this.fy(value))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 9,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `TRIX ${this.period}`\r\n }\r\n}\r\n\r\nexport default Trix\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { IndicatorType } from '../constants/common'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n period1: number\r\n period2: number\r\n period3: number\r\n}\r\n\r\nclass UltimateOscillator extends Indicator {\r\n static type = IndicatorType.Ult\r\n static label = 'Ultimate Oscillator'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\r\n return Math.max(period1, period2, period3)\r\n }\r\n\r\n declare period1: number\r\n declare period2: number\r\n declare period3: number\r\n ult: number[] = []\r\n tr: number[] = []\r\n bp: number[] = []\r\n\r\n set(values: Partial) {\r\n if (typeof values.period === 'string') {\r\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\r\n super.set({ ...values, period1, period2, period3 })\r\n } else {\r\n super.set(values)\r\n }\r\n }\r\n\r\n compute() {\r\n if (!this.isComputeNecessary()) return\r\n\r\n this.ult = []\r\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\r\n const tr = []\r\n const bp = []\r\n let bpSum1 = (bpSum2 = bpSum3 = 0)\r\n let trSum1 = (trSum2 = trSum3 = 0)\r\n let count1 = (count2 = count3 = 0)\r\n let avg2, avg3\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\r\n tr[i] = Math.max(this.data.high[i], this.data.close[i - 1]) - Math.min(this.data.low[i], this.data.close[i - 1])\r\n\r\n bpSum1 += bp[i]\r\n trSum1 += tr[i]\r\n count1++\r\n if (count1 > this.period1) {\r\n bpSum1 -= bp[i - this.period1]\r\n trSum1 -= tr[i - this.period1]\r\n }\r\n\r\n bpSum2 += bp[i]\r\n trSum2 += tr[i]\r\n count2++\r\n if (count2 > this.period2) {\r\n bpSum2 -= bp[i - this.period2]\r\n trSum2 -= tr[i - this.period2]\r\n }\r\n\r\n bpSum3 += bp[i]\r\n trSum3 += tr[i]\r\n count3++\r\n if (count3 > this.period3) {\r\n bpSum3 -= bp[i - this.period3]\r\n trSum3 -= tr[i - this.period3]\r\n }\r\n\r\n let avg1 = (avg2 = avg3 = 0)\r\n if (trSum1 > 0) {\r\n avg1 = bpSum1 / trSum1\r\n }\r\n if (trSum2 > 0) {\r\n avg2 = bpSum2 / trSum2\r\n }\r\n if (trSum3 > 0) {\r\n avg3 = bpSum3 / trSum3\r\n }\r\n\r\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\r\n }\r\n\r\n this.lastValue = this.ult.last() ?? null\r\n const { min, max } = this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\r\n }\r\n\r\n getModalConfig() {\r\n const period1 = {\r\n type: 'number',\r\n label: 'Period 1',\r\n name: 'period1',\r\n value: this.period1 ?? 7,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const period2 = {\r\n type: 'number',\r\n label: 'Period 2',\r\n name: 'period2',\r\n value: this.period2 ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const period3 = {\r\n type: 'number',\r\n label: 'Period 3',\r\n name: 'period3',\r\n value: this.period3 ?? 28,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period1, period2, period3],\r\n inputsErrorMessages: {\r\n period1: `${period1.label} must be a whole number between ${period1.min} and ${period1.max}`,\r\n period2: `${period2.label} must be a whole number between ${period2.min} and ${period2.max}`,\r\n period3: `${period3.label} must be a whole number between ${period3.min} and ${period3.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period1':\r\n case 'period2':\r\n case 'period3':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `ULT ${this.period1},${this.period2},${this.period3}`\r\n }\r\n}\r\n\r\nexport default UltimateOscillator\r\n","import { IndicatorType } from '../constants/common'\r\nimport math from '../helpers/math'\r\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Indicator from './indicator'\r\n\r\nclass Volume extends Indicator {\r\n static type = IndicatorType.Vol\r\n static label = 'Volume'\r\n\r\n compute() {\r\n const { min, max } =\r\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n this.lastValue = this.data.volume.last() ?? null\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const chartModel = this.model.chart()\r\n const { zoomFactor } = chartModel\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\r\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\r\n\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n drawBarCallback: (i, x) => {\r\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\r\n const y = Math.round(this.fy(this.data.volume[i]))\r\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\r\n },\r\n })\r\n }\r\n\r\n formatAxis(value: number) {\r\n return math.formatBigNumber(value, 2)\r\n }\r\n\r\n getModalConfig() {\r\n return {\r\n title: this.label,\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toString() {\r\n return `Volume`\r\n }\r\n}\r\n\r\nexport default Volume\r\n","import { IndicatorType } from '../constants/common'\r\nimport Indicator from './indicator'\r\n\r\ninterface Attrs {\r\n period: string\r\n}\r\n\r\nclass WilliamsR extends Indicator {\r\n static type = IndicatorType.Wr\r\n static label = 'Williams %R'\r\n\r\n declare period: number\r\n r: number[] = []\r\n\r\n set(values: Partial) {\r\n super.set(values)\r\n this.parsePeriodInt(values)\r\n }\r\n\r\n compute() {\r\n if (this.isComputeNecessary()) {\r\n this.r = []\r\n for (let i = this.period; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - this.period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n this.r[i] = 0\r\n if (highestHigh - lowestLow > 0) {\r\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\r\n }\r\n }\r\n\r\n this.lastValue = this.r.last() ?? null\r\n }\r\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\r\n this.min = min\r\n this.max = max\r\n }\r\n\r\n renderIndicator(context: CanvasRenderingContext2D) {\r\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.period ?? 14,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `W%R ${this.period}`\r\n }\r\n}\r\n\r\nexport default WilliamsR\r\n","import { IndicatorType } from '../constants/common'\r\nimport adx from './adx'\r\nimport aro from './aro'\r\nimport aroosc from './aroosc'\r\nimport atr from './atr'\r\nimport cci from './cci'\r\nimport cot from './cot'\r\nimport fi from './fi'\r\nimport indicator from './indicator'\r\nimport macd from './macd'\r\nimport mfi from './mfi'\r\nimport none from './none'\r\nimport obv from './obv'\r\nimport perf from './perf'\r\nimport rmi from './rmi'\r\nimport roc from './roc'\r\nimport rsi from './rsi'\r\nimport rvol from './rvol'\r\nimport rwi from './rwi'\r\nimport stofa from './stofa'\r\nimport stofu from './stofu'\r\nimport stosl from './stosl'\r\nimport trix from './trix'\r\nimport ult from './ult'\r\nimport vol from './vol'\r\nimport wr from './wr'\r\n\r\n// TODO check if this doesn't break saved charts\r\nexport const indicatorsByType = Object.freeze({\r\n [IndicatorType.Indicator]: indicator,\r\n [IndicatorType.None]: none,\r\n [IndicatorType.Adx]: adx,\r\n [IndicatorType.Aro]: aro,\r\n [IndicatorType.Aroosc]: aroosc,\r\n [IndicatorType.Atr]: atr,\r\n [IndicatorType.Cci]: cci,\r\n [IndicatorType.Cot]: cot,\r\n [IndicatorType.Fi]: fi,\r\n [IndicatorType.Macd]: macd,\r\n [IndicatorType.Mfi]: mfi,\r\n [IndicatorType.Obv]: obv,\r\n [IndicatorType.Perf]: perf,\r\n [IndicatorType.Rmi]: rmi,\r\n [IndicatorType.Roc]: roc,\r\n [IndicatorType.Rsi]: rsi,\r\n [IndicatorType.Rvol]: rvol,\r\n [IndicatorType.Rwi]: rwi,\r\n [IndicatorType.Stofa]: stofa,\r\n [IndicatorType.Stofu]: stofu,\r\n [IndicatorType.Stosl]: stosl,\r\n [IndicatorType.Trix]: trix,\r\n [IndicatorType.Ult]: ult,\r\n [IndicatorType.Vol]: vol,\r\n [IndicatorType.Wr]: wr,\r\n})\r\n\r\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol])\r\n","export const publishModalAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\r\n cacheKey: 'modals-publish',\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport * as React from 'react'\r\n\r\nimport { DefaultSpineEvents } from '../../types/shared'\r\nimport ElementModule from '../canvas/element'\r\nimport IndicatorModule from '../indicators/indicator'\r\nimport { useForceUpdate } from '../utils/force-update'\r\nimport { getJSONReplacerFunc } from '../utils/helpers'\r\n\r\ninterface UseModelStateOptions {\r\n watchProperties?: T extends null ? never[] : Array\r\n listenOnEvents?: string[]\r\n}\r\n\r\nconst getIsSpineObject = (value: any) =>\r\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\r\n\r\nconst getWatchedPropValue = (\r\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\r\n model: Model | null\r\n) => {\r\n if (typeof watchedProp === 'function') {\r\n const value = watchedProp.call(model)\r\n\r\n if (value && !getIsSpineObject(value)) {\r\n throw Error('Watched prop should have a primitive value or a spine object')\r\n }\r\n\r\n if (typeof value?.all === 'function') {\r\n return value.all()\r\n }\r\n\r\n return value\r\n }\r\n\r\n if (typeof watchedProp === 'object') {\r\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\r\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\r\n }\r\n\r\n return watchedProp\r\n}\r\n\r\nconst getWatchedProps = (model: Model | null, props?: Array) =>\r\n props?.reduce(\r\n (acc, propKey) => ({\r\n ...acc,\r\n [propKey]: getWatchedPropValue(model?.[propKey], model),\r\n }),\r\n {} as Partial\r\n )\r\n\r\nconst getAreWatchedPropsEqual = (\r\n currentValue: Value,\r\n previousValue: Value\r\n) => {\r\n if (currentValue instanceof Spine.Model) {\r\n return currentValue.eql(previousValue)\r\n }\r\n\r\n return currentValue === previousValue\r\n}\r\n\r\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\r\n\r\nexport function useModelState(\r\n model: Model,\r\n options: UseModelStateOptions = {}\r\n) {\r\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\r\n const stringifiedOptions = JSON.stringify(options)\r\n const { forceUpdate } = useForceUpdate()\r\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\r\n\r\n React.useEffect(() => {\r\n const handleModelChange = () => {\r\n const hasChange = watchProperties.some((propKey) => {\r\n const currentValue = getWatchedPropValue(model?.[propKey], model)\r\n const previousValue = watchedPropertiesRef.current?.[propKey]\r\n\r\n if (Array.isArray(currentValue)) {\r\n return (\r\n !Array.isArray(previousValue) ||\r\n currentValue.length !== previousValue.length ||\r\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\r\n )\r\n }\r\n\r\n return !getAreWatchedPropsEqual(currentValue, previousValue)\r\n })\r\n\r\n if (hasChange) {\r\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\r\n forceUpdate()\r\n }\r\n }\r\n\r\n const spineEvents = listenOnEvents.join(' ')\r\n\r\n model?.bind(spineEvents, handleModelChange)\r\n\r\n forceUpdate()\r\n\r\n return () => {\r\n model?.unbind(spineEvents, handleModelChange)\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [model?.cid, stringifiedOptions, forceUpdate])\r\n\r\n return model\r\n}\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport {\r\n ChartConfigChartPane,\r\n CustomSpineEvents,\r\n Instrument,\r\n ObjectHash,\r\n TodoObjectHashAnyType,\r\n} from '../../types/shared'\r\nimport BaseChart from '../charts/base_chart'\r\nimport PerfChart from '../charts/perf_chart'\r\nimport {\r\n DateRangeType,\r\n IndicatorType,\r\n QuotePollingIntervalInMs,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n} from '../constants/common'\r\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\r\nimport COT from '../indicators/cot'\r\nimport PricePerformance from '../indicators/perf'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils from '../utils'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\r\nimport ChartLayout from './chart_layout'\r\nimport Pane from './pane'\r\nimport Quote from './quote'\r\n\r\nclass Chart extends Spine.Model {\r\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\r\n this.configure(\r\n 'Chart',\r\n 'width',\r\n 'height',\r\n 'timeframe',\r\n 'dateRange',\r\n 'scale',\r\n 'leftOffset',\r\n 'ticker',\r\n 'instrument',\r\n 'fx',\r\n 'fy',\r\n 'zoomFactor',\r\n 'refreshData',\r\n 'stretch',\r\n 'isHideDrawingsActive',\r\n 'isScrolled',\r\n 'firstBarClose',\r\n 'premarket',\r\n 'aftermarket',\r\n 'hasChartEvents'\r\n )\r\n this.hasMany('panes', paneModel)\r\n this.belongsTo('quote', quoteModel)\r\n this.belongsTo('chart_layout', chartLayoutModel)\r\n }\r\n\r\n declare stretch: boolean\r\n declare chart_layout_id: string\r\n declare chart_layout: () => ChartLayout\r\n declare quote_id: string\r\n declare quote: () => Quote\r\n declare panes: () => Collection\r\n declare refreshData: boolean | number\r\n declare dateRange: DateRangeType\r\n declare width: number\r\n declare height: number\r\n declare timeframe: TIMEFRAME\r\n declare leftOffset: number\r\n declare ticker: string\r\n declare instrument: Instrument\r\n declare fx: (x: number) => number\r\n declare fy: (x: number) => number\r\n declare zoomFactor: number\r\n declare isHideDrawingsActive: boolean\r\n declare isScrolled: boolean\r\n declare scale: ScaleType\r\n declare firstBarClose: number\r\n declare premarket: boolean\r\n declare aftermarket: boolean\r\n declare hasChartEvents: boolean\r\n\r\n getChartPane() {\r\n return this.panes()\r\n .all()\r\n .find((pane: Pane) =>\r\n pane\r\n .elements()\r\n .all()\r\n .some((el) => el.isChart())\r\n )\r\n }\r\n\r\n getChartElement() {\r\n for (const pane of this.panes().all()) {\r\n for (const el of pane.elements().all()) {\r\n if (el.isChart()) {\r\n return el\r\n }\r\n }\r\n }\r\n }\r\n\r\n getChartType() {\r\n return this.getChartElement()?.instance.type\r\n }\r\n\r\n getRefreshInterval() {\r\n let defaultRefreshInterval: number | null = null\r\n if (typeof this.refreshData === 'number') {\r\n defaultRefreshInterval = this.refreshData\r\n } else if (this.refreshData === true) {\r\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\r\n }\r\n\r\n const isStock = this.instrument === Instrument.Stock\r\n const isPremium = window.FinvizSettings.hasUserPremium\r\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\r\n if (!isPremium) {\r\n customRefreshInterval = QuotePollingIntervalInMs.Free\r\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\r\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\r\n }\r\n\r\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\r\n }\r\n\r\n toObject() {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toObject())\r\n return {\r\n width: this.width,\r\n dateRange: this.dateRange,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const panes = this.panes()\r\n .all()\r\n .map((pane) => pane.toConfig(omitKeys))\r\n return omit(\r\n {\r\n width: this.width,\r\n height: this.height,\r\n timeframe: this.timeframe,\r\n scale: this.scale,\r\n leftOffset: this.leftOffset,\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n zoomFactor: this.zoomFactor,\r\n refreshData: this.refreshData,\r\n stretch: this.stretch,\r\n chartId: this.cid,\r\n panes,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isScrolled: this.isScrolled,\r\n premarket: this.premarket,\r\n aftermarket: this.aftermarket,\r\n hasChartEvents: this.hasChartEvents,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.panes()\r\n .all()\r\n .forEach((pane) => {\r\n pane.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart_layout())\r\n }\r\n\r\n getIsDisabled() {\r\n return this.quote()?.close.length === 0\r\n }\r\n\r\n getIsScrollable() {\r\n return this.chart_layout().scrollable\r\n }\r\n\r\n getAllPanes() {\r\n return this.panes().all()\r\n }\r\n\r\n getAllValidPanes() {\r\n const cotKeys = Object.keys(this.quote().COTs ?? {})\r\n return this.getAllPanes().filter((pane) => {\r\n const mainElement = pane.mainElement()\r\n if (mainElement?.instance.type === IndicatorType.Cot) {\r\n // Type of mainElement is `Element` but it can be an indicator too\r\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\r\n }\r\n return true\r\n })\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\r\n }\r\n\r\n getAllQuotes(): Quote[] {\r\n const perfQuotes = this.getAllElements()\r\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\r\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\r\n\r\n let quotePerfTickers: Quote[] = []\r\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\r\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\r\n if (perfChart) {\r\n quotePerfTickers = Quote.select(\r\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\r\n )\r\n }\r\n }\r\n\r\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\r\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\r\n )\r\n }\r\n\r\n createPaneCascade(paneProperties: ChartConfigChartPane) {\r\n const paneModel = this.panes().create(paneProperties)\r\n\r\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\r\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\r\n paneModel.elements().create({ instance, zIndex, elementId })\r\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\r\n })\r\n\r\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\r\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\r\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\r\n }\r\n\r\n return paneModel\r\n }\r\n\r\n updateAttributesAndSync(value: T) {\r\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\r\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\r\n .flatMap(([_, modelAttr]) => modelAttr)\r\n this.updateAttributes(value)\r\n\r\n if (attrsInSync.length > 0) {\r\n this.chart_layout()\r\n .getAllCharts()\r\n .forEach((chartModel) => {\r\n if (this.eql(chartModel)) {\r\n return\r\n }\r\n const newAttrs: ObjectHash = {}\r\n attrsInSync.forEach((modelAttr) => {\r\n if (value.hasOwnProperty(modelAttr)) {\r\n newAttrs[modelAttr] = value[modelAttr]\r\n }\r\n })\r\n chartModel.updateAttributes(newAttrs)\r\n })\r\n }\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return this.chart_layout().getIsChartPartInSync(chartPart)\r\n }\r\n\r\n getHasPatterns() {\r\n return this.getAllElements().some((element) => {\r\n if ('hasOverlay' in element.instance) {\r\n return (element.instance as BaseChart).hasOverlay?.('patterns')\r\n }\r\n\r\n return false\r\n })\r\n }\r\n\r\n getQuoteRawTicker(): string | null {\r\n return this.quote()?.getRawTicker() ?? null\r\n }\r\n\r\n setChartEvents(chartEvents?: Array, shouldClear = false) {\r\n const chartPane = this.getChartPane()\r\n if (!chartPane) {\r\n return\r\n }\r\n const allChartEvents = chartPane.chartEvents().all()\r\n if (shouldClear) {\r\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\r\n }\r\n\r\n const events = shouldClear\r\n ? chartEvents\r\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\r\n\r\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\r\n const newChartEvent = chartPane.chartEvents().create({\r\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\r\n elementId,\r\n })\r\n newChartEvent.instance.updateScales()\r\n })\r\n\r\n chartPane.updateChartEventsZIndexes()\r\n }\r\n}\r\n\r\nexport default Chart\r\n","/*\r\n * it converts it to numbered index and it causes problems later on\r\n * the reason it's not just numbered enum is that it when used in const below\r\n * */\r\nexport enum ChartSyncablePart {\r\n Crosshair = 'crosshair',\r\n Ticker = 'ticker',\r\n Timeframe = 'timeframe',\r\n}\r\n\r\nexport const ChartPartToAttrsSyncMap = {\r\n [ChartSyncablePart.Ticker]: ['ticker'],\r\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\r\n}\r\n\r\nexport const ChartSyncableParts = [\r\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\r\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\r\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\r\n]\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\r\nimport { DrawingSetting } from '../controllers/toolbar/interfaces'\r\nimport Indicator from '../indicators/indicator'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport { ChartSyncablePart } from './chart/contstants'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport DrawingsInternalStore from './drawings-internal-store'\r\nimport Pane from './pane'\r\nimport { QuoteFetchType } from './quote/constants'\r\n\r\nclass ChartLayout extends Spine.Model {\r\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\r\n this.configure(\r\n 'ChartLayout',\r\n 'layout',\r\n 'activeChart',\r\n 'activePane',\r\n 'activeChartEvent',\r\n 'width',\r\n 'height',\r\n 'editable',\r\n 'canChangeTicker',\r\n 'scrollable',\r\n 'initialScrollable',\r\n 'cross',\r\n 'editors',\r\n 'theme',\r\n 'settings',\r\n 'isWheelZoomEnabled',\r\n 'specificChartFunctionality',\r\n 'isLargeChart',\r\n 'isHideDrawingsActive',\r\n 'isPreserveDrawingsActive',\r\n 'isLockDrawingsActive',\r\n 'isDrawingModeContinuousActive',\r\n 'uuid',\r\n 'isTouchCrossActive',\r\n 'defaultZoomFactor',\r\n 'syncChartParts',\r\n 'isInit',\r\n 'willDestroy',\r\n 'idea'\r\n )\r\n this.hasMany('charts', chartModel)\r\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\r\n }\r\n\r\n declare layout: LayoutType\r\n declare activeChart: Chart\r\n declare activePane?: Pane\r\n declare activeChartEvent?: ChartEventElement\r\n declare width: number\r\n declare height: number\r\n declare editable: boolean\r\n declare canChangeTicker: boolean\r\n declare scrollable: boolean\r\n declare readonly initialScrollable: boolean\r\n declare cross: boolean\r\n declare editors: ChartEditorEnum[]\r\n declare theme: Theme\r\n declare settings: ISettings\r\n declare isWheelZoomEnabled: boolean\r\n declare specificChartFunctionality: SpecificChartFunctionality\r\n declare isLargeChart?: boolean\r\n declare charts: () => Collection\r\n declare isHideDrawingsActive: boolean\r\n declare isPreserveDrawingsActive: boolean\r\n declare isLockDrawingsActive: boolean\r\n declare isDrawingModeContinuousActive: boolean\r\n declare uuid: string\r\n declare isTouchCrossActive?: boolean\r\n declare defaultZoomFactor: number\r\n declare syncChartParts: ChartSyncablePart[]\r\n declare idea?: IIdea\r\n declare isInit?: boolean\r\n declare willDestroy?: boolean\r\n declare drawingsInternalStore: () => DrawingsInternalStore\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n\r\n if (!getIsSSr()) {\r\n this.bind('update', (model: ChartLayout) => {\r\n if (!window.FinvizSettings.toolsState) {\r\n window.FinvizSettings.toolsState = {}\r\n }\r\n window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings] = model.isPreserveDrawingsActive\r\n })\r\n }\r\n }\r\n\r\n getPaneWithSelection() {\r\n for (const pane of this.getAllPanes()) {\r\n if (pane.selection) {\r\n return pane\r\n }\r\n }\r\n }\r\n\r\n toObject() {\r\n const charts = this.getAllCharts().map((chart) => chart.toObject())\r\n return {\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n }\r\n }\r\n\r\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\r\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\r\n return JSON.parse(\r\n JSON.stringify(\r\n omit(\r\n {\r\n ...this.settings.ChartSettings.center,\r\n layout: this.layout,\r\n width: this.width,\r\n height: this.height,\r\n charts,\r\n isHideDrawingsActive: this.isHideDrawingsActive,\r\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\r\n colors: this.settings.ChartSettings.general.Colors,\r\n specificChartFunctionality: this.specificChartFunctionality,\r\n editors: this.editors,\r\n editable: this.editable,\r\n scrollable: this.scrollable,\r\n theme: this.theme,\r\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\r\n },\r\n omitKeys\r\n )\r\n )\r\n )\r\n }\r\n\r\n destroy(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n return super.destroy(options)\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.updateAttribute('willDestroy', true)\r\n this.getAllCharts().forEach((chart) => {\r\n chart.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n getAllCharts() {\r\n return this.charts().all()\r\n }\r\n\r\n getAllPanes() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\r\n }\r\n\r\n getAllElements() {\r\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\r\n }\r\n\r\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\r\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\r\n\r\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\r\n\r\n if (isInSync) {\r\n newSyncedChartParts.push(...chartPartsToSync)\r\n }\r\n\r\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\r\n }\r\n\r\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\r\n return !!this.syncChartParts?.includes(chartPart)\r\n }\r\n\r\n getIsIndicatorPresent(type: IndicatorType) {\r\n return !!this.charts()\r\n .first()\r\n ?.getAllElements()\r\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\r\n }\r\n\r\n getHTMLElementId() {\r\n return `chart-layout-${this.id}`\r\n }\r\n\r\n exitIdea() {\r\n this.updateAttribute('idea', undefined)\r\n this.getAllCharts().forEach((chart) => {\r\n // Change all idea quotes to non idea quotes and refetch because we don't need them anymore, but they may cause inconsistencies if they are in cache\r\n chart.getAllQuotes().forEach((quote) => {\r\n if (quote.ideaID) {\r\n quote.updateAttributes({ ideaID: undefined })\r\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\r\n }\r\n })\r\n\r\n chart.updateAttributes({ refreshData: true })\r\n })\r\n }\r\n\r\n isIdeaId(id: number | null = null) {\r\n return (this.idea?.id ?? null) === id\r\n }\r\n}\r\n\r\nexport default ChartLayout\r\n","import { ObjectHash, Theme } from '../../../types/shared'\r\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\r\n\r\nfunction normalizeHexAlpha(hexString = '') {\r\n const hexValue = hexString.replace('#', '')\r\n if (hexValue.length === 6) {\r\n return `${hexString}FF`\r\n }\r\n return hexString\r\n}\r\n\r\nexport const getColorOverwrites = ({\r\n theme,\r\n colors,\r\n}: {\r\n theme: Theme\r\n colors: ObjectHash, Theme>\r\n}) => {\r\n const customColors = colors[theme]\r\n const customColorKeys = Object.keys(customColors) as Array>\r\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\r\n\r\n return customColorKeys.reduce((acc, colorKey) => {\r\n const isDefaultOverWritten =\r\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\r\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\r\n\r\n return isDefaultOverWritten\r\n ? {\r\n ...acc,\r\n [colorKey]: customColors[colorKey],\r\n }\r\n : acc\r\n }, {})\r\n}\r\n","import tailwindColors from '../constants/colors'\r\nimport { getHEXWithSpecificAplha } from '../utils/colors'\r\n\r\nexport interface IChartThemeColors {\r\n aftermarketFade: string\r\n background: string\r\n borderDown: string\r\n borderUp: string\r\n canvasFill: string\r\n cross: string\r\n crossText: string\r\n crossTextBackground: string\r\n currentBackground: string\r\n currentText: string\r\n grid: string\r\n gridSecondary: string\r\n indicatorCurrentBackground: string\r\n indicatorCurrentText: string\r\n line: string\r\n marketDown: string\r\n marketUp: string\r\n negativeChange: string\r\n ohlcTrendDown: string\r\n ohlcTrendUp: string\r\n overlayTransparentBackground: string\r\n percentageZeroLineText: string\r\n performanceIndicatorLabel: string\r\n positiveChange: string\r\n premarketFade: string\r\n prevClose: string\r\n text: string\r\n textSecondary: string\r\n trendDown: string\r\n trendUp: string\r\n volumeTrendDown: string\r\n volumeTrendUp: string\r\n wickDown: string\r\n wickUp: string\r\n zeroChange: string\r\n}\r\n\r\nexport interface IIndicatorThemeColors {\r\n line: string\r\n signalLine: string\r\n}\r\n\r\nexport interface IElementThemeColors {\r\n line: string\r\n border: string\r\n textWithoutBackground: string\r\n}\r\n\r\ninterface IDarkerWickColors {\r\n borderUp: string\r\n wickUp: string\r\n borderDown: string\r\n wickDown: string\r\n}\r\n\r\nexport const chartLightTheme: IChartThemeColors = {\r\n aftermarketFade: '#FFFFFF99',\r\n background: '#008CFF0E',\r\n borderDown: '#000000FF',\r\n borderUp: '#000000FF',\r\n canvasFill: '#FFFFFFFF',\r\n cross: '#0000004C',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.brightYellow[100],\r\n currentText: tailwindColors.gray[800],\r\n grid: '#D2D2D2FF',\r\n gridSecondary: '#ECECEC',\r\n indicatorCurrentBackground: tailwindColors.gray[600],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[500],\r\n marketUp: tailwindColors.green[500],\r\n negativeChange: '#C80000FF',\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\r\n percentageZeroLineText: '#111',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: '#009600FF',\r\n premarketFade: '#FFFFFF99',\r\n prevClose: '#C80000FF',\r\n text: '#828282',\r\n textSecondary: '#dedede',\r\n trendDown: '#FF0000FF',\r\n trendUp: '#00FF00FF',\r\n volumeTrendDown: '#ffc0c0',\r\n volumeTrendUp: '#a8e0a8',\r\n wickDown: '#000000FF',\r\n wickUp: '#000000FF',\r\n zeroChange: '#000',\r\n}\r\n\r\nexport const chartDarkTheme: IChartThemeColors = {\r\n aftermarketFade: '#4C526133',\r\n background: '#1E6DC019',\r\n borderDown: '#F63538FF',\r\n borderUp: '#30CC5AFF',\r\n canvasFill: tailwindColors.gray[800],\r\n cross: '#404553',\r\n crossText: '#fff',\r\n crossTextBackground: '#111',\r\n currentBackground: tailwindColors.yellow[200],\r\n currentText: tailwindColors.gray[700],\r\n grid: '#363A46FF',\r\n gridSecondary: '#2C303A',\r\n indicatorCurrentBackground: tailwindColors.gray[500],\r\n indicatorCurrentText: '#fff',\r\n line: '#1E6DC0FF',\r\n marketDown: tailwindColors.red[300],\r\n marketUp: tailwindColors.green[300],\r\n negativeChange: tailwindColors.red[400],\r\n ohlcTrendDown: '#E54040FF',\r\n ohlcTrendUp: '#40A140FF',\r\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\r\n percentageZeroLineText: '#fff',\r\n performanceIndicatorLabel: '#646464',\r\n positiveChange: tailwindColors.green[400],\r\n premarketFade: '#4C526133',\r\n prevClose: '#C80000FF',\r\n text: '#929cb3',\r\n textSecondary: '#929CB399',\r\n trendDown: '#F63538FF',\r\n trendUp: '#30CC5AFF',\r\n volumeTrendDown: '#F635387F',\r\n volumeTrendUp: '#30CC5A7F',\r\n wickDown: '#F63538FF',\r\n wickUp: '#30CC5AFF',\r\n zeroChange: '#929cb3',\r\n}\r\n\r\nexport const darkerWickColors: IDarkerWickColors = {\r\n borderUp: '#006400FF',\r\n wickUp: '#006400',\r\n borderDown: '#6E0000FF',\r\n wickDown: '#6E0000FF',\r\n}\r\n\r\nexport const indicatorLightTheme: IIndicatorThemeColors = {\r\n line: '#000000',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\r\n line: '#D07933',\r\n signalLine: tailwindColors.red[400],\r\n}\r\n\r\nexport const elementLightTheme: IElementThemeColors = {\r\n line: '#000000',\r\n border: '#000000',\r\n textWithoutBackground: '#000000',\r\n}\r\n\r\nexport const elementDarkTheme: IElementThemeColors = {\r\n line: '#5faaf4',\r\n border: '#5192D1',\r\n textWithoutBackground: '#929cb3',\r\n}\r\nexport const generalColors: Array = [\r\n '#1f77b4',\r\n '#ff7f0e',\r\n '#2ca02c',\r\n '#d62728',\r\n '#9467bd',\r\n '#8c564b',\r\n '#e377c2',\r\n '#7f7f7f',\r\n '#bcbd22',\r\n '#17becf',\r\n]\r\n\r\n// node chart with thin bars color override\r\nexport const thinBarColorsOverride = {\r\n trendUp: '#00b400',\r\n trendDown: '#b40000',\r\n}\r\n\r\nexport enum AutoSaveState {\r\n Off,\r\n Saved,\r\n Unsaved,\r\n Saving,\r\n}\r\n\r\nexport const CHART_EVENT_BADGE_SIZE = 24\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { AutoSaveElement } from '../controllers/autosave/constants'\r\nimport { getUuid } from '../utils/helpers'\r\nimport { HLC, initHlc } from '../utils/hlc'\r\nimport { AutoSaveState } from './constants'\r\n\r\ninterface DrawingsInternalStateAttrs {\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n}\r\n\r\nclass DrawingsInternalStore extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'DrawingsInternalState',\r\n 'elements',\r\n 'latestRemoteUpdateTimestamp',\r\n 'latestLocalUpdateTimestamp',\r\n 'autoSaveState',\r\n 'instanceUUID'\r\n )\r\n }\r\n\r\n elements: AutoSaveElement[]\r\n latestRemoteUpdateTimestamp: HLC\r\n latestLocalUpdateTimestamp: HLC\r\n instanceUUID: string\r\n autoSaveState: AutoSaveState\r\n\r\n constructor(attrs: Partial = {}) {\r\n super(attrs)\r\n\r\n this.elements = attrs.elements ?? []\r\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\r\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\r\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\r\n }\r\n\r\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\r\n if (this.autoSaveState !== newAutoSaveState) {\r\n this.updateAttributes({ autoSaveState: newAutoSaveState })\r\n }\r\n }\r\n}\r\n\r\nexport default DrawingsInternalStore\r\n","import Spine from '@finviz/spine'\r\nimport merge from 'lodash.merge'\r\n\r\nimport { TodoObjectHashAnyType } from '../../types/shared'\r\nimport { drawingToolsByType } from '../canvas/drawingTools'\r\nimport CanvasElement from '../canvas/element'\r\nimport { CanvasElementType } from '../constants/common'\r\nimport { getIsSSr, getUuid } from '../utils/helpers'\r\nimport Pane from './pane'\r\nimport { changeElementZIndexes } from './utils'\r\n\r\nclass Element extends Spine.Model {\r\n static initClass(paneModel: typeof Pane) {\r\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\r\n this.belongsTo('pane', paneModel)\r\n }\r\n\r\n declare instance: CanvasElement\r\n declare pane_id: string\r\n declare destroyed: true | undefined\r\n declare pane: () => Pane\r\n lastChange: number | null = null\r\n elementId: string | null = null\r\n zIndex = -1\r\n\r\n generateUuid = getIsSSr() ? undefined : getUuid\r\n\r\n constructor(...args: any[]) {\r\n super(...args)\r\n const elementAttrs = args[0]\r\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\r\n this.one('create', () => {\r\n this.updateAttributes({\r\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\r\n })\r\n })\r\n }\r\n\r\n replace(instance: CanvasElement) {\r\n const oldInstance = this.instance\r\n this.updateAttribute('instance', instance)\r\n this.trigger('replace', this, oldInstance)\r\n }\r\n\r\n makeClone() {\r\n const { instance, pane_id } = this\r\n const { attrs } = instance\r\n const { scale } = instance.model\r\n const clonedObj = merge({ pane_id }, attrs)\r\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\r\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\r\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\r\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\r\n cloned.cachePointPositionTimestamp()\r\n Element.create({ instance: cloned, pane_id })\r\n this.trigger('makeClone', this, cloned)\r\n }\r\n\r\n moveToZIndex(zIndex: number) {\r\n const currentZIndex = this.zIndex\r\n const directionCoef = zIndex > currentZIndex ? 1 : -1\r\n\r\n if (this.isChart() || this.isIndicator()) {\r\n if (this.zIndex !== 0) {\r\n this.updateAttributes({ zIndex: 0 })\r\n }\r\n this.pane()\r\n .getAllElements()\r\n .filter((element) => {\r\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\r\n return shouldMove && element.isDrawing()\r\n })\r\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\r\n\r\n return\r\n }\r\n\r\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\r\n const { min, max } = this.pane().getElementZIndexRange()\r\n if (\r\n currentZIndex === newZIndex ||\r\n (currentZIndex === min && directionCoef === -1) ||\r\n (currentZIndex === max && directionCoef === 1)\r\n ) {\r\n return\r\n }\r\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsBelowZero,\r\n addElement: newZIndex < 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n isBelowZero: true,\r\n })\r\n\r\n changeElementZIndexes({\r\n elementsArray: elementsAboveZero,\r\n addElement: newZIndex > 0 ? this : undefined,\r\n oldZIndex: currentZIndex,\r\n newZIndex,\r\n })\r\n }\r\n\r\n bringToFront() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\r\n }\r\n\r\n sendToBack() {\r\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\r\n }\r\n\r\n bringForward() {\r\n this.moveToZIndex(this.zIndex + 1)\r\n }\r\n\r\n sendBackward() {\r\n this.moveToZIndex(this.zIndex - 1)\r\n }\r\n\r\n isChart() {\r\n return !!this.instance?.type.startsWith('charts/')\r\n }\r\n\r\n isIndicator() {\r\n return !!this.instance?.type.startsWith('indicators/')\r\n }\r\n\r\n isOverlay() {\r\n return !!this.instance?.type.startsWith('overlays/')\r\n }\r\n\r\n isDrawing() {\r\n return !!this.instance?.type.startsWith('canvas/')\r\n }\r\n\r\n isChartEvent() {\r\n return !!this.instance?.type.startsWith('chartEvent/')\r\n }\r\n\r\n isMouseDown() {\r\n return !!this.instance?.isMouseDown\r\n }\r\n\r\n hasOngoingInteraction() {\r\n return this.isMouseDown() || this.instance.isEditInProgress\r\n }\r\n\r\n toObject() {\r\n return {\r\n ...this.instance.toObject(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n toConfig() {\r\n return {\r\n ...this.instance.toConfig(),\r\n elementId: this.elementId,\r\n zIndex: this.zIndex,\r\n }\r\n }\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n return this.destroy(options)\r\n }\r\n\r\n refreshElementId() {\r\n this.updateAttribute('elementId', this.generateUuid?.())\r\n }\r\n}\r\n\r\nexport default Element\r\n","import endOfDay from 'date-fns/endOfDay'\r\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\r\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\r\nimport setDate from 'date-fns/set'\r\n\r\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\r\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\r\nimport Chart from '../chart'\r\n\r\nconst MARKET_START = { hours: 9, minutes: 30 }\r\nconst END_OF_DAY = { hours: 23, minutes: 59 }\r\n\r\nfunction getIsDateBeforeMarketStart(date: Date) {\r\n const hours = date.getHours()\r\n const minutes = date.getMinutes()\r\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\r\n}\r\n\r\nexport function roundTimeForSyncedPane({\r\n sourceChart,\r\n targetChart,\r\n timestamp,\r\n}: {\r\n sourceChart: Chart\r\n targetChart: Chart\r\n timestamp: number\r\n}) {\r\n let dateToReturn = dateFromUnixTimestamp(timestamp)\r\n const sourceChartHasPremarket =\r\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\r\n const targetChartHasPremarket =\r\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\r\n\r\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\r\n dateToReturn = setDate(dateToReturn, MARKET_START)\r\n }\r\n\r\n if (targetChart.timeframe === TIMEFRAME.m) {\r\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.w) {\r\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\r\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\r\n dateToReturn = endOfDay(dateToReturn)\r\n }\r\n\r\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\r\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\r\n }\r\n\r\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\r\n}\r\n","import Spine from '@finviz/spine'\r\n\r\nimport { ChartSyncablePart } from '../chart/contstants'\r\nimport Pane from '../pane'\r\nimport { roundTimeForSyncedPane } from './mouse-utils'\r\n\r\nexport class Mouse extends Spine.Model {\r\n static initClass() {\r\n this.configure('Mouse', 'position')\r\n this.belongsTo('pane', Pane)\r\n }\r\n\r\n declare position: { x: number; y: number } | undefined\r\n declare pane: () => Pane | null\r\n\r\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\r\n\r\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\r\n\r\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\r\n\r\n getCrossIndexForPane = (pane: Pane) => {\r\n if (this.position) {\r\n if (this.getIsMouseInChartOfPane(pane)) {\r\n return Math.round(this.position.x)\r\n }\r\n const paneOfMouse = this.pane()\r\n if (this.getIsCrossSyncOn() && paneOfMouse) {\r\n const mouseInChart = paneOfMouse.chart()\r\n const currentPaneChart = pane.chart()\r\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\r\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\r\n roundTimeForSyncedPane({\r\n sourceChart: mouseInChart,\r\n targetChart: currentPaneChart,\r\n timestamp: mousePositionTimestamp,\r\n })\r\n )\r\n return Math.floor(currentPanePositionX)\r\n }\r\n }\r\n\r\n return Number.NaN\r\n }\r\n\r\n getPriceForPane = (pane: Pane) => {\r\n const positionY = this.position?.y ?? null\r\n\r\n if (this.pane()?.eql(pane)) {\r\n return positionY\r\n }\r\n\r\n if (this.getIsCrossSyncOn() && this.pane()) {\r\n const mousePaneIndex = this.pane()?.getIndexInChart()\r\n const currentPaneIndex = pane.getIndexInChart()\r\n return mousePaneIndex === currentPaneIndex ? positionY : null\r\n }\r\n\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * Mouse is a singleton, so `initClass` must be called before we create the instance\r\n * otherwise it wouldn’t work\r\n */\r\nMouse.initClass()\r\n\r\nconst mouse = Mouse.create()\r\nmouse.save()\r\n\r\nexport default mouse as Mouse\r\n","import Spine, { Collection } from '@finviz/spine'\r\nimport omit from 'lodash.omit'\r\n\r\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\r\nimport CanvasElement from '../canvas/element'\r\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Chart from './chart'\r\nimport ChartEventElement from './chart-event-element'\r\nimport Element from './element'\r\nimport { rebuildElementZIndexes } from './utils'\r\n\r\nexport interface ScaleAxis {\r\n (index: number): number\r\n invert: (x: number) => number\r\n domain: () => [currentDomainMax: number, currentDomainMin: number]\r\n width: (x: number) => number\r\n height: (y: number) => number\r\n ticks: (y: number) => number[]\r\n}\r\n\r\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\r\n ChartEventBadgeType.Split,\r\n ChartEventBadgeType.Dividends,\r\n ChartEventBadgeType.EarningsPositive,\r\n ChartEventBadgeType.EarningsNegative,\r\n ChartEventBadgeType.EarningsNeutral,\r\n ChartEventBadgeType.EarningsFuture,\r\n]\r\n\r\nclass Pane extends Spine.Model {\r\n static initClass(\r\n elementModel: typeof Element,\r\n chartEventElementModel: typeof ChartEventElement,\r\n chartModel: typeof Chart\r\n ) {\r\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\r\n this.hasMany('elements', elementModel)\r\n this.hasMany('chartEvents', chartEventElementModel)\r\n this.belongsTo('mainElement', elementModel)\r\n this.belongsTo('chart', chartModel)\r\n }\r\n\r\n declare id: string\r\n declare chart_id: string\r\n declare height: number\r\n declare scale: {\r\n x: ScaleAxis\r\n y: ScaleAxis\r\n }\r\n\r\n declare instance: any\r\n declare chart: () => Chart\r\n declare mainElement: () => T | null\r\n declare elements: () => Collection\r\n declare chartEvents: () => Collection\r\n selection: CanvasElement | null = null\r\n scaleRange: { min: number; max: number } | null = null\r\n\r\n destroyCascade(options?: TodoObjectHashAnyType) {\r\n this.elements()\r\n .all()\r\n .forEach((element) => {\r\n element.destroyCascade()\r\n })\r\n return this.destroy(options)\r\n }\r\n\r\n toObject() {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toObject())\r\n return {\r\n height: this.height,\r\n scale: this.scale,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n }\r\n }\r\n\r\n toConfig(omitKeys = [] as string[]) {\r\n const elements = this.elements()\r\n .all()\r\n .map((el) => el.toConfig())\r\n return omit(\r\n {\r\n height: this.height,\r\n scaleRange: this.scaleRange,\r\n elements,\r\n },\r\n omitKeys\r\n )\r\n }\r\n\r\n move(direction: Position) {\r\n const chartPanes = this.chart().getAllPanes()\r\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\r\n const targetPane = chartPanes.find((pane) => this.eql(pane))\r\n\r\n if (!chartPane || !targetPane) return\r\n\r\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\r\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\r\n\r\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\r\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\r\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\r\n\r\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\r\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\r\n if (direction === Position.Above) {\r\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\r\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n if (direction === Position.Below) {\r\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\r\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\r\n }\r\n\r\n Pane.records = ohterChartPaneRecords.concat([\r\n ...panesAbove,\r\n arrayWithoutTargetRecord[chartRecordIndex],\r\n ...panesBelow,\r\n ])\r\n this.chart().trigger('change', this.chart())\r\n }\r\n\r\n getChartLayoutSettings() {\r\n return getChartLayoutSettings(this.chart().chart_layout())\r\n }\r\n\r\n getAllElements() {\r\n return this.elements()\r\n .all()\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n }\r\n\r\n getAllChartEvents(isSorted = true) {\r\n const chartEvents = [...this.chartEvents().all()]\r\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\r\n }\r\n\r\n getChartOrIndicatorElement() {\r\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\r\n }\r\n\r\n getIsIndicatorPane() {\r\n return !!this.mainElement()?.isIndicator()\r\n }\r\n\r\n getIsChartPane() {\r\n return !!this.mainElement()?.isChart()\r\n }\r\n\r\n resetHeight() {\r\n if (this.getIsIndicatorPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\r\n }\r\n if (this.getIsChartPane()) {\r\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\r\n }\r\n }\r\n\r\n getIndexInChart() {\r\n return this.chart()\r\n .getAllPanes()\r\n .findIndex((chartPane) => chartPane.eql(this))\r\n }\r\n\r\n getElementZIndexRange() {\r\n let max = -1\r\n let min = 1\r\n this.getAllElements().forEach((el) => {\r\n if (el.zIndex > max) {\r\n max = el.zIndex\r\n }\r\n if (el.zIndex < min) {\r\n min = el.zIndex\r\n }\r\n })\r\n return { min, max }\r\n }\r\n\r\n getBelowAboveZeroElements() {\r\n const allPaneElements = this.getAllElements()\r\n const elementsBelowZero: Element[] = []\r\n const elementsAboveZero: Element[] = []\r\n allPaneElements.forEach((el) => {\r\n if (el.zIndex < 0) {\r\n elementsBelowZero.push(el)\r\n }\r\n if (el.zIndex > 0) {\r\n elementsAboveZero.push(el)\r\n }\r\n })\r\n\r\n return { elementsBelowZero, elementsAboveZero }\r\n }\r\n\r\n normalizeZIndexes() {\r\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\r\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\r\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\r\n }\r\n\r\n getQuoteRawTicker() {\r\n return this.chart().getQuoteRawTicker()\r\n }\r\n\r\n getNumericId() {\r\n return Number(this.id.replace('c-', ''))\r\n }\r\n\r\n updateChartEventsZIndexes() {\r\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\r\n return\r\n }\r\n\r\n const chartEvents = this.getAllChartEvents(false).sort(\r\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\r\n )\r\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\r\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\r\n\r\n const hoveredTypeChartEventElements: ChartEventElement[] = []\r\n const openedTypeChartEventElements: ChartEventElement[] = []\r\n const nonActiveChartEventElements: ChartEventElement[] = []\r\n\r\n chartEvents.forEach((chartEvent, index) => {\r\n const chartEventsOnSameXPoint = chartEvents.filter(\r\n (chartEvent_B, i) =>\r\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\r\n )\r\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\r\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\r\n const isOpened = chartEvent.instance === openedChartEvent?.instance\r\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\r\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\r\n if (!isHovered || !isOpened) {\r\n if (isHoveredType) {\r\n hoveredTypeChartEventElements.push(chartEvent)\r\n } else if (isOpenType) {\r\n openedTypeChartEventElements.push(chartEvent)\r\n } else {\r\n nonActiveChartEventElements.push(chartEvent)\r\n }\r\n }\r\n })\r\n\r\n nonActiveChartEventElements.sort(\r\n (a, b) =>\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\r\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\r\n )\r\n\r\n const chartEventElements = [\r\n ...nonActiveChartEventElements,\r\n ...openedTypeChartEventElements,\r\n openedChartEvent,\r\n ...hoveredTypeChartEventElements,\r\n hoveredChartEvent,\r\n ].filter(Boolean)\r\n chartEventElements.forEach((chartEvent, index) => {\r\n chartEvent!.updateAttributes({ zIndex: index })\r\n })\r\n }\r\n}\r\n\r\nexport default Pane\r\n","import { ObjectHash, RequireByKey } from '../../types/shared'\r\n\r\ninterface HeikinAshiData {\r\n HAOpen: number[]\r\n HAClose: number[]\r\n}\r\n\r\ninterface QuoteValues {\r\n cachedAt: null | number\r\n dayToOffset: ObjectHash[]\r\n dateToIndex: ObjectHash[]\r\n heikinAshiData?: HeikinAshiData\r\n daysInQuote: Date[]\r\n}\r\n\r\ninterface QuoteCacheFunctionProps {\r\n cid: string\r\n key: keyof QuoteValues\r\n fetchedAt: number\r\n value: any\r\n}\r\n\r\nconst quoteCache = {} as ObjectHash\r\n\r\nexport function getCachedQuote({\r\n cid,\r\n key,\r\n fetchedAt,\r\n}: RequireByKey>, 'cid'>) {\r\n const quote = quoteCache[cid]\r\n if (quote?.cachedAt === fetchedAt && key) {\r\n return quote[key]\r\n } else if (!key) {\r\n return quote\r\n }\r\n return null\r\n}\r\n\r\nexport function setCachedQuote({\r\n cid,\r\n key,\r\n value,\r\n fetchedAt,\r\n}: Pick) {\r\n quoteCache[cid] = {\r\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\r\n [key]: value,\r\n cachedAt: fetchedAt,\r\n } as QuoteValues\r\n}\r\n\r\nexport function deleteCachedQuote({ cid }: Pick) {\r\n delete quoteCache[cid]\r\n}\r\n","import Spine from '@finviz/spine'\r\nimport { isSameMonth, isSameWeek } from 'date-fns'\r\nimport queryString from 'query-string'\r\n\r\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\r\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\r\nimport type { ICOT } from '../indicators/cot'\r\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\r\nimport { getIsAbortError } from '../utils/abort_controller'\r\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\r\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\r\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\r\nimport { getIsSSr } from '../utils/helpers'\r\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\r\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\r\nimport { getRawTickerForInstrument } from './utils'\r\n\r\nconst quoteRefreshChecksBeforeFullRefresh = 15\r\n\r\ntype TodoPattern = TodoObjectHashAnyType\r\n\r\nexport interface TickerTimeframesProps {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ninterface QuoteFetchOptions {\r\n aftermarket?: boolean\r\n premarket?: boolean\r\n patterns?: boolean\r\n events?: boolean\r\n maxBars?: number\r\n}\r\n\r\ninterface QuoteInternalOptions {\r\n cachePredicate?: (quote: Quote) => boolean\r\n fetchNewDataOnCachedQuote?: boolean\r\n}\r\n\r\ninterface UrlOptions extends QuoteFetchOptions {\r\n ticker: string\r\n instrument: string\r\n timeframe: string\r\n}\r\n\r\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\r\n\r\nexport interface DataResponse {\r\n COTs: COTData\r\n name: string\r\n ticker: string\r\n instrument: string\r\n interval: number\r\n timeframe: string\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n date: number[]\r\n volume: number[]\r\n lastOpen: number\r\n lastHigh: number\r\n lastLow: number\r\n lastClose: number\r\n lastDate: number\r\n lastTime: string | null\r\n lastVolume: number\r\n dataId: string\r\n prevClose: number\r\n afterClose: number\r\n afterChange: number\r\n afterTime: string | null\r\n drawMinutesPerDay: number\r\n marketStartMinutes: number\r\n premarketLengthMinutes: number\r\n aftermarketLengthMinutes: number\r\n aftermarket: boolean\r\n premarket: boolean\r\n hasPatterns: boolean\r\n patterns: Array\r\n patternsMinRange: number\r\n patternsMaxRange: number\r\n relativeVolume: number\r\n isIntraday: boolean\r\n noNewData?: boolean\r\n chartEvents?: ChartEventDataRaw[]\r\n}\r\n\r\ninterface COTData {\r\n [code: string]: ICOT\r\n}\r\n\r\nconst emptyQuote = {\r\n open: [],\r\n high: [],\r\n low: [],\r\n close: [],\r\n volume: [],\r\n date: [],\r\n fetchedAt: -1,\r\n numberOfRefreshChecks: 0,\r\n isFetching: false,\r\n is404: false,\r\n COTs: undefined,\r\n name: undefined,\r\n drawMinutesPerDay: undefined,\r\n marketStartMinutes: undefined,\r\n premarketLengthMinutes: undefined,\r\n aftermarketLengthMinutes: undefined,\r\n patterns: [],\r\n patternsMinRange: undefined,\r\n patternsMaxRange: undefined,\r\n relativeVolume: undefined,\r\n lastOpen: undefined,\r\n lastHigh: undefined,\r\n lastLow: undefined,\r\n lastClose: undefined,\r\n lastVolume: undefined,\r\n dataId: undefined,\r\n lastDate: undefined,\r\n prevClose: undefined,\r\n afterClose: undefined,\r\n afterChange: undefined,\r\n chartEvents: [],\r\n}\r\n\r\ninterface ICacheAvailabilityCheckFunctionsArguments {\r\n quote: Quote\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n}\r\n\r\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !quote.premarket === !options?.premarket &&\r\n !quote.aftermarket === !options?.aftermarket &&\r\n !quote.hasPatterns === !options?.patterns &&\r\n // if options.events is false we can reuse quote with events\r\n (!options?.events || !!quote.events)\r\n\r\nconst doesQuoteAndFetchParamsMatch = ({\r\n quote,\r\n ticker,\r\n instrument,\r\n timeframe,\r\n}: {\r\n quote: Quote\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\r\n\r\n// either we don't care about matching uuid at all, or they have to match\r\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\r\n\r\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\r\n !options?.cachePredicate || options.cachePredicate(quote)\r\n\r\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\r\n\r\nexport type QuoteGetParams = {\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n options?: QuoteFetchOptions & QuoteInternalOptions\r\n abortController?: null | AbortController\r\n shouldUseCache?: boolean\r\n chartUuid?: string\r\n}\r\n\r\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\r\n return (\r\n chartEvents?.map((item) => {\r\n let eventType: ChartEventType\r\n switch (item.eventType) {\r\n case ChartEventDbType.Dividends:\r\n eventType = ChartEventType.Dividends\r\n break\r\n case ChartEventDbType.Split:\r\n eventType = ChartEventType.Split\r\n break\r\n case ChartEventDbType.Earnings:\r\n eventType = ChartEventType.Earnings\r\n break\r\n }\r\n return {\r\n ...item,\r\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\r\n eventType,\r\n }\r\n }) ?? []\r\n )\r\n}\r\n\r\nclass Quote extends Spine.Model {\r\n static initClass() {\r\n this.configure(\r\n 'Quote',\r\n 'ticker',\r\n 'name',\r\n 'instrument',\r\n 'timeframe',\r\n 'open',\r\n 'high',\r\n 'low',\r\n 'close',\r\n 'date',\r\n 'volume',\r\n 'lastOpen',\r\n 'lastHigh',\r\n 'lastLow',\r\n 'lastClose',\r\n 'lastDate',\r\n 'lastVolume',\r\n 'lastTime',\r\n 'dataId',\r\n 'prevClose',\r\n 'COTs',\r\n 'chartEvents',\r\n 'afterClose',\r\n 'afterChange',\r\n 'afterTime',\r\n 'drawMinutesPerDay',\r\n 'marketStartMinutes',\r\n 'premarketLengthMinutes',\r\n 'aftermarketLengthMinutes',\r\n 'aftermarket',\r\n 'premarket',\r\n 'events',\r\n 'hasPatterns',\r\n 'patterns',\r\n 'patternsMinRange',\r\n 'patternsMaxRange',\r\n 'relativeVolume',\r\n 'fetchedAt',\r\n 'isIntraday',\r\n 'interval',\r\n 'drawDays',\r\n 'barIndex',\r\n 'barToDataIndex',\r\n 'fetchingPromise',\r\n 'isFetching',\r\n 'wasFetchAborted',\r\n 'chartUuid',\r\n 'numberOfRefreshChecks',\r\n 'maxBars',\r\n 'ideaID',\r\n 'is404'\r\n )\r\n }\r\n\r\n static async get({\r\n ticker: tickerRaw,\r\n instrument,\r\n timeframe,\r\n options,\r\n abortController,\r\n shouldUseCache = true,\r\n chartUuid,\r\n }: QuoteGetParams): Promise {\r\n const ticker = tickerRaw.replace('@', '')\r\n const [quote] = shouldUseCache\r\n ? Quote.select(\r\n (q) =>\r\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\r\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\r\n isNotEmptyQuote(q) &&\r\n isCacheAllowed({ quote: q, options }) &&\r\n (q.instrument !== Instrument.Stock ||\r\n Number.isInteger(q.ideaID) ||\r\n doesQuoteAndOptionsMatch({ quote: q, options }))\r\n )\r\n : []\r\n\r\n if (quote) {\r\n if (quote.isFetching) {\r\n await quote.getResolvedFetchingPromise()\r\n } else if (options?.fetchNewDataOnCachedQuote) {\r\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController })\r\n }\r\n return quote\r\n }\r\n\r\n const newQuote = Quote.create({\r\n ...emptyQuote,\r\n ticker,\r\n timeframe,\r\n instrument,\r\n chartUuid,\r\n maxBars: options?.maxBars,\r\n premarket: !!options?.premarket,\r\n aftermarket: !!options?.aftermarket,\r\n hasPatterns: !!options?.patterns,\r\n events: !!options?.events,\r\n })\r\n\r\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController })\r\n\r\n return newQuote\r\n }\r\n\r\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\r\n // TODO: fetch in 1 request\r\n if (tickersAndTimeframes.length === 0) {\r\n return {}\r\n }\r\n\r\n try {\r\n await Promise.all(\r\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n this.get({ ticker: ticker, instrument, timeframe })\r\n )\r\n )\r\n const data = tickersAndTimeframes.reduce(\r\n (accumulator, currentValue) => ({\r\n ...accumulator,\r\n [currentValue.ticker]: Quote.select(\r\n (q: Quote) =>\r\n q.ticker === currentValue.ticker &&\r\n q.instrument === currentValue.instrument &&\r\n q.timeframe === currentValue.timeframe\r\n )[0],\r\n }),\r\n {}\r\n )\r\n return data\r\n } catch (err) {\r\n // TODO: handle somehow\r\n }\r\n }\r\n\r\n declare ticker: string\r\n declare name: string\r\n declare instrument: Instrument\r\n declare interval: number\r\n declare timeframe: TIMEFRAME\r\n declare open: number[]\r\n declare high: number[]\r\n declare low: number[]\r\n declare close: number[]\r\n declare date: number[]\r\n declare volume: number[]\r\n declare lastOpen: number\r\n declare lastHigh: number\r\n declare lastLow: number\r\n declare lastClose: number\r\n declare lastDate: number\r\n declare lastVolume: number\r\n declare dataId: string\r\n declare prevClose: number\r\n declare COTs: COTData\r\n declare afterClose: number\r\n declare afterChange: number\r\n declare drawMinutesPerDay: number\r\n declare marketStartMinutes: number\r\n declare premarketLengthMinutes: number\r\n declare aftermarketLengthMinutes: number\r\n declare hasPatterns: boolean\r\n declare patterns: Array\r\n declare patternsMinRange: number\r\n declare patternsMaxRange: number\r\n declare relativeVolume: number\r\n declare isIntraday: boolean\r\n declare drawDays?: number\r\n declare barIndex: number[]\r\n /**\r\n * Array of length the same as number of bars\r\n *\r\n * If there's a gap and a bar index has no corresponding data index,\r\n * the last data index is used (or 0 if there's no last data index)\r\n *\r\n * @type {number[]}\r\n */\r\n declare barToDataIndex: number[]\r\n declare chartUuid?: string\r\n declare aftermarket: boolean\r\n declare premarket: boolean\r\n declare fetchedAt: number\r\n declare numberOfRefreshChecks: number\r\n declare isFetching: boolean\r\n declare fetchingPromise?: Promise\r\n declare wasFetchAborted: boolean\r\n declare maxBars?: number\r\n declare ideaID?: number\r\n declare is404?: boolean\r\n declare chartEvents: Array\r\n declare events?: boolean\r\n\r\n async fetchRequest({\r\n abortController,\r\n options = { type: QuoteFetchTypeUrlOption.New },\r\n }: {\r\n abortController?: null | AbortController\r\n options?: QuoteUrlOptions\r\n }) {\r\n let data: DataResponse | null = null\r\n let is404 = false\r\n let wasFetchAborted = false\r\n\r\n const fetchingPromise = fetchApi({\r\n location: this.getUrl(options),\r\n throwOnStatusCodes: [404],\r\n abortController,\r\n })\r\n\r\n this.updateAttributes({\r\n isFetching: true,\r\n fetchingPromise,\r\n })\r\n\r\n try {\r\n data = await fetchingPromise\r\n } catch (err) {\r\n if (getIsAbortError(err as Error)) {\r\n wasFetchAborted = true\r\n } else if (process.env.IS_E2E_TESTING) {\r\n throw new Error('Quote fetch error', { cause: err })\r\n }\r\n is404 = err instanceof NotFoundError\r\n // Ignore network/notfound errors\r\n }\r\n\r\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\r\n\r\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\r\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\r\n }\r\n\r\n this.updateAttributes({\r\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\r\n is404,\r\n wasFetchAborted,\r\n isFetching: false,\r\n })\r\n\r\n return data\r\n }\r\n\r\n async isPossibleToFetchSequentialData({\r\n abortController,\r\n }: {\r\n abortController?: null | AbortController\r\n } = {}) {\r\n const data = await this.fetchRequest({ abortController })\r\n if (data && data.date.length > 0 && this.date.length > 0) {\r\n return this.date[this.date.length - 1] >= data.date[0]\r\n }\r\n return false\r\n }\r\n\r\n async fetchData({\r\n fetchType,\r\n abortController,\r\n }: {\r\n fetchType: QuoteFetchType\r\n abortController?: null | AbortController\r\n }) {\r\n let options: QuoteUrlOptions\r\n if (fetchType === QuoteFetchType.Refetch) {\r\n options = { type: QuoteFetchTypeUrlOption.New }\r\n } else if (fetchType === QuoteFetchType.NewerData) {\r\n options = { type: QuoteFetchTypeUrlOption.Newer }\r\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\r\n options.dataId = this.dataId\r\n }\r\n } else {\r\n return\r\n }\r\n if (this.instrument === Instrument.Stock) {\r\n options.events = this.events == null ? true : this.events\r\n }\r\n\r\n const data = await this.fetchRequest({ abortController, options })\r\n\r\n if (!data || data.noNewData === true) {\r\n this.updateAttributes({\r\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\r\n })\r\n return\r\n }\r\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\r\n return\r\n }\r\n\r\n const newQuoteData = {\r\n COTs: data.COTs,\r\n name: data.name,\r\n open: data.open,\r\n high: data.high,\r\n low: data.low,\r\n close: data.close,\r\n volume: data.volume,\r\n date: data.date,\r\n drawMinutesPerDay: data.drawMinutesPerDay,\r\n marketStartMinutes: data.marketStartMinutes,\r\n premarketLengthMinutes: data.premarketLengthMinutes,\r\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\r\n patterns: data.patterns ?? [],\r\n patternsMinRange: data.patternsMinRange,\r\n patternsMaxRange: data.patternsMaxRange,\r\n relativeVolume: data.relativeVolume,\r\n lastOpen: data.lastOpen,\r\n lastHigh: data.lastHigh,\r\n lastLow: data.lastLow,\r\n lastClose: data.lastClose,\r\n lastVolume: data.lastVolume,\r\n dataId: data.dataId,\r\n lastDate: data.lastDate,\r\n lastTime: data.lastTime,\r\n prevClose: data.prevClose,\r\n afterClose: data.afterClose,\r\n afterChange: data.afterChange,\r\n afterTime: data.afterTime,\r\n numberOfRefreshChecks: 0,\r\n chartEvents: data.chartEvents ?? [],\r\n fetchedAt: Date.now(),\r\n }\r\n\r\n if (\r\n !(\r\n fetchType === QuoteFetchType.Refetch ||\r\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\r\n )\r\n ) {\r\n /*\r\n * Merges current and new data taking date as index\r\n */\r\n let AIndex = 0\r\n let BIndex = 0\r\n let mergeIndex = -1\r\n while (AIndex < this.date.length || BIndex < data.date.length) {\r\n const ADate = this.date[AIndex]\r\n const BDate = data.date[BIndex]\r\n if (BDate === undefined) {\r\n break\r\n } else if (ADate === BDate) {\r\n // Same date, update OHLCV\r\n this.open[AIndex] = data.open[BIndex]\r\n this.high[AIndex] = data.high[BIndex]\r\n this.low[AIndex] = data.low[BIndex]\r\n this.close[AIndex] = data.close[BIndex]\r\n this.volume[AIndex] = data.volume[BIndex]\r\n AIndex++\r\n BIndex++\r\n } else if (ADate > BDate || ADate === undefined) {\r\n // New bar for a date not yet in our dataset\r\n // If weekly or monthly timeframe & wasn't merged on AIndex\r\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\r\n const prevAIndex = AIndex - 1\r\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\r\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\r\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\r\n if (\r\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\r\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\r\n ) {\r\n this.date[prevAIndex] = data.date[BIndex]\r\n this.open[prevAIndex] = data.open[BIndex]\r\n this.high[prevAIndex] = data.high[BIndex]\r\n this.low[prevAIndex] = data.low[BIndex]\r\n this.close[prevAIndex] = data.close[BIndex]\r\n this.volume[prevAIndex] = data.volume[BIndex]\r\n mergeIndex = prevAIndex\r\n // Incrementing BIndex only because we're mergin arrays on AIndex\r\n BIndex++\r\n continue\r\n }\r\n }\r\n this.date.splice(AIndex, 0, data.date[BIndex])\r\n this.open.splice(AIndex, 0, data.open[BIndex])\r\n this.high.splice(AIndex, 0, data.high[BIndex])\r\n this.low.splice(AIndex, 0, data.low[BIndex])\r\n this.close.splice(AIndex, 0, data.close[BIndex])\r\n this.volume.splice(AIndex, 0, data.volume[BIndex])\r\n // Incrementing AIndex because we're changing the array in-place\r\n AIndex++\r\n BIndex++\r\n } else if (ADate < BDate) {\r\n AIndex++\r\n } else {\r\n console.warn('fetchNewerData merge warning')\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\r\n extra: {\r\n thisDateLength: this.date.length,\r\n dataDateLength: data.date.length,\r\n AIndex,\r\n BIndex,\r\n ADate,\r\n BDate,\r\n },\r\n })\r\n }\r\n }\r\n\r\n newQuoteData.date = this.date\r\n newQuoteData.open = this.open\r\n newQuoteData.high = this.high\r\n newQuoteData.low = this.low\r\n newQuoteData.close = this.close\r\n newQuoteData.volume = this.volume\r\n }\r\n\r\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\r\n // https://github.com/finvizhq/charts/issues/510\r\n if (!hasUpdatedSuccessfully) {\r\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\r\n }\r\n if (!this) {\r\n // or this somehow became null / falsy\r\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\r\n }\r\n this.trigger(fetchType, this, fetchType)\r\n }\r\n\r\n async getResolvedFetchingPromise() {\r\n try {\r\n return await this.fetchingPromise\r\n } catch {\r\n // do nothing\r\n }\r\n }\r\n\r\n fetchOlderData() {\r\n return // not yet implemented\r\n // TODO cancel previous request\r\n }\r\n\r\n load(atts: ObjectHash) {\r\n super.load(atts)\r\n const { fetchedAt = 0 } = atts\r\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\r\n if (this.timeframe && cachedAt !== fetchedAt) {\r\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\r\n this.isIntraday = [\r\n TIMEFRAME.i1,\r\n TIMEFRAME.i2,\r\n TIMEFRAME.i3,\r\n TIMEFRAME.i5,\r\n TIMEFRAME.i10,\r\n TIMEFRAME.i15,\r\n TIMEFRAME.i30,\r\n TIMEFRAME.h,\r\n TIMEFRAME.h2,\r\n TIMEFRAME.h4,\r\n ].includes(this.timeframe)\r\n this.interval = this.isIntraday\r\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\r\n : 0\r\n this.drawDays = this.getDrawDays()\r\n this.barIndex = this.getBarIndexes()\r\n this.patterns = this.patterns ?? []\r\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\r\n const lastIndex = this.barIndex[index - 1] ?? -1\r\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\r\n })\r\n }\r\n if (this.timeframe && this.ticker) {\r\n this.chartEvents = getChartEventsWithId({\r\n ticker: this.ticker,\r\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\r\n })\r\n }\r\n return this\r\n }\r\n\r\n destroy(options?: ObjectHash) {\r\n super.destroy(options)\r\n deleteCachedQuote({ cid: this.cid })\r\n return this\r\n }\r\n\r\n getDrawDays() {\r\n if (this.instrument !== Instrument.Stock) {\r\n return Infinity\r\n }\r\n switch (this.timeframe) {\r\n case TIMEFRAME.i1:\r\n case TIMEFRAME.i2:\r\n case TIMEFRAME.i3:\r\n case TIMEFRAME.i5:\r\n case TIMEFRAME.i10:\r\n return 10\r\n case TIMEFRAME.i15:\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n case TIMEFRAME.h4:\r\n return 15\r\n default:\r\n break\r\n }\r\n }\r\n\r\n getHeikinAshiData() {\r\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\r\n if (cachedHeikinAshiData) {\r\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\r\n }\r\n\r\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\r\n const HAOpen = this.open.reduce(\r\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\r\n [] as number[]\r\n )\r\n\r\n const heikAshiData = { open: HAOpen, close: HAClose }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\r\n\r\n return heikAshiData\r\n }\r\n\r\n getDayToOffset(): ObjectHash {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as ObjectHash\r\n }\r\n const dayToOffset: ObjectHash = {}\r\n let day = 0\r\n let lastDay\r\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n const dateString = dateStringFromDate(date)\r\n if (dateString !== lastDay) {\r\n dayToOffset[dateString] = day\r\n day++\r\n lastDay = dateString\r\n }\r\n }\r\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\r\n // premarket=false in fetch query there isn't other way to distinguish that\r\n if (getIsSSr() && this.lastDate) {\r\n // YYYYMMDD / 20211118 => YYYY-MM-DD\r\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\r\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\r\n\r\n if (lastDay !== lastDate) {\r\n dayToOffset[lastDate] = day\r\n }\r\n }\r\n\r\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\r\n return dayToOffset\r\n }\r\n\r\n getDaysInQuote() {\r\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\r\n if (cachedDayToOffset) {\r\n return cachedDayToOffset as unknown as Date[]\r\n }\r\n const dayToOffset = this.getDayToOffset()\r\n const daysInQuote = Object.keys(dayToOffset)\r\n .map((dateString) => {\r\n const [year, month, day] = dateString.split('-')\r\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\r\n })\r\n .sort((a, b) => a.getTime() - b.getTime())\r\n\r\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\r\n return daysInQuote\r\n }\r\n\r\n getBarIndexes() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return Array.from({ length: this.date.length }).map((_, index) => index)\r\n }\r\n\r\n const barIndex = []\r\n const dayToOffset = this.getDayToOffset()\r\n\r\n for (let i = 0; i < this.date.length; i += 1) {\r\n const date = dateFromUnixTimestamp(this.date[i])\r\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\r\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\r\n barIndex[i] = x\r\n }\r\n\r\n return barIndex\r\n }\r\n\r\n getBarIndex(i: number) {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return i\r\n }\r\n return this.barIndex[i]\r\n }\r\n\r\n getBarsInDay() {\r\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\r\n return\r\n }\r\n return Math.ceil(this.drawMinutesPerDay / this.interval)\r\n }\r\n\r\n getDataIndexByBarIndex(index: number) {\r\n if (this.barIndex) {\r\n for (let i = 0; i < this.barIndex.length; i++) {\r\n if (this.barIndex[i] === index) {\r\n return i\r\n }\r\n }\r\n }\r\n return -1\r\n }\r\n\r\n getDataByBarIndex(key: keyof Quote, index: number) {\r\n const dataIndex = this.getDataIndexByBarIndex(index)\r\n if (dataIndex > -1) {\r\n const quoteData = this[key as keyof Quote]! as number[]\r\n return quoteData[dataIndex] ?? null\r\n }\r\n return null\r\n }\r\n\r\n getDateToIndex() {\r\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\r\n if (cachedDateToIndex) {\r\n return cachedDateToIndex as unknown as ObjectHash\r\n }\r\n const dateToIndex: ObjectHash = {}\r\n for (let i = 0; i < this.date.length; i++) {\r\n dateToIndex[this.date[i]] = i\r\n }\r\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\r\n return dateToIndex\r\n }\r\n\r\n getTimestampFomPositionX(positionX: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getTimestampFromPositionX({\r\n positionX,\r\n quote: this,\r\n })\r\n }\r\n\r\n getPositionXFromTimestamp(timestamp: number) {\r\n if (this.date.length === 0) {\r\n return 0\r\n }\r\n return getPositionXFromTimestamp({\r\n timestamp,\r\n quote: this,\r\n })\r\n }\r\n\r\n getUrl(options: QuoteUrlOptions) {\r\n const config: UrlOptions = {\r\n ticker: this.ticker,\r\n instrument: this.instrument,\r\n timeframe: this.timeframe || 'd1',\r\n aftermarket: this.aftermarket,\r\n premarket: this.premarket,\r\n patterns: this.hasPatterns,\r\n maxBars: this.maxBars,\r\n ...options,\r\n }\r\n\r\n const isStock = config.instrument === Instrument.Stock\r\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\r\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\r\n\r\n if (getIsSSr()) {\r\n domain = process.env.BE_API_URL!\r\n }\r\n\r\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\r\n }\r\n\r\n getRawTicker() {\r\n return getRawTickerForInstrument(this.instrument, this.ticker)\r\n }\r\n\r\n clearData() {\r\n this.updateAttributes(emptyQuote)\r\n }\r\n}\r\n\r\nQuote.initClass()\r\n\r\nexport default Quote\r\n","export enum QuoteFetchType {\r\n Refetch = 'refetch',\r\n NewerData = 'newerData',\r\n}\r\n\r\nexport enum QuoteFetchTypeUrlOption {\r\n New = 'new',\r\n Newer = 'newer',\r\n}\r\n\r\nexport interface QuoteUrlOptions {\r\n type: QuoteFetchTypeUrlOption\r\n dataId?: string\r\n events?: boolean\r\n}\r\n","export const largeChartFontSize = {\r\n S: 8,\r\n M: 10,\r\n XXL: 16,\r\n XXXL: 24,\r\n}\r\n","import { Theme } from '../../../types/shared'\r\nimport {\r\n CHART_MARGIN,\r\n FONT_SIZE,\r\n LINE_HEIGHT,\r\n OFFSET,\r\n PADDING,\r\n SETTINGS_HEIGHT,\r\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n TextBaseline,\r\n} from '../../constants/common'\r\nimport {\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n generalColors,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from '../constants'\r\nimport { ISettings } from './interfaces'\r\n\r\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\r\n ChartSettings: {\r\n general: {\r\n Colors: {\r\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\r\n [Theme.light]: chartLightTheme,\r\n [Theme.dark]: chartDarkTheme,\r\n },\r\n settingsHeight: SETTINGS_HEIGHT,\r\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.XL,\r\n baseline: TextBaseline.alphabetic,\r\n ticker: {\r\n margin: {\r\n top: 30,\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.XXXL,\r\n style: 'bold',\r\n },\r\n },\r\n ohlc: {\r\n margin: {\r\n top: 30,\r\n left: 30,\r\n right: 30,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n change: {\r\n margin: {\r\n top: 30,\r\n right: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n },\r\n },\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.M,\r\n baseline: TextBaseline.top,\r\n axis: {\r\n margin: {\r\n top: 8,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n overlayLabel: {\r\n labelSpacing: 12,\r\n margin: {\r\n top: -8,\r\n left: 6,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n weight: 'bold',\r\n },\r\n },\r\n timeframe: {\r\n margin: {\r\n top: 0,\r\n left: 28,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n weight: '900',\r\n family: 'Lato, sans-serif',\r\n },\r\n },\r\n volumeAxis: {\r\n margin: {\r\n left: 33,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n },\r\n },\r\n },\r\n },\r\n IndicatorSettings: {\r\n general: {\r\n height: 140,\r\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 2,\r\n border: 1,\r\n },\r\n top: {\r\n height: CHART_MARGIN.S,\r\n },\r\n right: {\r\n width: CHART_MARGIN.XXL,\r\n axis: {\r\n margin: {\r\n left: 0,\r\n },\r\n font: {\r\n size: FONT_SIZE.S,\r\n lineHeight: LINE_HEIGHT.S,\r\n padding: {\r\n top: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n right: PADDING.XXS,\r\n },\r\n },\r\n },\r\n },\r\n bottom: {\r\n height: CHART_MARGIN.S,\r\n },\r\n left: {\r\n width: CHART_MARGIN.L,\r\n indicatorLabel: {\r\n labelSpacing: 4,\r\n margin: {\r\n top: OFFSET.S,\r\n left: OFFSET.M,\r\n },\r\n font: {\r\n size: FONT_SIZE.M,\r\n style: 'bold',\r\n lineHeight: LINE_HEIGHT.M,\r\n },\r\n },\r\n },\r\n },\r\n MarketSentimentSettings: {\r\n general: {\r\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\r\n },\r\n center: {\r\n barWidth: 3,\r\n barMargin: 1,\r\n border: 1,\r\n },\r\n top: {\r\n height: 0,\r\n },\r\n bottom: {\r\n height: 12,\r\n },\r\n left: {\r\n width: 0,\r\n },\r\n right: {\r\n width: 30,\r\n },\r\n },\r\n ColorsSettings: generalColors,\r\n ThumbSettings: {\r\n size: 8,\r\n touchSize: 16,\r\n color: '#ddd',\r\n borderWidth: 1,\r\n borderColor: '#999',\r\n },\r\n ElementSettings: {\r\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\r\n defaultFill: '#1e6dc066',\r\n defaultTransparentFill: '#1e6dc000',\r\n },\r\n})\r\n","import merge from 'lodash.merge'\r\n\r\nimport { ChartConfigChart } from '../../server/chartConfig'\r\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\r\nimport { SpecificChartFunctionality } from '../constants/common'\r\nimport Utils, { isRedesignedPage } from '../utils'\r\nimport LayoutModel from './chart_layout'\r\nimport { getColorOverwrites } from './chart_settings'\r\nimport { largeChartFontSize } from './chart_settings/constants'\r\nimport { INTERACTIVE_CHART_SETTINGS } from './chart_settings/interactive_chart_settings'\r\nimport { ISettings } from './chart_settings/interfaces'\r\nimport {\r\n IChartThemeColors,\r\n chartDarkTheme,\r\n chartLightTheme,\r\n elementDarkTheme,\r\n elementLightTheme,\r\n indicatorDarkTheme,\r\n indicatorLightTheme,\r\n} from './constants'\r\n\r\ninterface Config {\r\n theme: Theme\r\n barMargin?: number\r\n barWidth?: number\r\n border?: number\r\n charts?: ChartConfigChart[]\r\n colorsOverride?: Array\r\n volumeHeight?: number\r\n colors?: ObjectHash, Theme>\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n isOurSiteRequest?: boolean\r\n}\r\n\r\nexport function getSettings(config: Config, chartSettings?: ISettings): ISettings {\r\n const settings = merge({}, chartSettings ?? INTERACTIVE_CHART_SETTINGS(config.theme))\r\n\r\n if (config.barWidth != null) {\r\n settings.ChartSettings.center.barWidth = config.barWidth\r\n settings.IndicatorSettings.center.barWidth = config.barWidth\r\n }\r\n if (config.barMargin != null) {\r\n settings.ChartSettings.center.barMargin = config.barMargin\r\n settings.IndicatorSettings.center.barMargin = config.barMargin\r\n }\r\n if (config.border != null) {\r\n settings.ChartSettings.center.border = config.border\r\n settings.IndicatorSettings.center.border = config.border\r\n }\r\n if (config.colorsOverride) {\r\n settings.ColorsSettings = config.colorsOverride\r\n }\r\n if (config.volumeHeight) {\r\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\r\n }\r\n if (config.colors) {\r\n const settingColors = settings.ChartSettings.general.Colors\r\n settings.ChartSettings.general.Colors = {\r\n ...settingColors,\r\n [Theme.light]: {\r\n ...settingColors[Theme.light],\r\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\r\n },\r\n [Theme.dark]: {\r\n ...settingColors[Theme.dark],\r\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\r\n },\r\n }\r\n }\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\r\n settings.ChartSettings.left.width = 0\r\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\r\n settings.IndicatorSettings.left.width = 0\r\n }\r\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\r\n settings.ChartSettings.top.height = 10\r\n }\r\n\r\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\r\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\r\n if (isGroupInstrument) {\r\n settings.ChartSettings.top.ohlc.margin.top = 4\r\n settings.ChartSettings.top.ticker.margin.top = 0\r\n settings.ChartSettings.top.ticker.font = {\r\n size: largeChartFontSize.XXL,\r\n style: 'bold',\r\n }\r\n settings.ChartSettings.left.timeframe.margin.top = 12\r\n settings.ChartSettings.left.timeframe.font = {\r\n size: largeChartFontSize.S,\r\n style: 'bold',\r\n }\r\n }\r\n }\r\n\r\n if (config.isOurSiteRequest !== undefined) {\r\n settings.isOurSiteRequest = config.isOurSiteRequest\r\n }\r\n\r\n return settings\r\n}\r\n\r\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\r\n const settings = merge({}, chart_layout.settings)\r\n const isLight = theme === Theme.light\r\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\r\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\r\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\r\n\r\n return settings\r\n}\r\n\r\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\r\n const settings = chart_layout.settings\r\n\r\n return {\r\n ...settings,\r\n ChartSettings: {\r\n ...settings.ChartSettings,\r\n general: {\r\n ...settings.ChartSettings.general,\r\n Colors: {\r\n ...settings.ChartSettings.general.Colors,\r\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\r\n },\r\n },\r\n },\r\n }\r\n}\r\n","import { Instrument } from '../../types/shared'\r\nimport ChartLayoutModel from './chart_layout'\r\nimport Element from './element'\r\n\r\nexport const handleRemoveIndicatorPane = ({\r\n paneIndex,\r\n chartLayoutModel,\r\n}: {\r\n paneIndex: number\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const charts = chartLayoutModel.getAllCharts()\r\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\r\n}\r\n\r\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\r\n return (index + 1) * (isBelowZero ? -1 : 1)\r\n}\r\n\r\nexport function rebuildElementZIndexes({\r\n elementsArray,\r\n isBelowZero,\r\n}: {\r\n elementsArray: Element[]\r\n isBelowZero: boolean\r\n}) {\r\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n elements.forEach((element, index) => {\r\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\r\n if (newZIndex !== element.zIndex) {\r\n element.updateAttributes({ zIndex: newZIndex })\r\n }\r\n })\r\n}\r\n\r\nexport function changeElementZIndexes({\r\n elementsArray,\r\n addElement,\r\n oldZIndex,\r\n newZIndex,\r\n isBelowZero = false,\r\n}: {\r\n elementsArray: Element[]\r\n addElement: Element | undefined\r\n oldZIndex: number\r\n newZIndex: number\r\n isBelowZero?: boolean\r\n}) {\r\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\r\n const elements =\r\n elementsArray.length === 0 && addElement\r\n ? [...array, addElement]\r\n : array\r\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\r\n .flatMap((el, index) =>\r\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\r\n )\r\n\r\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\r\n if (elements.length < Math.abs(newZIndex) && addElement) {\r\n elements.push(addElement)\r\n }\r\n\r\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\r\n}\r\n\r\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\r\n return `${\r\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\r\n }${ticker}`\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n deviations: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n stdDev: number[]\r\n upperBand: number[]\r\n lowerBand: number[]\r\n}\r\n\r\nexport class BbCalculation extends MainCalculation {\r\n static type = OverlayType.Bb\r\n\r\n getDefaultCalculatedValues() {\r\n return {\r\n sma: [],\r\n stdDev: [],\r\n upperBand: [],\r\n lowerBand: [],\r\n }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { period, deviations } = this.options\r\n const { close } = this.quote\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = period; i < close.length; i++) {\r\n sum = sum - close[i - period] + close[i]\r\n this.calculatedValues.sma[i] = sum / period\r\n\r\n let stdDevSum = 0\r\n for (let j = i - period + 1; j <= i; j++) {\r\n stdDevSum += Math.pow(close[j] - this.calculatedValues.sma[i], 2)\r\n }\r\n this.calculatedValues.stdDev[i] = Math.sqrt(stdDevSum / period)\r\n\r\n this.calculatedValues.upperBand[i] = this.calculatedValues.sma[i] + this.calculatedValues.stdDev[i] * deviations\r\n this.calculatedValues.lowerBand[i] = this.calculatedValues.sma[i] - this.calculatedValues.stdDev[i] * deviations\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n ChartConfigChartPaneElement,\r\n IModalConfig,\r\n IModalConfigInput,\r\n ObjectHash,\r\n RequireByKey,\r\n} from '../../types/shared'\r\nimport Element from '../canvas/element'\r\nimport BaseChart from '../charts/base_chart'\r\nimport { OverlayType } from '../constants/common'\r\nimport Quote from '../models/quote'\r\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\r\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\r\n\r\nexport interface IOverlayIsValid {\r\n getIsValid(key: string): boolean | void\r\n}\r\n\r\nconst DEFAULT_LABEL_COLOR = '#0587cd'\r\n\r\nclass Overlay extends Element implements IOverlayIsValid {\r\n static type = OverlayType.Overlay\r\n static label = 'Overlay'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = getParsedIntegersFromPeriodString(period)\r\n return periodInt\r\n }\r\n\r\n declare data: Quote\r\n declare chart: BaseChart\r\n\r\n get type() {\r\n return (this.constructor as typeof Overlay).type\r\n }\r\n\r\n get label() {\r\n return (this.constructor as typeof Overlay).label\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\r\n }\r\n\r\n getFreeColor() {\r\n return this.getChartLayoutSettings().ColorsSettings[0]\r\n // TODO proper implementation - example how this could be done:\r\n // let colorsUsed = []\r\n // for (let overlay of this.chart.overlays) {\r\n // let object = overlay.getModalConfig().inputs\r\n // for (let _ in object) {\r\n // let input = object[_]\r\n // if (input.type === 'color') {\r\n // colorsUsed.push(input.value)\r\n // }\r\n // }\r\n // }\r\n // for (let color of colors) {\r\n // if (!colorsUsed.includes(color)) {\r\n // return color\r\n // }\r\n // }\r\n // return colors[0]\r\n }\r\n\r\n renderContent(_?: RenderingContext2DType) {\r\n this.data = this.model.chart().quote()\r\n }\r\n\r\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\r\n\r\n getIsValid(_: string): boolean | undefined {\r\n throw Error('Implement')\r\n }\r\n\r\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\r\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\r\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\r\n }\r\n\r\n isRendered() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n getModalConfig(): IModalConfig {\r\n return {\r\n title: '',\r\n inputs: [],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n toConfig() {\r\n const colors: string[] = []\r\n const periods: string[] = []\r\n\r\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\r\n if (input.type === 'color') {\r\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\r\n } else {\r\n periods.push(input.value.toString())\r\n }\r\n })\r\n\r\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\r\n }\r\n}\r\n\r\nexport default Overlay\r\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { BbCalculation } from '../indicator-calculation/bb'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst BB_COLORS = {\r\n [Theme.light]: {\r\n TOP: '#D386DF',\r\n BOTTOM: '#69C1EA',\r\n MIDDLE: '#CFD2F2',\r\n },\r\n [Theme.dark]: {\r\n TOP: '#D38BFB',\r\n BOTTOM: '#57AEFB',\r\n MIDDLE: '#E1B6FC',\r\n },\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Deviations: 2.0,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n deviations: number\r\n topColor?: string\r\n bottomColor?: string\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\r\n\r\n return [period, deviations]\r\n}\r\n\r\nclass BollingerBands extends Overlay {\r\n static type = OverlayType.Bb\r\n static label = 'Bollinger Bands'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, deviations] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.deviations = deviations\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n const { leftOffset, width } = this.model.chart()\r\n const [top, bottom] = this.model.scale.y.domain()\r\n const scaledTop = this.fy(top)\r\n const scaledBottom = this.fy(bottom)\r\n const { close } = this.data\r\n const period = Math.min(this.attrs.period, close.length - 1)\r\n\r\n let firstBarToRender: number | undefined\r\n let lastBarToRender = 0\r\n\r\n // middle line && find first & last bar to render\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\r\n\r\n const bbCalculation = new BbCalculation({\r\n quote: this.data,\r\n options: {\r\n period,\r\n deviations: this.attrs.deviations,\r\n },\r\n })\r\n\r\n bbCalculation.calculate(({ sma }, dataIndex) => {\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = dataIndex\r\n\r\n context.lineTo(this.fx(dataIndex), Math.round(this.fy(sma[dataIndex])))\r\n\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n lastBarToRender = dataIndex\r\n })\r\n\r\n if (firstBarToRender === undefined) return\r\n context.stroke()\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n\r\n // top line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledTop)\r\n context.set('strokeStyle', BB_COLORS[theme].TOP)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.upperBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledTop)\r\n context.fill()\r\n\r\n // bottom line\r\n context.beginPath()\r\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\r\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n context.lineTo(this.fx(i), Math.round(this.fy(bbCalculation.calculatedValues.lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\r\n context.fill()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const deviations = {\r\n type: 'number',\r\n label: 'Deviations',\r\n name: 'deviations',\r\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\r\n required: true,\r\n min: 0.1,\r\n max: 999,\r\n step: 0.1,\r\n }\r\n const topColor = {\r\n type: 'color',\r\n label: 'Top Color',\r\n name: 'topColor',\r\n value: this.attrs.topColor ?? this.getFreeColor(),\r\n }\r\n const bottomColor = {\r\n type: 'color',\r\n label: 'Bottom Color',\r\n name: 'bottomColor',\r\n value: this.attrs.bottomColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, deviations, topColor, bottomColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'deviations':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'topColor':\r\n case 'bottomColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n const theme = this.model.chart().chart_layout().theme as Theme\r\n return this.attrs.topColor || BB_COLORS[theme].TOP\r\n }\r\n\r\n toString() {\r\n return `BB ${this.attrs.period},${this.attrs.deviations}`\r\n }\r\n}\r\n\r\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\r\n\r\nexport default BollingerBands\r\n","import { OverlayType } from '../constants/common'\r\nimport utils from '../utils'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n channelStrokeColor: string\r\n channelFillColor: string\r\n medianBandColor: string\r\n}\r\n\r\nconst DEFAULT_PERIOD = 20\r\n\r\nconst COLORS = {\r\n ChannelStroke: '#69c1ea',\r\n ChannelFill: '#69C1EA12',\r\n MedianBandStroke: '#ffa75f',\r\n}\r\n\r\nclass DonchianChannels extends Overlay {\r\n static type = OverlayType.Dch\r\n static label = 'Donchian Channels'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period } = this.attrs\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const medianBand: number[] = []\r\n let firstBarToRender = -1\r\n let lastBarToRender = 0\r\n if (this.data.close.length === undefined) {\r\n return\r\n }\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', COLORS.ChannelStroke)\r\n context.set('fillStyle', COLORS.ChannelFill)\r\n\r\n //upper band + clip\r\n context.beginPath()\r\n drawInVisibleArea({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n width,\r\n drawBarCallback: (i, x) => {\r\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\r\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\r\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\r\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n },\r\n })\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // lower band + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // median band\r\n context.set('strokeStyle', COLORS.MedianBandStroke)\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PERIOD,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Channels Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Channels Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\r\n }\r\n const medianBandColor = {\r\n type: 'color',\r\n label: 'Median Band Color',\r\n name: 'medianBandColor',\r\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, medianBandColor, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'medianBandColor':\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.medianBandColor\r\n }\r\n\r\n toString() {\r\n return `Donchian ${this.attrs.period}`\r\n }\r\n}\r\n\r\nDonchianChannels.prototype.defaults = {\r\n medianBandColor: COLORS.MedianBandStroke,\r\n channelStrokeColor: COLORS.ChannelStroke,\r\n channelFillColor: COLORS.ChannelFill,\r\n}\r\n\r\nexport default DonchianChannels\r\n","import { OverlayType } from '../constants/common'\r\nimport { EMACalculation } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n deviations: number\r\n color: string\r\n}\r\n\r\nclass EMA extends Overlay {\r\n static type = OverlayType.Ema\r\n static label = 'Exponential Moving Average'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n const emaCalculation = new EMACalculation({\r\n quote: this.data,\r\n options: {\r\n period: this.attrs.period,\r\n },\r\n })\r\n emaCalculation.calculate(({ ema }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(ema[dataIndex])))\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `EMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nEMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default EMA\r\n","import { OverlayType } from '../constants/common'\r\nimport EMA from './ema'\r\n\r\nclass EMA2 extends EMA {\r\n static type = OverlayType.Ema2\r\n}\r\n\r\nEMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default EMA2\r\n","import { OverlayType } from '../constants/common'\r\nimport PaneModel from '../models/pane'\r\nimport { getBarWidthWithMargin } from '../utils/chart'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n lowColor: string\r\n highColor: string\r\n}\r\n\r\nclass HighLow extends Overlay {\r\n static type = OverlayType.Hilo\r\n static label = 'High/Low'\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.renderContent = this.renderContent.bind(this)\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const chartModel = this.model.chart()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const { Colors } = ChartSettings.general\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n const halfWidth = barWidth / 2\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n context.translate(0.5, 0.5)\r\n context.set('fillStyle', Colors.overlayTransparentBackground)\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.highColor)\r\n let prevHigh = -1\r\n for (let i = 0; i < this.data.close.length; i++) {\r\n let highestHigh = this.data.high[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.high[j] > highestHigh) {\r\n highestHigh = this.data.high[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < -10) {\r\n prevHigh = highestHigh\r\n continue\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n\r\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\r\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\r\n\r\n prevHigh = highestHigh\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n if (firstBarToRender === undefined) return\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\r\n context.fill()\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.lowColor)\r\n let prevLow = -1\r\n let prevBar = firstBarToRender\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n let lowestLow = this.data.low[i]\r\n for (let j = i - period + 1; j <= i; j++) {\r\n if (this.data.low[j] < lowestLow) {\r\n lowestLow = this.data.low[j]\r\n }\r\n }\r\n\r\n const x = this.fx(i)\r\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\r\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\r\n }\r\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\r\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\r\n\r\n prevLow = lowestLow\r\n prevBar = i\r\n }\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n\r\n // return to start and fill with background color\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\r\n context.fill()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 50,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const highColor = {\r\n type: 'color',\r\n label: 'High Color',\r\n name: 'highColor',\r\n value: this.attrs.highColor ?? this.getFreeColor(),\r\n }\r\n const lowColor = {\r\n type: 'color',\r\n label: 'Low Color',\r\n name: 'lowColor',\r\n value: this.attrs.lowColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, highColor, lowColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'highColor':\r\n case 'lowColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.highColor\r\n }\r\n\r\n toString() {\r\n return `HILO ${this.attrs.period}`\r\n }\r\n}\r\n\r\nHighLow.prototype.defaults = {\r\n lowColor: '#69c1ea',\r\n highColor: '#d386df',\r\n}\r\n\r\nexport default HighLow\r\n","import { OverlayType } from '../constants/common'\r\nimport { isPositiveFloat } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n price: number\r\n color: string\r\n}\r\n\r\nclass HorizontalLine extends Overlay {\r\n static type = OverlayType.Hline\r\n static label = 'Horizontal Line'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\r\n this.attrs.price = parseFloat(this.attrs.period)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const y = Math.round(this.fy(this.attrs.price))\r\n context.set('strokeStyle', this.attrs.color)\r\n context.translate(0, 0.5)\r\n context.beginPath()\r\n context.moveTo(-this.model.chart().leftOffset, y)\r\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\r\n context.stroke()\r\n context.translate(0, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const price = {\r\n type: 'number',\r\n label: 'Price',\r\n name: 'price',\r\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\r\n required: true,\r\n step: 0.1,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [price, color],\r\n inputsErrorMessages: {\r\n price: `${price.label} must be number`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'price':\r\n return isPositiveFloat(this.attrs[key])\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `HL ${this.attrs.price}`\r\n }\r\n}\r\n\r\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\r\n\r\nexport default HorizontalLine\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n conversion: number\r\n base: number\r\n spanB: number\r\n spanAStrokeColor: string\r\n spanAFillColor: string\r\n spanBStrokeColor: string\r\n spanBFillColor: string\r\n conversionLineColor: string\r\n baseLineColor: string\r\n laggingSpanColor: string\r\n}\r\n\r\nconst COLORS = {\r\n SpanA: {\r\n Stroke: '#009600',\r\n Fill: '#00960022',\r\n },\r\n SpanB: {\r\n Stroke: '#C80000',\r\n Fill: '#C8000022',\r\n },\r\n ConversionLine: '#69C1EA',\r\n BaseLine: '#E54040',\r\n LaggingSpan: '#FFA75F',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Conversion: 9,\r\n Base: 26,\r\n SpanB: 52,\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\r\n getParsedIntegersFromPeriodString(period)\r\n return [conversion, base, spanB]\r\n}\r\n\r\nclass IchimokuCloud extends Overlay {\r\n static type = OverlayType.Ic\r\n static label = 'Ichimoku Cloud'\r\n static renderFull = false\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period))\r\n }\r\n\r\n get renderFull() {\r\n return (this.constructor as typeof IchimokuCloud).renderFull\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\r\n ) {\r\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\r\n this.attrs.conversion = conversion\r\n this.attrs.base = base\r\n this.attrs.spanB = spanB\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { high, low, close } = this.data\r\n\r\n const {\r\n conversion,\r\n base,\r\n spanB,\r\n spanAFillColor,\r\n spanAStrokeColor,\r\n spanBFillColor,\r\n spanBStrokeColor,\r\n baseLineColor,\r\n conversionLineColor,\r\n laggingSpanColor,\r\n } = this.attrs\r\n\r\n const conversionLine: number[] = []\r\n const baseLine: number[] = []\r\n const senkouSpanA: number[] = []\r\n const senkouSpanB: number[] = []\r\n const conversionStartIndex = conversion - 1\r\n const baseStartIndex = base - 1\r\n const spanBIndex = spanB - 1\r\n const start = Math.min(baseStartIndex, conversionStartIndex)\r\n const end = close.length + baseStartIndex\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n // Calculation\r\n for (let i = start; i < end; i++) {\r\n if (i >= conversionStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\r\n conversionLine[i] = (highestHi + lowestLo) / 2\r\n }\r\n\r\n if (i >= baseStartIndex && i < close.length) {\r\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\r\n baseLine[i] = (highestHi + lowestLo) / 2\r\n\r\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n\r\n if (i >= spanBIndex) {\r\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\r\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\r\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\r\n }\r\n }\r\n\r\n let lastSpanAX = 0\r\n let lastSpanBX = 0\r\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\r\n\r\n const drawInVisibleAreaProps = {\r\n toIndexOffset: baseStartIndex,\r\n leftOffset,\r\n paneModel: this.model,\r\n quote: this.data,\r\n width,\r\n fxOverride: this.fx,\r\n }\r\n\r\n context.set('lineWidth', 1)\r\n context.translate(0.5, 0.5)\r\n context.save()\r\n // 1. Senkou Span A\r\n // 1.1 Stroke\r\n context.set('strokeStyle', spanAStrokeColor)\r\n context.set('fillStyle', spanAFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n lastSpanAX = x\r\n },\r\n })\r\n context.stroke()\r\n // 1.2 Clipping area\r\n context.lineTo(lastSpanAX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 1.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n lastSpanBX = x\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n\r\n // 2. Senkou Span B\r\n // 2.1 Stroke\r\n context.save()\r\n context.set('strokeStyle', spanBStrokeColor)\r\n context.set('fillStyle', spanBFillColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n if (i >= senkouSpanA.length) return\r\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\r\n },\r\n })\r\n context.stroke()\r\n // 2.2 Clipping area\r\n context.lineTo(lastSpanBX, context.canvas.height)\r\n context.lineTo(cloudStartingX, context.canvas.height)\r\n context.clip()\r\n // 2.3 Fill\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\r\n },\r\n })\r\n context.lineTo(lastSpanBX, 0)\r\n context.lineTo(cloudStartingX, 0)\r\n context.fill()\r\n context.restore()\r\n context.translate(-0.5, -0.5)\r\n\r\n if (this.renderFull) {\r\n // conversion line\r\n context.set('strokeStyle', conversionLineColor)\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // base line\r\n context.set('strokeStyle', baseLineColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\r\n },\r\n })\r\n context.stroke()\r\n\r\n // lagging span\r\n context.set('strokeStyle', laggingSpanColor)\r\n context.beginPath()\r\n drawInVisibleArea({\r\n ...drawInVisibleAreaProps,\r\n fxOverride: (x: number) => this.fx(x - base),\r\n drawBarCallback: (i, x) => {\r\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\r\n },\r\n })\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const conversion = {\r\n type: 'number',\r\n label: 'Conversion Line',\r\n name: 'conversion',\r\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const base = {\r\n type: 'number',\r\n label: 'Base Line Length',\r\n name: 'base',\r\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const spanB = {\r\n type: 'number',\r\n label: 'Leading Span B Length',\r\n name: 'spanB',\r\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const spanAStrokeColor = {\r\n type: 'color',\r\n label: 'Span A Stroke Color',\r\n name: 'spanAStrokeColor',\r\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanAFillColor = {\r\n type: 'color',\r\n label: 'Span A Fill Color',\r\n name: 'spanAFillColor',\r\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\r\n }\r\n const spanBStrokeColor = {\r\n type: 'color',\r\n label: 'Span B Stroke Color',\r\n name: 'spanBStrokeColor',\r\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\r\n }\r\n const spanBFillColor = {\r\n type: 'color',\r\n label: 'Span B Fill Color',\r\n name: 'spanBFillColor',\r\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\r\n }\r\n const conversionLineColor = {\r\n type: 'color',\r\n label: 'Conversion Line Color',\r\n name: 'conversionLineColor',\r\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\r\n }\r\n const baseLineColor = {\r\n type: 'color',\r\n label: 'Base Line Color',\r\n name: 'baseLineColor',\r\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\r\n }\r\n const laggingSpanColor = {\r\n type: 'color',\r\n label: 'Lagging Span Color',\r\n name: 'laggingSpanColor',\r\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [\r\n conversion,\r\n base,\r\n spanB,\r\n spanAStrokeColor,\r\n spanAFillColor,\r\n spanBStrokeColor,\r\n spanBFillColor,\r\n conversionLineColor,\r\n baseLineColor,\r\n laggingSpanColor,\r\n ],\r\n inputsErrorMessages: {\r\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\r\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\r\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'conversion':\r\n case 'base':\r\n case 'spanB':\r\n case 'lagging':\r\n return this.getIsNumberInputValid({ key })\r\n case 'spanAStrokeColor':\r\n case 'spanAFillColor':\r\n case 'spanBStrokeColor':\r\n case 'spanBFillColor':\r\n case 'conversionLineColor':\r\n case 'baseLineColor':\r\n case 'laggingSpanColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.spanAStrokeColor\r\n }\r\n\r\n toString() {\r\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\r\n }\r\n}\r\n\r\nIchimokuCloud.prototype.defaults = {\r\n spanAStrokeColor: COLORS.SpanA.Stroke,\r\n spanAFillColor: COLORS.SpanA.Fill,\r\n spanBStrokeColor: COLORS.SpanB.Stroke,\r\n spanBFillColor: COLORS.SpanB.Fill,\r\n conversionLineColor: COLORS.ConversionLine,\r\n baseLineColor: COLORS.BaseLine,\r\n laggingSpanColor: COLORS.LaggingSpan,\r\n}\r\n\r\nexport default IchimokuCloud\r\n","import { OverlayType } from '../constants/common'\r\nimport IchimokuCloud from './ic'\r\n\r\nclass IchimokuCloudFull extends IchimokuCloud {\r\n static type = OverlayType.Icf\r\n static label = 'Ichimoku Cloud (Full)'\r\n static renderFull = true\r\n}\r\n\r\nexport default IchimokuCloudFull\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport { ExponentialMovingAverage } from '../indicator-calculation/ema'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period?: string\r\n emaPeriod: number\r\n multiplier: number\r\n atrPeriod: number\r\n strokeColor: string\r\n fillColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n emaPeriod: 20,\r\n multiplier: 2.0,\r\n atrPeriod: 10,\r\n}\r\n\r\nconst COLORS = {\r\n Stroke: '#69C1EA',\r\n Fill: '#69C1EA33',\r\n}\r\n\r\nfunction parsePeriod(period: string) {\r\n const values = period.split(',')\r\n const emaPeriod = parseInt(values[0])\r\n const multiplier = parseFloat(values[1])\r\n const atrPeriod = parseInt(values[2])\r\n\r\n return [emaPeriod, multiplier, atrPeriod]\r\n}\r\n\r\nclass KeltnerChannel extends Overlay {\r\n static type = OverlayType.Kch\r\n static label = 'Keltner Channel'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n return Math.max(...parsePeriod(period)) * 2\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (\r\n typeof this.attrs.period === 'string' &&\r\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\r\n ) {\r\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\r\n this.attrs.emaPeriod = emaPeriod\r\n this.attrs.multiplier = multiplier\r\n this.attrs.atrPeriod = atrPeriod\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\r\n const ema = new ExponentialMovingAverage(emaPeriod)\r\n const atr = new AverageTrueRange(atrPeriod)\r\n const middleLine: number[] = []\r\n const upperBand: number[] = []\r\n const lowerBand: number[] = []\r\n const start = Math.max(emaPeriod, atrPeriod)\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.save()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', strokeColor)\r\n context.set('fillStyle', fillColor)\r\n\r\n //top line + clip\r\n context.beginPath()\r\n for (let i = 1; i < this.data.close.length; i++) {\r\n ema.add(this.data.close[i])\r\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\r\n if (i < start) {\r\n continue\r\n }\r\n\r\n const x = this.fx(i)\r\n if (this.fx(i + 1) + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n middleLine[i] = ema.value\r\n upperBand[i] = ema.value + multiplier * atr.value\r\n lowerBand[i] = ema.value - multiplier * atr.value\r\n\r\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\r\n lastBarToRender = i\r\n }\r\n if (firstBarToRender === undefined) {\r\n context.restore()\r\n return\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\r\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\r\n context.clip()\r\n\r\n // bottom line + fill\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\r\n }\r\n context.stroke()\r\n context.lineTo(this.fx(lastBarToRender), 0)\r\n context.lineTo(0, 0)\r\n context.fill()\r\n\r\n // middle line\r\n context.beginPath()\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\r\n }\r\n context.stroke()\r\n context.restore()\r\n }\r\n\r\n getModalConfig() {\r\n const emaPeriod = {\r\n type: 'number',\r\n label: 'EMA Period',\r\n name: 'emaPeriod',\r\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Multiplier',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const atrPeriod = {\r\n type: 'number',\r\n label: 'ATR Period',\r\n name: 'atrPeriod',\r\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n\r\n const strokeColor = {\r\n type: 'color',\r\n label: 'Stroke Color',\r\n name: 'strokeColor',\r\n value: this.attrs.strokeColor ?? this.getFreeColor(),\r\n }\r\n const fillColor = {\r\n type: 'color',\r\n label: 'Fill Color',\r\n name: 'fillColor',\r\n value: this.attrs.fillColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\r\n inputsErrorMessages: {\r\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'emaPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'atrPeriod':\r\n return this.getIsNumberInputValid({ key })\r\n case 'strokeColor':\r\n case 'fillColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.strokeColor\r\n }\r\n\r\n toString() {\r\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\r\n }\r\n}\r\n\r\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\r\n\r\nexport default KeltnerChannel\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\r\nclass None extends Overlay {\r\n static type = OverlayType.None\r\n static label = 'None'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n isRendered() {\r\n return false\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n}\r\n\r\nexport default None\r\n","import Text from '../canvas/text'\r\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\r\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\r\nimport Overlay from './overlay'\r\n\r\ntype aboveBelowType = 'above' | 'below'\r\n\r\nclass Patterns extends Overlay {\r\n static type = OverlayType.Patterns\r\n static label = 'Patterns (daily charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { ChartSettings } = this.getChartLayoutSettings()\r\n const data = this.data\r\n if (data.patterns.length === 0) {\r\n return\r\n }\r\n\r\n const originalScale = {\r\n width: 600,\r\n height: 300,\r\n barsInDay: Math.min(data.close.length, 200),\r\n high: data.patternsMaxRange,\r\n low: data.patternsMinRange,\r\n barWidth: 0,\r\n }\r\n originalScale.barWidth = originalScale.width / 200\r\n\r\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\r\n const fx = (x: number) => {\r\n if (x === 0) {\r\n return this.fx(0)\r\n }\r\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\r\n }\r\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\r\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\r\n const roundedXY = getRoundedObject({\r\n x1: fx(x1),\r\n y1: fy(y1),\r\n x2: fx(x2),\r\n y2: fy(y2),\r\n })\r\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\r\n context.translate(translateXY.x, translateXY.y)\r\n\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', color)\r\n context.lineTo(roundedXY.x1, roundedXY.y1)\r\n context.lineTo(roundedXY.x2, roundedXY.y2)\r\n context.stroke()\r\n\r\n context.translate(translateXY.x * -1, translateXY.y * -1)\r\n }\r\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx((x1 + x2) / 2),\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 8, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\r\n new Text(\r\n {\r\n x: fx(x1) + 5,\r\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\r\n font: { size: 9, style: 'bold' },\r\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\r\n fillStyle: color,\r\n textAlign: TextAlign.center,\r\n text,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n const above = (y: number) =>\r\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\r\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\r\n\r\n const supportColor = 'rgb(0, 150, 220)'\r\n const resistColor = 'rgb(180, 50, 200)'\r\n\r\n for (const pattern of data.patterns) {\r\n const { x1, x2, x3, y3 } = pattern\r\n let { y1, y2 } = pattern\r\n switch (pattern.kind) {\r\n case 1: // Horiz S/R\r\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\r\n break\r\n\r\n case 2: // tl resist\r\n line(resistColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 3: // tl support\r\n if (y1 === originalScale.height && y2 === originalScale.height) {\r\n y1 = y2 = originalScale.height - 1\r\n // Maybe just need to check on the new scale?\r\n } // support \"pod grafom\"\r\n line(supportColor, x1, y1, x2, y2)\r\n break\r\n\r\n case 12: // double top\r\n text('Double Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 13: // double bottom\r\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 14: // multi top\r\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\r\n break\r\n\r\n case 15: // multi bottom\r\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\r\n break\r\n\r\n case 16: // h&s top\r\n textHS('L', below(y1), resistColor, x1, y1)\r\n textHS('H', below(y2), resistColor, x2, y2)\r\n textHS('R', below(y3), resistColor, x3, y3)\r\n break\r\n\r\n case 17: // h&s bot\r\n textHS('L', above(y1), supportColor, x1, y1)\r\n textHS('H', above(y2), supportColor, x2, y2)\r\n textHS('R', above(y3), supportColor, x3, y3)\r\n break\r\n default:\r\n break\r\n }\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const supportColor = {\r\n type: 'color',\r\n label: 'Support Color',\r\n name: 'supportColor',\r\n value: this.attrs.supportColor ?? this.getFreeColor(),\r\n }\r\n const resistColor = {\r\n type: 'color',\r\n label: 'Resist Color',\r\n name: 'resistColor',\r\n value: this.attrs.resistColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [supportColor, resistColor],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid() {\r\n return true\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return false\r\n }\r\n\r\n toString() {\r\n return ''\r\n }\r\n}\r\n\r\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\r\n\r\nexport default Patterns\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { Instrument } from '../../types/shared'\r\nimport Text from '../canvas/text'\r\nimport { OverlayType, TIMEFRAME, TextBaseline } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport Utils from '../utils'\r\nimport { getBarWidthWithMargin, round } from '../utils/chart'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport Overlay from './overlay'\r\n\r\nenum Calculation {\r\n standard = 'Standard',\r\n fibonacci = 'Fibonacci',\r\n}\r\ntype CalculationType = keyof typeof Calculation\r\n\r\nenum PivotPeriod {\r\n day,\r\n week,\r\n month,\r\n year,\r\n}\r\n\r\ntype PivotPointType = {\r\n pivot: number\r\n res1: number\r\n res2: number\r\n res3: number\r\n sup1: number\r\n sup2: number\r\n sup3: number\r\n}\r\n\r\ninterface Attrs {\r\n period?: string\r\n calculationType: CalculationType\r\n color: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n CalculationType: 'standard' as CalculationType,\r\n Color: '#FFA75F',\r\n}\r\nconst FIB_LVL_1 = 0.382\r\nconst FIB_LVL_2 = 0.618\r\nconst DAY_SECONDS = 86400\r\nconst MINUTES_PER_DAY = 1440\r\n\r\nclass PivotPoints extends Overlay {\r\n static type = OverlayType.Pp\r\n static label = 'Pivot Points'\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (period) {\r\n this.attrs.calculationType = period as CalculationType\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n getPeriodType() {\r\n switch (this.data.timeframe) {\r\n case TIMEFRAME.i30:\r\n case TIMEFRAME.h:\r\n case TIMEFRAME.h2:\r\n return PivotPeriod.week\r\n case TIMEFRAME.h4:\r\n case TIMEFRAME.d:\r\n return PivotPeriod.month\r\n case TIMEFRAME.w:\r\n case TIMEFRAME.m:\r\n return PivotPeriod.year\r\n default:\r\n return PivotPeriod.day\r\n }\r\n }\r\n\r\n getIsEnoughData(startIndex: number, endIndex: number, periodType: PivotPeriod) {\r\n let dayGap = 7 // one week for week period\r\n if (periodType === PivotPeriod.month) dayGap = 28 // shortest month\r\n if (periodType === PivotPeriod.year) dayGap = 365\r\n\r\n if (startIndex !== endIndex) {\r\n if (startIndex === 0) {\r\n const daysDiff = (this.data.date[endIndex] - this.data.date[startIndex]) / DAY_SECONDS\r\n // we need to somehow determine if we have data if it starts from index 0\r\n // and we can't easily check if day before is different (different month/week/year)\r\n // so we are at least checking if it is [dayGap] days between start and end date\r\n return daysDiff >= dayGap\r\n } else {\r\n const startDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex])\r\n const beforeDay = Utils.dateFromUnixTimestamp(this.data.date[startIndex - 1])\r\n if (periodType === PivotPeriod.week) {\r\n return beforeDay.getDate() !== startDay.getDate()\r\n } else {\r\n return beforeDay.getMonth() !== startDay.getMonth()\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n fx = (x: number) => {\r\n const lastIndex = this.data.close.length - 1\r\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\r\n\r\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (this.data.close.length === 0) return\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width, zoomFactor } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n const barWidth = getBarWidthWithMargin({\r\n zoomFactor,\r\n chartLayout: chartModel.chart_layout(),\r\n })\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const text = (label: string, price: number, calculatedX: number) => {\r\n new Text(\r\n {\r\n x: calculatedX,\r\n y: this.fy(price) - 13,\r\n font: { size: 8, weight: '900' },\r\n textBaseline: TextBaseline.top,\r\n fillStyle: this.attrs.color,\r\n text: `${label} (${round({ data: this.data, num: price })})`,\r\n },\r\n this.model\r\n ).render(context)\r\n }\r\n\r\n const line = (fromX: number, toX: number, y: number) => {\r\n context.moveTo(fromX, this.fy(y))\r\n context.lineTo(toX, this.fy(y))\r\n }\r\n\r\n let startIndex = -1\r\n let endIndex = -1\r\n const isStock = this.data.instrument === Instrument.Stock\r\n const periodType = this.getPeriodType()\r\n let currentDate = new Date()\r\n let lastDate: Date | undefined\r\n\r\n context.translate(0.5, 0.5)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n for (let index = firstBarToRender.index; index <= lastBarToRender.index; index++) {\r\n currentDate = Utils.dateFromUnixTimestamp(this.data.date[index])\r\n\r\n // check if new calculation/render is necessary\r\n switch (periodType) {\r\n case PivotPeriod.day: // only if it is a new day\r\n if (currentDate.getDate() === lastDate?.getDate()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.week: // only if it is a new week\r\n if (lastDate && dateFns.isSameWeek(lastDate, currentDate, { weekStartsOn: 1 })) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.month: // only if it is a new month\r\n if (currentDate.getMonth() === lastDate?.getMonth()) {\r\n continue\r\n }\r\n break\r\n case PivotPeriod.year: // only if it is a new year\r\n if (currentDate.getFullYear() === lastDate?.getFullYear()) {\r\n continue\r\n }\r\n break\r\n }\r\n lastDate = currentDate\r\n\r\n // Find start/end indexes for the entire previous period\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n if (index > 0) {\r\n let previousTradingDay = new Date()\r\n for (let i = index - 1; i >= 0; i--) {\r\n previousTradingDay = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (previousTradingDay.getDate() !== currentDate.getDate()) break\r\n }\r\n previousTradingDay.setHours(0, 0, 0, 0)\r\n const previousNYMidnightTimestamp = Utils.convertLocalToNyTime(previousTradingDay, false).getTime() / 1000\r\n const currentMidnight = new Date(currentDate)\r\n currentMidnight.setHours(0, 0, 0, 0)\r\n const currentNYMidnightTimestamp = Utils.convertLocalToNyTime(currentMidnight, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= previousNYMidnightTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > currentNYMidnightTimestamp)\r\n\r\n // check if we have data for entire day\r\n if (startIndex !== endIndex) {\r\n const diff = this.data.date[endIndex] - this.data.date[startIndex]\r\n const isNonStockFullDay = !isStock && diff >= DAY_SECONDS\r\n const isStockFullDay = isStock && previousTradingDay.getDate() !== currentDate.getDate()\r\n if (!isNonStockFullDay && !isStockFullDay) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n }\r\n }\r\n break\r\n case PivotPeriod.week:\r\n const firstDayCurrentWeek = dateFns.startOfWeek(currentDate, { weekStartsOn: 1 })\r\n const firstDayCurrentWeekTimestamp = Utils.convertLocalToNyTime(firstDayCurrentWeek, false).getTime() / 1000\r\n const firstDayPreviousWeek = dateFns.sub(firstDayCurrentWeek, { weeks: 1 })\r\n const firstDayPreviousWeekTimestamp = Utils.convertLocalToNyTime(firstDayPreviousWeek, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousWeekTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentWeekTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.month:\r\n const firstDayCurrentMonth = dateFns.startOfMonth(currentDate)\r\n const firstDayCurrentMonthTimestamp = Utils.convertLocalToNyTime(firstDayCurrentMonth, false).getTime() / 1000\r\n const firstDayPreviousMonth = dateFns.sub(firstDayCurrentMonth, { months: 1 })\r\n const firstDayPreviousMonthTimestamp =\r\n Utils.convertLocalToNyTime(firstDayPreviousMonth, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousMonthTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentMonthTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n case PivotPeriod.year:\r\n const firstDayCurrentYear = dateFns.startOfYear(currentDate)\r\n const firstDayCurrentYearTimestamp = Utils.convertLocalToNyTime(firstDayCurrentYear, false).getTime() / 1000\r\n const firstDayPreviousYear = dateFns.sub(firstDayCurrentYear, { years: 1 })\r\n const firstDayPreviousYearTimestamp = Utils.convertLocalToNyTime(firstDayPreviousYear, false).getTime() / 1000\r\n\r\n startIndex = this.data.date.findIndex((ts) => ts >= firstDayPreviousYearTimestamp)\r\n endIndex = this.data.date.findIndex((ts) => ts > firstDayCurrentYearTimestamp)\r\n\r\n if (!this.getIsEnoughData(startIndex, endIndex, periodType)) {\r\n startIndex = endIndex = Number.MIN_SAFE_INTEGER\r\n }\r\n break\r\n }\r\n\r\n // calculate pivot point if it was found\r\n if (!(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex)) continue\r\n\r\n let pivot, sup1, sup2, sup3, res1, res2, res3\r\n const previousHigh = Math.max(...this.data.high.slice(startIndex, endIndex))\r\n const previousLow = Math.min(...this.data.low.slice(startIndex, endIndex))\r\n const previousClose = this.data.close[endIndex - 1] // endIndex is the beginning of the next period\r\n\r\n if (this.attrs.calculationType === 'standard') {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = 2 * pivot - previousHigh\r\n sup2 = pivot - (previousHigh - previousLow)\r\n sup3 = previousLow - 2 * (previousHigh - pivot)\r\n res1 = 2 * pivot - previousLow\r\n res2 = pivot + (previousHigh - previousLow)\r\n res3 = previousHigh + 2 * (pivot - previousLow)\r\n } else {\r\n pivot = (previousHigh + previousLow + previousClose) / 3\r\n sup1 = pivot - (previousHigh - previousLow) * FIB_LVL_1\r\n sup2 = pivot - (previousHigh - previousLow) * FIB_LVL_2\r\n sup3 = pivot - (previousHigh - previousLow)\r\n res1 = pivot + (previousHigh - previousLow) * FIB_LVL_1\r\n res2 = pivot + (previousHigh - previousLow) * FIB_LVL_2\r\n res3 = pivot + (previousHigh - previousLow)\r\n }\r\n\r\n const pivotPoint: PivotPointType = { pivot, sup1, sup2, sup3, res1, res2, res3 }\r\n\r\n // prepare x coordinates for lines rendering\r\n let fromX = this.fx(index)\r\n let toX = this.fx(index)\r\n switch (periodType) {\r\n case PivotPeriod.day:\r\n const interval = this.data.interval\r\n const currentX = fromX\r\n\r\n const toDate = new Date(currentDate)\r\n toDate.setHours(16, 0, 0, 0)\r\n if (this.data.aftermarket && interval <= 5) toDate.setHours(18, 30, 0, 0)\r\n if (interval <= 15 && !isStock) toDate.setHours(23, 59, 59, 99)\r\n const toTimestamp = toDate.getTime() / 1000\r\n const toDiffMinutes = (toTimestamp - currentDate.getTime() / 1000) / 60\r\n const toBars = toDiffMinutes / interval\r\n toX = Math.min(currentX + toBars * barWidth, -leftOffset + width)\r\n\r\n const fromDate = new Date(currentDate)\r\n fromDate.setHours(9, 30, 0, 0)\r\n if (this.data.premarket && interval <= 5) fromDate.setHours(7, 0, 0, 0)\r\n if (interval <= 15 && !isStock) fromDate.setHours(0, 0, 0, 0)\r\n const fromTimestamp = fromDate.getTime() / 1000\r\n const fromDiffMinutes = (fromTimestamp - currentDate.getTime() / 1000) / 60\r\n const fromBars = fromDiffMinutes / interval\r\n fromX = currentX + fromBars * barWidth\r\n break\r\n\r\n case PivotPeriod.week:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (!dateFns.isSameWeek(currentDate, nextDate, { weekStartsOn: 1 })) {\r\n fromX = this.fx(i + 1) // because we need start from current week\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the week\r\n const barsPerDay = Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n toX += (isStock ? 5 : 7) * barsPerDay * barWidth\r\n }\r\n break\r\n\r\n case PivotPeriod.month:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getMonth() !== currentDate.getMonth()) {\r\n fromX = this.fx(i + 1) // because we need start from current month\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the month\r\n const barsPerDay = this.data.isIntraday\r\n ? Math.ceil((this.data.drawMinutesPerDay ?? MINUTES_PER_DAY) / this.data.interval)\r\n : 1\r\n toX += (isStock ? 20 : 30) * barsPerDay * barWidth\r\n }\r\n break\r\n default:\r\n for (let i = index + 1; i <= lastBarToRender.index; i++) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n toX = this.fx(i)\r\n break\r\n }\r\n }\r\n for (let i = index - 1; i >= firstBarToRender.index; i--) {\r\n const nextDate = Utils.dateFromUnixTimestamp(this.data.date[i])\r\n if (nextDate.getFullYear() !== currentDate.getFullYear()) {\r\n fromX = this.fx(i + 1) // because we need start from current year\r\n break\r\n }\r\n }\r\n\r\n if (fromX === toX) {\r\n // we need line to imaginary end of the year\r\n toX += (this.data.timeframe === TIMEFRAME.w ? 49 : 12) * barWidth\r\n }\r\n break\r\n }\r\n fromX = Math.max(fromX, -leftOffset)\r\n\r\n // render pivot line\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.pivot)\r\n context.stroke()\r\n\r\n // render resistance and support lines\r\n context.save()\r\n context.setLineDash([3, 3])\r\n context.beginPath()\r\n line(fromX, toX, pivotPoint.res1)\r\n line(fromX, toX, pivotPoint.res2)\r\n line(fromX, toX, pivotPoint.res3)\r\n line(fromX, toX, pivotPoint.sup1)\r\n line(fromX, toX, pivotPoint.sup2)\r\n line(fromX, toX, pivotPoint.sup3)\r\n context.stroke()\r\n context.restore()\r\n\r\n // render labels if there is enough space\r\n if (toX - fromX >= 48) {\r\n text('P', pivotPoint.pivot, fromX)\r\n text('R1', pivotPoint.res1, fromX)\r\n text('R2', pivotPoint.res2, fromX)\r\n text('R3', pivotPoint.res3, fromX)\r\n text('S1', pivotPoint.sup1, fromX)\r\n text('S2', pivotPoint.sup2, fromX)\r\n text('S3', pivotPoint.sup3, fromX)\r\n }\r\n }\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const calculationType = {\r\n type: 'select',\r\n label: 'Calculation Type',\r\n name: 'calculationType',\r\n value: this.attrs.calculationType ?? DEFAULT_PARAMETERS.CalculationType,\r\n required: true,\r\n items: [\r\n {\r\n value: 'standard',\r\n label: 'Standard',\r\n },\r\n {\r\n value: 'fibonacci',\r\n label: 'Fibonacci',\r\n },\r\n ],\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [calculationType, color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'calculationType':\r\n case 'color':\r\n return !!this.attrs[key]\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `Pivot Points (${Calculation[this.attrs.calculationType]})`\r\n }\r\n}\r\n\r\nPivotPoints.prototype.defaults = {\r\n calculationType: DEFAULT_PARAMETERS.CalculationType,\r\n color: DEFAULT_PARAMETERS.Color,\r\n}\r\n\r\nexport default PivotPoints\r\n","import { OverlayType } from '../constants/common'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n fallingColor: string\r\n}\r\n\r\nclass SAR extends Overlay {\r\n static type = OverlayType.Sar\r\n static label = 'Parabolic SAR'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 0\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\r\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\r\n this.attrs.step = step\r\n this.attrs.maxStep = maxStep\r\n }\r\n this.trigger('change')\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const data = this.data\r\n const deltaHigh = data.high[1] - data.high[0]\r\n const deltaLow = data.low[0] - data.low[1]\r\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\r\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\r\n let isLong = pdm >= mdm\r\n\r\n let sar = isLong ? data.low[0] : data.high[0]\r\n let ep = isLong ? data.high[1] : data.low[1]\r\n let newHigh = data.high[0]\r\n let newLow = data.low[0]\r\n let af = this.attrs.step\r\n\r\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\r\n let sarToDraw\r\n const prevHigh = newHigh\r\n const prevLow = newLow\r\n newHigh = data.high[i]\r\n newLow = data.low[i]\r\n\r\n if (isLong) {\r\n if (newLow <= sar) {\r\n isLong = false\r\n sar = ep\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newLow\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newHigh > ep) {\r\n ep = newHigh\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n }\r\n } else {\r\n if (newHigh >= sar) {\r\n isLong = true\r\n sar = ep\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n\r\n sarToDraw = sar\r\n\r\n af = this.attrs.step\r\n ep = newHigh\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar > prevLow) {\r\n sar = prevLow\r\n }\r\n if (sar > newLow) {\r\n sar = newLow\r\n }\r\n } else {\r\n sarToDraw = sar\r\n\r\n if (newLow < ep) {\r\n ep = newLow\r\n af += this.attrs.step\r\n if (af > this.attrs.maxStep) {\r\n af = this.attrs.maxStep\r\n }\r\n }\r\n\r\n sar = sar + af * (ep - sar)\r\n\r\n if (sar < prevHigh) {\r\n sar = prevHigh\r\n }\r\n if (sar < newHigh) {\r\n sar = newHigh\r\n }\r\n }\r\n }\r\n\r\n const x = Math.round(this.fx(i) - 1.5)\r\n const y = Math.round(this.fy(sarToDraw) - 1.5)\r\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\r\n context.fillRect(x, y, 3, 3)\r\n }\r\n }\r\n\r\n getModalConfig() {\r\n const step = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Step',\r\n name: 'step',\r\n value: this.attrs.step ?? 0.02,\r\n required: true,\r\n }\r\n const maxStep = {\r\n type: 'number',\r\n step: 0.01,\r\n min: 0.01,\r\n max: 999,\r\n label: 'Maximum Step',\r\n name: 'maxStep',\r\n value: this.attrs.maxStep ?? 0.2,\r\n required: true,\r\n }\r\n const risingColor = {\r\n type: 'color',\r\n label: 'Rising Color',\r\n name: 'risingColor',\r\n value: this.attrs.risingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n const fallingColor = {\r\n type: 'color',\r\n label: 'Falling Color',\r\n name: 'fallingColor',\r\n value: this.attrs.fallingColor ?? this.getFreeColor(),\r\n customizable: false,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [step, maxStep, risingColor, fallingColor],\r\n inputsErrorMessages: {\r\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\r\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'step':\r\n case 'maxStep': {\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n }\r\n case 'risingColor':\r\n case 'fallingColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.risingColor\r\n }\r\n\r\n toString() {\r\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\r\n }\r\n}\r\n\r\nSAR.prototype.defaults = {\r\n risingColor: '#69c1ea',\r\n fallingColor: '#d386df',\r\n}\r\n\r\nexport default SAR\r\n","import { OverlayType } from '../constants/common'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\ntype DefaultCalculatedValuesType = {\r\n sma: number[]\r\n}\r\n\r\nexport class SMACalculation extends MainCalculation {\r\n static type = OverlayType.Sma\r\n declare options: Options\r\n\r\n getDefaultCalculatedValues() {\r\n return { sma: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { close } = this.quote\r\n const lastIndex = close.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let sum = 0\r\n for (let i = 0; i < this.options.period; i++) {\r\n sum += close[i]\r\n }\r\n for (let i = this.options.period; i <= lastIndex; i++) {\r\n sum = sum - close[i - this.options.period] + close[i]\r\n this.calculatedValues.sma[i] = sum / this.options.period\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport { SMACalculation } from '../indicator-calculation/sma'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n step: number\r\n period: string\r\n maxStep: number\r\n risingColor: string\r\n color: string\r\n}\r\n\r\nclass SMA extends Overlay {\r\n static type = OverlayType.Sma\r\n static label = 'Simple Moving Average'\r\n\r\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\r\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\r\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n this.attrs.period = parseInt(period, 10)\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\r\n context.beginPath()\r\n context.translate(0.5, 0.5)\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const smaCalculation = new SMACalculation({\r\n quote: this.data,\r\n options: { period },\r\n })\r\n\r\n smaCalculation.calculate(({ sma }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false\r\n }\r\n context.lineTo(x, Math.round(this.fy(sma[dataIndex])))\r\n })\r\n\r\n context.translate(-0.5, -0.5)\r\n context.stroke()\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? 5,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, color],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'color':\r\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n toString() {\r\n return `SMA ${this.attrs.period}`\r\n }\r\n}\r\n\r\nSMA.prototype.defaults = { color: '#ffa75f' }\r\n\r\nexport default SMA\r\n","import { OverlayType } from '../constants/common'\r\nimport SMA from './sma'\r\n\r\nclass SMA2 extends SMA {\r\n static type = OverlayType.Sma2\r\n}\r\n\r\nSMA2.prototype.defaults = { color: '#ff6400' }\r\n\r\nexport default SMA2\r\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport AverageTrueRange from '../helpers/atr'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n multiplier: number\r\n uptrendColor: string\r\n downtrendColor: string\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 7,\r\n Multiplier: 3.0,\r\n}\r\n\r\nconst COLORS = {\r\n Uptrend: '#00a000',\r\n Downtrend: '#c80000',\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\r\n\r\n return [period, multiplier]\r\n}\r\n\r\nclass Supertrend extends Overlay {\r\n static type = OverlayType.Str\r\n static label = 'Supertrend'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt] = parsePeriod(period)\r\n return periodInt + 1\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, multiplier] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.multiplier = multiplier\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n const { leftOffset, width } = this.model.chart()\r\n const { period, multiplier } = this.attrs\r\n const { high, low, close } = this.data\r\n const atr = new AverageTrueRange(period)\r\n const finalUpperBand: number[] = []\r\n const finalLowerBand: number[] = []\r\n const supertrend: boolean[] = []\r\n let firstBarToRender\r\n let lastBarToRender = 0\r\n\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.uptrendColor)\r\n for (let i = 1; i < close.length; i++) {\r\n atr.add(high[i], low[i], close[i - 1])\r\n\r\n // compute bands\r\n const avg = (high[i] + low[i]) / 2\r\n const upperBand = avg + multiplier * atr.value\r\n const lowerBand = avg - multiplier * atr.value\r\n\r\n finalUpperBand[i] = upperBand\r\n finalLowerBand[i] = lowerBand\r\n\r\n // identify supertrend\r\n if (close[i] > finalUpperBand[i - 1]) {\r\n supertrend[i] = true\r\n } else if (close[i] < finalLowerBand[i - 1]) {\r\n supertrend[i] = false\r\n } else {\r\n supertrend[i] = supertrend[i - 1]\r\n }\r\n\r\n // adjust bands\r\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\r\n finalLowerBand[i] = finalLowerBand[i - 1]\r\n }\r\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\r\n finalUpperBand[i] = finalUpperBand[i - 1]\r\n }\r\n\r\n const x = this.fx(i)\r\n if (i < period || x + leftOffset < 0) {\r\n continue\r\n }\r\n if (this.fx(i - 1) + leftOffset > width) {\r\n break\r\n }\r\n if (firstBarToRender === undefined) firstBarToRender = i\r\n\r\n if (supertrend[i] && !supertrend[i - 1]) {\r\n // buy\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else if (supertrend[i]) {\r\n // keep buying\r\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n } else {\r\n // keep selling\r\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\r\n }\r\n lastBarToRender = i\r\n }\r\n context.stroke()\r\n\r\n if (firstBarToRender === undefined) {\r\n context.translate(-0.5, -0.5)\r\n return\r\n }\r\n\r\n context.beginPath()\r\n context.set('strokeStyle', this.attrs.downtrendColor)\r\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\r\n const x = this.fx(i)\r\n if (!supertrend[i] && supertrend[i - 1]) {\r\n // sell\r\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else if (!supertrend[i]) {\r\n // keep selling\r\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n } else {\r\n // keep buying\r\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\r\n }\r\n }\r\n context.stroke()\r\n\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const multiplier = {\r\n type: 'number',\r\n label: 'Period',\r\n name: 'multiplier',\r\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\r\n required: true,\r\n step: 0.1,\r\n min: 0.0,\r\n max: 999,\r\n }\r\n\r\n const uptrendColor = {\r\n type: 'color',\r\n label: 'Uptrend Color',\r\n name: 'uptrendColor',\r\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\r\n }\r\n const downtrendColor = {\r\n type: 'color',\r\n label: 'Downtrend Color',\r\n name: 'downtrendColor',\r\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, multiplier, uptrendColor, downtrendColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'multiplier':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'uptrendColor':\r\n case 'downtrendColor':\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor(): string {\r\n return this.attrs.uptrendColor\r\n }\r\n\r\n toString() {\r\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\r\n }\r\n}\r\n\r\nSupertrend.prototype.defaults = {\r\n uptrendColor: COLORS.Uptrend,\r\n downtrendColor: COLORS.Downtrend,\r\n}\r\n\r\nexport default Supertrend\r\n","import * as d3 from 'd3'\r\n\r\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\r\nimport { OverlayType } from '../constants/common'\r\nimport Chart from '../models/chart'\r\nimport utils from '../utils'\r\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\r\nimport { getAreNoBarsVisible, getVisibleBarToRenderIndex } from '../utils/draw_in_visible_area'\r\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\r\nimport Overlay from './overlay'\r\n\r\nconst VP_COLORS = {\r\n UP: '#00FF00',\r\n DOWN: '#FF0000',\r\n}\r\n\r\nconst DEFAULT_PARAMETERS = {\r\n Period: 20,\r\n Opacity: 0.3,\r\n}\r\n\r\ninterface Attrs {\r\n period: number | string\r\n opacity: number\r\n upColor?: string\r\n downColor?: string\r\n}\r\n\r\nfunction applyOpacityToColor(color: string, opacity: number) {\r\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\r\n}\r\n\r\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\r\n return [\r\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\r\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\r\n ]\r\n}\r\n\r\n// Only time when we want value to be able to equal start of segment is first segment,\r\n// because start of next segment is equal to end of previous and value would match two segments\r\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\r\n return (notEqualStart ? val > start : val >= start) && val <= end\r\n}\r\n\r\nfunction parsePeriod(periodStr: string) {\r\n const values = periodStr.split(',')\r\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\r\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\r\n\r\n return [period, opacity]\r\n}\r\n\r\nclass VolumeProfile extends Overlay {\r\n static type = OverlayType.Vp\r\n static label = 'Volume Profile'\r\n\r\n static getNumOfBarsBuffer({ period }: RequireByKey) {\r\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\r\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\r\n }\r\n\r\n set(obj: Partial) {\r\n super.set(obj)\r\n const { period } = obj\r\n if (typeof period === 'string') {\r\n const [periodInt, opacity] = parsePeriod(period)\r\n this.attrs.period = periodInt\r\n this.attrs.opacity = opacity\r\n this.trigger('change')\r\n }\r\n return this\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n if (typeof this.attrs.period !== 'number') {\r\n return\r\n }\r\n super.renderContent()\r\n\r\n const chartModel = this.model.chart() as Chart\r\n const { leftOffset, width } = chartModel\r\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\r\n const chartWidth = width - left.width - right.width\r\n\r\n if (this.data.close.length === 0) return\r\n\r\n const firstBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n })\r\n\r\n const lastBarToRender = getVisibleBarToRenderIndex({\r\n quote: this.data,\r\n paneModel: this.model,\r\n leftOffset,\r\n chartWidth,\r\n })\r\n\r\n const areNoBarsVisible = getAreNoBarsVisible(firstBarToRender, lastBarToRender)\r\n if (areNoBarsVisible) return\r\n\r\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\r\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender.index, lastBarToRender.index + 1))\r\n\r\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\r\n const segments = [] // create an empty array to hold the segments\r\n\r\n for (let i = 0; i < this.attrs.period; i++) {\r\n const segmentStart = minClose + segment * i // calculate start of current segment\r\n const segmentEnd = segmentStart + segment // calculate end of current segment\r\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\r\n }\r\n\r\n // loop through visible bars and assign volumes to segments\r\n for (let i = firstBarToRender.index; i <= lastBarToRender.index; i++) {\r\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\r\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\r\n )\r\n if (segmentIndex === -1) continue\r\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\r\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\r\n }\r\n\r\n const max = utils.max(segments.map((item) => item.up + item.down))\r\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\r\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\r\n\r\n segments.forEach((item) => {\r\n const y = Math.round(this.fy(item.start))\r\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\r\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\r\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\r\n const upSegmentWidth = Math.round(volumeFX(item.up))\r\n const downSegmentWidth = Math.round(volumeFX(item.down))\r\n\r\n context.fillStyle = upColor\r\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\r\n context.fillStyle = downColor\r\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\r\n })\r\n }\r\n\r\n getModalConfig() {\r\n const period = {\r\n type: 'number',\r\n label: 'Zones',\r\n name: 'period',\r\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\r\n required: true,\r\n min: 1,\r\n max: 999999,\r\n }\r\n const opacity = {\r\n type: 'number',\r\n label: 'Opacity',\r\n name: 'opacity',\r\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\r\n required: true,\r\n min: 0,\r\n max: 1,\r\n step: 0.1,\r\n }\r\n const upColor = {\r\n type: 'color',\r\n label: 'Up Color',\r\n name: 'upColor',\r\n value: this.attrs.upColor ?? VP_COLORS.UP,\r\n }\r\n const downColor = {\r\n type: 'color',\r\n label: 'Down Color',\r\n name: 'downColor',\r\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [period, opacity, upColor, downColor],\r\n inputsErrorMessages: {\r\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\r\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\r\n },\r\n }\r\n }\r\n\r\n getIsValid(key: string): boolean {\r\n switch (key) {\r\n case 'period':\r\n return this.getIsNumberInputValid({ key })\r\n case 'opacity':\r\n return this.getIsNumberInputValid({ key, integerOnly: false })\r\n case 'upColor':\r\n case 'downColor':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n getLabelColor() {\r\n return this.attrs.upColor || VP_COLORS.UP\r\n }\r\n\r\n toString() {\r\n return `VP ${this.attrs.period}`\r\n }\r\n}\r\n\r\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\r\n\r\nexport default VolumeProfile\r\n","import { OverlayType } from '../constants/common'\r\nimport { dateFromUnixTimestamp } from '../utils'\r\nimport { MainCalculation, OnValueCalculated } from './main'\r\n\r\ntype Options = {\r\n period: number\r\n}\r\n\r\nconst datesAreOnSameDay = (first: Date, second: Date) =>\r\n first.getFullYear() === second.getFullYear() &&\r\n first.getMonth() === second.getMonth() &&\r\n first.getDate() === second.getDate()\r\n\r\ntype DefaultCalculatedValuesType = {\r\n vwap: number[]\r\n}\r\n\r\nexport class VWapCalculation extends MainCalculation {\r\n static type = OverlayType.Vwap\r\n\r\n getDefaultCalculatedValues() {\r\n return { vwap: [] }\r\n }\r\n\r\n calculate(onValueCalculated?: OnValueCalculated) {\r\n const { date, close, low, high, volume } = this.quote\r\n const lastIndex = date.length - 1\r\n this._calculatedValues = this.getDefaultCalculatedValues()\r\n\r\n let cumulativePV = 0\r\n let cumulativeVolume = 0\r\n\r\n for (let i = 0; i <= lastIndex; i++) {\r\n if (i > 0) {\r\n const prevDate = dateFromUnixTimestamp(date[i - 1])\r\n if (!datesAreOnSameDay(prevDate, dateFromUnixTimestamp(date[i]))) {\r\n cumulativePV = 0\r\n cumulativeVolume = 0\r\n }\r\n }\r\n\r\n const typicalPrice = (close[i] + low[i] + high[i]) / 3\r\n const pv = typicalPrice * volume[i]\r\n\r\n cumulativePV += pv\r\n cumulativeVolume += volume[i]\r\n\r\n this.calculatedValues.vwap[i] = cumulativePV / cumulativeVolume\r\n\r\n if (onValueCalculated?.(this.calculatedValues, i) === false) {\r\n break\r\n }\r\n }\r\n }\r\n}\r\n","import { OverlayType } from '../constants/common'\r\nimport { VWapCalculation } from '../indicator-calculation/vwap'\r\nimport PaneModel from '../models/pane'\r\nimport Overlay from './overlay'\r\n\r\ninterface Attrs {\r\n period: number\r\n color: string\r\n}\r\n\r\nclass VWAP extends Overlay {\r\n static type = OverlayType.Vwap\r\n static label = 'VWAP (intraday charts)'\r\n\r\n static getNumOfBarsBuffer() {\r\n return 1\r\n }\r\n\r\n constructor(values: Partial, model: PaneModel) {\r\n super(values, model)\r\n this.attrs.period = 5\r\n }\r\n\r\n renderContent(context: CanvasRenderingContext2D) {\r\n super.renderContent()\r\n if (!this.isRendered()) {\r\n return\r\n }\r\n\r\n const { leftOffset, width } = this.model.chart()\r\n context.translate(0.5, 0.5)\r\n context.beginPath()\r\n context.set('lineWidth', 1)\r\n context.set('strokeStyle', this.attrs.color)\r\n\r\n const vwapCalculation = new VWapCalculation({\r\n quote: this.data,\r\n options: { period: this.attrs.period },\r\n })\r\n\r\n vwapCalculation.calculate(({ vwap }, dataIndex) => {\r\n const x = this.fx(dataIndex)\r\n if (this.fx(dataIndex + 1) + leftOffset < 0) {\r\n return // continue\r\n }\r\n if (this.fx(dataIndex - 1) + leftOffset > width) {\r\n return false // break\r\n }\r\n const y = Math.round(this.fy(vwap[dataIndex]))\r\n context.lineTo(x, y)\r\n })\r\n\r\n context.stroke()\r\n context.translate(-0.5, -0.5)\r\n }\r\n\r\n getModalConfig() {\r\n const color = {\r\n type: 'color',\r\n label: 'Color',\r\n name: 'color',\r\n value: this.attrs.color ?? this.getFreeColor(),\r\n }\r\n\r\n return {\r\n title: this.label,\r\n inputs: [color],\r\n inputsErrorMessages: {},\r\n }\r\n }\r\n\r\n getIsValid(key: string) {\r\n switch (key) {\r\n case 'color':\r\n // Some users have wrong colors which break the form validation\r\n return true\r\n default:\r\n return false\r\n }\r\n }\r\n\r\n isRendered() {\r\n return this.model.chart().quote().isIntraday\r\n }\r\n\r\n isRenderedOverlaysLabel() {\r\n return this.isRendered()\r\n }\r\n\r\n toString() {\r\n return `VWAP`\r\n }\r\n}\r\n\r\nVWAP.prototype.defaults = { color: '#9467bd' }\r\n\r\nexport default VWAP\r\n","import { OverlayType } from '../constants/common'\r\nimport bb from './bb'\r\nimport dch from './dch'\r\nimport ema from './ema'\r\nimport ema2 from './ema2'\r\nimport hilo from './hilo'\r\nimport hline from './hline'\r\nimport ic from './ic'\r\nimport icf from './icf'\r\nimport kch from './kch'\r\nimport none from './none'\r\nimport overlay from './overlay'\r\nimport patterns from './patterns'\r\nimport pp from './pp'\r\nimport sar from './sar'\r\nimport sma from './sma'\r\nimport sma2 from './sma2'\r\nimport str from './str'\r\nimport vp from './vp'\r\nimport vwap from './vwap'\r\n\r\nexport const overlaysByType = Object.freeze({\r\n [OverlayType.Overlay]: overlay,\r\n [OverlayType.None]: none,\r\n [OverlayType.Bb]: bb,\r\n [OverlayType.Dch]: dch,\r\n [OverlayType.Ema]: ema,\r\n [OverlayType.Ema2]: ema2,\r\n [OverlayType.Hilo]: hilo,\r\n [OverlayType.Hline]: hline,\r\n [OverlayType.Ic]: ic,\r\n [OverlayType.Icf]: icf,\r\n [OverlayType.Kch]: kch,\r\n [OverlayType.Patterns]: patterns,\r\n [OverlayType.Pp]: pp,\r\n [OverlayType.Sar]: sar,\r\n [OverlayType.Sma]: sma,\r\n [OverlayType.Sma2]: sma2,\r\n [OverlayType.Str]: str,\r\n [OverlayType.Vp]: vp,\r\n [OverlayType.Vwap]: vwap,\r\n})\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch (e) {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch (e) {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n )\r\n}\r\n","import { ObjectHash } from '../../types/shared'\r\n\r\nconst requestsAbortControllersCache: ObjectHash = {}\r\n\r\nexport function removeFromAbortCache(key: string) {\r\n delete requestsAbortControllersCache[key]\r\n}\r\n\r\nexport function abortRequest(key: string) {\r\n requestsAbortControllersCache[key]?.abort()\r\n removeFromAbortCache(key)\r\n}\r\n\r\nexport function getIsAbortError(error: Error) {\r\n return error.name === 'AbortError'\r\n}\r\n\r\nexport function createRequestAbortController({\r\n key,\r\n shouldAbortRunningRequest = false,\r\n}: {\r\n key: string\r\n shouldAbortRunningRequest?: boolean\r\n}) {\r\n if (shouldAbortRunningRequest) {\r\n abortRequest(key)\r\n }\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n if (controller) {\r\n requestsAbortControllersCache[key] = controller\r\n }\r\n return controller\r\n}\r\n","import * as websiteShared from '@finviz/website'\r\n\r\nimport { captureException } from './helpers'\r\n\r\n/**\r\n * Hook used to asynchronously load a module\r\n *\r\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\r\n */\r\nexport const useAsyncModule = (\r\n props: {\r\n importFn: () => Promise\r\n onError?: () => void\r\n cacheKey: string\r\n captureException?: (exception: Error, captureContext?: { extra: Record }) => void\r\n errorSeverity?: 'medium' | 'high'\r\n } & (websiteShared.ControlledModuleConfig | websiteShared.SuspenseModuleConfig)\r\n) =>\r\n websiteShared.useAsyncModule({ captureException, ...props }) as [\r\n SuspenseMode extends true ? T : T | null,\r\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\r\n ]\r\n","import { getIsSSr } from './helpers'\r\n\r\n// Extracted from isMobile, and modified to fit usage\r\nfunction isFirefoxDesktop() {\r\n const matchesAndroid = navigator.userAgent.match(/Android/i)\r\n const matchesWebOS = navigator.userAgent.match(/webOS/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesiPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesBlackBerry = navigator.userAgent.match(/BlackBerry/i)\r\n const matchesWindowsPhone = navigator.userAgent.match(/Windows Phone/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n const isMobileDevice =\r\n matchesAndroid ||\r\n matchesWebOS ||\r\n matchesIPhone ||\r\n matchesiPad ||\r\n matchesIPod ||\r\n matchesBlackBerry ||\r\n matchesWindowsPhone ||\r\n matchesIOSLike\r\n\r\n const matchesFirefox = !!navigator.userAgent.match(/firefox/i)\r\n\r\n return matchesFirefox && !isMobileDevice\r\n}\r\n\r\n// Due bug in FireFox, when if HW acceleration is used canvas is blurry\r\n// we need to set canvas as CPU only\r\nconst shouldUseCPUOnly = getIsSSr() ? false : isFirefoxDesktop()\r\n\r\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\r\n if (!canvas) {\r\n return null\r\n }\r\n\r\n const context = canvas.getContext('2d', shouldUseCPUOnly ? { willReadFrequently: true } : undefined)\r\n if (!context) {\r\n window.Sentry?.captureMessage('Context unavailable')\r\n return null\r\n }\r\n\r\n context._cache = {}\r\n\r\n const _restore = CanvasRenderingContext2D.prototype.restore\r\n context.restore = function () {\r\n this._cache = {}\r\n return _restore.apply(this)\r\n }\r\n\r\n context.set = function (key, value) {\r\n if (this._cache[key] !== value) {\r\n this[key] = value\r\n this._cache[key] = value\r\n }\r\n }\r\n\r\n return context\r\n}\r\n","import { Theme } from '../../types/shared'\r\nimport twColors from '../constants/colors'\r\nimport { ChartEventType } from '../constants/common'\r\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../helpers/math'\r\nimport utils from '../utils'\r\nimport { formatDateToStringUS } from '../utils/helpers'\r\n\r\ninterface IChartEventBase {\r\n elementId: string\r\n eventType: ChartEventType\r\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\r\n}\r\n\r\nexport interface IEarnings extends IChartEventBase {\r\n epsActual?: number\r\n epsEstimate?: number\r\n epsReportedActual?: number\r\n epsReportedEstimate?: number\r\n fiscalEndDate: number\r\n fiscalPeriod: string\r\n salesActual?: number\r\n salesEstimate?: number\r\n}\r\n\r\nexport interface IDividends extends IChartEventBase {\r\n ordinary: number\r\n special: number\r\n}\r\n\r\nexport interface ISplit extends IChartEventBase {\r\n factorFrom: number\r\n factorTo: number\r\n}\r\n\r\nexport enum ChartEventBadgeState {\r\n default = 'default',\r\n hover = 'hover',\r\n selected = 'selected',\r\n}\r\n\r\nexport interface IChartEventBadgeProps {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n width: number\r\n}\r\n\r\ninterface IGetChartEventBadgeColors {\r\n theme: Theme\r\n state: ChartEventBadgeState\r\n colors: IBadgeColors\r\n}\r\n\r\ninterface IBadgeStateColors {\r\n default: string\r\n hover: string\r\n selected: string\r\n}\r\n\r\ninterface IBadgeThemeColors {\r\n outerStroke: string\r\n innerStroke: string\r\n innerFill: IBadgeStateColors\r\n textFill: IBadgeStateColors\r\n}\r\n\r\ninterface IBadgeColors {\r\n light: IBadgeThemeColors\r\n dark: IBadgeThemeColors\r\n}\r\n\r\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\r\n return {\r\n outerStroke: colors[theme].outerStroke,\r\n innerStroke: colors[theme].innerStroke,\r\n innerFill: colors[theme].innerFill[state],\r\n textFill: colors[theme].textFill[state],\r\n }\r\n}\r\n\r\nexport function getFormattedEventDate(\r\n exdate: number,\r\n hasEarningsDateSuffix = false,\r\n options: ObjectHash = {\r\n month: 'short',\r\n }\r\n) {\r\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\r\n\r\n const hours = parsedDate.getHours()\r\n const formattedDate = formatDateToStringUS(parsedDate, options)\r\n\r\n if (hasEarningsDateSuffix) {\r\n let suffix = ''\r\n\r\n if (hours <= 9) {\r\n suffix = 'BMO'\r\n } else if (hours >= 16) {\r\n suffix = 'AMC'\r\n }\r\n\r\n return `${formattedDate} ${suffix}`\r\n }\r\n\r\n return formattedDate\r\n}\r\n\r\nexport function getFormattedValue({\r\n value,\r\n bigNumberUnit,\r\n maxDecimalPlaces = 3,\r\n}: {\r\n value: number\r\n bigNumberUnit?: BigNumber\r\n maxDecimalPlaces?: number\r\n}) {\r\n let numberString = ''\r\n let suffix = ''\r\n\r\n if (bigNumberUnit === undefined) {\r\n numberString = math.round({ value, overridePlaces: 3 })\r\n } else {\r\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\r\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\r\n suffix = bigNumber.substring(bigNumber.length - 1)\r\n }\r\n\r\n const [wholeNumber, decimalNumber] = numberString.split('.')\r\n\r\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\r\n\r\n let formattedDecimalNumber = decimalNumber\r\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\r\n formattedDecimalNumber = decimalNumber.slice(0, -1)\r\n }\r\n\r\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\r\n}\r\n\r\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\r\n return {\r\n light: {\r\n outerStroke: twColors.white,\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][50],\r\n hover: twColors[colorKey][100],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors[colorKey][500],\r\n hover: twColors[colorKey][600],\r\n selected: twColors.white,\r\n },\r\n },\r\n dark: {\r\n outerStroke: twColors.gray[900],\r\n innerStroke: twColors[colorKey][400],\r\n innerFill: {\r\n default: twColors[colorKey][800],\r\n hover: twColors[colorKey][600],\r\n selected: twColors[colorKey][400],\r\n },\r\n textFill: {\r\n default: twColors.white,\r\n hover: twColors.white,\r\n selected: twColors.white,\r\n },\r\n },\r\n } as IBadgeColors\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\r\nimport Line from '../canvas/line'\r\nimport Text from '../canvas/text'\r\nimport { chartsByType } from '../charts/charts'\r\nimport {\r\n CRYPTOS,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n OFFSET,\r\n PADDING,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TIMEFRAME_SECONDS,\r\n TextBaseline,\r\n} from '../constants/common'\r\nimport { getPercentageFromValue } from '../controllers/renderUtils'\r\nimport math from '../helpers/math'\r\nimport Chart from '../models/chart'\r\nimport ChartLayoutModel from '../models/chart_layout'\r\nimport { IChartSettings } from '../models/chart_settings/interfaces'\r\nimport { Mouse } from '../models/mouse'\r\nimport Pane from '../models/pane'\r\nimport Quote, { QuoteGetParams } from '../models/quote'\r\nimport { getChartLayoutSettings } from '../models/settings'\r\nimport Utils, { dateFromUnixTimestamp } from '../utils'\r\nimport { captureException } from './helpers'\r\n\r\nconst DAY_IN_SECONDS = 86400\r\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\r\nconst virtualDatesCache: ObjectHash<{\r\n fromSeconds: number\r\n toSeconds: number\r\n lastUsed: number\r\n virtualDates: number[]\r\n}> = {}\r\n\r\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\r\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\r\n const ts1Utc = ts1\r\n const ts2Utc = ts2\r\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\r\n}\r\n\r\nfunction getVirtualDatesCacheId({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n}) {\r\n return `${ticker}-${timeframe}-${idRevision}`\r\n}\r\n\r\nfunction getCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n const cache = virtualDatesCache[id]\r\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\r\n cache.lastUsed = Date.now()\r\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\r\n return cache.virtualDates\r\n }\r\n return cache.virtualDates.filter(\r\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\r\n )\r\n }\r\n return null\r\n}\r\n\r\nfunction checkVirtualCacheSize() {\r\n const now = Date.now()\r\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\r\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\r\n delete virtualDatesCache[virtualDatesCacheId]\r\n }\r\n })\r\n}\r\n\r\nfunction setCachedVirtualDates({\r\n idRevision,\r\n ticker,\r\n timeframe,\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n}: {\r\n idRevision: number\r\n ticker: string\r\n timeframe: string\r\n fromSeconds: number\r\n toSeconds: number\r\n virtualDates: number[]\r\n}) {\r\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\r\n checkVirtualCacheSize()\r\n virtualDatesCache[id] = {\r\n fromSeconds,\r\n toSeconds,\r\n virtualDates,\r\n lastUsed: Date.now(),\r\n }\r\n}\r\n\r\nconst MAX_BAR_BORDER_WIDTH = 1\r\nconst MIN_BAR_MARGIN_WIDTH = 0\r\nconst MAX_BAR_MARGIN_WIDTH = 16\r\n\r\nexport function getBarWidthWithMarginByParts({\r\n zoomFactor = 1,\r\n chartLayout,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const { ChartSettings } = chartLayout.settings\r\n const settingsCenter = ChartSettings.center\r\n const barMargin =\r\n zoomFactor > 1 && settingsCenter.barMargin === 0\r\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\r\n : settingsCenter.barMargin\r\n\r\n const barFillWidth = settingsCenter.barWidth * zoomFactor\r\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\r\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\r\n\r\n return {\r\n barFillWidth,\r\n barBorderWidth,\r\n barMarginWidth,\r\n }\r\n}\r\n\r\nexport function getBarWidthWithMargin({\r\n zoomFactor = 1,\r\n chartLayout,\r\n shouldRound = true,\r\n}: {\r\n zoomFactor?: number\r\n chartLayout: ChartLayoutModel\r\n shouldRound?: boolean\r\n}) {\r\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\r\n\r\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\r\n if (!shouldRound) {\r\n return barWidth\r\n }\r\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\r\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\r\n}\r\n\r\nexport function getBarWithoutMarginWidth(chartModel: Chart) {\r\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\r\n chartLayout: chartModel.chart_layout(),\r\n zoomFactor: chartModel.zoomFactor,\r\n })\r\n return barFillWidth + barBorderWidth * 2\r\n}\r\n\r\nexport function getHalfBarWidth(chartModel: Chart, floor = true) {\r\n // Math.max(1, num) is kept from previous implementation, it is highly likely\r\n // that some function which use getHalfBarWidth expect return to be >= 1,\r\n // because we never render bar with width < 1 but at the same time when we have and odd\r\n // width like 5, wa want to floor because of pixel perfect rendering\r\n // but some function require raw not floored number to be able to do it's calculations\r\n // TODO: it would be good to possibly revisit this and check usage if we do need\r\n // to perform floor as well as limit result to be >= 1 but it is most likely necessary\r\n const halfBarWidthRaw = Math.max(1, getBarWithoutMarginWidth(chartModel) / 2)\r\n return floor ? ~~halfBarWidthRaw : halfBarWidthRaw\r\n}\r\n\r\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\r\n\r\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\r\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\r\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\r\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\r\nconst setZoomFactorToCache = (key: string, value: number) => {\r\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\r\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\r\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\r\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\r\n if (poppedKey) {\r\n delete zoomFactorForBarsToDisplayCache[poppedKey]\r\n }\r\n }\r\n }\r\n\r\n zoomFactorForBarsToDisplayCache[key] = value\r\n}\r\n\r\nexport function getZoomFactorForBarsToDisplay({\r\n chartVisibleWidth,\r\n numOfVisibleBars,\r\n chartLayout,\r\n}: {\r\n chartVisibleWidth: number\r\n numOfVisibleBars: number\r\n chartLayout: ChartLayoutModel\r\n}) {\r\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\r\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\r\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\r\n let zoomIncrement = 0\r\n let currentZoomFactor = 1\r\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\r\n let iteration = 0\r\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\r\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\r\n }\r\n while (finalZoomFactor === null) {\r\n iteration += 1\r\n const threshold = 0.01\r\n currentZoomFactor += zoomIncrement\r\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\r\n const barWidthDiff = barWidthWithMargin - barWidth\r\n if (barWidthDiff > threshold) {\r\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else if (barWidthDiff < -threshold) {\r\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\r\n } else {\r\n finalZoomFactor = currentZoomFactor\r\n }\r\n\r\n if (iteration === 1000) {\r\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\r\n extra: {\r\n iteration,\r\n zoomIncrement,\r\n barWidthWithMargin,\r\n barWidth,\r\n barWidthDiff,\r\n currentZoomFactor,\r\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\r\n },\r\n })\r\n return currentZoomFactor\r\n }\r\n }\r\n\r\n setZoomFactorToCache(cacheKey, finalZoomFactor)\r\n\r\n return finalZoomFactor\r\n}\r\n\r\nexport function getTimeframeSeconds({\r\n lowerIndex,\r\n dates,\r\n timeframe,\r\n}: {\r\n lowerIndex: number\r\n dates: number[]\r\n timeframe: TIMEFRAME\r\n}) {\r\n const upperIndex = lowerIndex + 1\r\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\r\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\r\n}\r\n\r\nfunction getVirtualTradedDays({\r\n dateStartSeconds,\r\n dateEndSeconds,\r\n datesSeconds,\r\n marketStartMinutes,\r\n}: {\r\n dateStartSeconds: number\r\n dateEndSeconds: number\r\n datesSeconds: number[]\r\n marketStartMinutes: number\r\n}) {\r\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\r\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\r\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\r\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\r\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\r\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\r\n return dateFns\r\n .eachDayOfInterval({\r\n start:\r\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\r\n ? dateFns.addBusinessDays(dateStart, -1)\r\n : dateStart,\r\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\r\n })\r\n .filter((date) => {\r\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\r\n return (\r\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\r\n datesSeconds.some((dateTime) =>\r\n areTimestampsFromSameDay({\r\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\r\n ts2,\r\n })\r\n )\r\n )\r\n })\r\n}\r\n\r\nexport function getVirtualTimeframeTradedDates({\r\n dateStart,\r\n dateEnd,\r\n quote,\r\n}: {\r\n dateStart: number\r\n dateEnd: number\r\n quote: Quote\r\n}) {\r\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\r\n const barsInDay = quote.getBarsInDay() ?? 0\r\n\r\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\r\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\r\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\r\n\r\n const commonVirtualCacheProps = {\r\n idRevision: dates.length,\r\n ticker,\r\n timeframe,\r\n fromSeconds: dateStart,\r\n toSeconds: dateEnd,\r\n }\r\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\r\n if (cachedDates) {\r\n return cachedDates\r\n }\r\n if (!isIntraday || instrument !== Instrument.Stock) {\r\n if (isWithinRangeOfQuoteDate) {\r\n return dates\r\n }\r\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\r\n const firstDate = dates[0]\r\n const lastDate = dates[dates.length - 1]\r\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\r\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\r\n return [\r\n ...Array.from({ length: numOfDatesBefore })\r\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\r\n .reverse(),\r\n ...dates,\r\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\r\n ]\r\n }\r\n\r\n const virtualTradedDays = isWithinRangeOfQuoteDate\r\n ? quote.getDaysInQuote()\r\n : getVirtualTradedDays({\r\n dateStartSeconds: dateStart,\r\n dateEndSeconds: dateEnd,\r\n datesSeconds: dates,\r\n marketStartMinutes,\r\n })\r\n\r\n const marketStartSeconds = marketStartMinutes * 60\r\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\r\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\r\n const virtualDates = virtualTradedDays.flatMap((date) => {\r\n const daySeconds =\r\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\r\n const dayStartSeconds = daySeconds + marketStartSeconds\r\n return barTimeframeSeconds.map(\r\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\r\n (barSeconds, index) =>\r\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\r\n dayStartSeconds +\r\n barSeconds\r\n )\r\n })\r\n\r\n if (!isWithinRangeOfQuoteDate) {\r\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\r\n const isLowerBounded =\r\n date >= dateStart ||\r\n areTimestampsFromSameDay({\r\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\r\n ts2: dateStart - quoteDatesTimestampOffset,\r\n })\r\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\r\n return isLowerBounded || isOneBeforeLowerBoundStarts\r\n })\r\n }\r\n\r\n setCachedVirtualDates({\r\n ...commonVirtualCacheProps,\r\n virtualDates,\r\n })\r\n\r\n return virtualDates\r\n}\r\n\r\ninterface TimestampPositionGettersProps {\r\n quote: Quote\r\n}\r\n\r\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (positionX >= 0 && positionX <= lastDateIndex) {\r\n const lowerIndex = Math.floor(positionX)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\r\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\r\n }\r\n const isLookingBack = positionX < 0\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n const numOfSecondsOutOfBounds = isLookingBack\r\n ? Math.abs(positionX) * averageBarDate\r\n : (positionX - lastDateIndex) * averageBarDate\r\n return Math.round(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\r\n}\r\n\r\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\r\n const { date, timeframe } = quote\r\n const dates = getVirtualTimeframeTradedDates({\r\n dateStart: date[0],\r\n dateEnd: date[date.length - 1],\r\n quote,\r\n })\r\n const dateStart = dates[0]\r\n const dateEnd = dates[dates.length - 1]\r\n const lastDateIndex = dates.length - 1\r\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\r\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\r\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\r\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\r\n return upperIndex - positionDiffUpperTimestamp\r\n }\r\n const isLookingBack = timestamp < dateStart\r\n const averageBarDate = (dateEnd - dateStart) / dates.length\r\n return isLookingBack\r\n ? -((dateStart - timestamp) / averageBarDate)\r\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\r\n}\r\n\r\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\r\nexport function getInstrument(tickerRaw: string) {\r\n if (tickerRaw.indexOf('@') === 0) {\r\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\r\n\r\n if (CRYPTOS[ticker]) {\r\n return Instrument.Crypto\r\n } else if (ticker.length === 6) {\r\n return Instrument.Forex\r\n } else {\r\n return Instrument.Futures\r\n }\r\n }\r\n return Instrument.Stock\r\n}\r\n\r\nexport function getPerfIndicatorTickerAndTimeframes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n}: {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n timeframe: TIMEFRAME\r\n}) {\r\n const { elements } = paneWithPerfIndicator\r\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\r\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\r\n return tickers.map((ticker) => ({\r\n ticker,\r\n instrument: getInstrument(ticker),\r\n timeframe,\r\n }))\r\n}\r\n\r\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\r\n paneWithPerfIndicator: ChartConfigChartPane\r\n chartUuid?: string\r\n}\r\n\r\nexport async function prefetchPerfIndicatorAllQuotes({\r\n paneWithPerfIndicator,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n}: PrefetchPerfIndicatorAllQuotesProps) {\r\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\r\n\r\n if (tickersAndTimeframes.length > 0) {\r\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\r\n Quote.get({\r\n ticker,\r\n instrument,\r\n timeframe,\r\n options,\r\n chartUuid,\r\n })\r\n )\r\n return Promise.all(promises)\r\n }\r\n return Promise.resolve([])\r\n}\r\n\r\ninterface RenderCrossProps {\r\n context: CanvasRenderingContext2D\r\n mouseModel: Mouse\r\n paneModel: Pane\r\n quote: Quote\r\n contentWidth: number\r\n contentHeight: number\r\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\r\n getRoundDecimalPlaces?: (price?: number) => number | undefined\r\n isIndicator?: boolean\r\n isPerfIndicator?: boolean\r\n}\r\n\r\nexport function renderCross({\r\n context,\r\n mouseModel,\r\n paneModel,\r\n quote,\r\n contentWidth,\r\n contentHeight,\r\n onRenderCrossText,\r\n getRoundDecimalPlaces,\r\n isIndicator = false,\r\n isPerfIndicator = false,\r\n}: RenderCrossProps) {\r\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\r\n const chartModel = paneModel.chart()\r\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\r\n const settings = isIndicator ? IndicatorSettings : ChartSettings\r\n const { Colors } = ChartSettings.general\r\n\r\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\r\n return false\r\n }\r\n\r\n const price = mouseModel.getPriceForPane(paneModel)\r\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\r\n const isXAxisInView = middle > 0 && middle <= contentWidth\r\n if (isXAxisInView) {\r\n const x = middle + settings.left.width\r\n new Line(\r\n {\r\n x1: x,\r\n x2: x,\r\n y1: settings.top.height,\r\n y2: settings.top.height + contentHeight,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n onRenderCrossText?.(context, crossIndex)\r\n }\r\n\r\n const domainRange = paneModel.scale.y\r\n .domain()\r\n .slice()\r\n .sort((a, b) => a - b)\r\n\r\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\r\n return isXAxisInView\r\n }\r\n\r\n const priceFy = paneModel.scale.y(price)\r\n const y = Math.round(priceFy + settings.top.height)\r\n new Line(\r\n {\r\n x1: settings.left.width,\r\n x2: settings.left.width + contentWidth,\r\n y1: y,\r\n y2: y,\r\n strokeStyle: Colors.cross,\r\n },\r\n paneModel\r\n ).render(context)\r\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\r\n\r\n const getCrossText = () => {\r\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\r\n return `${math.round({\r\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: 2,\r\n })}%`\r\n }\r\n return `${math.round({\r\n value: price,\r\n lastClose: quote.lastClose,\r\n instrument: quote.instrument,\r\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\r\n })}${isPerfIndicator ? '%' : ''}`\r\n }\r\n\r\n new Text(\r\n {\r\n text: getCrossText(),\r\n x:\r\n settings.left.width +\r\n settings.right.axis.margin.left! +\r\n contentWidth +\r\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\r\n padding: isIndicator\r\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\r\n : {\r\n top: PADDING.XXS,\r\n right: PADDING.XXS,\r\n bottom: PADDING.XXS,\r\n left: PADDING.XXS,\r\n },\r\n ...{\r\n y,\r\n textBaseline: TextBaseline.middle,\r\n fillStyle: Colors.crossText,\r\n background: Colors.crossTextBackground,\r\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\r\n lineHeight: settings.right.axis.font.lineHeight,\r\n },\r\n },\r\n paneModel\r\n ).render(context)\r\n\r\n return true\r\n}\r\n\r\n/**\r\n * Set canvas width and height to 0 which fixes Safari memory problems\r\n *\r\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\r\n */\r\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\r\n if (!canvas) return\r\n\r\n canvas.width = 0\r\n canvas.height = 0\r\n canvas.style.width = '0px'\r\n canvas.style.height = '0px'\r\n}\r\n\r\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\r\n const { Colors } = ChartSettings.general\r\n if (change === 0) {\r\n return Colors.zeroChange\r\n }\r\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\r\n}\r\n\r\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\r\n return math.round({\r\n value: num,\r\n lastClose: data.lastClose,\r\n instrument: data.instrument,\r\n overridePlaces: overridePlaces,\r\n })\r\n}\r\n\r\nexport interface ITickerChange {\r\n points: number\r\n string: string\r\n percentString: string\r\n}\r\ninterface ITickerChangeResult {\r\n tickerChange: ITickerChange | null\r\n tickerAfterChange: ITickerChange | null\r\n}\r\n\r\nexport function getTickerChangeFromCloseValues({\r\n anchorClose,\r\n prevClose,\r\n data,\r\n}: {\r\n anchorClose: number\r\n prevClose: number\r\n data: Quote\r\n}): ITickerChange {\r\n const changePoints = anchorClose - prevClose\r\n const changePercent = (anchorClose / prevClose - 1) * 100\r\n const sign = changePoints < 0 ? '-' : changePoints > 0 ? '+' : ''\r\n const changePercentString = `${round({\r\n data,\r\n num: Math.abs(changePercent),\r\n overridePlaces: 2,\r\n })}%`\r\n const changePointsString = `${sign}${round({\r\n data,\r\n num: Math.abs(changePoints),\r\n })} (${changePercentString})`\r\n\r\n return {\r\n points: changePoints,\r\n string: changePointsString,\r\n percentString: `${sign}${changePercentString}`,\r\n }\r\n}\r\nexport function getTickerChange({ data }: { data: Quote }) {\r\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\r\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\r\n if (isChange) {\r\n result.tickerChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.lastClose,\r\n prevClose: data.prevClose,\r\n })\r\n }\r\n\r\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\r\n if (isAfterChange) {\r\n const tickerAfterChange = getTickerChangeFromCloseValues({\r\n data,\r\n anchorClose: data.afterClose,\r\n prevClose: data.lastClose,\r\n })\r\n result.tickerAfterChange = {\r\n ...tickerAfterChange,\r\n string: `AH: ${tickerAfterChange.string}`,\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\r\n return [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n SpecificChartFunctionality.futuresPage,\r\n ].includes(specificChartFunctionality)\r\n}\r\n\r\nexport function getShouldUseDarkerWickColors({\r\n specificChartFunctionality,\r\n totalBarWidth,\r\n}: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n timeFrame?: TIMEFRAME\r\n totalBarWidth: number\r\n}) {\r\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\r\n const isOffscreenChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\r\n const isQuoteChartWithNarrowBars =\r\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\r\n\r\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\r\n}\r\n\r\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabled() {\r\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport function setIsDrawingEnabled(value: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function getIsSidebarEnabled(specificChartFunctionality?: SpecificChartFunctionality) {\r\n return specificChartFunctionality === SpecificChartFunctionality.chartPage\r\n}\r\n\r\nexport const handleTypeChange = ({\r\n type,\r\n chartLayoutModel,\r\n}: {\r\n type: ChartElementType\r\n chartLayoutModel: ChartLayoutModel\r\n}) => {\r\n const elements = chartLayoutModel.getAllElements()\r\n elements.forEach((element) => {\r\n if (element.isChart() && element.instance.attrs.type !== type) {\r\n const pane = element.pane()\r\n const instance = chartsByType[type].fromObject(\r\n {\r\n ...element.instance.attrs,\r\n type,\r\n },\r\n pane\r\n )\r\n element.replace(instance)\r\n }\r\n })\r\n}\r\n\r\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\r\n specificChartFunctionality: SpecificChartFunctionality\r\n editable: boolean\r\n editors: ChartEditorEnum[]\r\n}) => {\r\n const { specificChartFunctionality, editable, editors } = args\r\n\r\n return (\r\n editable &&\r\n editors?.includes(ChartEditorEnum.tools) &&\r\n specificChartFunctionality &&\r\n [\r\n SpecificChartFunctionality.chartPage,\r\n SpecificChartFunctionality.quotePage,\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ].includes(specificChartFunctionality)\r\n )\r\n}\r\n","/**\r\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\r\n * */\r\n\r\nexport interface RGBA {\r\n r: number\r\n g: number\r\n b: number\r\n a: number\r\n}\r\n\r\nexport interface HSVA {\r\n h: number\r\n s: number\r\n v: number\r\n a: number\r\n}\r\n\r\nexport interface HSLA {\r\n h: number\r\n s: number\r\n l: number\r\n a: number\r\n}\r\n\r\n/**\r\n * Convert Hex string to RGBA object.\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hexStringToRGBA(hexString: string): RGBA {\r\n const hexColor = removeHashSymbol(hexString)\r\n let r: string | number = 0\r\n let g: string | number = 0\r\n let b: string | number = 0\r\n let a: string | number = 255\r\n\r\n // 3 digits\r\n if (hexColor.length === 3 || hexColor.length === 4) {\r\n r = '0x' + hexColor[0] + hexColor[0]\r\n g = '0x' + hexColor[1] + hexColor[1]\r\n b = '0x' + hexColor[2] + hexColor[2]\r\n // Get channel if defined\r\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\r\n\r\n // 6 digits\r\n } else if (hexColor.length === 6 || hexColor.length === 8) {\r\n r = '0x' + hexColor[0] + hexColor[1]\r\n g = '0x' + hexColor[2] + hexColor[3]\r\n b = '0x' + hexColor[4] + hexColor[5]\r\n // Get channel if defined\r\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\r\n }\r\n\r\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSVA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSVA(hexString: string) {\r\n return rgbaToHSVA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert HEX string to HSLA color representation.\r\n *\r\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function hexStringToHSLA(hexString: string) {\r\n return rgbaToHSLA(hexStringToRGBA(hexString))\r\n}\r\n\r\n/**\r\n * Convert alpha value to hex value\r\n *\r\n * Input: [0,1]\r\n *\r\n * Output: alpha in HEX format\r\n */\r\nexport function alphaToHex(alpha: number) {\r\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\r\n .toString(16)\r\n .padStart(2, '0')\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HEX string.\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\r\n */\r\nexport function rgbaToHexString(color: RGBA, alpha = false) {\r\n const r = color.r.toString(16)\r\n const g = color.g.toString(16)\r\n const b = color.b.toString(16)\r\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\r\n\r\n if (!alpha || color.a === 1) {\r\n return hexString\r\n }\r\n\r\n return `${hexString}${alphaToHex(color.a)}`\r\n}\r\n\r\n/**\r\n * Convert HSVA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\r\n const rgbaColor = hsvaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert HSLA object to HEX string\r\n *\r\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToHexString(color: HSLA, alpha = false) {\r\n const rgbaColor = hslaToRGBA(color)\r\n\r\n return rgbaToHexString(rgbaColor, alpha)\r\n}\r\n\r\n/**\r\n * Convert RGBA color to HSVA\r\n * @see https://stackoverflow.com/a/54070620/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSVA(color: RGBA): HSVA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: v ? c / v : 0,\r\n v: v,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA to HSLA\r\n * @see https://stackoverflow.com/a/54071699/6662683\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n */\r\nexport function rgbaToHSLA(color: RGBA): HSLA {\r\n const r = color.r / 255\r\n const g = color.g / 255\r\n const b = color.b / 255\r\n\r\n const v = Math.max(r, g, b)\r\n const c = v - Math.min(r, g, b)\r\n const f = 1 - Math.abs(v + v - c - 1)\r\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\r\n\r\n return {\r\n h: 60 * (h < 0 ? h + 6 : h),\r\n s: f ? c / f : 0,\r\n l: (v + v - c) / 2,\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSVA color to RGBA\r\n * @see https://stackoverflow.com/a/54024653/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hsvaToRGBA(color: HSVA): RGBA {\r\n const f = (n: number, k = (n + color.h / 60) % 6) => color.v - color.v * color.s * Math.max(Math.min(k, 4 - k, 1), 0)\r\n\r\n return {\r\n r: Math.round(f(5) * 255),\r\n g: Math.round(f(3) * 255),\r\n b: Math.round(f(1) * 255),\r\n a: Math.round(color.a * 100) / 100,\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to RGBA\r\n * @see https://stackoverflow.com/a/54014428/6662683\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function hslaToRGBA(color: HSLA): RGBA {\r\n const a = color.s * Math.min(color.l, 1 - color.l)\r\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\r\n\r\n return {\r\n r: Math.round(f(0) * 255),\r\n g: Math.round(f(8) * 255),\r\n b: Math.round(f(4) * 255),\r\n a: color.a,\r\n }\r\n}\r\n\r\n/**\r\n * Convert RGBA color to rgba() string\r\n *\r\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n *\r\n * Output: rgba(r, g, b, a)\r\n */\r\nexport function rgbaToRGBAString(color: RGBA) {\r\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\r\n}\r\n\r\n/**\r\n * Convert rgba() string to RGBA color\r\n *\r\n * Input: rgba(r, g, b, a)\r\n *\r\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\r\n */\r\nexport function rgbaStringToObject(color: string) {\r\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\r\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\r\n return {\r\n r: Number.parseInt(red),\r\n g: Number.parseInt(green),\r\n b: Number.parseInt(blue),\r\n a: Number.parseFloat(alpha),\r\n }\r\n}\r\n\r\n/**\r\n * Convert HSLA color to hsla() string\r\n *\r\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\r\n *\r\n * Output: hsla(h, s, l, a)\r\n */\r\nexport function hslaToHSLAString(color: HSLA) {\r\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\r\n color.a\r\n })`\r\n}\r\n\r\nexport function removeHashSymbol(strColor: string) {\r\n return strColor.replace(/#/g, '')\r\n}\r\n\r\n/**\r\n * Check if the param is a valid color by setting it as style\r\n */\r\nexport function isValidColor(strColor: string) {\r\n const isRgb = strColor.startsWith('rgba')\r\n const s = new Option().style\r\n\r\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\r\n\r\n return s.color !== ''\r\n}\r\n\r\n/**\r\n * Normalize color to be a hex value\r\n */\r\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\r\n const isRgb = getIsRgb(strColor)\r\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\r\n\r\n if (allowAlpha) {\r\n return hexColor\r\n }\r\n return hexColor.slice(0, 7)\r\n}\r\n\r\n/**\r\n * Returns true if color is rgb or rgba\r\n */\r\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\r\n const rgbKeys = ['rgb']\r\n if (isAlphaAllowed) {\r\n rgbKeys.push('rgba')\r\n }\r\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\r\n}\r\n\r\n/**\r\n * Convert any color format to HSVA (internal color picker representation)\r\n */\r\nexport function getHSVAFromColor(strColor: string) {\r\n if (getIsRgb(strColor)) {\r\n return rgbaToHSVA(rgbaStringToObject(strColor))\r\n }\r\n\r\n return hexStringToHSVA(strColor)\r\n}\r\n\r\n/**\r\n * Stringify HSVA color representation into a output format\r\n */\r\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\r\n switch (output) {\r\n case 'rgba':\r\n return rgbaToRGBAString(hsvaToRGBA(color))\r\n default:\r\n return hsvaToHEXString(color, canSelectAlpha)\r\n }\r\n}\r\n\r\n/**\r\n * Get luma value from RGBA color using the Rec. 709 coefficients\r\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\r\n *\r\n * If luma is >= 165 the foreground color should be dark\r\n */\r\nexport function getLumaFromRGBA(color: RGBA) {\r\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\r\n}\r\n\r\n/**\r\n * Checks if luma is >= 165 or alpha < 0.3\r\n */\r\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\r\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\r\n}\r\n\r\n/**\r\n * Set specific alpha for a hex color\r\n */\r\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\r\n const rgbaColor = hexStringToRGBA(color)\r\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\r\n}\r\n\r\n/**\r\n * Get rgba from valid color string\r\n */\r\nexport function getRGBAValueFromValidColorString(value: string) {\r\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\r\n return rgbaToRGBAString(hexStringToRGBA(value))\r\n}\r\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\r\n// otherwise cursor is set if element exists\r\nexport const setElementCursor = ({\r\n elementId,\r\n cursor,\r\n conditionalCursor,\r\n}: {\r\n elementId: string\r\n cursor: string\r\n conditionalCursor?: string\r\n}) => {\r\n const element = document.getElementById(elementId)\r\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\r\n element.style.cursor = cursor\r\n }\r\n}\r\n","/*\r\n * We want to be able to render only bars/parts of line that are visible to users,\r\n * but without introducing visual artifacts like bars missing in front of users while scrolling\r\n * or lines that start in middle of chart for sparse intraday stock data.\r\n *\r\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\r\n * one bar outside of visible area to create a continuous line.\r\n */\r\nimport type Pane from '../models/pane'\r\nimport type Quote from '../models/quote'\r\nimport { getHalfBarWidth } from './chart'\r\n\r\ninterface IBarToRender {\r\n index: number\r\n isBarVisible: boolean\r\n}\r\n\r\nexport const drawInVisibleArea = ({\r\n drawBarCallback,\r\n fromIndexOffset = 0,\r\n fxOverride,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n toIndexOffset = 0,\r\n width,\r\n}: {\r\n drawBarCallback: (i: number, x: number) => void\r\n fromIndexOffset?: number\r\n fxOverride?: (index: number) => number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n toIndexOffset?: number\r\n width: number\r\n}) => {\r\n const fx = fxOverride ?? ((index: number) => paneModel.scale.x(quote.barIndex[index]))\r\n\r\n // We want to start rendering one bar outside of the visible area for two reasons:\r\n // 1. To create a seamless transition for bars entering/leaving the view, avoiding them from\r\n // abruptly dis/appearing when half the bar is outside.\r\n // 2. To prevent disconnected lines in case there's a bar gap.\r\n // However, if a `fromIndex` is provided and it's higher than the first visible bar,\r\n // we need to start rendering from that specific index. This ensures correct starting\r\n // points for elements like indicators that rely on this value.\r\n const firstBarToRenderIndex = getCompensatedFirstBarToRenderIndex({ quote, paneModel, leftOffset, fromIndexOffset })\r\n\r\n let lastBarToRender = -1\r\n for (let i = firstBarToRenderIndex; i < quote.close.length + toIndexOffset; i++) {\r\n const x = fx(i)\r\n if (x + leftOffset > width) {\r\n lastBarToRender = i\r\n break\r\n }\r\n drawBarCallback(i, x)\r\n }\r\n\r\n if (lastBarToRender > -1) {\r\n const x = fx(lastBarToRender)\r\n drawBarCallback(lastBarToRender, x)\r\n }\r\n}\r\n\r\n/**\r\n * Get first or last visible bar index.\r\n * IMPORTANT: If chartWidth provided return is lastVisibleBarIndex\r\n */\r\nexport function getVisibleBarToRenderIndex({\r\n chartWidth,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n chartWidth?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n const chartModel = paneModel.chart()\r\n\r\n // not all the time there is bar present on barIndex calculated via inverted leftOffset\r\n // there might be a gap between bars, if there is, barToDataIndex on that gap spot will have value of\r\n // previous bar which isn't visible\r\n\r\n const barIndex = Math.round(paneModel.scale.x.invert(-leftOffset + (chartWidth !== undefined ? chartWidth : 0)))\r\n const dataBarIndex = quote.barToDataIndex[Math.min(Math.max(barIndex, 0), quote.barToDataIndex.length - 1)]\r\n const halfBarWidth = getHalfBarWidth(chartModel, false)\r\n\r\n const isBarVisible = Math.round(paneModel.scale.x(quote.barIndex[dataBarIndex]) + halfBarWidth) + leftOffset > 0\r\n\r\n return {\r\n index:\r\n chartWidth === undefined\r\n ? isBarVisible\r\n ? dataBarIndex\r\n : Math.max(Math.min(dataBarIndex + 1, quote.barIndex.length - 1), 0)\r\n : dataBarIndex,\r\n isBarVisible,\r\n }\r\n}\r\n\r\n// Get first bar to render compensated for fromIndexOffset\r\nexport function getCompensatedFirstBarToRenderIndex({\r\n fromIndexOffset = 0,\r\n leftOffset,\r\n paneModel,\r\n quote,\r\n}: {\r\n fromIndexOffset?: number\r\n leftOffset: number\r\n paneModel: Pane\r\n quote: Quote\r\n}) {\r\n return Math.max(0, getVisibleBarToRenderIndex({ quote, leftOffset, paneModel }).index - 1, fromIndexOffset)\r\n}\r\n\r\n/**\r\n * Checks if there are no visible bars between the specified first and last bars to render.\r\n * IMPORTANT: Provided indexes should be without bar gap compensation.\r\n *\r\n * @param {IBarToRender} firstBarToRenderIndex The index of the first bar to render.\r\n * @param {IBarToRender} lastBarToRenderIndex The index of the last bar to render.\r\n * @returns {boolean} True if there are no visible bars between the first and last bars, false otherwise.\r\n */\r\nexport function getAreNoBarsVisible(firstBarToRenderIndex: IBarToRender, lastBarToRenderIndex: IBarToRender): boolean {\r\n return !firstBarToRenderIndex.isBarVisible && !lastBarToRenderIndex.isBarVisible\r\n}\r\n","import queryString from 'query-string'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\n\r\ninterface FetchApiProps {\r\n location: string\r\n queryParameters?: ObjectHash\r\n method?: string\r\n body?: RequestInit['body']\r\n contentType?: ContentType\r\n abortController?: null | AbortController\r\n throwOnStatusCodes?: number[]\r\n throwOnPredicate?: (response: Response) => boolean\r\n keepalive?: boolean\r\n}\r\n\r\nexport const getFormDataFromObject = (object: ObjectHash) =>\r\n Object.keys(object).reduce((formData, key) => {\r\n formData.append(key, object[key])\r\n return formData\r\n }, new FormData())\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nconst fetchApi = async ({\r\n location,\r\n queryParameters,\r\n method,\r\n body,\r\n contentType,\r\n abortController,\r\n throwOnStatusCodes,\r\n throwOnPredicate,\r\n keepalive = false,\r\n}: FetchApiProps) => {\r\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\r\n const parameters: RequestInit = {\r\n method: method || 'GET',\r\n credentials: 'include',\r\n headers: contentType && {\r\n 'Content-Type': contentType,\r\n },\r\n signal: abortController?.signal,\r\n body: body,\r\n keepalive,\r\n }\r\n try {\r\n const response = await fetch(url, parameters)\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\r\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\r\n const StatusCodeError = getStatusCodeError(response.status)\r\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\r\n }\r\n return responseData as T\r\n } catch (err) {\r\n throw err\r\n }\r\n}\r\n\r\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\r\n switch (statusCode) {\r\n case 403:\r\n return ForbiddenError\r\n case 404:\r\n return NotFoundError\r\n case 410:\r\n return GoneError\r\n case 500:\r\n return InternalServerError\r\n default:\r\n return GenericStatusCodeError\r\n }\r\n}\r\n\r\nexport class GenericStatusCodeError extends Error {\r\n response: ObjectHash | string\r\n statusCode: number\r\n\r\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\r\n super(message)\r\n this.response = response\r\n this.statusCode = statusCode\r\n }\r\n}\r\nexport class ForbiddenError extends GenericStatusCodeError {}\r\nexport class NotFoundError extends GenericStatusCodeError {}\r\nexport class InternalServerError extends GenericStatusCodeError {}\r\nexport class GoneError extends GenericStatusCodeError {}\r\n\r\nexport default fetchApi\r\n","import React from 'react'\r\n\r\nexport function useForceUpdate() {\r\n const [forceUpdateKey, increment] = React.useState(0)\r\n const forceUpdate = React.useCallback(() => {\r\n increment((prev) => prev + 1)\r\n }, [])\r\n return { forceUpdate, forceUpdateKey }\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n","export type HLC = {\r\n ts: number\r\n count: number\r\n uuid: string\r\n}\r\n\r\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\r\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\r\n\r\nexport const parseHlc = (serialized: string) => {\r\n const [ts, count, uuid] = serialized.split(':')\r\n return {\r\n ts: Number.parseInt(ts),\r\n count: Number.parseInt(count, 36),\r\n uuid,\r\n }\r\n}\r\n\r\nexport const initHlc = (uuid: string, now: number): HLC => ({\r\n ts: now,\r\n count: 0,\r\n uuid,\r\n})\r\n\r\nexport const compareHlc = (one: HLC, two: HLC) => {\r\n if (one.ts === two.ts) {\r\n if (one.count === two.count) {\r\n if (one.uuid === two.uuid) {\r\n return 0\r\n }\r\n return one.uuid < two.uuid ? -1 : 1\r\n }\r\n return one.count - two.count\r\n }\r\n return one.ts - two.ts\r\n}\r\n\r\nexport const incrementHlc = (local: HLC, now: number): HLC => {\r\n if (now > local.ts) {\r\n return { ts: now, count: 0, uuid: local.uuid }\r\n }\r\n\r\n return { ...local, count: local.count + 1 }\r\n}\r\n\r\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\r\n if (compareHlc(local, remote) >= 0) {\r\n return local\r\n }\r\n return { ...local, ts: remote.ts, count: remote.count }\r\n}\r\n","import { useChartLayoutGlobalModelAsyncModule } from '../controllers/chart-settings/async-modules'\r\nimport { useAsyncModule } from './async-modules-utils'\r\n\r\nexport function useChartLayoutGlobalModelAsync() {\r\n const [useChartLayoutGlobalModelModule] = useAsyncModule({\r\n ...useChartLayoutGlobalModelAsyncModule,\r\n isSuspenseMode: true,\r\n })\r\n return useChartLayoutGlobalModelModule.useChartLayoutGlobalModel()\r\n}\r\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\r\n\r\nimport {\r\n CanvasElementType,\r\n ChartEditorEnum,\r\n ChartElementType,\r\n ChartEventType,\r\n IndicatorType,\r\n LayoutType,\r\n OverlayType,\r\n ScaleType,\r\n SpecificChartFunctionality,\r\n TIMEFRAME,\r\n TextAlign,\r\n TextBaseline,\r\n} from '../app/constants/common'\r\nimport ChartModel from '../app/models/chart'\r\nimport ChartLayout from '../app/models/chart_layout'\r\nimport { IChartThemeColors } from '../app/models/constants'\r\n\r\ninterface ISentry {\r\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\r\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n Sentry: ISentry\r\n FinvizSettings: ObjectHash\r\n FinvizChartsSettings: ObjectHash\r\n globalChartConfig: RootChartConfigObject\r\n isRenderInProgress: boolean | number\r\n rendersInProgress: number[]\r\n FinvizQuoteTypeCurrent: string\r\n handleScriptNotLoaded: () => void\r\n renderScriptNotLoaded: () => void\r\n gtag?: any\r\n }\r\n\r\n interface Document {\r\n fullscreenElement: any\r\n webkitFullscreenElement?: () => void\r\n mozFullScreenElement?: () => void\r\n msFullscreenElement?: () => void\r\n\r\n webkitExitFullscreen?: () => void\r\n mozExitFullScreen?: () => void\r\n msExitFullscreen?: () => void\r\n }\r\n\r\n interface HTMLElement {\r\n webkitRequestFullScreen?: () => void\r\n mozRequestFullScreen?: () => void\r\n msRequestFullscreen?: () => void\r\n }\r\n\r\n interface Navigator {\r\n msMaxTouchPoints: any\r\n }\r\n\r\n interface Array {\r\n last(): T | undefined\r\n }\r\n\r\n interface String {\r\n padLeft(paddingValue: string): string\r\n startsWith(str: string): boolean\r\n }\r\n\r\n type CanvasCache = Partial>\r\n\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n // We need to omit `canvas` because it is read only\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n\r\n interface HTMLCanvasElement {\r\n _cache: CanvasCache\r\n }\r\n\r\n interface ImageBitmapRenderingContext {\r\n _cache: CanvasCache\r\n }\r\n\r\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\r\n}\r\n\r\ndeclare module 'skia-canvas' {\r\n interface CanvasRenderingContext2D {\r\n _cache: CanvasCache\r\n\r\n set>(\r\n key: Key,\r\n value: CanvasRenderingContext2D[Key]\r\n ): void\r\n }\r\n}\r\n\r\nexport type TodoObjectHashAnyType = Record\r\nexport type TodoAreaObject = Record\r\nexport type ObjectHash = Record\r\nexport type EmptyObject = Record\r\n\r\nexport type TodoAnyType = any\r\n\r\nexport type ThumbType = string\r\n\r\nexport type PaneArea = {\r\n mouseDown?: boolean\r\n x: number\r\n y: number\r\n scaled: {\r\n x: number\r\n y: number\r\n }\r\n width: number\r\n height: number\r\n cursorX: number\r\n cursorY: number\r\n isCursorInChartWidthBoundaries: boolean\r\n} & T\r\n\r\nexport type Maybe = T | null | undefined\r\n\r\nexport interface DrawingBorder {\r\n color: string\r\n width: number\r\n}\r\n\r\nexport interface TextAttrs {\r\n text?: string\r\n background: string\r\n border?: { width: number; color: string }\r\n lineWidth?: number\r\n font: {\r\n size: number\r\n family?: string\r\n style?: string\r\n weight?: string\r\n }\r\n fillStyle?: string\r\n strokeStyle?: string\r\n angle?: number\r\n lineHeight: number\r\n textAlign?: TextAlign\r\n textBaseline: TextBaseline\r\n padding: {\r\n top: number\r\n right: number\r\n bottom: number\r\n left: number\r\n }\r\n}\r\n\r\nexport interface Point {\r\n x: number\r\n y: number\r\n}\r\n\r\nexport type RequireByKey = Omit & Required>\r\n\r\nexport interface ResizeByThumbFuncProps {\r\n type: ThumbType\r\n difX: number\r\n difY: number\r\n area: PaneArea\r\n}\r\n\r\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\r\n\r\nexport interface ChartConfigChartPaneElement {\r\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\r\n overlays?: OverlayConfigObject[]\r\n period?: string\r\n code?: string\r\n elementId?: string | null\r\n zIndex?: number\r\n}\r\n\r\nexport interface RendererChartBarProps {\r\n index: number\r\n chartSettingsColors: IChartThemeColors\r\n hasFillAndBorder?: boolean\r\n}\r\n\r\nexport interface ChartConfigChartPane {\r\n elements: ChartConfigChartPaneElement[]\r\n height: number\r\n chart?: ChartConfigObject | ChartModel\r\n}\r\n\r\nexport interface IIdea {\r\n id?: number\r\n date?: string\r\n note: string\r\n}\r\n\r\nexport interface ChartConfigObjectExtended {\r\n editable: boolean\r\n canChangeTicker: boolean\r\n scrollable: boolean\r\n cross: boolean\r\n ideas: boolean\r\n editors: ChartEditorEnum[]\r\n specificChartFunctionality: SpecificChartFunctionality\r\n theme: Theme\r\n layout: LayoutType\r\n uuid?: string\r\n idea?: IIdea\r\n}\r\n\r\nexport interface ChartConfigObject {\r\n width: number\r\n height: number\r\n panes: ChartConfigChartPane[]\r\n premarket: boolean\r\n aftermarket: boolean\r\n dateRange: string | null\r\n hasChartEvents?: boolean\r\n stretch?: boolean\r\n ticker: string\r\n instrument: Instrument\r\n timeframe: TIMEFRAME\r\n chart_layout: ChartLayout\r\n zoomFactor: number\r\n leftOffset: number | null\r\n refreshData: boolean | number\r\n isHideDrawingsActive: boolean\r\n isScrolled?: boolean\r\n scale: ScaleType\r\n}\r\n\r\nexport type RootChartConfigObjectChart = Omit<\r\n ChartConfigObject,\r\n 'chart_layout' | 'leftOffset' | 'zoomFactor' | 'isHideDrawingsActive'\r\n>\r\nexport interface RootChartConfigObject extends Partial {\r\n charts: Array\r\n width: number\r\n height: number\r\n newCharts?: boolean\r\n useGrid?: boolean\r\n}\r\n\r\nexport interface OverlayConfigObject {\r\n color: string\r\n period: string\r\n type: OverlayType\r\n}\r\n\r\nexport enum Instrument {\r\n Stock = 'stock',\r\n Crypto = 'crypto',\r\n MarketSentiment = 'market_sentiment',\r\n Futures = 'futures',\r\n Forex = 'forex',\r\n Group = 'group',\r\n}\r\n\r\nexport enum Theme {\r\n light = 'light',\r\n dark = 'dark',\r\n}\r\n\r\nexport interface IModalConfig {\r\n title: string\r\n inputs: IModalConfigInput[]\r\n inputsErrorMessages: ObjectHash\r\n}\r\nexport interface IOptionType {\r\n value: string | number\r\n label: string\r\n}\r\nexport interface IModalConfigInput {\r\n type: React.HTMLInputTypeAttribute\r\n label: string\r\n name: string\r\n value: number | string\r\n required?: boolean\r\n min?: number\r\n color?: string\r\n step?: number\r\n items?: IOptionType[]\r\n}\r\n\r\n// Keep in sync with config/types/globals.d.ts\r\nexport enum Position {\r\n Above = 'above',\r\n Below = 'below',\r\n}\r\n\r\nexport enum DefaultSpineEvents {\r\n Change = 'change',\r\n Destroy = 'destroy',\r\n Refresh = 'refresh',\r\n Update = 'update',\r\n}\r\n\r\nexport enum CustomSpineEvents {\r\n IndicatorsChange = 'indicatorsChange',\r\n ManualChange = 'manualChange',\r\n}\r\n\r\nexport enum DrawingSpineOptionsEvent {\r\n Remove = 'remove',\r\n}\r\n\r\nexport interface DrawingSpineOptions {\r\n eventType: DrawingSpineOptionsEvent\r\n}\r\n\r\nexport type TodoButtonProps = ObjectHash\r\nexport type TodoButtonTheme = string\r\n"],"names":["Array","prototype","last","this","length","String","padLeft","paddingValue","slice","startsWith","str","indexOf","_callbackCache","Spine","bind","ev","callback","that","cb","record","fkey","id","_len","arguments","rest","_key","push","newCb","origCb","model","unbind","item","findIndex","element","iterable","all","index","el","eql","defaults","enabled","collapsed","duration","timestamp","logErrors","withStackTrace","level","logger","console","filterChanges","attrs","props","Object","keys","constructor","name","errorTransformer","error","titleFormatter","title","time","took","parts","toFixed","join","colors","prevState","action","nextState","pad","num","maxLength","repeat","times","toString","printLogEntry","logEntry","options","startedTime","data","formattedTime","getHours","getMinutes","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","e","log","styles","trace","groupEnd","initialize","window","protoModelLoad","load","started","Date","now","cid","attributes","returnedValue","apply","badgeImages","getSvgImageCacheKey","concat","badgeType","theme","state","ChartEventElement","ElementModel","_defineProperty","initClass","paneModel","configure","belongsTo","getChartEventBadgeImage","cacheKey","badgeImage","isLoaded","image","width","height","async","_ref","onBadgeInitLoad","importWithRetry","chartBadgeSvgByType","chartEventsAsyncModule","importFn","handleImageResolve","values","some","_ref2","undefined","ChartEventBadgeState","forEach","badgeState","ChartEventBadgeType","Theme","svgHTML","CHART_EVENT_BADGE_SIZE","img","Image","src","encodeURIComponent","onload","onerror","captureException","Error","extra","fetchAndCacheChartEventBadges","trigger","getChartEventData","_this$instance$model$","instance","chart","quote","chartEvents","find","stockEvent","elementId","toObject","super","yIndex","toConfig","Indicator","chartModel","Overlay","Chart","Pane","Quote","ChartLayout","DrawingsInternalStore","Element","document","location","hostname","isIPad","Utils","IPAD_FULLSCREEN_CLASS","FullscreenButton","isFullscreen","setIsFullscreen","React","getFullscreenStatus","requestFullscreen","getRequestFullscreen","documentElement","exitFullscreen","getExitFullscreen","onClick","call","checkFullscreen","body","classList","add","remove","addEventListener","removeEventListener","_jsx","Button","leftContent","contentClass","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","useDropdownState","placement","orientation","Dropdown","label","l","_jsxs","className","layout","DropdownItem","appearance","Icon","DropdownSeparator","Paragraph","size","ChartSyncableParts","_ref4","isChartPartInSync","getIsChartPartInSync","active","_window$gtag","_window","setSyncChartParts","gtag","event_label","ThemeToggleButton","isDarkMode","updateAttributes","settings","updateSettings","setCookieRequest","catch","BREAKPOINTS","minWidth","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","_chartLayout$idea","onSettingsOpen","hasPublish","chartLayout","_Fragment","IdeasDropdown","TourButton","page","specificChartFunctionality","Publish","disabled","idea","Time","breakpointMode","breakpoints","ChartLayoutHeader","prevProps","nextProps","StockDetailTimeframeBar","withSuspense","_chartModel$timeframe","_chartModel$dateRange","isDateRangeAvailable","isPremium","isLoadingOverride","isScrollIntoViewEnabled","onTimeframeSelect","onDateRangeSelect","useChartLayoutGlobalModelAsync","chartModelUnwatched","_chartLayoutModel$get","getAllCharts","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","instrument","Instrument","Stock","isLoading","useChartControls","isInteractive","anchorDate","generateChartLayoutRouterPath","timeframeGroupsWithHref","dateRangeGroupsWithHref","isFetching","handleCustomDateRangeValidation","useChartModelCustomDateRangeValues","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","getDateRangeTimeframe","useCustomDateRangeDialog","pathGenerator","dateRangeGroups","customRange","dateRange","timeFrameGroups","TimeframeBar","chartIndex","rounding","isRedesignEnabled","selectedTimeframe","timeframe","selectedDateRange","loadingTimeframe","onCustomDateRangeClick","show","onFavoriteTimeframeToggle","containerElement","isFavoritesEnabled","CustomDateRange","dialogState","dateRangeTimeframe","pushIndicators","panes","indicator","_options$COTs","cotKeys","COTs","code","elements","type","IndicatorType","Cot","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","period","parameters","getChartTypeByTaConfigStyle","style","candlestick","ChartElementType","CandleStick","heikinashi","HeikinAshi","hollowcandlestick","HollowCandleStick","line","LineChart","ohlc","OhlcChart","mergeChartAndTAConfig","chartConfig","taConfig","charts","scale","_chartScaleMap","linear","ScaleType","Linear","percentage","Percentage","logarithmic","Logarithmic","indicators","filter","position","Position","Above","overlays","overlay","_overlay$parameters","_overlay$color","color","Below","getPanes","_overlay$parameters2","_overlay$color2","SettingsTab","SidebarDirection","createAlertAsyncModule","saveToPortfolioAsyncModule","AdsProvider","getAdsProvider","FinvizSettings","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","_window$gtag2","_window2","pathname","query","freestarPageView","_window$freestar","replace","freestar","queue","trackPageview","portfolioWatchlistTableAsyncModule","assets","logo","logo_light","ColorVariant","CheckboxSize","CheckboxComponent","ref","_props$checked","default","checked","defaultChecked","classnames","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","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","MAX_HEIGHT_PROPERTY","POPOVER_HEIGHT_LIMIT_STYLE","maxHeight","usePopoverMaxHeight","maxHeightLimit","hasViewportHeightLimit","offsets","innerHeight","useWindowSize","isWatching","visible","animating","buttonElement","unstable_referenceRef","buttonRect","offsetY","elementMaxHeight","bottom","scrollY","popoverId","getAttribute","popoverWrapper","getElementById","setProperty","DEFAULT_OFFSETS","ContextMenu","menuMaxHeight","items","popperElement","setPopperElement","virtualRef","x","scrollX","y","right","toJSON","getVirtualRef","dropdownState","isFullyClosed","getExtendedDialogState","hasBeenOpen","usePopper","modifiers","offset","popper","ContextMenuDropdown","isStatic","ContextMenuInner","MAX_SAFE_INTEGER","innerState","maxHeightStyle","rightContent","_item$onClick","assign","menu_option","ChartGridCell","gridArea","GridLayout","columns","rows","border","gridTemplateColumns","gridTemplateRows","ChartGrid","defaultValueAccessor","InnerState","asComponent","valueKey","changeKey","valueAccessor","setState","handleChange","ListContext","getSelectedItemIndex","ListItem","activeTheme","onSelectItem","onKeyPress","closeOnSelect","Reakit","itemProps","Boolean","role","BUTTON_DEFAULT_ELEMENT","align","List","selectedIndex","direction","includeBaseStyles","prevSelected","move","closeParent","Provider","child","RangeSize","RangeSlider","step","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","vertical","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","hasRedesignEnabled","horizontal","alternative","Toolbar","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","throttle","originalWidth","offsetWidth","ToolbarButton","_props$appearance","_buttonSettings$size","_props$children","disabledTooltip","isInAction","isInActionProp","iconAction","buttonSettings","isActive","includeRedesign","grow","getButtonThemeSettings","getMainIcon","iconActive","titleActive","Delayed","delay","delayComponent","Spinner","DEFAULT_OFFSET","HOVER_TIMEOUT","useHoverPopover","_settings$unstable_of","_settings$placement","unstable_offset","animated","COMPONENT_ANIMATION_DURATION","modal","showTimeout","hideTimeout","clearTimeouts","showPopover","hidePopover","onMouseOver","onMouseOut","focusOnShow","focusOnHide","finalFocusRef","ariaLabel","hideOnClickOutside","hasBackdrop","onOverlayClick","popoverWrapperStyle","popoverMaxHeight","hasButtonWidthLimit","zIndex","useZIndex","Portal","unstable_autoFocusOnShow","unstable_autoFocusOnHide","unstable_finalFocusRef","onTransitionEnd","onAnimationEnd","innerProps","Box","_props$as","ToolbarGroup","_groupItems$map","defaultItem","groupItems","groupTitle","useNativeSelect","listState","currentId","loop","unstable_virtual","selectedItem","setSelectedItem","groupId","toLocaleLowerCase","isAlternativeTheme","defaultValue","setSelectedIndex","closePopover","newIndex","onItemChange","useList","i","stopPropagation","NativeSelect","ToolbarItem","isItemActive","ToolbarDivider","StepContent","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","target","on","popperOptions","ReactDOM","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","overlayPadding","addSteps","start","TabSpacing","InternalTab","ariaSelected","spacing","content","classNames","Tab","TabList","TabPanel","Tabs","BadgeSize","BadgePadding","Badge","padding","badgePadding","badgeSize","TooltipInputWrapper","tooltipSettings","gutter","tooltip","useTooltipState","TooltipTrigger","focusable","isHideOnClickOutside","onFocus","_children$props$onFoc","_children$props","onBlur","_children$props$onBlu","_children$props2","Tooltip","hideOnHoverOutside","TooltipInputComponent","TooltipInput","useTrackPageView","trackInitial","trackAutomatically","initialRender","handleTrackView","tracking","throttleWaitInMs","setSize","innerWidth","handleResize","cancel","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","Arrow","renderContent","resize","_thumbs","Thumb","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","getChartLayoutSettings","ElementSettings","Colors","context","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","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","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","__","setIsSelected","setIsHovered","isHovered","getIsPaneSelection","_this$model$elements$","pane","selection","attrsSubset","customizer","objValue","srcValue","getIsDrawing","mergewith","cachePointPositionTimestamp","get","defineProperty","globalAlpha","isMouseDown","isEditInProgress","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","heightScaled","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","_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","open","afterHour","isFinite","afterClose","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","Crypto","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","getMinMax","placesAxis","stepPrice","scaleRange","updateAttribute","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","previousTick","positiveScaleY","getYLineText","val","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","_ref8","currentText","getDrawDays","MarketSentiment","textRenderer","startBarIndex","getVisibleBarToRenderIndex","endBarIndex","chartWidth","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","buffer","renderXAxisLabels","_ref9","labels","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","getIsOverlapping","interval","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","barWidth","getBarWidthWithMargin","zoomFactor","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","_ref11","lastDay","lastHours","NaN","hours","_ref12","indexOffset","getBarsInDay","_ref13","lastMonth","_ref14","gridSecondary","isYearLabel","substring","_ref15","lastYear","isJanuary","shouldRenderVolume","getIsIndicatorPresent","Vol","getVolumeTicks","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","_ref16","change","tickerChange","tickerAfterChange","getTickerChange","isOffscreen","isGroupInstrument","finvizWatermarkOffset","changeText","percentString","string","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref17","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","flatMap","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref18","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","XXL","alignTop","renderOHLCToCanvas","_ref19","ohlcSet","isSingleLineWithChange","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isStock","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","smallIndex","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","firstBarToRenderIndex","lastBarToRenderIndex","volumes","getAreNoBarsVisible","addMarginBottom","marginBottom","setOverlays","removeOverlay","splice","MAX_VALUE","MIN_VALUE","prevMin","closestMinMaxIndices","placesLastClose","priceAbs","hasOverlay","chartPage","getCandleLikeChartsRenderingColors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","isRedesignedPage","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","getIsSSr","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","first","redLine","greenLine","MarketSentimentSettings","sum","_data","lastIndex","_dataLastIndex","renderLineBullBear","array","oversold","overbought","isRedesign","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","months","MultiLineChart","ColorsSettings","quotes","getQuotes","tickers","end","asc","_this$data$getDataByB","maxTickerLength","isLastDate","tickersDimensions","closeValue","arrays","q","_this$data","isIdeaId","ideaID","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","hasData","percentageText","lastCrossIndex","_d3$max","fromDate","toDate","filteredQuotes","closes","daysCount","end1","asc1","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXXL","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","ChartEditorEnum","LayoutType","OverlayType","ChartEventDbType","ChartEventType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","gridAreas","DESC","TimeframeLabelShort","DateRangeType","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","QuotePageQueryChartTypes","minutes","days","weeks","MicroTimeframeRange","prev","curr","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","getContainerTypeFromPaneConfig","indicatorElement","getContainerType","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","isChart","updateInternalStoreWithChangedElement","changeType","currentInternalStore","lastUpdateTimestamp","getQuoteRawTicker","containerType","destroyed","instanceJson","newDrawing","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","chartSettingsModule","chartSettingsAsyncModule","onClose","ScrollableChartSettingsPopover","forceGlobalRerender","getIsConfigChanged","confirmationDialogState","checkChangesAndOpenDiscard","discardChangesAndHide","buttonPosition","_popoverContentElemen","popoverContentElement","getState","disclosureElement","chartHeight","_chartElement$clientH","chartElement","clientHeight","minHeight","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","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","fetchedAt","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","barMargin","hasSameBarWidth","hasSameBarMargin","_chartLayoutModel$spe","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","numOfVisibleBars","getVisibleBarsNumber","getChartStartEndDates","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","Timeframe","syncChartParts","hasSyncedTicker","Ticker","_decodedSearch$t$spli","_decodedSearch$t","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r","decodedSearch","urlTickers","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","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","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","handleValuesChange","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","checkValidity","handleCloseDialog","Dialog","isDraggable","onFullyClosed","onHide","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","usePrevious","runInitialSaveAndRefetchUpdate","Off","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","checkDrawingUpdateInterval","setInterval","unregisterListeners","clearInterval","willDestroy","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","ta","ty","taInt","isQuotePage","defaultType","FinvizQuoteTypeCurrent","generateRouterPath","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","nativeSelect","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","ChangeLabel","changePoints","isTiny","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","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","timeframeBarProps","canChangeTicker","hasTimeframe","editors","tools","editable","ideas","compactViewMaxBreakpointPx","publish","contextMenu","selector","forceUpdate","componentDidMount","update","componentWillUnmount","_document$querySelect2","_document$querySelect","shown","querySelector","onContextMenu","ContextMenuComponent","ready","clientY","clientX","ChartEventPopoverWithState","unwatchedChartLayout","isPopoverMounted","chartEventsModule","isChartEventOfThisChart","setData","clickAwayRef","isListening","refCallback","handler","contains","useClickAway","_chartModel$getChartP","chartEvent","popoverShow","popoverHide","newData","getChartEvenBadgeType","PopoverAnchor","store","ZIndexContext","AriakitPortal","autoFocusOnShow","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","getMinMaxLeftOffset","newLeftOffset","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","elementModel","hasProperties","isElementDrawing","makeClone","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","hoveredElement","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","cross","crossRafId","requestAnimationFrame","process","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","getShouldRenderCrossInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","additionalData","Settings","getSettings","areaRectangle","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","cursorX","cursorY","isCursorInChartWidthBoundaries","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","Mouse","isChartsPage","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","CanvasElement","isElementHovered","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","isSelectionCanvas","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","ManualChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance5","_element$instance6","paneHammer","Hammer","paneRef","touchAction","threshold","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","CHART_LAYOUT_CHILD_CHANGE_EVENT","_this$canvasWrapperRe2","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseLeave","onPaneMouseLeave","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","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","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","total","optiMinHeight","minimalPaneHeight","basePane","WrapperComp","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","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","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isToolLoading","ChartAutoSaveNote","onNoteChange","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isAnimating","hideOnEsc","onAction","onCancel","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","urlSearchParams","setUrlSearchParams","useSearchParams","toolbarMobileElement","setToolbarMobileElement","MOBILE_TOOLBAR_DIV_ID","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","_wrapperRef$current","openSelect","actionId","has","SIDEBAR_QUERY_PARAM","params","delete","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishModalModule","publishModalAsyncModule","PublishDialog","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","getChartElementTypeFromResponseType","TA","useChartRouteChange","isIdeasDialogOpen","dateFns","updateChartConfig","_ty","urlType","handleTypeChange","_decodedSearch$r$spli","urlTicker","urlTimeframe","urlDateRange","getInstrument","newChartConfig","getRawTickerForInstrument","updateAttributesAndSync","_chartLayoutModel$ide3","_chartLayoutModel$ide4","exitIdea","_window$FinvizSetting3","defaultPeriod","defaultDateRange","handleIdeaLeave","getUuid","ChartLayoutComponentBase","preserveDrawings","toolsState","handlePreserveDrawingsSettings","setPreserveDrawings","preserveDrawingAbortController","URLSearchParams","tools_state","orientationChangeTimeout","setToolbarPosition","throttledResize","modelAttrs","_this$state","_this$state2","test","getVisualViewportScale","visualViewport","noteDialogState","toggle","drawingToRemove","settingId","newObj","toggleHideDrawings","handleLockDrawings","_this$model$activeCha","updateLayout","modelProperties","isHideDrawingsActive","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","newIsToolbarHorizontal","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","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","parentElement","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","onRegisterChartLayoutModel","getDefaultZoomFactor","OnInitListener","setIsInit","checkIfInitIsComplete","elementIndex","_config$charts$chartI","opacity","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","dark","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","newElements","ChartLayoutModel","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","timeoutDurations","allCharts","timeoutDurationsMin","timeoutId","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","getIdeaUrl","searchObject","isStockOnQute","path","queryString","IdeaItem","onIdeaDeleted","isDeleting","setIsDeleting","isConfirmDelete","setIsConfirmDelete","currentIdea","onDeleteIdeaClick","wasDeleted","fetch","status","newUrl","URL","searchParams","company","IdeasTabs","hasError","setHasError","hasFetched","setHasFetched","categorizedIdeas","setCategorizedIdeas","queryTickers","dateParts","processed","tickerIdeas","categorizeIdeas","fetchIdeas","handleIdeaDeleted","modifiedCategories","categoryIndex","updatedCategory","updatedAll","category","IdeasDialog","hasPadding","dropdownButtonClassName","tooltipState","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","hideTooltip","dropdownItemProps","checkIfAnyQuoteIsLoading","fetchingQuotes","closeOnClick","_layoutModel$idea","activeChartQuote","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","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isIntradayDateRange","isOffScreen","isOffScreenWithNoDateRange","isOffScreenIntradayDateRange","isOffScreenWithFixedBars","isQuotePageWithNoDateRange","isQuotePageIntradayDateRange","isQuotePageWithFixedBars","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","minPx","extendedMin","rounded","fromEntries","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","shouldRenderCross","DEFAULT_WIDTHS","DEFAULT_CONTEXT","activeModule","isCloseVisible","onResize","selectModule","SidebarContext","useSidebarContext","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","description","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","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","getDefaultCalculatedValues","ema","calculate","onValueCalculated","_calculatedValues","calculatedValues","Ema","getAllCalculatedValues","lastNItems","getCalculatedValues","getDbColumnName","_this$options","key1","key2","localeCompare","MAX_POSITIVE_DEFAULT_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","periodInt","getParsedIntegersFromPeriodString","Rvol","Atr","Adx","Aro","Mfi","Perf","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","drawInVisibleAreaProps","fromIndexOffset","getCompensatedFirstBarToRenderIndex","clipHeight","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","areNoBarsVisible","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","AroonCalculation","aroonUp","aroonDown","oscillator","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","AroonOscillator","_this$aroonCalculatio","_this$aroonCalculatio2","_this$aroonCalculatio3","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","FICalculation","fi","ForceIndex","_this$fiCalculation$c2","_this$fiCalculation","_this$fiCalculation$c","fiCalculation","_this$fiCalculation$c3","_this$fiCalculation2","MACDCalculation","macd","histogram","fastPeriod","slowPeriod","signalPeriod","emaFast","emaSlow","emaSignal","MACD","_this$macdCalculation","macdCalculation","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","OBV","_this$obv$last","obv","currentObv","Obv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","getAll","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RsiCalculation","rsi","RSI","_this$rsiCalculation$","rsiCalculation","_this$rsiCalculation$2","_this$rsiCalculation","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","Stofa","StochasticsSlow","Stosl","TrixCalculation","trix","ema1","ema2","ema3","_this$trixCalculation2","_this$trixCalculation3","_this$trixCalculation","trixCalculation","_this$trixCalculation4","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","spineEvents","hasMany","getChartElement","getChartType","_this$getChartElement","defaultRefreshInterval","Default","customRefreshInterval","Elite","isStockFastRefreshAvailable","EliteStocksReduced","Free","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","quotePerf","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","hasOwnProperty","chartParts","isInSync","chartPart","_hasOverlay","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","normalizeHexAlpha","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","_this$instance2","isOverlay","_this$instance3","_this$instance4","_this$instance5","_this$instance6","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_this$mainElement","_this$mainElement2","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","emptyQuote","numberOfRefreshChecks","is404","patternsMinRange","patternsMaxRange","dataId","tickerRaw","shouldUseCache","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","isNotEmptyQuote","isCacheAllowed","hasPatterns","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","maxBars","tickersAndTimeframes","accumulator","fetchRequest","QuoteFetchTypeUrlOption","New","fetchingPromise","getUrl","getIsAbortError","NotFoundError","shouldUseEmptyQuote","_data$ticker","_data$patterns","_data$chartEvents","_this$numberOfRefresh","Newer","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","atts","_this$patterns","drawDays","getBarIndexes","barToDataIndex","_this$barIndex","_chartEvents$map","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","dataIndex","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","host","env","BE_API_URL","rev","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","tickerTimeframeChangeHeight","chartSettings","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","BbCalculation","stdDev","upperBand","lowerBand","deviations","stdDevSum","Bb","getFreeColor","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","bbCalculation","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","topColor","bottomColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","Dch","EMA","_this$attrs$color","EMA2","Ema2","HighLow","highColor","prevHigh","lowColor","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","Hilo","isPositiveFloat","Hline","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","toIndexOffset","fxOverride","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","Ic","IchimokuCloudFull","Icf","KeltnerChannel","emaPeriod","atrPeriod","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","Kch","Patterns","originalScale","barsInDay","aboveBelow","textHS","above","below","supportColor","resistColor","kind","_this$attrs$supportCo","_this$attrs$resistCol","Calculation","PivotPeriod","PivotPoints","calculationType","getPeriodType","week","getIsEnoughData","startIndex","endIndex","periodType","dayGap","startDay","beforeDay","_lastDate","_lastDate2","_lastDate3","calculatedX","fromX","toX","currentDate","previousTradingDay","previousNYMidnightTimestamp","currentMidnight","currentNYMidnightTimestamp","isNonStockFullDay","isStockFullDay","firstDayCurrentWeek","firstDayCurrentWeekTimestamp","firstDayPreviousWeek","firstDayPreviousWeekTimestamp","firstDayCurrentMonth","firstDayCurrentMonthTimestamp","firstDayPreviousMonth","firstDayPreviousMonthTimestamp","firstDayCurrentYear","firstDayCurrentYearTimestamp","firstDayPreviousYear","firstDayPreviousYearTimestamp","pivot","sup1","sup2","sup3","res1","res2","res3","previousHigh","previousLow","pivotPoint","currentX","toBars","nextDate","_this$data$drawMinute","_this$data$drawMinute2","_this$attrs$calculati","Pp","SAR","maxStep","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","Sar","SMACalculation","Sma","SMA","SMA2","Sma2","Supertrend","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","_this$attrs$uptrendCo","_this$attrs$downtrend","Str","VP_COLORS","applyOpacityToColor","VolumeProfile","upColor","downColor","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","Vp","VWapCalculation","vwap","cumulativePV","cumulativeVolume","second","datesAreOnSameDay","Vwap","VWAP","bb","dch","hilo","hline","ic","icf","kch","pp","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getQuoteDateTimestampOffsetInSeconds","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","websiteShared","shouldUseCPUOnly","matchesAndroid","matchesWebOS","matchesiPad","matchesBlackBerry","matchesWindowsPhone","matchesIOSLike","isFirefoxDesktop","getContext","willReadFrequently","_cache","_restore","CanvasRenderingContext2D","getChartEventBadgeColors","outerStroke","innerStroke","innerFill","textFill","getFormattedEventDate","exdate","hasEarningsDateSuffix","parsedDate","formattedDate","formatDateToStringUS","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","twColors","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","halfBarWidthRaw","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","resolve","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","_ref23","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","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","two","local","remote","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel"],"sourceRoot":""}