{"version":3,"file":"3584.f7ce7bf0.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/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/models/chart.ts","webpack://@finviz/website/../charts/app/controllers/chart-events/async-modules.ts","webpack://@finviz/website/../charts/app/models/chart-event-element.ts","webpack://@finviz/website/../charts/app/models/chart_layout.ts","webpack://@finviz/website/../charts/app/utils/hlc.ts","webpack://@finviz/website/../charts/app/models/drawings-internal-store.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/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/utils.ts","webpack://@finviz/website/../charts/app/controllers/autosave/constants.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-autosave-api.tsx","webpack://@finviz/website/../charts/app/utils/string-byte-length.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://@finviz/website/../charts/app/controllers/autosave/use-is-auto-save-active.ts","webpack://@finviz/website/../charts/app/controllers/autosave/with-auto-save.tsx","webpack://@finviz/website/../charts/app/utils/use-prev-state.ts","webpack://@finviz/website/../charts/app/modals/ideas.tsx","webpack://@finviz/website/../charts/app/controllers/header/ideas_dropdown.tsx","webpack://@finviz/website/../charts/app/modals/publish/async-modules.ts","webpack://@finviz/website/../charts/app/controllers/header/publish.tsx","webpack://@finviz/website/../charts/app/controllers/header/tour_button.tsx","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/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/chart-controls.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/constants.ts","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/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-content.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar-tabs.tsx","webpack://@finviz/website/../charts/app/controllers/sidebar/sidebar.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/with-complete-layout-model-init.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/with-quote-polling.tsx","webpack://@finviz/website/../charts/app/controllers/chart_layout/chart_layout_component.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/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/./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/checkbox.tsx","webpack://@finviz/website/./js/main/components/color-picker/draggable.tsx","webpack://@finviz/website/./js/main/components/color-picker/pointer.tsx","webpack://@finviz/website/./js/main/components/color-picker/util.ts","webpack://@finviz/website/./js/main/components/color-picker/alpha.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-palette.tsx","webpack://@finviz/website/./js/main/components/color-picker/hue-saturation.tsx","webpack://@finviz/website/./js/main/components/color-picker/lightness.tsx","webpack://@finviz/website/./js/main/components/color-picker/color-preview.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-input.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker.tsx","webpack://@finviz/website/./js/main/components/color-picker/picker-button.tsx","webpack://@finviz/website/./js/main/components/copy-to-clipboard/copy-to-clipboard.tsx","webpack://@finviz/website/./js/main/components/date-picker/index.tsx","webpack://@finviz/website/./js/main/components/context-menu/context-menu.tsx","webpack://@finviz/website/./js/main/components/grid/grid.tsx","webpack://@finviz/website/./js/main/components/inner-state/inner-state.tsx","webpack://@finviz/website/./js/main/components/range.tsx","webpack://@finviz/website/./js/main/components/toolbar/interfaces.ts","webpack://@finviz/website/./js/main/components/toolbar/hooks.ts","webpack://@finviz/website/./js/main/components/toolbar/toolbar.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-button.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-group.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-item.tsx","webpack://@finviz/website/./js/main/components/toolbar/toolbar-divider.tsx","webpack://@finviz/website/./js/main/components/tour/step-content.tsx","webpack://@finviz/website/./js/main/components/tour/utils.ts","webpack://@finviz/website/./js/main/components/tour/hooks.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/daterange-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/label-with-delayed-spinner.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-select.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/timeframe-bar.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range-utils.ts","webpack://@finviz/website/./js/main/components/timeframe-bar/custom-date-range.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-custom-date-range-dialog.tsx","webpack://@finviz/website/./js/main/components/timeframe-bar/use-favorite-timeframes.tsx","webpack://@finviz/website/./js/main/hooks/use-sync-local-storage.ts","webpack://@finviz/website/./js/main/components/tooltip-input.tsx","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/components/portfolio/async-modules.ts","webpack://@finviz/website/./js/main/services/wait-for-previous-promise.ts","webpack://@finviz/website/./js/main/libs-export.ts","webpack://@finviz/website/./js/main/services/async-modules-utils.tsx","webpack://@finviz/website/./js/main/services/import-with-retry.ts","webpack://@finviz/website/./js/main/services/local-storage.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/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/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/triangle.ts","webpack://@finviz/website/../charts/app/canvas/vertical_line.ts","webpack://@finviz/website/../charts/app/canvas/xabcd.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-settings/async-modules.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/toolbar/interfaces.ts","webpack://@finviz/website/../charts/app/controllers/utils.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/model-hooks/use-model-state.ts","webpack://@finviz/website/../charts/app/models/element.ts","webpack://@finviz/website/../charts/app/utils/async-modules-utils.ts","webpack://@finviz/website/../charts/app/utils/chart-events-utils.ts","webpack://@finviz/website/../charts/app/utils/force-update.ts","webpack://@finviz/website/../charts/app/utils/useChartLayoutGlobalModelAsync.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 { 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 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","export const chartEventsAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"chart-events\" */ './module-entry'),\r\n cacheKey: 'chart-events',\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('../website-shared')\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, { 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 Indicator from '../indicators/indicator'\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 '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 drawingsInternalStore: () => DrawingsInternalStore\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 destroyCascade(options?: TodoObjectHashAnyType) {\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","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 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\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 * as React from 'react'\r\n\r\nimport { InputColorPicker, convertColorToHEX } from '../components'\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 React, { useCallback } from 'react'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport { InputColorPicker, Paragraph, RangeSlider } from '../components'\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 * as React from 'react'\r\n\r\nimport { convertColorToHEX } from '../components'\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 React from 'react'\r\n\r\nimport { Checkbox } from '../components'\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 React, { useCallback, useState } from 'react'\r\n\r\nimport { Checkbox, Input, Select, SelectOption } from '../components'\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 option.value === value.family)?.value}\r\n onChange={(selected: { value: string }) => setValue('family', setFamily, selected.value)}\r\n data-testid=\"chart-modal-font-select\"\r\n >\r\n {FONT_VALUES.map((option) => (\r\n {option.label}\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 * as React from 'react'\r\n\r\nimport { convertColorToHEX } from '../components'\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 React from 'react'\r\n\r\nimport { Textarea } from '../components'\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 React from 'react'\r\n\r\nimport { Input } from '../components'\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 React from 'react'\r\n\r\nimport { Input } from '../components'\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 React from 'react'\r\n\r\nimport { Checkbox, Input, InputColorPicker, convertColorToHEX } from '../components'\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 React from 'react'\r\n\r\nimport { Checkbox, Input, Paragraph } from '../../components'\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 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 { Button, ButtonGroup, Dialog, DialogBody, DialogFooter, DialogHeader, useDialogState } from '../components'\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\n/**\r\n * Dialogs require element to restore focus when closing. Restore focus to the\r\n * currently selected chart or body\r\n */\r\nfunction getElementToFocus(): HTMLElement {\r\n return document.querySelector('.chart.active') ?? document.body\r\n}\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: any\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 finalFocusRef = React.useRef(getElementToFocus())\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 {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 Close\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({ modal: false })\r\n\r\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\r\n if (onSubmit) {\r\n setOnSubmit(() => onSubmit)\r\n }\r\n if (onDismiss) {\r\n setOnDismiss(() => onDismiss)\r\n }\r\n\r\n setElement(element)\r\n dialog.show()\r\n }\r\n\r\n const onHide = () => {\r\n setElement(null)\r\n setOnSubmit(null)\r\n setOnDismiss(null)\r\n }\r\n\r\n return (\r\n \r\n {props.children}\r\n {element && (\r\n \r\n )}\r\n \r\n )\r\n}\r\n","import { ChartConfigChartPane } from '../../../types/shared'\r\nimport { 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 { 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 React from 'react'\r\n\r\nimport { Notification, Paragraph, useNotification } from '../../components'\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 = 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 return () => {\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,\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 omit from 'lodash.omit'\r\nimport queryString from 'query-string'\r\nimport React, { useEffect, useRef, useState } from 'react'\r\n\r\nimport { Instrument, ObjectHash } from '../../types/shared'\r\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader } from '../components'\r\nimport { ChartsOrQuotePageQueryParams, 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 { getInstrument } from '../utils/chart'\r\nimport fetchApi, { getFormDataFromObject } from '../utils/fetch_api'\r\nimport { captureException } from '../utils/helpers'\r\nimport { decodeQueryString } from '../utils/query_string'\r\n\r\ninterface IIdea {\r\n ticker: string\r\n instrument: string\r\n period: string\r\n company?: string\r\n date: string\r\n note: string\r\n id: string\r\n}\r\n\r\nfunction 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\nfunction IdeasList() {\r\n const [hasError, setHasError] = useState(false)\r\n const [hasFetched, setHasFetched] = useState(false)\r\n const [isDeleting, setIsDeleting] = useState(false)\r\n const [ideas, setIdeas] = useState([])\r\n const { i: currentIdea } = decodeQueryString()\r\n\r\n 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 ...idea,\r\n instrument: getInstrument(idea.ticker),\r\n }))\r\n\r\n setIdeas(ideas)\r\n setHasFetched(true)\r\n } catch {\r\n setHasError(true)\r\n }\r\n }\r\n\r\n fetchIdeas()\r\n }, [])\r\n\r\n const onDeleteIdeaClick = useRef(async (idea: IIdea) => {\r\n if (!window.confirm('Do you really want to delete this idea?')) return\r\n\r\n const body = [\r\n ['id', idea.id],\r\n ['ticker', idea.ticker],\r\n ['queryString', document.location.search],\r\n ['locationPathname', document.location.pathname],\r\n ['currentIdea', currentIdea],\r\n ]\r\n .map((row) => row.join('='))\r\n .join('&')\r\n\r\n setIsDeleting(true)\r\n\r\n const response = await fetch('/api/idea_delete.ashx', {\r\n body,\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n method: 'post',\r\n })\r\n\r\n if (currentIdea === String(idea.id)) {\r\n window.location.href = response.url\r\n return\r\n }\r\n\r\n // Check if the page was loaded with the idea which is going to be deleted here\r\n // If that's the case, refresh the page to remove idea data from the page so when user navigates back to idea page it shows idea 404\r\n const configIdeaId = window.FinvizChartsSettings?.ideaChart?.idea?.id ?? window.globalChartConfig?.idea?.id\r\n if (configIdeaId === idea.id) {\r\n window.location.reload()\r\n return\r\n }\r\n\r\n setIdeas((ideas) => ideas.filter((stateIdea) => stateIdea.id !== idea.id))\r\n setIsDeleting(false)\r\n })\r\n\r\n if (!hasFetched || hasError) {\r\n return (\r\n

\r\n {hasError ? 'Unexpected error occured, please refresh the page.' : 'Loading…'}\r\n
\r\n )\r\n }\r\n\r\n if (ideas.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 {ideas.map((idea) => (\r\n (document.location = getIdeaUrl(idea))}\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 \r\n {idea.note !== '' ? (\r\n

{idea.note}

\r\n ) : null}\r\n
\r\n
\r\n \r\n ) => {\r\n ev.stopPropagation()\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\r\nexport function IdeasDialog(props: any) {\r\n return (\r\n \r\n props.state.hide()}>Your ideas\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\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","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n Button,\r\n ButtonComponentProps,\r\n ButtonProps,\r\n DialogTrigger,\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 '../../components'\r\nimport { IdeasDialog, saveIdea } from '../../modals/ideas'\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 \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","export const publishModalAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\r\n cacheKey: 'modals-publish',\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonComponentProps, Delayed, DialogTrigger, Icon, Spinner, useDialogState } from '../../components'\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 [publishModalModule, { isLoading }] = useAsyncModule({\r\n ...publishModalAsyncModule,\r\n shouldLoadModule: dialog.visible,\r\n errorSeverity: 'medium',\r\n onError: () => dialog.hide(),\r\n })\r\n const PublishDialog = publishModalModule?.default\r\n const buttonProps = isLoading\r\n ? ({\r\n leftContent: (\r\n \r\n }\r\n >\r\n \r\n \r\n ),\r\n } as ButtonComponentProps)\r\n : ({\r\n as: DialogTrigger,\r\n state: dialog,\r\n leftContent: 'share',\r\n } as ButtonComponentProps)\r\n\r\n return (\r\n <>\r\n \r\n {PublishDialog && }\r\n \r\n )\r\n}\r\n","import { TourDefinition } from '@finviz/website/js/main/components/tour/types'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonSizeType, ButtonThemeType, Delayed, Icon, Spinner, useTour } from '../../components'\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 { SelectListProps } from '@finviz/website/js/main/components/select/select-list'\r\nimport * as React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { ButtonComponentProps, Icon, Select, SelectOption } from '../../components'\r\nimport ChartLayout from '../../models/chart_layout'\r\nimport { useChartTypes } from './use-chart-types'\r\nimport { TypeBaseOption } from './utils'\r\n\r\nconst isNativeMobileSelect = true // explicitly enable native select for mobile devices\r\n\r\ninterface Props extends Pick {\r\n isPremium: boolean\r\n model: ChartLayout\r\n rounding: SelectListProps['rounding']\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)?.iconName\r\n\r\n React.useEffect(() => {\r\n setSelectedType(currentType)\r\n }, [currentType])\r\n\r\n return (\r\n item.value === selectedType)?.iconName} className=\"text-gray-300\" />\r\n )\r\n }\r\n rightContent={props.theme === 'chip' ? 'caretDown' : undefined}\r\n hasPopoverButtonWidthLimit={false}\r\n isNativeMobileSelect={isNativeMobileSelect}\r\n onChange={(item: TypeBaseOption) => setSelectedType(item.value)}\r\n >\r\n {chartTypes.map((item) => {\r\n const selectOptionProps = item.href\r\n ? ({ as: Link, to: item.href, reloadDocument: !window.FinvizSettings.hasUserPremium } as ButtonComponentProps<\r\n typeof Link\r\n >)\r\n : ({} as ButtonComponentProps)\r\n\r\n return (\r\n \r\n {item.label}\r\n \r\n )\r\n })}\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 classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Paragraph } from '../../components'\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\nimport { withSuspense } from '../../website-shared'\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 * as React from 'react'\r\n\r\nimport { Button, ButtonComponentProps } from '../../components'\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 fetch('/api/set_cookie.ashx?cookie=' + DRAWING_COOKIE_NAME + '&value=' + newValue)\r\n .catch(() => {})\r\n .then((res) => {\r\n if (!res?.ok) {\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\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 * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { Button, ButtonComponentProps } from '../../components'\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 React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogTrigger,\r\n Dropdown,\r\n DropdownItem,\r\n Icon,\r\n Spinner,\r\n Search as WebsiteSearchComponent,\r\n useDialogState,\r\n useDropdownState,\r\n} from '../../components'\r\nimport { useAsyncModule } from '../../utils/async-modules-utils'\r\nimport { createAlertAsyncModule, saveToPortfolioAsyncModule } from '../../website-shared'\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 createAlertDialogState = useDialogState()\r\n const [saveToPortfolioModule, { isLoading: isLoadingSaveToPortfolio }] = useAsyncModule({\r\n ...saveToPortfolioAsyncModule,\r\n shouldLoadModule: saveToPortfolioDialogState.visible,\r\n onError: () => saveToPortfolioDialogState.hide(),\r\n })\r\n const [createAlertModule, { isLoading: isLoadingCreateAlert }] = useAsyncModule({\r\n ...createAlertAsyncModule,\r\n shouldLoadModule: createAlertDialogState.visible,\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 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 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 { PopoverPlacement } from '@finviz/website/js/main/components/popover/types'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport {\r\n Button,\r\n ButtonComponentProps,\r\n Delayed,\r\n Popover,\r\n PopoverTrigger,\r\n Spinner,\r\n getExtendedDialogState,\r\n useElementMeasure,\r\n usePopoverState,\r\n} from '../../components'\r\nimport { SpecificChartFunctionality } from '../../constants/common'\r\nimport {\r\n chartSettingsAsyncModule,\r\n preventClosingUnsavedChangesAsyncModule,\r\n} 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\n\r\nconst SETTINGS_WIDTH = 580 // w-145\r\nconst BUTTON_POPOVER_GUTTER = 16\r\nconst SETTINGS_POPOVER_ID = 'settings-popover'\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\ntype PopoverStylesType = { body?: React.CSSProperties; wrapper?: React.CSSProperties }\r\n\r\nexport function ScrollableChartSettingsPopover({ state, model }: { state: any; model: ChartLayout }) {\r\n const { elementWidth: bodyWidth } = useElementMeasure(document.body)\r\n const [chartSettingsModule] = useAsyncModule({\r\n ...chartSettingsAsyncModule,\r\n shouldLoadModule: state.visible,\r\n errorSeverity: 'medium',\r\n onError: () => state.hide(),\r\n })\r\n const [preventClosingUnsavedChangesModule] = useAsyncModule({\r\n ...preventClosingUnsavedChangesAsyncModule,\r\n shouldLoadModule: state.visible,\r\n errorSeverity: 'medium',\r\n onError: () => state.hide(),\r\n })\r\n\r\n /**\r\n * The reason for this workaround is that the popover with a loader while fetching async modules remounts and resets\r\n * all animations when all async modules are loaded and the popover is rerendered inside PreventClosingUnsavedChanges\r\n * */\r\n const checkForUnsavedChangesAndCloseRef = React.useRef(() => {})\r\n\r\n const { ChartSettings } = chartSettingsModule ?? {}\r\n const { PreventClosingUnsavedChanges } = preventClosingUnsavedChangesModule ?? {}\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n const chartElement = document.getElementById('chart')\r\n const popoverContentElement = document.getElementById(SETTINGS_POPOVER_ID)\r\n const settingsButton: HTMLButtonElement = state.unstable_referenceRef.current\r\n\r\n const popoverStyles = React.useMemo(() => {\r\n const newPopoverStyles: PopoverStylesType = {}\r\n if (!settingsButton || !chartElement) {\r\n return newPopoverStyles\r\n }\r\n const buttonRect = settingsButton.getBoundingClientRect()\r\n const topOffset = buttonRect.top + buttonRect.height\r\n newPopoverStyles.body = {\r\n maxHeight: window.innerHeight - topOffset - BUTTON_POPOVER_GUTTER * 2,\r\n position: 'sticky',\r\n top: -topOffset + BUTTON_POPOVER_GUTTER - window.scrollY,\r\n }\r\n if (!popoverContentElement) {\r\n return newPopoverStyles\r\n }\r\n const chartHeight = chartElement.clientHeight\r\n const popoverContentHeight = popoverContentElement.offsetHeight\r\n const emptySpaceDiff = bodyWidth - model.width\r\n const maxOffset = SETTINGS_WIDTH - buttonRect.width\r\n\r\n let rightOffset = emptySpaceDiff > 150 ? (emptySpaceDiff / 2) * -1 : 0\r\n if (emptySpaceDiff / 2 > maxOffset) rightOffset = maxOffset * -1\r\n\r\n newPopoverStyles.wrapper = {\r\n height: popoverContentHeight < chartHeight ? chartHeight : undefined,\r\n marginRight: rightOffset,\r\n }\r\n\r\n return newPopoverStyles\r\n }, [settingsButton, chartElement, popoverContentElement, model.width, bodyWidth])\r\n\r\n const hasAsyncModules = !!(PreventClosingUnsavedChanges && ChartSettings)\r\n\r\n return (\r\n \r\n {hasAsyncModules ? (\r\n \r\n {({ checkForUnsavedChangesAndClose }) => {\r\n checkForUnsavedChangesAndCloseRef.current = checkForUnsavedChangesAndClose\r\n return !isFullyClosed ? : null\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\ninterface ChartSettingsButtonProps extends Pick {\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-end' })\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: settingsPopoverState.visible,\r\n } as ButtonComponentProps\r\n }, [model, isPremium, settingsPopoverState])\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 classnames from 'classnames'\r\nimport React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport {\r\n ButtonRoundingType,\r\n ButtonSizeType,\r\n CustomDateRange,\r\n Heading,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n} from '../../components'\r\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\r\nimport { useModelState } from '../../model-hooks/use-model-state'\r\nimport Chart from '../../models/chart'\r\nimport { IdeasDropdown } from '../header/ideas_dropdown'\r\nimport { Publish } from '../header/publish'\r\nimport { TourButton } from '../header/tour_button'\r\nimport { ChartTypesSelect } from './chart-type-select'\r\nimport { DailyChangeDisplay } from './daily-change-display'\r\nimport { DrawButton } from './draw-button'\r\nimport { FullscreenButton } from './fullscreen-button'\r\nimport Search from './search'\r\nimport { ChartSettingsButton } from './settings-button'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\ninterface SettingsComponentProps {\r\n chartModel: Chart\r\n chartIndex: number\r\n}\r\n\r\nconst isPremium = window.FinvizSettings.hasUserPremium\r\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\r\n\r\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\r\n const rounding: ButtonRoundingType | undefined = hasRedesignEnabled ? undefined : 'none'\r\n // This memo is required for publish, otherwise it ends up in a loop\r\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\r\n const chartModel = useModelState(unwatchedChartModel, {\r\n watchProperties: ['ticker', 'quote', 'dateRange'],\r\n })\r\n const { instrument } = chartModel?.quote() || {}\r\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n\r\n const navigate = useNavigate()\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: true,\r\n })\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const handleTickerSelect = React.useCallback(\r\n (ticker: string) => {\r\n const upperCaseTicker = ticker.toUpperCase()\r\n\r\n navigate(\r\n generateChartLayoutRouterPath({\r\n ticker: upperCaseTicker,\r\n timeframe: chartModel.timeframe,\r\n dateRange: chartModel.dateRange,\r\n })\r\n )\r\n },\r\n [chartModel, generateChartLayoutRouterPath, navigate]\r\n )\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n const timeframeBarProps = React.useMemo(\r\n () => ({\r\n size: 'medium' as ButtonSizeType,\r\n chartIndex: chartIndex,\r\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\r\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\r\n selectedTimeframe: chartModel.timeframe,\r\n onTimeframeSelect: () => {},\r\n selectedDateRange: chartModel.dateRange,\r\n favoriteTimeframes: favoriteTimeframes,\r\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\r\n onDateRangeSelect: handleDateRangeSelect,\r\n 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 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","export const CHART_LAYOUT_CHILD_CHANGE_EVENT = 'chartLayoutChildChange'\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 React from 'react'\r\nimport * as ReactDOM from 'react-dom'\r\n\r\nimport { ObjectHash } from '../../types/shared'\r\nimport { ContextMenu as ContextMenuComponent } from '../components'\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 classNames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport {\r\n Delayed,\r\n DialogBody,\r\n Popover,\r\n PopoverTrigger,\r\n Spinner,\r\n ZIndexContext,\r\n getExtendedDialogState,\r\n usePopoverState,\r\n} from '../../components'\r\nimport { ChartEventBadgeType } from '../../constants/common'\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\nconst POPOVER_ID = 'badge-popover'\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 { isFullyClosed } = getExtendedDialogState(popoverState)\r\n const [style, setStyle] = React.useState({\r\n top: 0,\r\n left: 0,\r\n })\r\n const [chartEventsModule] = useAsyncModule({\r\n ...chartEventsAsyncModule,\r\n shouldLoadModule: !isFullyClosed,\r\n errorSeverity: 'medium',\r\n onError: () => popoverState.hide(),\r\n })\r\n const elementId = activeChartEvent?.elementId\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.unstable_popoverRef.current\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 (isFullyClosed) {\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 popoverHide()\r\n setStyle({\r\n top,\r\n left,\r\n })\r\n }\r\n if (!popoverState.visible) {\r\n popoverShow()\r\n }\r\n }, [\r\n elementId,\r\n isFullyClosed,\r\n data,\r\n style,\r\n popoverShow,\r\n popoverHide,\r\n popoverState.visible,\r\n activeChartEvent,\r\n chartModel,\r\n isChartEventOfThisChart,\r\n ])\r\n\r\n return (\r\n <>\r\n \r\n {data && !isFullyClosed && (\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","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 React from 'react'\r\n\r\nimport { Button, ButtonGroup, Delayed, Icon, Spinner } from '../../components'\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 classnames from 'classnames'\r\nimport debounce from 'lodash.debounce'\r\nimport React from 'react'\r\n\r\nimport { Button, ButtonGroup, ButtonSizeType, Icon } from '../../components'\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 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 { Button, Notification, NotificationContextType, Paragraph, withNotificationContext } from '../../components'\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\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) {\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 if (type === 'cross' && this.chartLayoutModel.cross) {\r\n if (this.crossRafId === null) {\r\n this.crossRafId = window.requestAnimationFrame(() => {\r\n this.renderCross()\r\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\r\n })\r\n }\r\n } else if (this.rafId == null && this.canvasCtx) {\r\n this.rafId = window.requestAnimationFrame(() => {\r\n this._renderAll()\r\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\r\n })\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?.()) {\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 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?.()) {\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 classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Spinner } from '../../components'\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 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)}\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","import * as React from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\n\r\nimport { DefaultErrorBoundary } from '../../../components'\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 React from 'react'\r\n\r\nimport { Delayed, Spinner } from '../../../components'\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 { 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 classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '../../components'\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', unstable_timeout: 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 {\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 \r\n {value.description}\r\n \r\n \r\n )\r\n })}\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { useNavigate, useSearchParams } from 'react-router-dom'\r\n\r\nimport { Delayed, Spinner } from '../../components'\r\nimport { getIsMobilePortrait } from '../../utils'\r\nimport { localStorage } from '../../website-shared'\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","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 { ToolbarGroupProps } from '@finviz/website/js/main/components/toolbar/toolbar-group'\r\nimport classnames from 'classnames'\r\nimport React from 'react'\r\n\r\nimport { PaneArea } from '../../../types/shared'\r\nimport { Toolbar as ToolbarComponent, ToolbarDivider, ToolbarItem } from '../../components'\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 React from 'react'\r\n\r\nimport { ObjectHash } from '../../../../types/shared'\r\nimport { Textarea } from '../../../components'\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 React from 'react'\r\n\r\nimport { Dialog, DialogBody, DialogHeader } from '../../../components'\r\nimport ChartLayout from '../../../models/chart_layout'\r\nimport { ChartAutoSaveNotes } from './auto-save-notes'\r\n\r\ninterface INoteDialog {\r\n dialogState: any\r\n chartLayoutModel: ChartLayout\r\n}\r\n\r\nexport function AutoSaveNotesDialog({ dialogState, chartLayoutModel }: INoteDialog) {\r\n return (\r\n \r\n dialogState.hide()}>Notes\r\n \r\n {(dialogState.visible || dialogState.animating) && }\r\n \r\n \r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport { Button, ConfirmationDialog as ConfirmationDialogComponent } from '../../components'\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: any\r\n onCancel: () => void\r\n onAction: () => void\r\n isAutosaveDialogContent: boolean\r\n tickers: string[]\r\n}\r\n\r\nexport function ConfirmationDialog({\r\n onCancel,\r\n onAction,\r\n state,\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 React from 'react'\r\n\r\nimport { Button, Icon } from '../../../components'\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 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 { Button } from '../../../components'\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: NodeJS.Timeout | null = null\r\n const newIsVisible = autoSaveState !== AutoSaveState.Saved\r\n\r\n setVisibilityTimeout = 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 React from 'react'\r\n\r\nimport { Textarea } from '../../components'\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 React from 'react'\r\n\r\nimport { getExtendedDialogState, useDialogState } from '../../components'\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 { isFullyClosed } = getExtendedDialogState(dialog)\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: !isFullyClosed,\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 React from 'react'\r\n\r\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader, Paragraph } from '../../components'\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: any\r\n actionCallback: (action: IdeaDrawingsConfirmationOptions) => void\r\n}\r\n\r\nexport function IdeaLeaveDialog({ actionCallback, state }: IIdeaLeaveDialog) {\r\n return (\r\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}\r\n finalFocusRef={{ current: document.body }}\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 * as dateFns from 'date-fns'\r\nimport React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport { useDialogState } from '../../components'\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 { useTrackPageView } from '../../website-shared'\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\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 && dialog.visible) {\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 dialog.show,\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 dialog.hide()\r\n },\r\n [dialog, 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 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 }\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 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 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 Spine from '@finviz/spine'\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 { ChartGrid, ChartGridCell } from '../../components'\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: any\r\n noteDialogState: any\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 handleConfirmationDialogCloseBtn = () => {\r\n this.props.confirmationDialogState.hide()\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.handleConfirmationDialogCloseBtn()\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 React from 'react'\r\n\r\nimport { useDialogState } from '../components'\r\n\r\nexport const withDialogState = (Component: any) => (props: any) => {\r\n const confirmationDialogState = useDialogState()\r\n const noteDialogState = useDialogState({ modal: false })\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 React from 'react'\r\n\r\nimport { RootChartConfigObject } from '../../../types/shared'\r\nimport { NotificationWrapper } from '../../components'\r\nimport { ElementStyleDialogWrapper } from '../../modals/element_style'\r\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\r\nimport { withSuspense } from '../../website-shared'\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","import * as React from 'react'\r\n\r\nimport { Button } from '../../components'\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 * as React from 'react'\r\nimport { useLocation, useNavigate } from 'react-router-dom'\r\n\r\nimport {\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 '../../components'\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 * as React from 'react'\r\n\r\nimport { Button } from '../../components'\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 fetch(`/api/set_cookie.ashx?cookie=chartsTheme&value=${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 * as React from 'react'\r\n\r\nimport { Button, Time, TimeBreakpoint } from '../../components'\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 React from 'react'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport {\r\n ButtonSizeType,\r\n CustomDateRange,\r\n TimeframeBar,\r\n useCustomDateRangeDialog,\r\n useFavoriteTimeframes,\r\n} from '../../components'\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 { withSuspense } from '../../website-shared'\r\nimport { useChartControls } from './use-chart-controls'\r\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\r\n\r\nfunction StockDetailTimeframeBarRaw({\r\n size = 'regular',\r\n className = '!m-0 space-x-2',\r\n isDateRangeAvailable,\r\n isPremium,\r\n isLoadingOverride,\r\n isScrollIntoViewEnabled = false,\r\n onTimeframeSelect = () => {},\r\n onDateRangeSelect = () => {},\r\n}: {\r\n size?: ButtonSizeType\r\n className?: string\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n onTimeframeSelect?: (timeframe: any) => void\r\n onDateRangeSelect?: (timeframe: any) => void\r\n}) {\r\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\r\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\r\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\r\n const chartModel = useModelState(chartModelUnwatched, {\r\n watchProperties: ['timeframe', 'dateRange'],\r\n })\r\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\r\n const { isLoading } = useChartControls({\r\n chartModel,\r\n isInteractive: isDateRangeAvailable,\r\n })\r\n\r\n const {\r\n anchorDate,\r\n generateChartLayoutRouterPath,\r\n timeframeGroupsWithHref,\r\n dateRangeGroupsWithHref,\r\n isFetching,\r\n handleCustomDateRangeValidation,\r\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\r\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\r\n useCustomDateRangeDialog({\r\n instrument,\r\n anchorDate,\r\n pathGenerator: generateChartLayoutRouterPath,\r\n })\r\n\r\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\r\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\r\n\r\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\r\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\r\n if (!dateRangeTimeframe) return\r\n\r\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\r\n if (isValid) onDialogSubmit(dateRangeTimeframe)\r\n }\r\n\r\n return (\r\n <>\r\n {\r\n handleDateRangeSelect(value)\r\n onDateRangeSelect?.(value)\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","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","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 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\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 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 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, PopoverProps, 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 * Hides color picker when clicked outside of popover,\r\n * works with changing focus from the trigger component to another one\r\n *\r\n * @default true\r\n */\r\n hideOnClickOutside: PopoverProps['hideOnClickOutside']\r\n\r\n /**\r\n * Popover overlay click callback, if nothing's provided it calls hide when clicked outside of popover on its overlay\r\n * 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 * 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 hideOnClickOutside = true,\r\n onOverlayClick,\r\n ...props\r\n}: ButtonColorPickerProps) {\r\n const popoverState = usePopoverState()\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: NodeJS.Timeout\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 = setTimeout(() => {\r\n setIsCopied(false)\r\n }, 2000)\r\n }\r\n\r\n return () => {\r\n resetTimer()\r\n }\r\n }, [isCopied])\r\n\r\n return (\r\n
\r\n e.currentTarget.select()}\r\n inputClass=\"h-12\"\r\n data-testid=\"copy-to-clipboard-textarea\"\r\n value={text}\r\n />\r\n
\r\n {bottomLeftContent &&
{bottomLeftContent}
}\r\n \r\n {isCopied ? 'Copied' : 'Copy'}\r\n \r\n
\r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { CalendarProps } from 'react-calendar'\r\n\r\nimport { Box } from '../box'\r\nimport { ZIndexContext, getExtendedDialogState } from '../dialog'\r\nimport { Popover, PopoverTrigger, usePopoverState } from '../popover'\r\nimport { Spinner } from '../spinner'\r\n\r\nconst DatePickerComponent = React.lazy(() => import('./picker'))\r\n\r\ntype RangePickerCallback = (value: [Date, Date], ev: React.ChangeEvent) => void\r\ntype PickerCallback = (value: Date, ev: React.ChangeEvent) => void\r\n\r\ninterface DatePickerProps extends Omit {\r\n /**\r\n * Trigger element for the picker\r\n */\r\n children: JSX.Element\r\n\r\n onChange: PickerCallback | RangePickerCallback\r\n\r\n zIndex?: string\r\n}\r\n\r\nexport function StatelessDatePicker({\r\n state,\r\n children,\r\n zIndex,\r\n ...props\r\n}: DatePickerProps & { state: ReturnType; zIndex?: string }) {\r\n const { isFullyClosed } = getExtendedDialogState(state)\r\n return (\r\n <>\r\n \r\n {(triggerProps: React.HTMLProps) =>\r\n React.Children.map(children, (child) => {\r\n if (React.isValidElement(child))\r\n return React.cloneElement(child, { ...triggerProps, ...(child.props as any) })\r\n })\r\n }\r\n \r\n {!isFullyClosed && (\r\n \r\n \r\n \r\n \r\n \r\n }\r\n >\r\n ) => {\r\n state.hide()\r\n props.onChange?.(value, ev)\r\n }}\r\n />\r\n \r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nexport function DatePicker(props: DatePickerProps) {\r\n const popover = usePopoverState()\r\n\r\n return \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 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 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 { PopoverTrigger, useHoverPopover } from '../popover'\r\nimport { SelectOption } from '../select'\r\nimport { useSelect } from '../select/hooks'\r\nimport { NativeSelect } from '../select/native-select'\r\nimport { SelectList } from '../select/select-list'\r\nimport { useToolbarContext } from './hooks'\r\nimport { IToolbarItem, ToolbarTheme } from './interfaces'\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 { 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 = useSelect(\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={select.onItemChange}\r\n onClick={() => onChange(selectedItem.id, 'select')}\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","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","import * as React from 'react'\r\nimport { Link, To } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { BoxRounding } from '../box'\r\nimport { ButtonHTMLProps, ButtonProps, ButtonSizeType } from '../button'\r\nimport { DropdownSeparator } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { SelectOption, SelectWithTooltip } from '../select'\r\nimport { SelectItem } from '../select/types'\r\n\r\nexport interface DateRangeBaseOption extends SelectItem {\r\n timeframe?: TIMEFRAME\r\n href?: To\r\n withReload?: boolean\r\n}\r\n\r\ninterface Props {\r\n chartIndex: number\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedDateRange: string | null\r\n onDateRangeSelect: (value: DateRange) => void\r\n rounding: keyof typeof BoxRounding\r\n size?: ButtonSizeType\r\n}\r\n\r\nconst DATERANGE_TOOLTIP = 'Range'\r\n\r\nexport function DateRangeSelect({\r\n size,\r\n chartIndex,\r\n dateRangeGroups,\r\n selectedDateRange,\r\n onDateRangeSelect,\r\n rounding,\r\n}: Props) {\r\n const flatDateRanges = React.useMemo(() => dateRangeGroups.flatMap(({ dateRanges }) => dateRanges), [dateRangeGroups])\r\n\r\n const buttonProps = React.useMemo(\r\n () => ({\r\n size,\r\n rounding,\r\n className: '',\r\n rightContent: undefined,\r\n appearance: 'square',\r\n theme: 'chip',\r\n }),\r\n [size, rounding]\r\n )\r\n\r\n const selectWithTooltipListProps = React.useMemo(() => ({ rounding }), [rounding])\r\n\r\n return (\r\n }\r\n tooltipLabel={DATERANGE_TOOLTIP}\r\n active={!!selectedDateRange}\r\n hasPopoverViewportHeightLimit\r\n isNativeMobileSelect={false}\r\n hasPopoverButtonWidthLimit={false}\r\n listProps={selectWithTooltipListProps}\r\n >\r\n {dateRangeGroups.flatMap(({ label, dateRanges }, index) => [\r\n {label},\r\n ...dateRanges.map(({ href, value, label, withReload }) => {\r\n let linkProps = {}\r\n if (href) {\r\n linkProps = {\r\n as: Link,\r\n to: href,\r\n reloadDocument: withReload ?? !FinvizSettings.hasUserPremium,\r\n }\r\n }\r\n return (\r\n \r\n {label}\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\n\r\nimport { Delayed } from '../delayed'\r\nimport { Spinner } from '../spinner'\r\n\r\ninterface Props {\r\n label: React.ReactNode\r\n isLoading: boolean\r\n}\r\n\r\nexport function LabelWithDelayedSpinner({ label, isLoading }: Props) {\r\n return (\r\n <>\r\n {label}\r\n {isLoading && (\r\n
\r\n {label}}>\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 { Link, To } from 'react-router-dom'\r\n\r\nimport { BoxRounding } from '../box'\r\nimport { Button, ButtonHTMLProps, ButtonProps, ButtonSizeType } from '../button'\r\nimport { DropdownSeparator } from '../dropdown'\r\nimport { Icon } from '../icon'\r\nimport { SelectItem, SelectOption, SelectWithTooltip } from '../select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\n\r\nexport type TimeframeBaseOption = SelectItem & {\r\n labelShort?: string\r\n labelPageTitle?: string\r\n href?: To\r\n withReload?: boolean\r\n}\r\n\r\ninterface Props {\r\n chartIndex: number\r\n isCompactView: boolean\r\n isCompactOnly: boolean\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n selectedTimeframe: string\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n rounding: keyof typeof BoxRounding\r\n size?: ButtonSizeType\r\n isLoading?: boolean\r\n isFavoritesEnabled: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nconst TIMEFRAME_TOOLTIP = 'Interval'\r\n\r\nexport function TimeframeSelect({\r\n size,\r\n chartIndex,\r\n timeFrameGroups,\r\n selectedTimeframe,\r\n favoriteTimeframes,\r\n isLoading = false,\r\n isCompactView,\r\n isCompactOnly,\r\n onTimeframeSelect,\r\n onFavoriteTimeframeToggle,\r\n rounding,\r\n isFavoritesEnabled,\r\n theme = 'chip',\r\n}: Props) {\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const buttonProps = React.useMemo(\r\n () => ({\r\n size,\r\n rounding,\r\n rightContent: undefined,\r\n className: '',\r\n theme: theme,\r\n appearance: !isCompactView ? 'square' : undefined,\r\n }),\r\n [size, isCompactView, rounding, theme]\r\n )\r\n\r\n const selectWithTooltipListProps = React.useMemo(() => ({ rounding }), [rounding])\r\n\r\n const getSelectedTimeframeLabel = React.useCallback(() => {\r\n if (isCompactView) {\r\n const selectedTimeframeItem = flatTimeframes.find(({ value }) => value === selectedTimeframe)\r\n return selectedTimeframeItem?.labelShort ?? selectedTimeframeItem?.label\r\n }\r\n return ''\r\n }, [flatTimeframes, isCompactView, selectedTimeframe])\r\n\r\n return (\r\n \r\n } isLoading={isLoading && isCompactView} />\r\n \r\n }\r\n buttonContent={getSelectedTimeframeLabel()}\r\n data-testid={`chart-${chartIndex}-timeframes-select`}\r\n hasPopoverViewportHeightLimit\r\n isNativeMobileSelect={false}\r\n hasPopoverButtonWidthLimit={false}\r\n listProps={selectWithTooltipListProps}\r\n >\r\n {timeFrameGroups.flatMap(({ timeframes }, groupIndex) => [\r\n ,\r\n ...timeframes.map((item) => {\r\n const isIconButtonActive = favoriteTimeframes.includes(item.value)\r\n let linkProps = {}\r\n if (item.href) {\r\n linkProps = {\r\n as: Link,\r\n to: item.href,\r\n reloadDocument: !!item.withReload,\r\n }\r\n }\r\n return (\r\n ) => {\r\n ev.stopPropagation()\r\n ev.preventDefault()\r\n onFavoriteTimeframeToggle(item)\r\n }}\r\n className={classNames('group -mr-2', {\r\n 'text-gray-300': !isIconButtonActive,\r\n 'text-yellow-200': isIconButtonActive,\r\n })}\r\n >\r\n \r\n \r\n \r\n ) : undefined\r\n }\r\n >\r\n {item.label}\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 { Link } from 'react-router-dom'\r\n\r\nimport { useElementMeasure } from '../../hooks/use-element-measure'\r\nimport { BoxRounding } from '../box'\r\nimport { Button, ButtonPadding, ButtonProps, ButtonSize, ButtonSizeType } from '../button'\r\nimport { DateRangeBaseOption, DateRangeSelect } from './daterange-select'\r\nimport { LabelWithDelayedSpinner } from './label-with-delayed-spinner'\r\nimport { TimeframeBaseOption, TimeframeSelect } from './timeframe-select'\r\n\r\ninterface Props {\r\n isPremium?: boolean\r\n chartIndex?: number\r\n compactViewMaxBreakpointPx?: number\r\n timeFrameGroups: Array<{ label: string; timeframes: TimeFrame[] }>\r\n dateRangeGroups: Array<{ label?: string; dateRanges: DateRange[] }>\r\n selectedTimeframe: string\r\n selectedDateRange: string | null\r\n onTimeframeSelect: (value: TimeFrame) => void\r\n onDateRangeSelect: (value: DateRange) => void\r\n favoriteTimeframes: string[]\r\n onFavoriteTimeframeToggle: (value: TimeFrame) => void\r\n size?: ButtonSizeType\r\n loadingTimeframe?: string\r\n rounding?: keyof typeof BoxRounding\r\n isDateRangeAvailable?: boolean\r\n containerElement?: HTMLElement\r\n className?: string\r\n isFavoritesEnabled?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n isTimeframeSelectEnabled?: boolean\r\n isCompactOnly?: boolean\r\n theme?: ButtonProps['theme']\r\n}\r\n\r\nfunction getTimeframeChipElementId({ timeframe, chartIndex }: { timeframe: string; chartIndex: number }) {\r\n return `${chartIndex}-${timeframe}`\r\n}\r\n\r\nfunction getButtonPadding(size: ButtonSize): keyof typeof ButtonPadding {\r\n switch (size) {\r\n case ButtonSize.xxsmall:\r\n case ButtonSize.xsmall:\r\n case ButtonSize.small:\r\n case ButtonSize.regular:\r\n return 'small'\r\n case ButtonSize.medium:\r\n return 'regular'\r\n case ButtonSize.large:\r\n return 'medium'\r\n case ButtonSize.none:\r\n return 'none'\r\n }\r\n}\r\n\r\nexport function TimeframeBar({\r\n isPremium = FinvizSettings.hasUserPremium,\r\n chartIndex = 0,\r\n compactViewMaxBreakpointPx = 400,\r\n timeFrameGroups,\r\n dateRangeGroups,\r\n selectedTimeframe,\r\n selectedDateRange,\r\n favoriteTimeframes,\r\n loadingTimeframe,\r\n onTimeframeSelect,\r\n onDateRangeSelect,\r\n onFavoriteTimeframeToggle,\r\n size,\r\n rounding = 'regular',\r\n isDateRangeAvailable = true,\r\n containerElement,\r\n className,\r\n isFavoritesEnabled = true,\r\n isScrollIntoViewEnabled = true,\r\n isTimeframeSelectEnabled,\r\n isCompactOnly = false,\r\n theme,\r\n}: Props) {\r\n const [scrollWrapperElement, setScrollWrapperElement] = React.useState(null)\r\n const [timeframeButtonsScrollLocation, setTimeframeButtonsScrollLocation] = React.useState({\r\n isOnLeftEdge: true,\r\n isOnRightEdge: true,\r\n })\r\n const { setElementRef, elementWidth } = useElementMeasure(containerElement)\r\n const flatTimeframes = React.useMemo(() => timeFrameGroups.flatMap(({ timeframes }) => timeframes), [timeFrameGroups])\r\n\r\n const timeframesInExpandedPanel = React.useMemo(\r\n () =>\r\n isFavoritesEnabled\r\n ? flatTimeframes.filter(({ value }) => value === selectedTimeframe || favoriteTimeframes.includes(value))\r\n : flatTimeframes,\r\n [flatTimeframes, selectedTimeframe, favoriteTimeframes, isFavoritesEnabled]\r\n )\r\n\r\n const isCompactView =\r\n isCompactOnly || elementWidth < compactViewMaxBreakpointPx || timeframesInExpandedPanel.length <= 1\r\n const checkTimeframeWrapperScrollPosition = React.useCallback(() => {\r\n if (scrollWrapperElement) {\r\n const isOnLeftEdge = scrollWrapperElement.scrollLeft === 0\r\n const isOnRightEdge =\r\n Math.ceil(scrollWrapperElement.offsetWidth + scrollWrapperElement.scrollLeft) >=\r\n scrollWrapperElement.scrollWidth\r\n\r\n if (\r\n timeframeButtonsScrollLocation.isOnLeftEdge !== isOnLeftEdge ||\r\n timeframeButtonsScrollLocation.isOnRightEdge !== isOnRightEdge\r\n ) {\r\n setTimeframeButtonsScrollLocation({ isOnLeftEdge, isOnRightEdge })\r\n }\r\n }\r\n }, [timeframeButtonsScrollLocation, scrollWrapperElement])\r\n\r\n React.useEffect(() => {\r\n checkTimeframeWrapperScrollPosition()\r\n }, [checkTimeframeWrapperScrollPosition, scrollWrapperElement, elementWidth])\r\n\r\n React.useEffect(() => {\r\n if (!isCompactView && isScrollIntoViewEnabled) {\r\n const timeframeElement = document.getElementById(\r\n getTimeframeChipElementId({ chartIndex, timeframe: selectedTimeframe })\r\n )\r\n\r\n if (timeframeElement && scrollWrapperElement) {\r\n const leftOffset =\r\n timeframeElement.offsetLeft + timeframeElement.clientWidth / 2 - scrollWrapperElement.clientWidth / 2\r\n\r\n scrollWrapperElement.scrollTo(Math.max(0, Math.min(leftOffset, scrollWrapperElement.scrollWidth)), 0)\r\n }\r\n }\r\n }, [isCompactView, chartIndex, selectedTimeframe, elementWidth, isScrollIntoViewEnabled, scrollWrapperElement])\r\n\r\n return (\r\n \r\n {(isTimeframeSelectEnabled ?? isFavoritesEnabled) && (\r\n
\r\n \r\n
\r\n )}\r\n {!isCompactView && (\r\n
\r\n \r\n {\r\n /*\r\n * Vertical scrolling doesn't scroll horizontally by default (it's possible when holding shift)\r\n * When using touchpad we may get values in both delatX and deltaY, so if someone's scrolling horizontally we don't want to do anything\r\n * but if they are scrolling vertically (deltaY > deltaX) we want to scroll horizontally the value they would nativally scroll in vertical direction\r\n * */\r\n const absDx = Math.abs(event.deltaX)\r\n const absDy = Math.abs(event.deltaY)\r\n if (absDy > absDx) {\r\n event.currentTarget.scrollLeft += event.deltaY\r\n }\r\n }}\r\n >\r\n {timeframesInExpandedPanel.map((timeframe) => {\r\n let linkProps = {}\r\n if (timeframe.href) {\r\n linkProps = {\r\n as: Link,\r\n to: timeframe.href,\r\n reloadDocument: timeframe.withReload ?? !isPremium,\r\n onClick: () => onTimeframeSelect(timeframe),\r\n }\r\n } else {\r\n linkProps = {\r\n onClick: (ev: React.MouseEvent) => {\r\n ev.preventDefault()\r\n onTimeframeSelect(timeframe)\r\n },\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 )}\r\n {isDateRangeAvailable && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n )\r\n}\r\n","import { type To } from 'react-router-dom'\r\n\r\nimport { decodeQueryString, encodeQueryString } from '../../../app/queryString'\r\nimport { SpecificChartFunctionality, TIMEFRAME } from '../../constants'\r\nimport { DateRangeType, Instrument } from '../../types'\r\nimport { CUSTOM_DATE_RANGE, CustomDateRangePrefixEnum, DATE_RANGE_PREFIX_DELMITER } from './custom-date-range-utils'\r\n\r\ninterface ITimeFrame {\r\n value: TIMEFRAME | 'intraday'\r\n label: string\r\n labelShort: string\r\n labelPageTitle?: string\r\n}\r\n\r\nexport interface ITimeframeGroup {\r\n label: string\r\n timeframes: ITimeFrame[]\r\n}\r\n\r\ninterface IDateRange {\r\n value: string\r\n label: string\r\n timeframe?: TIMEFRAME\r\n}\r\n\r\nexport interface IRangeGroup {\r\n label?: string\r\n dateRanges: IDateRange[]\r\n}\r\n\r\nexport const generateTimeframeGroups = (isPremium = true): ITimeframeGroup[] => {\r\n const premiumTimeframes: ITimeframeGroup[] = [\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.i1, label: '1 Minute', labelShort: '1M' },\r\n { value: TIMEFRAME.i2, label: '2 Minutes', labelShort: '2M' },\r\n { value: TIMEFRAME.i3, label: '3 Minutes', labelShort: '3M' },\r\n { value: TIMEFRAME.i5, label: '5 Minutes', labelShort: '5M' },\r\n { value: TIMEFRAME.i10, label: '10 Minutes', labelShort: '10M' },\r\n { value: TIMEFRAME.i15, label: '15 Minutes', labelShort: '15M' },\r\n { value: TIMEFRAME.i30, label: '30 Minutes', labelShort: '30M' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.h, label: '1 Hour', labelShort: '1H', labelPageTitle: 'Hourly' },\r\n { value: TIMEFRAME.h2, label: '2 Hours', labelShort: '2H' },\r\n { value: TIMEFRAME.h4, label: '4 Hours', labelShort: '4H' },\r\n ],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'D', labelPageTitle: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'W', labelPageTitle: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'M', labelPageTitle: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n const freeTimeframes = [\r\n {\r\n // intradayTimeframe is only for non premium users used as redirect to elite subscription\r\n label: '',\r\n timeframes: [{ value: 'intraday' as const, label: 'Intraday', labelShort: 'Intraday' }],\r\n },\r\n {\r\n label: '',\r\n timeframes: [\r\n { value: TIMEFRAME.d, label: '1 Day', labelShort: 'Daily' },\r\n { value: TIMEFRAME.w, label: '1 Week', labelShort: 'Weekly' },\r\n { value: TIMEFRAME.m, label: '1 Month', labelShort: 'Monthly' },\r\n ],\r\n },\r\n ]\r\n\r\n return isPremium ? premiumTimeframes : freeTimeframes\r\n}\r\n\r\nexport function getTimeframeGroups(isPremium: boolean) {\r\n return generateTimeframeGroups(isPremium)\r\n}\r\n\r\nexport const generateDateRangeGroups = ({\r\n isPremium,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n instrument: Instrument\r\n}): IRangeGroup[] => {\r\n const isStock = instrument === Instrument.Stock\r\n const rangeGroups: Array<{ label?: string; dateRanges: IDateRange[] }> = [\r\n {\r\n label: 'Days',\r\n dateRanges: [\r\n { value: DateRangeType.d1, label: '1 Day', timeframe: isStock ? TIMEFRAME.i1 : TIMEFRAME.i5 },\r\n { value: DateRangeType.d5, label: '5 Days', timeframe: isStock ? TIMEFRAME.i5 : TIMEFRAME.i30 },\r\n ],\r\n },\r\n {\r\n label: 'Months',\r\n dateRanges: [\r\n { value: DateRangeType.m1, label: '1 Month', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m3, label: '3 Months', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.m6, label: '6 Months', timeframe: TIMEFRAME.d },\r\n ],\r\n },\r\n {\r\n label: 'Years',\r\n dateRanges: [\r\n { value: DateRangeType.ytd, label: 'Year to Date', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y1, label: '1 Year', timeframe: TIMEFRAME.d },\r\n { value: DateRangeType.y2, label: '2 Years', timeframe: TIMEFRAME.w },\r\n { value: DateRangeType.y5, label: '5 Years', timeframe: isPremium ? TIMEFRAME.w : TIMEFRAME.m },\r\n { value: DateRangeType.max, label: 'Max', timeframe: TIMEFRAME.m },\r\n ],\r\n },\r\n ]\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroups({\r\n isPremium,\r\n customRange,\r\n isCustomAvailable = true,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n customRange?: string\r\n isCustomAvailable?: boolean\r\n instrument: Instrument\r\n}) {\r\n const rangeGroups = generateDateRangeGroups({ isPremium, instrument })\r\n\r\n if (isPremium && isCustomAvailable !== false) {\r\n const [dateRangePrefix] = customRange?.split(DATE_RANGE_PREFIX_DELMITER) ?? []\r\n rangeGroups.push({\r\n dateRanges: [\r\n {\r\n value:\r\n customRange && Object.values(CustomDateRangePrefixEnum).includes(dateRangePrefix)\r\n ? customRange\r\n : CUSTOM_DATE_RANGE,\r\n label: 'Custom',\r\n },\r\n ],\r\n })\r\n }\r\n\r\n return rangeGroups\r\n}\r\n\r\nexport function getDateRangeGroupsWithHref({\r\n isPremium,\r\n customRange,\r\n generatePath,\r\n withReload,\r\n isCustomAvailable,\r\n instrument,\r\n}: {\r\n isPremium: boolean\r\n isCustomAvailable?: boolean\r\n customRange?: string\r\n withReload?: boolean\r\n instrument: Instrument\r\n generatePath: (dateRange: IDateRange) => To\r\n}) {\r\n return getDateRangeGroups({\r\n isPremium,\r\n isCustomAvailable,\r\n customRange,\r\n instrument,\r\n }).map((dateRangeGroup: IRangeGroup) => ({\r\n label: dateRangeGroup.label,\r\n dateRanges: dateRangeGroup.dateRanges.map((dateRange) => ({\r\n ...dateRange,\r\n href:\r\n !isPremium || Object.values(DateRangeType).includes(dateRange.value as DateRangeType)\r\n ? generatePath(dateRange)\r\n : undefined,\r\n withReload: withReload ?? !isPremium,\r\n })),\r\n }))\r\n}\r\n\r\nconst FREE_PERIODS_STOCK = ['d', 'w', 'm']\r\n\r\nexport function generatePathForTimeframeDateRange({\r\n isPremium,\r\n pathname,\r\n timeframe,\r\n dateRange,\r\n utmCampaign,\r\n freeTimeframes = FREE_PERIODS_STOCK,\r\n dateRangeQueryKey = 'r',\r\n}: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n utmCampaign?: string\r\n freeTimeframes?: string[]\r\n dateRangeQueryKey?: string\r\n}) {\r\n if (isPremium || freeTimeframes.includes(timeframe)) {\r\n return {\r\n pathname,\r\n search: `?${encodeQueryString({\r\n ...decodeQueryString(),\r\n i: undefined,\r\n p: timeframe,\r\n [dateRangeQueryKey]: dateRange ?? undefined,\r\n })}`,\r\n }\r\n }\r\n\r\n return {\r\n pathname: '/elite.ashx',\r\n search: `?${encodeQueryString({\r\n utm_source: 'finviz',\r\n utm_medium: 'banner',\r\n utm_campaign: utmCampaign || window.location.pathname,\r\n })}`,\r\n }\r\n}\r\n\r\nexport const timeframeUtm: Partial> = {\r\n [SpecificChartFunctionality.quotePage]: 'quote-timeframe',\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe',\r\n}\r\n\r\nexport const daterangeUtm: Partial> = {\r\n [SpecificChartFunctionality.futuresPage]: 'futures-timeframe-daterange',\r\n [SpecificChartFunctionality.forexPage]: 'forex-timeframe-daterange',\r\n [SpecificChartFunctionality.cryptoPage]: 'crypto-timeframe-daterange',\r\n}\r\n","import * as dateFns from 'date-fns'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { generateDateRangeGroups } from './utils'\r\n\r\n// **************START**************\r\n// Functions from here until END have to be in sync with\r\n// charts: app/utils/chart-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\nconst DAYS_IN_YEAR = 365\r\n\r\nexport function getCustomStartEndDateRangeUrlParam({ start, end }: { start: Date | null; end: Date | null }) {\r\n const startString = start ? formatDateToStringUS(start) : ''\r\n const endString = end ? formatDateToStringUS(end) : ''\r\n\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Range,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n startString,\r\n CUSTOM_DATE_RANGE_DELIMITER,\r\n endString,\r\n ]\r\n\r\n return stringParts.join('').replace(/\\//g, '-')\r\n}\r\n\r\nexport function getPrevPeriodDateRangeUrlParam({\r\n years,\r\n months,\r\n days,\r\n}: {\r\n years: number\r\n months: number\r\n days: number\r\n}) {\r\n const stringParts = [\r\n CustomDateRangePrefixEnum.Prev,\r\n DATE_RANGE_PREFIX_DELMITER,\r\n years,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n months,\r\n CUSTOM_PREV_RANGE_DELIMITER,\r\n days,\r\n ]\r\n\r\n return stringParts.join('')\r\n}\r\n\r\nexport function getTimeframeForDateRangeType({\r\n dateRange,\r\n isPremium = true,\r\n instrument,\r\n}: {\r\n dateRange: string\r\n isPremium?: boolean\r\n instrument: Instrument\r\n}) {\r\n const dateRanges = generateDateRangeGroups({ isPremium, instrument }).flatMap(({ dateRanges }) => dateRanges)\r\n return dateRanges.find(({ value }) => value === dateRange)?.timeframe ?? null\r\n}\r\n\r\nexport function getTimeframeFromDateRange({\r\n dateRange,\r\n anchorDate,\r\n instrument,\r\n isPremium,\r\n}: {\r\n dateRange: string\r\n anchorDate: Date\r\n instrument: Instrument\r\n isPremium: boolean\r\n}) {\r\n const dateRangeTimeframe = getTimeframeForDateRangeType({ dateRange, instrument })\r\n if (dateRangeTimeframe) {\r\n return dateRangeTimeframe\r\n }\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n const startNyTime = start ?? new Date(0)\r\n const startToReferenceDateNumOfDays = dateFns.differenceInCalendarDays(anchorDate, startNyTime) + 1\r\n const rangeNumOfDays = dateFns.differenceInCalendarDays(end ?? anchorDate, startNyTime) + 1\r\n /**\r\n * DB_BARS_LIMIT - code below is dependent on amount of data we store for specific timeframes\r\n * Search DB_BARS_LIMIT in the project to find other places with such code.\r\n */\r\n if (rangeNumOfDays > 6 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 4 * DAYS_IN_YEAR) {\r\n return isPremium ? TIMEFRAME.w : TIMEFRAME.m\r\n }\r\n\r\n if (rangeNumOfDays > 1.5 * DAYS_IN_YEAR) {\r\n return TIMEFRAME.w\r\n }\r\n\r\n // Keep these values in sync with values in FetchQuoteIntraday in quote.cs\r\n if (instrument === Instrument.Stock) {\r\n if (rangeNumOfDays <= 1 && startToReferenceDateNumOfDays <= 11) {\r\n return TIMEFRAME.i1\r\n }\r\n\r\n if (rangeNumOfDays <= 5 && startToReferenceDateNumOfDays <= 16) {\r\n return TIMEFRAME.i5\r\n }\r\n\r\n if (rangeNumOfDays <= 7 && startToReferenceDateNumOfDays <= 200) {\r\n return TIMEFRAME.i30\r\n }\r\n } else {\r\n if (startToReferenceDateNumOfDays <= 2) {\r\n return TIMEFRAME.i5\r\n }\r\n if (startToReferenceDateNumOfDays <= 7) {\r\n return TIMEFRAME.i30\r\n }\r\n }\r\n\r\n return TIMEFRAME.d\r\n}\r\n","import * as dateFns from 'date-fns'\r\nimport * as React from 'react'\r\n\r\nimport { formatDateToStringUS } from '../../../app/shared/utils'\r\nimport { Button } from '../button'\r\nimport { ButtonGroup } from '../button-group'\r\nimport { DatePicker } from '../date-picker'\r\nimport { Delayed } from '../delayed'\r\nimport { Dialog, DialogBody, DialogFooter, DialogHeader } from '../dialog'\r\nimport { Input } from '../input'\r\nimport { Spinner } from '../spinner'\r\nimport {\r\n CustomDateRangePrefixEnum,\r\n getCustomStartEndDateRangeUrlParam,\r\n getParsedDateRange,\r\n getPrevPeriodDateRangeUrlParam,\r\n parseCustomDateRangeUrlParam,\r\n} from './custom-date-range-utils'\r\n\r\nconst DATA_YEAR_START = 1980\r\nconst DATE_PICKER_MIN_DATE = new Date(`01/01/${DATA_YEAR_START}`)\r\nconst YEARS_MAX_VALUE = new Date().getFullYear() - DATA_YEAR_START\r\n\r\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' } as const\r\n\r\nexport enum CustomRangeType {\r\n StartEnd,\r\n Manual,\r\n}\r\n\r\ninterface StartEndRange {\r\n kind: CustomRangeType.StartEnd\r\n start: Date | null\r\n end: Date | null\r\n}\r\n\r\ninterface ManualRange {\r\n kind: CustomRangeType.Manual\r\n days?: number\r\n months?: number\r\n years?: number\r\n}\r\n\r\nexport type CustomDateRangeType = StartEndRange | ManualRange\r\n\r\ninterface DialogContentProps {\r\n /**\r\n * Dialog state\r\n */\r\n dialogState: any\r\n dateRange?: string\r\n anchorDate: Date\r\n onDialogSubmit: (args: { dateRange: string | null }) => void\r\n isFetching?: boolean\r\n}\r\n\r\nconst DEFAULT_MANUAL_RANGE: ManualRange = {\r\n kind: CustomRangeType.Manual,\r\n days: 0,\r\n months: 0,\r\n years: 0,\r\n}\r\n\r\nconst DEFAULT_START_END_RANGE: StartEndRange = {\r\n kind: CustomRangeType.StartEnd,\r\n start: null,\r\n end: null,\r\n}\r\n\r\nfunction isValidManualRangeState({ years = 0, months = 0, days = 0 }: ManualRange) {\r\n return years + months + days > 0\r\n}\r\n\r\nfunction isValidStartEndRangeState({ start, end }: StartEndRange) {\r\n return !!(start || end)\r\n}\r\n\r\nfunction getDefaultSelectedTab(dateRange?: string) {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return CustomRangeType.StartEnd\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\r\n return CustomRangeType.Manual\r\n }\r\n }\r\n return CustomRangeType.StartEnd\r\n}\r\n\r\nfunction getDefaultSelectedDate({\r\n dateRange,\r\n anchorDate,\r\n}: {\r\n dateRange?: string\r\n anchorDate: Date\r\n}): CustomDateRangeType {\r\n if (dateRange) {\r\n const [dateRangePrefix] = getParsedDateRange(dateRange)\r\n const { start, end } = parseCustomDateRangeUrlParam({ dateRange, anchorDate })\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\r\n return { kind: CustomRangeType.StartEnd, start, end }\r\n }\r\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev && start && end) {\r\n const { years, months, days } = dateFns.intervalToDuration({\r\n start: dateFns.sub(start, { days: 1 }),\r\n end,\r\n })\r\n return { kind: CustomRangeType.Manual, years, months, days }\r\n }\r\n }\r\n\r\n return DEFAULT_START_END_RANGE\r\n}\r\n\r\nexport function CustomDateRange({\r\n dialogState,\r\n dateRange,\r\n anchorDate,\r\n onDialogSubmit,\r\n isFetching,\r\n}: DialogContentProps) {\r\n const [selectedTab, setSelectedTab] = React.useState(getDefaultSelectedTab(dateRange))\r\n\r\n const [state, setState] = React.useState(getDefaultSelectedDate({ dateRange, anchorDate }))\r\n\r\n const { current: onChange } = React.useRef((kind: CustomRangeType, newValue: Partial) => {\r\n setState((prevState) => {\r\n if (kind === CustomRangeType.Manual) {\r\n const defaults = prevState?.kind === CustomRangeType.Manual ? prevState : DEFAULT_MANUAL_RANGE\r\n return { ...defaults, ...newValue } as ManualRange\r\n }\r\n if (kind === CustomRangeType.StartEnd) {\r\n const defaults = prevState?.kind === CustomRangeType.StartEnd ? prevState : DEFAULT_START_END_RANGE\r\n\r\n const newState = { ...defaults, ...newValue }\r\n if (newState.start && newState.end && newState.start.getTime() > newState.end.getTime()) {\r\n const newEnd = new Date(newState.start.getTime())\r\n newState.start = newState.end\r\n newState.end = newEnd\r\n }\r\n return newState\r\n }\r\n return prevState\r\n })\r\n })\r\n\r\n const handleSubmit = (ev: React.FormEvent) => {\r\n ev.preventDefault()\r\n\r\n let dateRange = null\r\n\r\n if (state?.kind === CustomRangeType.StartEnd && isValidStartEndRangeState(state)) {\r\n dateRange = getCustomStartEndDateRangeUrlParam({ start: state.start, end: state.end })\r\n } else if (state?.kind === CustomRangeType.Manual && isValidManualRangeState(state)) {\r\n dateRange = getPrevPeriodDateRangeUrlParam({\r\n days: state.days ?? 0,\r\n months: state.months ?? 0,\r\n years: state.years ?? 0,\r\n })\r\n }\r\n\r\n onDialogSubmit({ dateRange })\r\n }\r\n\r\n const isAbsolute = state?.kind === CustomRangeType.StartEnd\r\n const fromDate = isAbsolute ? state.start : DEFAULT_START_END_RANGE.start\r\n const toDate = isAbsolute ? state.end : DEFAULT_START_END_RANGE.end\r\n\r\n const manualRange = {\r\n ...DEFAULT_MANUAL_RANGE,\r\n ...(state?.kind === CustomRangeType.Manual ? state : {}),\r\n }\r\n\r\n return (\r\n \r\n \r\n Custom Date Range\r\n \r\n
\r\n \r\n \r\n setSelectedTab(CustomRangeType.StartEnd)}\r\n >\r\n Start / End\r\n \r\n setSelectedTab(CustomRangeType.Manual)}\r\n >\r\n Range\r\n \r\n \r\n\r\n {selectedTab === CustomRangeType.StartEnd ? (\r\n
\r\n onChange(CustomRangeType.StartEnd, { start })}\r\n >\r\n \r\n \r\n onChange(CustomRangeType.StartEnd, { end })}\r\n >\r\n \r\n \r\n
\r\n ) : (\r\n
\r\n ) =>\r\n onChange(CustomRangeType.Manual, { years: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { months: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n ) =>\r\n onChange(CustomRangeType.Manual, { days: Number.parseInt(ev.currentTarget.value) })\r\n }\r\n />\r\n
\r\n )}\r\n
\r\n \r\n
\r\n \r\n setState(state.kind === CustomRangeType.Manual ? DEFAULT_MANUAL_RANGE : DEFAULT_START_END_RANGE)\r\n }\r\n >\r\n Reset\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\nimport { To, useNavigate } from 'react-router-dom'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { Instrument } from '../../types'\r\nimport { useDialogState } from '../dialog'\r\nimport { getTimeframeFromDateRange } from './custom-date-range-utils'\r\n\r\ninterface IPathForTimeframeDateRangeProps {\r\n timeframe: TIMEFRAME | 'intraday'\r\n dateRange?: string | null\r\n ticker?: string\r\n}\r\n\r\ninterface IUseCustomDateRangeDialogSubmitProps {\r\n anchorDate?: Date\r\n instrument?: Instrument\r\n shouldReloadOnNavigate?: boolean\r\n pathGenerator?: ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\r\n pathname: string\r\n search: string\r\n }\r\n}\r\n\r\nexport function useCustomDateRangeDialog({\r\n anchorDate,\r\n instrument,\r\n pathGenerator,\r\n shouldReloadOnNavigate = false,\r\n}: IUseCustomDateRangeDialogSubmitProps) {\r\n const navigate = useNavigate()\r\n const customDateRangeDialogState = useDialogState()\r\n\r\n const isPremium = FinvizSettings.hasUserPremium\r\n\r\n const handleDateRangeSelect = React.useCallback(\r\n (\r\n { value, timeframe, href }: { value: string; timeframe?: TIMEFRAME; href?: To },\r\n callback?: ({ value, timeframe, href }: { value: string; timeframe: TIMEFRAME; href?: To }) => void\r\n ) => {\r\n if (!timeframe) {\r\n if (isPremium) {\r\n customDateRangeDialogState.show()\r\n }\r\n return\r\n }\r\n\r\n if (!href && pathGenerator) {\r\n const path = pathGenerator({ timeframe, dateRange: value })\r\n if (shouldReloadOnNavigate) {\r\n window.location.href = `${path.pathname}?${path.search}`\r\n } else {\r\n navigate(path)\r\n }\r\n }\r\n\r\n callback?.({ value, timeframe, href })\r\n },\r\n [navigate, customDateRangeDialogState, isPremium, pathGenerator, shouldReloadOnNavigate]\r\n )\r\n\r\n const getDateRangeTimeframe = React.useCallback(\r\n (dateRange: string | null) => {\r\n if (!anchorDate || !instrument || !dateRange) return null\r\n\r\n return {\r\n value: dateRange,\r\n timeframe: getTimeframeFromDateRange({\r\n dateRange: dateRange!,\r\n anchorDate,\r\n isPremium,\r\n instrument,\r\n }),\r\n }\r\n },\r\n [anchorDate, instrument, isPremium]\r\n )\r\n\r\n const onDialogSubmit = React.useCallback(\r\n ({ value: dateRange, timeframe: newTimeframe }: { value: string; timeframe: TIMEFRAME }) => {\r\n handleDateRangeSelect({\r\n value: dateRange,\r\n timeframe: newTimeframe,\r\n })\r\n customDateRangeDialogState.hide()\r\n },\r\n // We only want `customDateRangeDialogState.hide`, not the whole dialog\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [customDateRangeDialogState.hide, handleDateRangeSelect]\r\n )\r\n\r\n return { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { TIMEFRAME } from '../../constants'\r\nimport { useSyncLocalStorage } from '../../hooks/use-sync-local-storage'\r\n\r\ntype FavoriteTimeframesMap = { [K in TIMEFRAME | 'intraday']?: boolean }\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS = {\r\n [TIMEFRAME.i1]: true,\r\n [TIMEFRAME.i2]: false,\r\n [TIMEFRAME.i3]: true,\r\n [TIMEFRAME.i5]: true,\r\n [TIMEFRAME.i10]: false,\r\n [TIMEFRAME.i15]: true,\r\n [TIMEFRAME.i30]: true,\r\n [TIMEFRAME.h]: true,\r\n [TIMEFRAME.h2]: false,\r\n [TIMEFRAME.h4]: false,\r\n [TIMEFRAME.d]: true,\r\n [TIMEFRAME.w]: true,\r\n [TIMEFRAME.m]: true,\r\n}\r\n\r\nexport const TIMEFRAME_FAVORITE_DEFAULTS_FREE = {\r\n ...TIMEFRAME_FAVORITE_DEFAULTS,\r\n intraday: true,\r\n}\r\n\r\nconst LOCAL_STORAGE_KEY = 'favoriteTimeframesMap'\r\n\r\nexport function useFavoriteTimeframes(isPremium = true) {\r\n const { state, setState } = useSyncLocalStorage(\r\n LOCAL_STORAGE_KEY,\r\n isPremium ? TIMEFRAME_FAVORITE_DEFAULTS : TIMEFRAME_FAVORITE_DEFAULTS_FREE\r\n )\r\n\r\n const toggleFavoriteTimeframe = React.useCallback(\r\n (timeframe: TIMEFRAME | 'intraday') => {\r\n setState((prevState) => ({\r\n ...prevState,\r\n [timeframe]: !prevState[timeframe],\r\n }))\r\n },\r\n [setState]\r\n )\r\n\r\n const favoriteTimeframes = React.useMemo(\r\n () => Object.keys(state).filter((key) => state[key as keyof FavoriteTimeframesMap]),\r\n [state]\r\n )\r\n\r\n return {\r\n favoriteTimeframes: isPremium ? favoriteTimeframes : Object.keys(TIMEFRAME_FAVORITE_DEFAULTS_FREE),\r\n toggleFavoriteTimeframe,\r\n }\r\n}\r\n","import * as React from 'react'\r\n\r\nimport * as storage from '../services/local-storage'\r\n\r\n/**\r\n * Hook to synchronize localStorage.setItem across all components on the page on all open tabs\r\n */\r\nexport function useSyncLocalStorage(storageKey: string, defaultValue: ValueType) {\r\n const [state, setState] = React.useState(storage.getValue(storageKey, defaultValue))\r\n\r\n React.useEffect(() => {\r\n const subscription = storage.subscribeToChanges(storageKey, defaultValue, setState)\r\n\r\n return () => {\r\n subscription.unsubscribe()\r\n }\r\n }, [storageKey, defaultValue])\r\n\r\n const setValue = React.useCallback(\r\n (valueGetter: React.SetStateAction) => storage.setValue(storageKey, valueGetter, defaultValue),\r\n [defaultValue, storageKey]\r\n )\r\n\r\n return {\r\n state,\r\n setState: setValue,\r\n }\r\n}\r\n","import * as React from 'react'\r\nimport * as Reakit from 'reakit/Tooltip'\r\n\r\nimport { getExtendedDialogState } from './dialog'\r\nimport { Input, InputHTMLProps, InputProps } from './input'\r\nimport { Tooltip, TooltipColor, TooltipTrigger, useTooltipState } from './tooltip'\r\n\r\ntype TooltipInputProps = InputProps & InputHTMLProps & { isInteractive?: boolean }\r\n\r\nexport interface TooltipInputWrapperProps extends Pick {\r\n children: React.ReactElement\r\n /**\r\n * Tooltip text content\r\n */\r\n tooltipContent?: React.ReactNode\r\n tooltipColor?: keyof typeof TooltipColor\r\n tooltipSettings?: Reakit.TooltipInitialState\r\n}\r\n\r\nfunction TooltipInputWrapper({\r\n children,\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n name,\r\n}: TooltipInputWrapperProps) {\r\n const tooltip = useTooltipState({ placement: 'bottom', ...tooltipSettings })\r\n const { isFullyClosed } = getExtendedDialogState(tooltip)\r\n\r\n return (\r\n <>\r\n \r\n {children}\r\n \r\n {tooltipContent && !isFullyClosed && (\r\n \r\n {tooltipContent}\r\n \r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction TooltipInputComponent(\r\n {\r\n tooltipContent,\r\n tooltipColor,\r\n tooltipSettings,\r\n isInteractive = true,\r\n ...props\r\n }: 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","export const portfolioWatchlistTableAsyncModule = {\r\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist-table\" */ './PortfolioWatchlistTable'),\r\n cacheKey: 'portfolio-watchlist-table',\r\n}\r\n","/**\r\n * Ignore any subsequent callback calls until the previous callback has finished\r\n */\r\n\r\nexport function waitForPreviousPromise(callback: () => void | Promise) {\r\n let callbackPromise: Promise | void | null = null\r\n\r\n return async function () {\r\n if (callbackPromise !== null) return\r\n\r\n callbackPromise = callback()\r\n await callbackPromise\r\n callbackPromise = null\r\n }\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 { 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 './components/portfolio/async-modules'\r\nexport { useTrackPageView } from './hooks/use-track-pageview'\r\nexport { useAsyncModule, withSuspense } from './services/async-modules-utils'\r\nexport { importWithRetry } from './services/import-with-retry'\r\nexport * as localStorage from './services/local-storage'\r\nexport { waitForPreviousPromise } from './services/wait-for-previous-promise'\r\n\r\nexport const assets = { logo, logo_light }\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\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 shouldLoadModule?: boolean\r\n captureException?: typeof defaultCaptureException\r\n isSuspenseMode?: SuspenseMode\r\n}) {\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 { EventEmitter } from 'events'\r\nimport * as React from 'react'\r\n\r\nlet emitter: EventEmitter | undefined\r\n\r\n/**\r\n * Get the emitter which is used to sync components across the page, subscibe to\r\n * changes and attach event which handles changes across windows\r\n */\r\nexport function subscribeToChanges(\r\n key: string,\r\n defaultValue: ValueType,\r\n changeCallback?: (value: React.SetStateAction) => void\r\n) {\r\n if (!emitter) emitter = new EventEmitter()\r\n\r\n const onChange = (value: React.SetStateAction) => {\r\n const newValue = value ?? getValue(key, defaultValue)\r\n setValue(key, newValue, defaultValue, false)\r\n changeCallback?.(newValue)\r\n }\r\n\r\n const onStorageChange = (ev: StorageEvent) => {\r\n if (ev.key === key) {\r\n try {\r\n const value = ev.newValue ? JSON.parse(ev.newValue) : null\r\n onChange(value ?? defaultValue)\r\n } catch {\r\n onChange(defaultValue)\r\n }\r\n }\r\n }\r\n\r\n emitter.addListener(key, onChange)\r\n window.addEventListener('storage', onStorageChange)\r\n\r\n return {\r\n emitter,\r\n unsubscribe: () => {\r\n emitter?.removeListener(key, onChange)\r\n window.removeEventListener('storage', onStorageChange)\r\n },\r\n }\r\n}\r\n\r\n/**\r\n * Get value from local storage or fall back to `defaultValue`\r\n */\r\nexport function getValue(key: string, defaultValue: ValueType): ValueType {\r\n try {\r\n const value = localStorage.getItem(key)\r\n const parsedValue = value ? JSON.parse(value) : null\r\n return parsedValue ?? defaultValue\r\n } catch {\r\n return defaultValue\r\n }\r\n}\r\n\r\n/**\r\n * Set value to local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function setValue(\r\n key: string,\r\n valueGetter: React.SetStateAction,\r\n defaultValue: ValueType,\r\n emit = true\r\n) {\r\n try {\r\n const state = getValue(key, defaultValue)\r\n const valueToStore = valueGetter instanceof Function ? valueGetter(state) : valueGetter\r\n\r\n localStorage.setItem(key, JSON.stringify(valueToStore))\r\n if (emit) emitter?.emit(key, valueToStore)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Removes value from local storage. Optionally emits the change to all other components\r\n * which are subscribed with the same `key`\r\n */\r\nexport function removeValue(key: string, emit = true) {\r\n try {\r\n localStorage.removeItem(key)\r\n if (emit) emitter?.emit(key, undefined)\r\n } catch {}\r\n}\r\n\r\n/**\r\n * Helper function to migrate old value type to new one (eg. boolean to object)\r\n */\r\nexport function migrateValue(\r\n key: string,\r\n /**\r\n * The migrate function might get called multiple times on the page, so `oldValue` in the callback\r\n * can actually be the already migrated value. Make sure to add a condition to only migrate once.\r\n */\r\n transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue),\r\n defaultValue: NewValue\r\n) {\r\n try {\r\n const oldValue = getValue(key, undefined)\r\n if (typeof oldValue === 'undefined') return\r\n const migratedValue = transformValue instanceof Function ? transformValue(oldValue) : transformValue\r\n setValue(key, migratedValue, defaultValue, false) // don’t emit to other components\r\n } catch {}\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 { 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 }\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) }\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 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.length < 6) {\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.length > 4) {\r\n this._thumbs.splice(4)\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 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 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 = maxCoefficientY\r\n ? Math.min(this.attrs.y1, this.attrs.y2, maxCoefficientY)\r\n : Math.min(this.attrs.y1, this.attrs.y2)\r\n const bottom = maxCoefficientY\r\n ? Math.max(this.attrs.y1, this.attrs.y2, maxCoefficientY)\r\n : 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\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, 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, 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 React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport { Instrument } from '../../../types/shared'\r\nimport {\r\n Notification,\r\n Paragraph,\r\n generatePathForTimeframeDateRange,\r\n getDateRangeGroupsWithHref,\r\n timeframeUtm,\r\n useNotification,\r\n} from '../../components'\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 { type To } from 'react-router-dom'\r\n\r\nimport { IconNameType, getTimeframeGroups } from '../../components'\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 iconName: IconNameType\r\n href?: string\r\n}\r\nexport const DEFAULT_TYPES: TypeBaseOption[] = [\r\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\r\n { iconName: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\r\n { iconName: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\r\n { iconName: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\r\n { iconName: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\r\n]\r\n\r\nexport const FREE_TYPES_QUOTE: TypeBaseOption[] = [\r\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlesticksimple, label: 'Candle - simple' },\r\n { iconName: '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 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","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 { 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 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 getCompensatedFirstBarToRenderIndex,\r\n getFirstBarToRenderIndex,\r\n getLastBarToRenderIndex,\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 quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset: this.leftOffset,\r\n width: this.width,\r\n fromIndexOffset: from,\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 = getFirstBarToRenderIndex({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n }).index\r\n const lastBarToRenderIndex = getLastBarToRenderIndex({\r\n quote: this.data,\r\n scale: this.model.scale,\r\n leftOffset,\r\n chartWidth: this.contentWidth,\r\n }).index\r\n\r\n for (const arr of arrays) {\r\n for (let i = firstBarToRenderIndex; i <= lastBarToRenderIndex; 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 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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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 { 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, ChartSettings } = 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 w = ChartSettings.center.barWidth + ChartSettings.center.border * 2\r\n const { macd, histogram, signal } = this.macdCalculation.calculatedValues\r\n const drawInVisibleAreaProps = {\r\n quote: this.data,\r\n scale: this.model.scale,\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 - ~~(ChartSettings.center.barWidth / 2), y, w, 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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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 scale: this.model.scale,\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","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 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 * as websiteShared from '../website-shared'\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 = (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 shouldLoadModule?: boolean\r\n isSuspenseMode?: SuspenseMode\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 { 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 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 { 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"],"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","ChartEvent","Element","static","ChartEventType","isOpen","left","top","values","super","scale","getBoundingPointKeys","x","y","type","label","getChartEvenBadgeType","Dividends","ChartEventBadgeType","Split","EarningsNeutral","getChartEventModel","chartEventModel","chartEvents","findByAttribute","getXYPosition","bottom","getChartLayoutSettings","ChartSettings","scaled","roundedXY","getRoundedObject","height","CHART_EVENT_BADGE_SIZE","yIndex","getIsVisible","TIMEFRAME","w","m","includes","chart","quote","timeframe","renderContent","context","Math","round","chartLayout","chart_layout","buffer","leftOffset","width","getChartEventBadgeImage","theme","state","chartEvent","ChartEventBadgeState","selected","isHovered","hover","default","badgeType","drawImage","setIsHovered","updateChartEventsZIndexes","trigger","toggleIsOpen","isOpenOverride","isCurrentEventActive","activeChartEvent","elementId","instance","updateAttribute","undefined","isInArea","area","scaledArea","getIsInChartView","ChartEventLabels","Earnings","eventItem","getChartEventData","epsActual","epsEstimate","dateTimestamp","EarningsFuture","EarningsNegative","EarningsPositive","chartEventsByType","freeze","dividends","split","earnings","canvasElements","overlaysByType","indicatorsByType","drawingToolsByType","chartsByType","getCanvasElementByType","elementType","Chart","initClass","paneModel","quoteModel","chartLayoutModel","configure","hasMany","belongsTo","getChartPane","panes","find","pane","elements","some","isChart","getChartElement","getChartType","getRefreshInterval","defaultRefreshInterval","refreshData","QuotePollingIntervalInMs","Default","isStock","instrument","Instrument","Stock","isPremium","FinvizSettings","hasUserPremium","customRefreshInterval","Elite","Utils","isStockFastRefreshAvailable","EliteStocksReduced","Free","max","toObject","map","dateRange","ticker","zoomFactor","stretch","chartId","isHideDrawingsActive","isScrolled","premarket","aftermarket","hasChartEvents","toConfig","omitKeys","omit","destroyCascade","forEach","destroy","getIsDisabled","close","getIsScrollable","scrollable","getAllPanes","getAllValidPanes","cotKeys","COTs","filter","mainElement","IndicatorType","Cot","code","getAllElements","flatMap","getAllQuotes","perfQuotes","_ref","Perf","_ref2","quotes","quotePerfTickers","specificChartFunctionality","SpecificChartFunctionality","quotePerf","perfChart","Quote","select","q","tickers","d","createPaneCascade","paneProperties","create","_ref3","zIndex","fromObject","CustomSpineEvents","IndicatorsChange","chartOrIndicator","getChartOrIndicatorElement","updateAttributes","updateAttributesAndSync","value","attrsInSync","entries","ChartPartToAttrsSyncMap","_ref4","key","getIsChartPartInSync","_ref5","_","modelAttr","getAllCharts","chartModel","newAttrs","hasOwnProperty","setSyncChartParts","chartParts","isInSync","chartPart","getHasPatterns","hasOverlay","getQuoteRawTicker","getRawTicker","setChartEvents","shouldClear","chartPane","allChartEvents","events","_ref6","_ref7","eventType","positionTimestamps","updateScales","chartEventsAsyncModule","importFn","cacheKey","badgeImages","getSvgImageCacheKey","ChartEventElement","ElementModel","badgeImage","isLoaded","image","async","onBadgeInitLoad","importWithRetry","chartBadgeSvgByType","handleImageResolve","badgeState","Theme","svgHTML","img","Image","src","encodeURIComponent","onload","onerror","captureException","Error","extra","fetchAndCacheChartEventBadges","stockEvent","ChartLayout","drawingsInternalStoreModel","getPaneWithSelection","selection","charts","layout","isPreserveDrawingsActive","JSON","parse","stringify","settings","center","general","Colors","editors","editable","newCharts","test","location","pathname","chartPartsToSync","isArray","newSyncedChartParts","syncChartParts","getIsIndicatorPresent","first","isIndicator","getHTMLElementId","exitIdea","ideaID","fetchData","fetchType","QuoteFetchType","Refetch","isIdeaId","idea","initHlc","uuid","ts","count","compareHlc","one","two","incrementHlc","local","receiveHlc","remote","DrawingsInternalStore","latestRemoteUpdateTimestamp","latestLocalUpdateTimestamp","instanceUUID","autoSaveState","getUuid","AutoSaveState","Off","setAutoSaveState","newAutoSaveState","Indicator","Overlay","Pane","document","hostname","BackgroundInput","onChange","_jsx","InputColorPicker","inputDataTestId","toLocaleLowerCase","color","convertColorToHEX","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","currentTarget","handleColorChange","_jsxs","className","children","RangeSlider","rightContent","Paragraph","as","size","Number","BorderInput","min","step","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","family","setFamily","useState","setSize","style","setStyle","weight","setWeight","setValue","valueSetter","Select","items","option","SelectOption","Input","LineInput","MultilineStringInput","required","Textarea","placeholder","target","autoFocus","NumberInput","allowDecimal","pattern","parseFloat","parseInt","StringInput","Trend","active","trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","React","from","setFrom","to","setTo","macroKey","macroLabel","charAt","toUpperCase","_Fragment","disabled","DEFAULTS","MacroTimeframe","minutes","hours","days","weeks","months","INPUTS_AVAILABLE","getInitialState","visibilities","merge","visibility","macroTimeframe","valueMacroTimeframe","getIsVisibilityOutsideAvailableTimeframes","every","macrotimeframe","macroRange","MicroTimeframeRange","isInRange","Visibility","initialVisibilityRef","handleChange","result","handleDisableSubmit","current","TAB_BUTTON_COMMON_PROPS","contentClass","getValuesFromFormState","formState","reduce","acc","cur","DialogTabs","ElementStyleDialog","config","getModalConfig","initialFormStateRef","inputs","setFormState","finalFocusRef","querySelector","body","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","getIsDrawing","isEditInProgress","handleValuesChange","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","set","hide","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","preventDefault","checkValidity","handleCloseDialog","Dialog","isDraggable","onOverlayClick","onHide","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","Button","onClick","input","InputComponent","getInputForType","inputType","stateInput","DialogFooter","animating","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","modal","Provider","openDialog","show","getContainerType","indicatorType","None","getTickersAndContainerTypesInLayoutModel","containerTypes","containerType","getInitialStoreDrawings","initialDrawings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","elementMethod","isDrawing","getNoteElementId","getElementNoteText","noteElement","elementAttrs","text","getTickerNoteText","changeType","lastChange","lastChangeTimestamp","lastChangeCounter","lastChangeNodeUUID","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","notificationContext","useNotification","fetchDrawings","fetchApi","queryParameters","throwOnStatusCodes","drawing","saveDrawings","bodyJsonString","getDBRecordFromAutosaveElement","keepalive","s","n","i","l","hi","charCodeAt","lo","getByteLengthOfString","Sentry","method","contentType","ContentType","ApplicationJson","latestChangeHlc","sort","a","b","InternalServerError","Promise","r","setTimeout","ForbiddenError","GoneError","newTicker","response","message","Notification","actions","timeoutInMs","GenericStatusCodeError","invalidItems","deleteAllDrawings","lastLocalChange","newHlc","useDrawingAutoSaveControls","isAutoSaveActive","useModelState","watchProperties","isInit","getIsPreserveDrawingsAndAutosaveAvailable","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","saveQueueExtraFilterCallback","saveQueue","Unsaved","save","Saving","Saved","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","isCreator","paneDrawing","parsedElementAttrs","toAutosaveConfig","hasOngoingInteraction","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","activeChart","checkDrawingUpdate","isRefetchAll","updatedDrawings","newLastUpdateTimestamp","updatedElementIds","newInternalStore","currentInternalStore","lastUpdateTimestamp","drawingIndex","currentDrawing","currentNote","autoSavedNote","mergeUpdatedDrawingsToInternalStore","allElements","normalizeZIndexes","quotePage","activeTicker","updateInternalStoreWithElement","updateResult","destroyed","instanceJson","newDrawing","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","updateInternalStoreWithChangedElement","deleteAllAutoSavedElements","onElementChange","elementPane","elementContainerType","elementPaneTicker","DrawingSpineOptionsEvent","Remove","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","checkDrawingUpdateInterval","setInterval","clearInterval","getIdeaUrl","period","searchObject","t","p","isQuotePage","isStockOnQute","queryString","ta","IdeasList","hasError","setHasError","hasFetched","setHasFetched","isDeleting","setIsDeleting","ideas","setIdeas","currentIdea","decodeQueryString","useEffect","gtag","event_category","getInstrument","fetchIdeas","onDeleteIdeaClick","useRef","confirm","search","row","fetch","headers","href","url","ideaChart","globalChartConfig","stateIdea","reload","company","date","stopPropagation","IdeasDialog","IdeasDropdown","rounding","dropdownButtonClassName","tooltipState","useTooltipState","placement","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","useDropdownState","hideTooltip","dropdownItemProps","TooltipTrigger","checkIfAnyQuoteIsLoading","fetchingQuotes","isFetching","fetchedAt","visible","Dropdown","leftContent","appearance","DropdownItem","closeOnClick","layoutModel","activeChartQuote","toJSON","LayoutType","barWidth","barMargin","c","layoutModelObjectPanes","tickersString","replace","getChartTickers","array","quotesJsonString","quoteTickersTimeframes","getFormDataFromObject","ideaUrl","open","saveIdea","DialogTrigger","Tooltip","Spinner","classnames","getIsMobileScreenSize","encodeQueryString","utm_source","utm_medium","utm_campaign","publishModalAsyncModule","Publish","publishModalModule","isLoading","useAsyncModule","shouldLoadModule","errorSeverity","onError","PublishDialog","buttonProps","Delayed","delayComponent","Icon","TourButton","page","tour","useTour","pageTours","steps","getRequestFullscreen","documentElement","chartPage","overlayPadding","isRedesignEnabled","Boolean","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","isNativeMobileSelect","ChartTypesSelect","chartTypes","getCurrentType","useLocation","ty","taInt","defaultType","QuoteShortToLongType","FinvizQuoteTypeCurrent","QuoteNodeChartTypes","candlestick","candlesticksimple","generateRouterPath","FREE_TYPES_QUOTE_VALUES","QuoteLongToShortType","DEFAULT_TYPES","FREE_TYPES_QUOTE","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","icon","iconName","listProps","hasPopoverButtonWidthLimit","selectOptionProps","Link","_createElement","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","ChangeLabel","changePoints","isTiny","DailyChangeDisplay","withSuspense","chartIndex","useChartLayoutGlobalModelAsync","listenOnEvents","tickerChange","getTickerChange","math","getInstrumentDecimalPlaces","lastClose","tickerAfterChange","points","string","prevProps","nextProps","utmCampaign","futuresPage","forexPage","cryptoPage","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","catch","then","res","ok","expires","setMonth","getMonth","utils","setCookie","getLayoutType","tickersCount","FullscreenButton","urlTickers","Search","onTickerSelected","dropdownState","saveToPortfolioDialogState","createAlertDialogState","saveToPortfolioModule","isLoadingSaveToPortfolio","saveToPortfolioAsyncModule","createAlertModule","isLoadingCreateAlert","createAlertAsyncModule","SaveToPortfolio","CreateAlert","detailLink","formattedTicker","Futures","Forex","Crypto","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","onClose","SETTINGS_WIDTH","BUTTON_POPOVER_GUTTER","SETTINGS_POPOVER_ID","ScrollableChartSettingsPopover","elementWidth","bodyWidth","useElementMeasure","chartSettingsModule","chartSettingsAsyncModule","preventClosingUnsavedChangesModule","preventClosingUnsavedChangesAsyncModule","checkForUnsavedChangesAndCloseRef","PreventClosingUnsavedChanges","isFullyClosed","getExtendedDialogState","chartElement","getElementById","popoverContentElement","settingsButton","unstable_referenceRef","popoverStyles","newPopoverStyles","buttonRect","getBoundingClientRect","topOffset","maxHeight","innerHeight","position","scrollY","chartHeight","clientHeight","popoverContentHeight","offsetHeight","emptySpaceDiff","maxOffset","rightOffset","wrapper","marginRight","hasAsyncModules","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","checkForUnsavedChangesAndClose","ChartSettingsButton","settingsPopoverState","usePopoverState","PopoverTrigger","focusRing","getQuoteRequestKey","useChartControls","unwatchedChartModel","isInteractive","navigate","useNavigate","chartModelRef","modelRef","useModelRef","setIsLoading","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","isSameTicker","getLeftOffset","chartQuote","NewerData","getAllChartEvents","isChartEvent","fetchQuote","patterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","get","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","hasSameBarWidth","IndicatorSettings","hasSameBarMargin","hasRedesignEnabled","ChartControls","favoriteTimeframes","toggleFavoriteTimeframe","useFavoriteTimeframes","anchorDate","generateChartLayoutRouterPath","timeframeGroupsWithHref","dateRangeGroupsWithHref","handleCustomDateRangeValidation","useChartModelCustomDateRangeValues","onDialogSubmit","customDateRangeDialogState","handleDateRangeSelect","getDateRangeTimeframe","useCustomDateRangeDialog","pathGenerator","handleTickerSelect","upperCaseTicker","handleCustomRangeSubmit","dateRangeTimeframe","timeframeBarProps","timeFrameGroups","dateRangeGroups","customRange","selectedTimeframe","onTimeframeSelect","selectedDateRange","loadingTimeframe","onDateRangeSelect","isFavoritesEnabled","onFavoriteTimeframeToggle","canChangeTicker","TimeframeBar","CustomDateRange","dialogState","hasTimeframe","ChartEditorEnum","Heading","tools","compactViewMaxBreakpointPx","grow","publish","CHART_LAYOUT_CHILD_CHANGE_EVENT","ContextMenu","contextMenu","selector","componentDidMount","update","componentWillUnmount","forceUpdate","render","shown","classList","remove","onContextMenu","ContextMenuComponent","add","ready","ReactDOM","event","clientY","pageYOffset","clientX","ChartEventPopoverWithState","unwatchedChartLayout","popoverState","chartEventsModule","isChartEventOfThisChart","setData","clickAwayRef","isListening","refCallback","isMobile","handler","contains","addEventListener","removeEventListener","useClickAway","unstable_popoverRef","popoverShow","popoverHide","newData","ZIndexContext","tabIndex","hasBackdrop","classNames","focusOnShow","hasViewportHeightLimit","ChartEventPopoverContent","LoadLatestDataButton","chartModelUnwatched","getIsMounted","isMountedRef","useIsMounted","hasNewDataAvailable","setHasNewDataAvailable","isPossibleToFetchSequentialData","hasNewData","promises","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","rafId","crossRafId","paneRef","scalerRef","zoomerRef","canvasWrapperRef","canvasRef","crossCanvasRef","paneHammer","scalerHammer","zoomerHammer","canvasWrapperHammer","mouseDown","lastClientX","lastClientY","currentViewRange","lastX","lastY","lastActiveTool","scalerLastY","isElementHovered","hoveredElement","isDisableTouchCrossAvailable","canvas","canvasCtx","crossCanvas","crossCanvasCtx","isIndicatorPane","hasSeenCrossNotification","localStorage","getItem","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","recountScale","ManualChange","onChartUpdate","activeTool","MouseModel","getIsIndicatorPane","renderAll","renderCross","initialStoreDrawings","cachePointPositionTimestamp","getContextWithCache","Hammer","touchAction","threshold","on","onPress","onTouchMove","passive","onScalerReset","onZoomerReset","onDoubleClick","unmountCanvas","touchEventsDisabled","onPaneClick","paneIndex","getIsHammerAllowScrollActive","isChartPane","getIsChartPane","onMouseMove","onPaneMouseMove","onMouseLeave","onPaneMouseLeave","onTouchStart","onMouseDown","onResizerMouseDown","initialScrollable","onScalerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","DrawingTool","Mouse","onAddToZoomFactor","diff","shouldCalculateRightAlign","onCanvasInteractionStart","onCanvasInteractionMove","onTouchEnd","onBlur","getChartAlt","cross","isTouchCrossActive","oldElementInstance","isDrawingModeContinuousActive","setSelection","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","getArea","onMouseMoveOnScrolling","activeChartInteraction","TouchEvent","targetTouches","dif","addToLeftOffset","scaleRange","difY","ScaleType","Logarithmic","invert","getMinMax","onScalerTouchMove","onScalerMouseMove","onScalerTouchEnd","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","currentDomainMax","currentDomainMin","domain","originalMinMax","currentDiff","abs","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","barIndex","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","thumbsAreInArea","elementModel","hasProperties","isElementDrawing","makeClone","setVisibilityTo","SetVisibilityTo","currentAndAbove","currentAndBelow","currentOnly","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","element_type","updateType","getIsCreator","getIsCreatorDialogOpen","requestAnimationFrame","_renderAll","getIsUpdatedDesign","renderPane","isCharts","isRedesignedFuturesForexCrypto","isRedesignedPage","isMouseInPane","getShouldRenderCrossInPane","clearRect","isCrossDisabled","PaneModel","elementInstance","renderCrossText","NaN","restore","additionalData","Settings","getSettings","areaRectangle","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","right","cursorX","cursorY","isCursorInChartWidthBoundaries","ratio","getScaleRatio","canvasElement","setSizeOnCanvasElement","smallIndex","isChartsPage","setState","setItem","inline","_this","isMouseDownIgnored","zoomControls","paneHeight","touchEvent","setMousePosition","getMousePositionInBoundaries","isTouch","getIsChartEvent","onCanvasInteractionEnd","Touch","isPrimaryClick","setElementCursor","cursor","CanvasElement","activeThumb","moveBy","isSelected","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","getValueInRange","isSameMouseModel","setIsSelected","isSelectionCanvas","getCanvasDOMNode","withNotificationContext","Component","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","lastWidth","mouseWheelTimeout","setStateWithPanesTimeout","lastHeight","resizerPaneIndex","minimalPaneHeight","zoomerRightAlign","onLayoutModelChange","panesWrapperElement","onPaneCreate","calculateMinimalPaneHeight","handleQuoteChange","onModelChange","onOlderDataLoaded","onDataLoaded","componentDidUpdate","isWheelZoomEnabled","handleSetPanesWrapperRef","renderChartToolbar","showSettings","resetMouseModel","onPinchStart","onWheel","onMouseWheel","addToZoomFactor","calcZoomerRightAlign","activePane","paneId","chartModelParam","panesHeight","sum","newPaneHeight","isNaN","newChartPaneHeight","newIsScrolled","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","minHeight","total","optiMinHeight","floor","basePane","touches","onZoomerTouchMove","onZoomerTouchEnd","onZoomerMouseUp","getRawDistance","p1","p2","distance","onPinchMove","onPinchEnd","fx","currentLeftOffset","isIntraday","getBarIndex","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","offset","normalizeWheelDeltaY","deltaY","sign","isMouseWheel","difX","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","numOfVisibleBars","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","getIsSmallIndexChart","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","isMouseDown","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","overlays","overlay","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isChartPage","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","ModuleLoadFailed","DefaultErrorBoundary","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","isError","isSuspenseMode","withModuleAsyncLoad","mobile","SidebarContent","direction","onResize","useSidebarContext","minWidth","DEFAULT_WIDTHS","maxWidth","defaultMobile","defaultDesktop","desktop","SidebarDirection","vertical","Resizable","enable","handleClasses","defaultSize","isIPad","horizontal","MOBILE_TOOLBAR_DIV_ID","SidebarTabs","activeModule","selectModule","unstable_timeout","isActive","isBlurAfterClick","SIDEBAR_QUERY_PARAM","Sidebar","onShouldResize","tabsClassName","urlSearchParams","useSearchParams","sidebarModuleKey","setActiveModule","handleSelectModule","newUrlSearchParams","URLSearchParams","delete","handleCloseSidebar","getIsMobilePortrait","contextValue","isCloseVisible","SidebarContext","ErrorBoundary","FallbackComponent","fallback","drawingCreatorsAsyncModule","drawingActions","DrawingActions","AddNote","DeleteDrawings","DeleteAutoSavedDrawings","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","PreserveDrawings","iconActive","titleActive","DrawingModeContinuous","HideDrawings","LockDrawings","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","Measure","ScaledLine","Arrow","VerticalLine","HorizontalLine","Rectangle","RotatedRectangle","Triangle","Ellipse","Curve","Pitchfork","Polygon","Xabcd","ScaledText","Brush","ElliottWaves","FibonacciRetracements","Position","Callout","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","drawingCreatorsModule","isDrawingCreatorsModuleLoading","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","ToolbarComponent","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","ToolbarDivider","ChartAutoSaveNote","onNoteChange","rows","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","AutoSaveNotesDialog","isBackdropDisabled","ConfirmationDialog","onCancel","onAction","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","setUrlSearchParams","toolbarMobileElement","setToolbarMobileElement","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","openSelect","actionId","has","params","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","imgElement","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","QuotePageQueryChartTypes","ChartElementType","LineChart","hc","HollowCandleStick","ha","HeikinAshi","o","OhlcChart","PerfChart","cs","CandleStick","getChartElementTypeFromResponseType","TA","useChartRouteChange","useTrackPageView","trackInitial","dateFns","updateChartConfig","decodedSearch","urlType","handleTypeChange","urlTicker","urlTimeframe","urlDateRange","newChartConfig","getRawTickerForInstrument","defaultPeriod","defaultDateRange","handleIdeaLeave","getDefaultZoomFactor","innerWidth","MOBILE_VIEW_BREAKPOINT_WIDTH","MOBILE_BARS_TO_VIEW","OnInitListener","onRegisterChartLayoutModel","parentElement","setIsInit","checkIfInitIsComplete","isReady","elementIndex","opacity","withCompleteLayoutModelInit","newConfig","light","dark","concat","isQuotePageWithDrawingsOff","getCookie","noteDrawing","ideaObject","indicatorElement","getContainerTypeFromPaneConfig","newElements","ChartLayoutModel","toolsState","isLockDrawingsActive","withQuotePolling","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","EXTRA_MARKET_BUFFER_MINUTES","timeoutDurations","allCharts","timeoutDurationsMin","timeoutId","chartIds","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","QUOTE_FETCH_EVENT","ChartLayoutComponentBase","orientationChangeTimeout","preserveDrawingAbortController","AbortController","chartConfig","modelProperties","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","keyCode","ThumbSettings","touchSize","onChartDestroy","setToolbarPosition","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","abort","throttledResize","preserveDrawings","handlePreserveDrawingsSettings","setPreserveDrawings","val","tools_state","handleResize","modelAttrs","throttle","newIsToolbarHorizontal","getFullscreenStatus","getVisualViewportScale","visualViewport","handleDrawingAction","noteDialogState","toggle","confirmationDialogState","handleConfirmationDialogCloseBtn","handleConfirmationDialogDeleteBtn","drawingToRemove","handleDrawingsSetting","settingId","newObj","toggleHideDrawings","handleLockDrawings","event_label","renderToolbar","args","isOverlayToolbar","useGrid","LAYOUTS","isMobilePortrait","isSidebarEnabled","getIsSidebarEnabled","ChartGrid","border","columns","ChartGridCell","gridAreas","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","updateLayout","removeCharts","addCharts","rowStart","columnStart","rowEnd","columnEnd","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","updateChartsTitle","defaultDocumentTitleRef","afterClose","prevClose","percentageChange","overridePlaces","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","isWithNotifications","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","IPAD_FULLSCREEN_CLASS","isFullscreen","setIsFullscreen","requestFullscreen","exitFullscreen","getExitFullscreen","call","checkFullscreen","SORTED_LAYOUT_KEYS","arr","sortBy","sortDirection","SORT_DIRECTION","ASC","directionMultiplier","sortObjects","ChartLayoutDropdown","parsedQuery","getChartsToPath","useChartsPathLocation","orientation","DropdownSeparator","ChartSyncableParts","isChartPartInSync","ThemeToggleButton","isDarkMode","updateSettings","BREAKPOINTS","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","onSettingsOpen","hasPublish","Time","breakpointMode","breakpoints","ChartLayoutHeader","StockDetailTimeframeBar","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","containerElement","SettingsTab","AdsProvider","getAdsProvider","adsProvider","Freestar","InvestingChannel","trackPageView","query","freestarPageView","freestar","queue","trackPageview","ColorVariant","CheckboxSize","CheckboxComponent","defaultChecked","violet","emerald","orange","teal","pink","lime","purple","green","yellow","blue","red","gray","forwardRef","clamp","getRelativePosition","node","rect","pointer","pageX","pageXOffset","pageY","preventDefaultMove","DraggablePickerComponent","onMove","onKey","container","hasTouched","isDragging","setDragging","isValid","handleMove","buttons","handleMoveStart","nativeEvent","handleKeyDown","which","handleMoveEnd","toggleDocumentEvents","toggleEvent","useLayoutEffect","onKeyDown","DraggablePicker","memo","Pointer","backgroundColor","hexStringToRGBA","hexString","hexColor","removeHashSymbol","g","hexStringToHSVA","rgbaToHSVA","alphaToHex","alpha","padStart","rgbaToHexString","hsvaToHEXString","hsvaToRGBA","v","h","f","k","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","strColor","isValidColor","isRgb","Option","getIsRgb","rgbKeys","getHSVAFromColor","Alpha","changeLightness","pos","gradientPreview","useMemo","backgroundImage","DEFAULT_COLORS","ColorPalette","lowerCaseColor","toLowerCase","colorObj","HueSaturation","getPositionFromHSLA","colorPreview","changeSaturation","Lightness","ColorPreview","isTooLight","getLumaFromRGBA","getIsColorTooLightOrTransparent","isValidIconName","PickerInput","hasColorPreview","colorInput","setColorInput","colorUtil","isRgba","handleColorInputChange","ColorPicker","canSelectCustom","canSelectAlpha","outputFormat","onPaletteItemClick","cachedColor","hsvaColor","setColor","currentColor","newColor","onChangeCallback","stringColor","output","onSetCustomCodeClick","prompt","trim","alert","_hex","orignalColor","isMobileDevice","MultiColorPicker","colorInputLabel","ColorTabButton","ButtonRounding","small","ButtonColorPicker","buttonPickerDataTestId","isMultiPicker","activeColorIndex","setActiveColorIndex","originalColor","colorObject","childComponent","CopyToClipboard","bottomLeftContent","isCopied","setIsCopied","handleCopyToClipboard","copy","resetTimer","readOnly","DatePickerComponent","StatelessDatePicker","triggerProps","child","Box","locale","minDetail","DatePicker","popover","DEFAULT_OFFSETS","menuMaxHeight","popperElement","setPopperElement","virtualRef","scrollX","getVirtualRef","hasBeenOpen","usePopper","modifiers","popper","ContextMenuDropdown","isStatic","ContextMenuInner","MAX_SAFE_INTEGER","innerState","maxHeightStyle","usePopoverMaxHeight","maxHeightLimit","offsets","assign","menu_option","GridLayout","gridTemplateColumns","gridTemplateRows","defaultValueAccessor","InnerState","asComponent","valueKey","changeKey","valueAccessor","RangeSize","inputClassName","hasTrack","setHasTrack","trackRef","thumbRef","thumbLeft","track","thumb","valuePercent","trackBox","thumbBox","Label","ToolbarTheme","ToolbarDirection","ToolbarContext","chipTransparent","isWrapped","isStretched","useToolbarContext","getToolbarSettings","alternative","toolbarRef","contextProviderValue","toolbarSettings","isSafariDesktop","forceReflow","originalWidth","offsetWidth","ToolbarButton","isInActionProp","buttonSettings","includeRedesign","getButtonThemeSettings","getMainIcon","delay","ToolbarGroup","selectedItem","setSelectedItem","groupId","useHoverPopover","useSelect","NativeSelect","onItemChange","SelectList","isItemActive","StepContent","shepherdLibrary","loadShepherdLibrary","setLoading","shepherdPromise","buttonClasses","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","regular","getStepButtons","complete","classes","getButtonTheme","ButtonTheme","ButtonPadding","back","backButton","next","nextButton","getTourKey","tours","lastFinishedTour","lastTourIndex","allToursViewed","skip","toursToView","initialTour","completeTour","DEFAULT_OPTIONS","exitOnEsc","useModalOverlay","currentTour","setTour","controller","loadingSetter","signal","aborted","definition","setComplete","tourUtils","Tour","removeStep","processedSteps","attachTo","popperOptions","modalOverlayOpeningRadius","overlayRadius","modalOverlayOpeningPadding","addSteps","start","DATERANGE_TOOLTIP","DateRangeSelect","flatDateRanges","dateRanges","selectWithTooltipListProps","SelectWithTooltip","buttonContent","tooltipLabel","hasPopoverViewportHeightLimit","withReload","linkProps","LabelWithDelayedSpinner","invisible","TIMEFRAME_TOOLTIP","TimeframeSelect","isCompactView","isCompactOnly","flatTimeframes","timeframes","getSelectedTimeframeLabel","selectedTimeframeItem","labelShort","groupIndex","isIconButtonActive","getTimeframeChipElementId","getButtonPadding","xxsmall","xsmall","medium","large","none","isTimeframeSelectEnabled","scrollWrapperElement","setScrollWrapperElement","timeframeButtonsScrollLocation","setTimeframeButtonsScrollLocation","isOnLeftEdge","isOnRightEdge","setElementRef","timeframesInExpandedPanel","checkTimeframeWrapperScrollPosition","scrollLeft","ceil","scrollWidth","timeframeElement","offsetLeft","clientWidth","scrollTo","onScroll","absDx","deltaX","padding","generateTimeframeGroups","premiumTimeframes","i1","i2","i3","i5","i10","i15","i30","labelPageTitle","h2","h4","freeTimeframes","getTimeframeGroups","generateDateRangeGroups","DateRangeType","d1","d5","m1","m3","m6","ytd","y1","y2","y5","getDateRangeGroups","isCustomAvailable","rangeGroups","dateRangePrefix","DATE_RANGE_PREFIX_DELMITER","CustomDateRangePrefixEnum","CUSTOM_DATE_RANGE","getDateRangeGroupsWithHref","generatePath","dateRangeGroup","FREE_PERIODS_STOCK","generatePathForTimeframeDateRange","dateRangeQueryKey","timeframeUtm","daterangeUtm","CUSTOM_DATE_RANGE_DELIMITER","CUSTOM_PREV_RANGE_DELIMITER","getParsedDateRange","parseCustomDateRangeUrlParam","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","getTime","end","Prev","years","DAYS_IN_YEAR","getTimeframeFromDateRange","getTimeframeForDateRangeType","startNyTime","startToReferenceDateNumOfDays","rangeNumOfDays","DATE_PICKER_MIN_DATE","YEARS_MAX_VALUE","getFullYear","CustomRangeType","DEFAULT_MANUAL_RANGE","kind","Manual","DEFAULT_START_END_RANGE","StartEnd","getDefaultSelectedTab","getDefaultSelectedDate","newState","newEnd","isAbsolute","fromDate","toDate","manualRange","isValidStartEndRangeState","startString","formatDateToStringUS","endString","getCustomStartEndDateRangeUrlParam","isValidManualRangeState","getPrevPeriodDateRangeUrlParam","minDate","shouldReloadOnNavigate","path","newTimeframe","TIMEFRAME_FAVORITE_DEFAULTS","TIMEFRAME_FAVORITE_DEFAULTS_FREE","intraday","LOCAL_STORAGE_KEY","storageKey","defaultValue","storage","subscription","unsubscribe","valueGetter","useSyncLocalStorage","TooltipInputWrapper","tooltipContent","tooltipColor","tooltipSettings","tooltip","isHideOnClickOutside","TooltipInputComponent","TooltipInput","trackAutomatically","initialRender","handleTrackView","tracking","portfolioWatchlistTableAsyncModule","waitForPreviousPromise","callbackPromise","assets","logo","logo_light","cache","errorsCache","ErrorSeverity","defaultCaptureException","exception","captureContext","setIsError","handleError","high","handleScriptNotLoaded","renderScriptNotLoaded","loadModule","cachedModule","mod","err","NUM_OF_RETRIES","retries","emitter","subscribeToChanges","changeCallback","EventEmitter","getValue","onStorageChange","addListener","removeListener","emit","valueToStore","Function","removeValue","removeItem","migrateValue","transformValue","oldValue","CanvasElementType","arrow","resize","_thumbs","Thumb","x1","x2","getDefaults","ElementSettings","line","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","angle","PI","moveTo","lineTo","stroke","lineAngle","atan2","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","isDrawingElementLockedOrInvisible","distanceToSegment","modalConfig","brushV1","untranslatedContext","brushPath","cachedFill","previousFill","shouldRenderFill","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","getShouldRenderFill","Path2D","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","moveByThumb","onMouseUp","roundToFixed","roundY","isPointInPath","positionPointsTimestamps","getTimestampFomPositionX","getPositionXFromTimestamp","places","domainDiff","numberOfLeadingZeros","log10","getAutosaveOmittedProperties","getEdgeXYValues","edgeXYValues","minX","minY","maxX","maxY","TailDirection","getTailHalfWidth","halfWidth","dist","Text","calloutV1","getModalConfigBase","textWithoutBackground","font","fillStyle","lineHeight","textAlign","textBaseline","background","defaultFill","setupContext","setupTextMetricsCache","ctx","lastAttrs","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","S","renderText","previousDescent","fillText","getCalloutProperties","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","curve","x3","y3","drawQuadraticCurve","Bezier","quadraticFromPoints","cp1x","cp2x","cp1y","cp2y","project","ellipse","getCoordinates","centerLeftX","centerLeftY","centerRightX","centerRightY","boundingPointKeys","bottomCenterX","bottomCenterY","bezierCurveTo","bottomRightX","bottomRightY","topRightX","topRightY","topCenterX","topCenterY","topLeftX","topLeftY","bottomLeftX","bottomLeftY","rotationAngle","atan","radiusX","radiusY","width_two_thirds","dx1","dy1","dx2","dy2","rotatedRectangle","getRectCoordinates","coords","mx1","mx2","my1","my2","nk","dx","sqrt","dy","x4","y4","SymbolElement","symbol","sx","getRotatedCoordinates","scaleX","sy","textHeight","scaleY","xScale","yScale","xOffset","yOffset","rotate","cx","cy","halfHeight","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","waves","getOffsetFromLineWidth","TextBaseline","middle","TextAlign","wave","positionWavesTimestamps","EllipseV1","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","distanceToLine","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","getRotatedPointCoordinates","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPointLinesAngle","sharedPoint","rotatedPoinCoordinates","rotatedPointCoordinates","newLeftPoint","leftRotatedCursorPoint","newRightPoint","rightRotatedCursorPoint","parseCoefficients","coefficients","parsed","getMaxCoefficientUnscaledY","heightScaled","splice","maxCoefficientY","decimalPlaces","updateDecimalPlaces","renderLabels","omitX","x1Dif","x2Dif","startingX1","startingX2","getVolumeSumString","volume","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","fillRect","priceDif","percentage","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","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","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","addPoints","multiplyVectorByScalar","trendPoint2RayOriginPoint2","subtractPoints","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","median","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","isPolygon","scaledPoints","xPoint","yPoint","targetY","stopY","centerY","stopBaseline","targetBaseline","targetColor","stopColor","targetDif","targetPerc","targetStr","stopDif","stopPerc","stopStr","middle1","roundDif","coordType","coordIndex","obj","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","Line","dashLength","setLineDash","XXXS","XXS","textBoxX","textBoxY","textBoxWidth","textBoxHeight","omitY","XABCD","xx","xy","ax","ay","bx","by","retLabel","len","ret","xab","bcd","result1","setIsFetching","dateFromUnixTimestamp","getTimeframeGroupsWithHref","timeFrame","dateRangeState","getVisibleBarsNumber","getChartStartEndDates","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","Timeframe","hasSyncedTicker","Ticker","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","currentTicker","currentTimeframe","currentDaterange","sidebar","timeFrameGroup","QuoteUrlChartTypes","ohlc","heikinashi","hollowcandlestick","useChartLayoutGlobalModelAsyncModule","DEFAULT_CONTEXT","MarketSentiment","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","MAX_POSITIVE_DEFAULT_VALUE","MAX_VALUE","MAX_NEGATIVE_DEFAULT_VALUE","defineProperty","indicator","getNumOfBarsBuffer","periodInt","getParsedIntegersFromPeriodString","labelWidth","contentWidth","lastValue","shouldUpdate","renderYAxis","mouseModelChangeHandler","mouseModel","setupCache","compute","clip","renderXAxis","getTranslate","do","renderIndicator","undo","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","ticks","tickTextStep","yLine","strokeStyle","grid","OFFSET","M","axis","margin","getMergedPropsWithDefaults","tick","formatAxis","contentHeight","valueY","formatBigNumber","indicatorCurrentText","indicatorCurrentBackground","xLine","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","tailwindColors","INDICATOR_LABEL_HEIGHT","roundedRect","isPerfIndicator","onRenderCrossText","getCrossIndexForPane","crossIndex","renderCrossTextChartsPage","renderCrossTextQuotePage","__","renderOversoldOverbought","oversold","zero","overbought","drawLines","drawInVisibleAreaProps","fromIndexOffset","firstBarToRenderIndex","getCompensatedFirstBarToRenderIndex","clipHeight","getIsSSr","drawInVisibleArea","drawBarCallback","renderZeroLine","tickStep","parsePeriodInt","setModel","FONT_SIZE","computeVisibleMinMax","getFirstBarToRenderIndex","lastBarToRenderIndex","getLastBarToRenderIndex","chartWidth","arrays","getDomainDefaults","inputsErrorMessages","Rvol","Atr","Adx","Aro","Mfi","Rmi","Rsi","Stofu","Ult","Macd","Rwi","Trix","Wr","Aroosc","Roc","Cci","Fi","INDICATOR_DEFAULT_DOMAIN","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","pdi","mdi","adx","amdm","apdm","atr","deltaHigh","deltaLow","low","pdm","mdm","tr","di","AroonCalculation","MainCalculation","getDefaultCalculatedValues","aroonUp","aroonDown","oscillator","calculate","onValueCalculated","_calculatedValues","highPeriod","highestInPeriod","periodSinceHigh","lastIndexOf","lowPeriod","lowestInPeriod","periodSinceLow","calculatedValues","COLORS","Aroon","aroonCalculation","textLabels","labelSetting","AroonOscillator","ATR","AverageTrueRange","CommodityChannelIndex","cci","smaCount","tp","smaSum","devCount","typicalPrice","sma","devSum","j","dev","COT","cotQuoteCode","cot","minMax","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","textSecondary","alphabetic","tickFormat","FICalculation","fi","ema","ExponentialMovingAverage","ForceIndex","fiCalculation","MACDCalculation","macd","histogram","fastPeriod","slowPeriod","signalPeriod","emaFast","emaSlow","emaSignal","MACD","macdCalculation","signalLine","MFI","mfi","negativeMoneyFlow","mf","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","OBV","Obv","obv","currentObv","PricePerformance","firstFetchCalled","perf","indicatorLabelWidth","d3","range","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","getAll","_compute","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","nice","ColorsSettings","crossIndexTickerTimeStamp","getDataByBarIndex","tickerDateToIndex","tickerPerformance","canvasFill","labelSpacing","performanceIndicatorLabel","isVertical","labelBottom","tickerText","canFitItemsVertically","tickerQuote","maxCrossIndex","tickerTextWidth","crossText","prev","getSanitizedTicker","RMI","rmi","momentum","u","ad","au","sumu","sumd","rs","ROC","roc","RsiCalculation","rsi","RSI","rsiCalculation","DEFAULT_PARAMETERS","RelativeVolume","rvol","baseLine","periodStr","parsePeriod","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","barWidthWithoutMargin","halfBarWidth","volumeTrendDown","volumeTrendUp","baseLineY","zeroChange","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","k1","kPeriod","dPeriod","dCount","dSum","kSum","kCount","highestHigh","lowestLow","StochasticsFast","Stofa","StochasticsSlow","Stosl","TrixCalculation","trix","lastIndex","ema1","ema2","ema3","trixCalculation","UltimateOscillator","period1","period2","period3","ult","bp","bpSum2","bpSum3","count2","count3","trSum2","trSum3","avg2","avg3","bpSum1","trSum1","count1","avg1","Volume","Vol","WilliamsR","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","propKey","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","spineEvents","generateUuid","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","borderWidth","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","isOverlay","refreshElementId","websiteShared","getChartEventBadgeColors","outerStroke","innerStroke","innerFill","textFill","getFormattedEventDate","exdate","hasEarningsDateSuffix","month","parsedDate","formattedDate","suffix","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","BIG_NUMBER_VALUES","BigNumber","Million","substring","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","colorKey","twColors","forceUpdateKey","increment","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel"],"sourceRoot":""}