{"version":3,"file":"main.97c2beee.js","mappings":"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","sources":["webpack://charts/./app/modals/background.tsx","webpack://charts/./app/modals/color_range_row.tsx","webpack://charts/./app/modals/border.tsx","webpack://charts/./app/modals/checkbox.tsx","webpack://charts/./app/modals/font.tsx","webpack://charts/./app/modals/line.tsx","webpack://charts/./app/modals/multiline_string.tsx","webpack://charts/./app/modals/number.tsx","webpack://charts/./app/modals/string.tsx","webpack://charts/./app/modals/trend.tsx","webpack://charts/./app/modals/visibility/visibility-input.tsx","webpack://charts/./app/modals/visibility/index.tsx","webpack://charts/./app/modals/element_style.tsx","webpack://charts/./app/controllers/autosave/utils.ts","webpack://charts/./app/controllers/autosave/constants.ts","webpack://charts/./app/controllers/autosave/use-drawing-autosave-api.ts","webpack://charts/./app/utils/string-byte-length.ts","webpack://charts/./app/controllers/autosave/use-drawing-auto-save-controls.ts","webpack://charts/./app/controllers/autosave/use-is-auto-save-active.ts","webpack://charts/./app/controllers/autosave/with-auto-save.tsx","webpack://charts/./app/utils/use-prev-state.ts","webpack://charts/./app/modals/ideas.tsx","webpack://charts/./app/controllers/header/ideas_dropdown.tsx","webpack://charts/./app/modals/publish/async-modules.ts","webpack://charts/./app/controllers/header/publish.tsx","webpack://charts/./app/controllers/header/tour_button.tsx","webpack://charts/./app/controllers/chart-controls/chart-type-select.tsx","webpack://charts/./app/controllers/chart-controls/use-chart-types.ts","webpack://charts/./app/controllers/chart-controls/daily-change-display.tsx","webpack://charts/./app/controllers/chart-controls/draw-button.tsx","webpack://charts/./app/controllers/chart-controls/fullscreen-button.tsx","webpack://charts/./app/controllers/chart-controls/search.tsx","webpack://charts/./app/controllers/chart-controls/settings-button.tsx","webpack://charts/./app/controllers/chart-controls/use-chart-controls.ts","webpack://charts/./app/model-hooks/useModelRef.ts","webpack://charts/./app/controllers/chart-controls/chart-controls.tsx","webpack://charts/external var \"FLibs.Hammerjs\"","webpack://charts/./app/controllers/chart_layout/constants.ts","webpack://charts/./app/models/context_menu.ts","webpack://charts/./app/controllers/context_menu.tsx","webpack://charts/./app/controllers/pane/chart-event-popover-with-state.tsx","webpack://charts/./app/utils/use-click-away.ts","webpack://charts/./app/controllers/pane/load-latest-data-button.tsx","webpack://charts/./app/utils/use-is-mounted.ts","webpack://charts/./app/controllers/pane/zoom_controls.tsx","webpack://charts/./app/controllers/pane/pane.tsx","webpack://charts/./app/controllers/pane/with-pane-model.tsx","webpack://charts/./app/controllers/chart/chart-spinner-overlay.tsx","webpack://charts/./app/controllers/chart/constants.ts","webpack://charts/./app/controllers/chart/chart.tsx","webpack://charts/./app/controllers/chart/with-chart-init.tsx","webpack://charts/./app/controllers/chart/with-watched-panes-on-chart-model.tsx","webpack://charts/external var \"FLibs.ReactErrorBoundary\"","webpack://charts/./app/controllers/sidebar/modules/module-load-failed.tsx","webpack://charts/./app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://charts/./app/controllers/sidebar/modules/modules.ts","webpack://charts/./app/controllers/sidebar/modules/with-module-async-load.tsx","webpack://charts/./app/controllers/sidebar/sidebar-content.tsx","webpack://charts/./app/controllers/sidebar/sidebar-tabs.tsx","webpack://charts/./app/controllers/sidebar/sidebar.tsx","webpack://charts/./app/creators/async-modules.ts","webpack://charts/./app/controllers/toolbar/drawingActions.tsx","webpack://charts/./app/controllers/toolbar/drawingSettings.tsx","webpack://charts/./app/controllers/toolbar/drawingTools.ts","webpack://charts/./app/controllers/toolbar/toolbar.tsx","webpack://charts/./app/controllers/toolbar/index.ts","webpack://charts/./app/controllers/toolbar/auto-save-notes/auto-save-notes.tsx","webpack://charts/./app/controllers/toolbar/auto-save-notes/auto-save-notes-dialog.tsx","webpack://charts/./app/controllers/toolbar/confirmation_dialog.tsx","webpack://charts/./app/controllers/toolbar/mobile/tool-button.tsx","webpack://charts/./app/controllers/toolbar/mobile/toolbar-mobile.tsx","webpack://charts/./app/controllers/chart_layout/auto-save-state-indicator.tsx","webpack://charts/./app/controllers/chart_layout/chart-layout-auto-save-note.tsx","webpack://charts/./app/controllers/chart_layout/publish_old_button_click_listener.tsx","webpack://charts/./app/controllers/autosave/idea-leave-dialog.tsx","webpack://charts/./app/controllers/chart_layout/with-chart-route-change.tsx","webpack://charts/./app/controllers/chart_layout/with-complete-layout-model-init.tsx","webpack://charts/./app/controllers/chart_layout/with-quote-cache-management.tsx","webpack://charts/./app/controllers/chart_layout/with-quote-polling.tsx","webpack://charts/./app/controllers/chart_layout/chart_layout_component.tsx","webpack://charts/./app/controllers/with_dialog_state_hook.tsx","webpack://charts/./app/controllers/chart_layout/with-chart-page-title.tsx","webpack://charts/./app/controllers/chart_layout/with-idea-model-state.tsx","webpack://charts/./app/controllers/chart_layout/chart_layout.tsx","webpack://charts/./app/controllers/header/fullscreen_button.tsx","webpack://charts/./app/controllers/header/layout_dropdown.tsx","webpack://charts/./app/helpers/sorter.ts","webpack://charts/./app/controllers/header/theme_toggle_button.tsx","webpack://charts/./app/controllers/header/index.tsx","webpack://charts/./app/controllers/chart-controls/stock-detail-timeframe-bar.tsx","webpack://charts/./app/utils/convert_ta.ts","webpack://charts/./node_modules/@finviz/spine/lib/ sync $^","webpack://charts/./app/components.js","webpack://charts/./app/constants/colors.js","webpack://charts/./app/website-shared.js","webpack://charts/./app/lib-export.js","webpack://charts/./app/canvas/arrow.ts","webpack://charts/./app/canvas/brush/brush_v1.ts","webpack://charts/./app/canvas/callout/callout_utils.ts","webpack://charts/./app/canvas/callout/callout_v1.ts","webpack://charts/./app/canvas/curve.ts","webpack://charts/./app/canvas/ellipse.ts","webpack://charts/./app/canvas/rotated_rectangle.ts","webpack://charts/./app/canvas/symbol.ts","webpack://charts/./app/canvas/drawingTools.ts","webpack://charts/./app/canvas/element.ts","webpack://charts/./app/canvas/elliott_waves/elliott_waves.ts","webpack://charts/./app/canvas/ellipse/ellipse_v1.ts","webpack://charts/./app/canvas/fibonacci_retracements.ts","webpack://charts/./app/canvas/horizontal_line.ts","webpack://charts/./app/canvas/line.ts","webpack://charts/./app/canvas/measure.ts","webpack://charts/./app/canvas/pitchfork/pitchfork_utils.ts","webpack://charts/./app/canvas/pitchfork/pitchfork_v1.ts","webpack://charts/./app/canvas/polygon.ts","webpack://charts/./app/canvas/position.ts","webpack://charts/./app/canvas/rectangle.ts","webpack://charts/./app/canvas/rotated_rectangle/rotated_rectangle_v1.ts","webpack://charts/./app/canvas/scaled_line.ts","webpack://charts/./app/canvas/scaled_text.ts","webpack://charts/./app/canvas/text.ts","webpack://charts/./app/canvas/thumb.ts","webpack://charts/./app/canvas/triangle.ts","webpack://charts/./app/canvas/vertical_line.ts","webpack://charts/./app/canvas/xabcd.ts","webpack://charts/./app/canvas/cache.js","webpack://charts/./app/models/chart_settings/interfaces.ts","webpack://charts/./app/charts/utils.ts","webpack://charts/./app/charts/base_chart.ts","webpack://charts/./app/charts/candle_stick.ts","webpack://charts/./app/charts/candle_stick_hollow.ts","webpack://charts/./app/charts/heikin_ashi.ts","webpack://charts/./app/charts/line_chart.ts","webpack://charts/./app/charts/market_sentiment.ts","webpack://charts/./app/charts/multi_line_chart.ts","webpack://charts/./app/charts/ohlc_chart.ts","webpack://charts/./app/charts/perf_chart.ts","webpack://charts/./app/charts/charts.ts","webpack://charts/./app/constants/common.ts","webpack://charts/./app/controllers/chart-controls/use-chart-model-custom-date-range-values.tsx","webpack://charts/./app/controllers/chart-controls/use-charts-path-location.ts","webpack://charts/./app/controllers/chart-controls/utils.ts","webpack://charts/./app/controllers/chart-events/async-modules.ts","webpack://charts/./app/controllers/chart-settings/async-modules.ts","webpack://charts/./app/utils/chart-date-range-utils.ts","webpack://charts/./app/controllers/renderUtils.ts","webpack://charts/./app/controllers/sidebar/constants.ts","webpack://charts/./app/controllers/sidebar/hooks/sidebar-context.tsx","webpack://charts/./app/controllers/toolbar/interfaces.ts","webpack://charts/./app/controllers/utils.ts","webpack://charts/./app/helpers/atr.ts","webpack://charts/./app/helpers/ema.ts","webpack://charts/./app/chart-events/chart-event.ts","webpack://charts/./app/chart-events/dividends.ts","webpack://charts/./app/chart-events/earnings.ts","webpack://charts/./app/chart-events/split.ts","webpack://charts/./app/chart-events/index.ts","webpack://charts/./app/helpers/get-canvas-element-by-type.ts","webpack://charts/./app/helpers/math.ts","webpack://charts/./app/logger.js","webpack://charts/./app/models/chart-event-element.ts","webpack://charts/./app/models/indicator.ts","webpack://charts/./app/models/overlay.ts","webpack://charts/./app/models/relationships.ts","webpack://charts/./app/index.ts","webpack://charts/./app/indicators/indicator.ts","webpack://charts/./app/utils/canvas-render.ts","webpack://charts/./app/indicators/adx.ts","webpack://charts/./app/indicators/aro.ts","webpack://charts/./app/indicators/aroosc.ts","webpack://charts/./app/indicators/atr.ts","webpack://charts/./app/indicators/cci.ts","webpack://charts/./app/indicators/cot.ts","webpack://charts/./app/indicators/fi.ts","webpack://charts/./app/indicators/macd.ts","webpack://charts/./app/indicators/mfi.ts","webpack://charts/./app/indicators/none.ts","webpack://charts/./app/indicators/obv.ts","webpack://charts/./app/indicators/perf.ts","webpack://charts/./app/indicators/rmi.ts","webpack://charts/./app/indicators/roc.ts","webpack://charts/./app/indicators/rsi.ts","webpack://charts/./app/indicators/rvol.ts","webpack://charts/./app/indicators/rwi.ts","webpack://charts/./app/indicators/stofu.ts","webpack://charts/./app/indicators/stofa.ts","webpack://charts/./app/indicators/stosl.ts","webpack://charts/./app/indicators/trix.ts","webpack://charts/./app/indicators/ult.ts","webpack://charts/./app/indicators/vol.ts","webpack://charts/./app/indicators/wr.ts","webpack://charts/./app/indicators/indicators.ts","webpack://charts/./app/lib/shims.ts","webpack://charts/./app/model-hooks/use-model-state.ts","webpack://charts/./app/models/chart.ts","webpack://charts/./app/models/chart/contstants.ts","webpack://charts/./app/models/chart_layout.ts","webpack://charts/./app/models/chart_settings/index.ts","webpack://charts/./app/models/constants.ts","webpack://charts/./app/models/drawings-internal-store.ts","webpack://charts/./app/models/element.ts","webpack://charts/./app/models/mouse/mouse-utils.ts","webpack://charts/./app/models/mouse/mouse.ts","webpack://charts/./app/models/pane.ts","webpack://charts/./app/models/quoteCache.ts","webpack://charts/./app/models/quote.ts","webpack://charts/./app/models/quote/constants.ts","webpack://charts/./app/models/chart_settings/constants.ts","webpack://charts/./app/models/chart_settings/interactive_chart_settings.ts","webpack://charts/./app/models/settings.ts","webpack://charts/./app/models/utils.ts","webpack://charts/./app/overlays/overlay.ts","webpack://charts/./app/overlays/bb.ts","webpack://charts/./app/overlays/dch.ts","webpack://charts/./app/overlays/ema.ts","webpack://charts/./app/overlays/ema2.ts","webpack://charts/./app/overlays/hilo.ts","webpack://charts/./app/overlays/hline.ts","webpack://charts/./app/overlays/ic.ts","webpack://charts/./app/overlays/icf.ts","webpack://charts/./app/overlays/kch.ts","webpack://charts/./app/overlays/none.ts","webpack://charts/./app/overlays/patterns.ts","webpack://charts/./app/overlays/sar.ts","webpack://charts/./app/overlays/sma.ts","webpack://charts/./app/overlays/sma2.ts","webpack://charts/./app/overlays/str.ts","webpack://charts/./app/overlays/vp.ts","webpack://charts/./app/overlays/vwap.ts","webpack://charts/./app/overlays/overlays.ts","webpack://charts/./app/utils.ts","webpack://charts/./app/utils/abort_controller.ts","webpack://charts/./app/utils/async-modules-utils.ts","webpack://charts/./app/utils/chart-events-utils.ts","webpack://charts/./app/utils/chart.ts","webpack://charts/./app/utils/colors.ts","webpack://charts/./app/utils/cursor.ts","webpack://charts/./app/utils/draw_in_visible_area.ts","webpack://charts/./app/utils/fetch_api.ts","webpack://charts/./app/utils/force-update.ts","webpack://charts/./app/utils/helpers.ts","webpack://charts/./app/utils/hlc.ts","webpack://charts/./app/utils/query_string.ts","webpack://charts/./app/utils/useChartLayoutGlobalModelAsync.ts","webpack://charts/./types/shared.ts","webpack://charts/external var \"FLibs.DateFns\"","webpack://charts/external var \"FLibs.React\"","webpack://charts/external var \"FLibs.ReactDOM\"","webpack://charts/external var \"FLibs.ReactRouterDOM\"","webpack://charts/external var \"FLibs.classnames\"","webpack://charts/external var \"FLibs.d3\""],"sourcesContent":["import * as React from 'react'\n\nimport { InputColorPicker, convertColorToHEX } from '../components'\n\ninterface BackgroundInputProps {\n label: string\n value: string\n onChange: (color: string) => void\n}\n\nexport function BackgroundInput({ label = 'Background', value, onChange }: BackgroundInputProps) {\n return (\n \n )\n}\n","import React, { useCallback } from 'react'\n\nimport { ObjectHash } from '../../types/shared'\nimport { InputColorPicker, Paragraph, RangeSlider } from '../components'\n\ninterface ColorRangeRowInputProps {\n label: string\n colorValue: string\n colorTestId: string\n rangeValue: string\n rangeTestId: string\n rangeLabel: string\n rangeProps: ObjectHash\n onChange: (colorValue: string, value: string) => void\n}\n\nexport function ColorRangeRowInput({\n label,\n colorValue,\n colorTestId,\n rangeValue,\n rangeTestId,\n rangeLabel,\n rangeProps,\n onChange,\n}: ColorRangeRowInputProps) {\n const handleRangeChange = useCallback(\n (ev) => {\n const value = ev.currentTarget.value\n onChange(colorValue, value)\n },\n [onChange, colorValue]\n )\n const handleColorChange = useCallback(\n (color) => {\n onChange(color, rangeValue)\n },\n [onChange, rangeValue]\n )\n return (\n
\n
\n \n
\n
\n \n {rangeValue}\n \n }\n onChange={handleRangeChange}\n value={rangeValue}\n data-testid={rangeTestId}\n />\n
\n
\n )\n}\n","import * as React from 'react'\n\nimport { convertColorToHEX } from '../components'\nimport { ColorRangeRowInput } from './color_range_row'\n\ninterface Value {\n color: string\n width: string\n}\n\ninterface BorderInputProps {\n label: string\n value: Value\n min: number\n max: number\n onChange: (value: Value) => void\n}\n\nexport function BorderInput({ label = 'Border', value, onChange, min, max }: BorderInputProps) {\n return (\n onChange({ color, width })}\n />\n )\n}\n","import React from 'react'\n\nimport { Checkbox } from '../components'\n\ninterface CheckBoxProps {\n label: string\n value: boolean\n onChange: (isChecked: boolean) => void\n}\n\nexport function CheckBox({ label, value, onChange }: CheckBoxProps) {\n return (\n ) => onChange(ev.currentTarget.checked)}\n data-testid=\"chart-modal-checkbox\"\n >\n {label}\n \n )\n}\n","import React, { useCallback, useState } from 'react'\n\nimport { Checkbox, Input, Select, SelectOption } from '../components'\n\nconst FONT_VALUES = [\n { value: 'Arial', label: 'Arial' },\n { value: 'Verdana', label: 'Verdana' },\n]\n\ninterface InputProps {\n family: string\n size: string\n style: string\n weight: string\n}\n\ninterface FontInputProps {\n value: InputProps\n onChange: (values: InputProps) => void\n}\n\nexport function FontInput({ value, onChange }: FontInputProps) {\n const [family, setFamily] = useState(value.family)\n const [size, setSize] = useState(value.size)\n const [style, setStyle] = useState(value.style)\n const [weight, setWeight] = useState(value.weight)\n\n const setValue = useCallback(\n (key, valueSetter, value) => {\n valueSetter(value)\n onChange({ family, size, style, weight, [key]: value })\n },\n [family, size, style, weight, onChange]\n )\n\n return (\n
\n
\n
\n option.value === value.family)?.value}\n onChange={(selected: { value: string }) => setValue('family', setFamily, selected.value)}\n data-testid=\"chart-modal-font-select\"\n >\n {FONT_VALUES.map((option) => (\n {option.label}\n ))}\n \n
\n ) => setValue('size', setSize, ev.currentTarget.value)}\n value={size}\n data-testid=\"chart-modal-font-size\"\n />\n\n ) =>\n setValue('weight', setWeight, ev.currentTarget.checked ? 'bold' : 'normal')\n }\n data-testid=\"chart-modal-font-weight\"\n >\n Bold\n \n ) =>\n setValue('style', setStyle, ev.currentTarget.checked ? 'italic' : 'normal')\n }\n data-testid=\"chart-modal-font-style\"\n >\n Italic\n \n
\n
\n )\n}\n","import * as React from 'react'\n\nimport { convertColorToHEX } from '../components'\nimport { ColorRangeRowInput } from './color_range_row'\n\ninterface LineInputValue {\n color: string\n width: string\n}\n\ninterface LineInputProps {\n label: string\n value: LineInputValue\n onChange: (value: LineInputValue) => void\n}\n\nexport function LineInput({ label = 'Line', value, onChange }: LineInputProps) {\n return (\n onChange({ color, width })}\n />\n )\n}\n","import React from 'react'\n\nimport { Textarea } from '../components'\n\ninterface MultilineStringInputProps {\n label: string\n value: string\n required: boolean\n onChange: (value: string) => void\n}\n\nexport function MultilineStringInput({ label, value, required, onChange }: MultilineStringInputProps) {\n return (\n ) => onChange(e.target.value)}\n value={value}\n autoFocus\n data-testid=\"chart-modal-multiline-string-textarea\"\n />\n )\n}\n","import React from 'react'\n\nimport { Input } from '../components'\n\ninterface NumberInputProps {\n label: string\n name: string\n value: number\n required: boolean\n min?: number\n max?: number\n allowDecimal?: boolean\n step?: number\n onChange: (value: number) => void\n}\n\nexport function NumberInput(props: NumberInputProps) {\n const { label, name, value, required, min, max, step, allowDecimal = false } = props\n\n return (\n ) =>\n props.onChange(allowDecimal ? parseFloat(e.target.value) : parseInt(e.target.value, 10))\n }\n data-testid=\"chart-modal-number-input\"\n />\n )\n}\n","import React from 'react'\n\nimport { Input } from '../components'\n\ninterface StringInputProps {\n label: string\n name: string\n value: string\n required: boolean\n onChange: (value: string) => void\n}\n\nexport function StringInput(props: StringInputProps) {\n const { label, name, value, required } = props\n\n return (\n ) => props.onChange(e.target.value)}\n data-testid=\"chart-modal-string-textinput\"\n />\n )\n}\n","import React from 'react'\n\nimport { Checkbox, Input, InputColorPicker, convertColorToHEX } from '../components'\n\ninterface InputProps {\n active: boolean\n trend: number\n color: string\n}\n\ninterface trendInputProps {\n value: InputProps\n onChange: (values: InputProps) => void\n}\n\nexport function Trend({ value, onChange }: trendInputProps) {\n return (\n
\n ) => onChange({ ...value, active: ev.currentTarget.checked })}\n data-testid=\"chart-modal-trend-active\"\n />\n ) =>\n onChange({ ...value, trend: ev.currentTarget.valueAsNumber })\n }\n value={value.trend}\n data-testid=\"chart-modal-trend-value\"\n />\n onChange({ ...value, color: color })}\n inputDataTestId=\"chart-modal-trend-color\"\n />\n
\n )\n}\n","import React from 'react'\n\nimport { Checkbox, Input, Paragraph } from '../../components'\nimport { MacroTimeframe } from '../../constants/common'\nimport { DEFAULTS } from './index'\n\nexport interface InputProps {\n macroKey: MacroTimeframe\n isOff: boolean\n from: number\n to: number\n}\n\ninterface VisibilityInputProps {\n value: InputProps\n onChange: (value: InputProps) => void\n isCheckboxOnly: boolean\n}\n\nexport function VisibilityInput({ value, onChange, isCheckboxOnly }: VisibilityInputProps) {\n const [isOff, setIsOff] = React.useState(value.isOff)\n const [from, setFrom] = React.useState(value.from)\n const [to, setTo] = React.useState(value.to)\n const { macroKey } = value\n const macroLabel = macroKey.charAt(0).toUpperCase() + macroKey.slice(1)\n\n const setValue = React.useCallback(\n (key, valueSetter, value) => {\n valueSetter(value)\n onChange({ macroKey, isOff, from, to, [key]: value })\n },\n [macroKey, isOff, from, to, onChange]\n )\n return (\n
\n
\n ) => setValue('isOff', setIsOff, !e.target.checked)}\n >\n {isCheckboxOnly && macroLabel}\n \n {!isCheckboxOnly && (\n <>\n ) =>\n setValue('from', setFrom, Number(ev.currentTarget.value))\n }\n data-testid={`visibility-input-${macroKey}-from`}\n />\n -\n ) =>\n setValue('to', setTo, Number(ev.currentTarget.value))\n }\n data-testid={`visibility-input-${macroKey}-to`}\n />\n {macroLabel}\n \n )}\n
\n
\n )\n}\n","import merge from 'lodash.merge'\nimport React from 'react'\n\nimport { IVisibility, MacroTimeframe, MicroTimeframeRange } from '../../constants/common'\nimport { isInRange } from '../../utils/helpers'\nimport { InputProps, VisibilityInput } from './visibility-input'\n\ninterface VisibilityProps {\n label: string\n name: string\n value: IVisibility\n onChange: (value: IVisibility) => void\n handleDisableSubmit: (value: string | false) => void\n}\n\ntype Micro = { isOff: boolean; from: number; to: number }\nexport type DEFAULTS_TYPE = { [key in MacroTimeframe]: Micro }\n\nexport const DEFAULTS: DEFAULTS_TYPE = {\n // [MacroTimeframe.seconds]: { isOff: false, from: 1, to: 59 },\n [MacroTimeframe.minutes]: { isOff: false, from: 1, to: 59 },\n [MacroTimeframe.hours]: { isOff: false, from: 1, to: 24 },\n [MacroTimeframe.days]: { isOff: false, from: 1, to: 366 },\n [MacroTimeframe.weeks]: { isOff: false, from: 1, to: 52 },\n [MacroTimeframe.months]: { isOff: false, from: 1, to: 12 },\n}\n\nconst INPUTS_AVAILABLE = [MacroTimeframe.minutes, MacroTimeframe.hours]\n\nconst getInitialState = (value: IVisibility) => {\n const visibilities = merge({}, DEFAULTS)\n for (const visibility in visibilities) {\n const macroTimeframe = visibility as MacroTimeframe\n const valueMacroTimeframe = value?.[macroTimeframe]\n if (!valueMacroTimeframe) continue\n if (Object.keys(valueMacroTimeframe).length === 0) {\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], isOff: true }\n } else {\n visibilities[macroTimeframe] = { ...visibilities[macroTimeframe], ...valueMacroTimeframe }\n }\n }\n return visibilities\n}\n\nconst getIsVisibilityOutsideAvailableTimeframes = (value: IVisibility) => {\n const result = Object.keys(MacroTimeframe).every((macrotimeframe) => {\n const macroRange = value[macrotimeframe as MacroTimeframe]\n\n return (\n macroRange &&\n (Object.keys(macroRange).length === 0 ||\n !MicroTimeframeRange[macrotimeframe as MacroTimeframe].some((item) =>\n isInRange({\n value: item,\n min: macroRange?.from ?? DEFAULTS[macrotimeframe as MacroTimeframe].from,\n max: macroRange?.to ?? DEFAULTS[macrotimeframe as MacroTimeframe].to,\n })\n ))\n )\n })\n return result\n}\n\nexport function Visibility(props: VisibilityProps) {\n const initialVisibilityRef = React.useRef(getInitialState(props.value))\n\n const handleChange = (value: InputProps) => {\n const result: IVisibility = props.value ? merge({}, props.value) : {}\n result[value.macroKey] = {}\n\n if (value.isOff) {\n props.onChange(result)\n } else if (value.from === DEFAULTS[value.macroKey].from && value.to === DEFAULTS[value.macroKey].to) {\n delete result[value.macroKey]\n props.onChange(result)\n } else {\n if (value.from !== DEFAULTS[value.macroKey].from) {\n result[value.macroKey]!.from = value.from\n }\n if (value.to !== DEFAULTS[value.macroKey].to) {\n result[value.macroKey]!.to = value.to\n }\n props.onChange(result)\n }\n\n props.handleDisableSubmit(\n getIsVisibilityOutsideAvailableTimeframes(result)\n ? 'The chosen timeframes would make the drawing invisible on all supported timeframes.'\n : false\n )\n }\n\n return Object.keys(initialVisibilityRef.current).map((macroKey) => (\n \n ))\n}\n","import debounce from 'lodash.debounce'\nimport * as React from 'react'\n\nimport { ObjectHash } from '../../types/shared'\nimport CanvasElement from '../canvas/element'\nimport { Button, ButtonGroup, Dialog, DialogBody, DialogFooter, DialogHeader, useDialogState } from '../components'\nimport { BackgroundInput } from './background'\nimport { BorderInput } from './border'\nimport { CheckBox } from './checkbox'\nimport { FontInput } from './font'\nimport { LineInput } from './line'\nimport { MultilineStringInput } from './multiline_string'\nimport { NumberInput } from './number'\nimport { StringInput } from './string'\nimport { Trend } from './trend'\nimport { Visibility } from './visibility'\n\n/**\n * Dialogs require element to restore focus when closing. Restore focus to the\n * currently selected chart or body\n */\nfunction getElementToFocus() {\n return document.querySelector('.chart.active') ?? document.body\n}\n\nfunction getInputForType(type: string) {\n switch (type) {\n case 'number':\n return NumberInput\n case 'string':\n return StringInput\n case 'text':\n return StringInput\n case 'background':\n return BackgroundInput\n case 'border':\n return BorderInput\n case 'line':\n return LineInput\n case 'multiline_string':\n return MultilineStringInput\n case 'font':\n return FontInput\n case 'checkbox':\n return CheckBox\n case 'trend':\n return Trend\n case 'visibility':\n return Visibility\n default:\n return () =>
ERROR: Unknown input type
\n }\n}\n\nconst TAB_BUTTON_COMMON_PROPS = { type: 'button', className: 'flex-1', contentClass: 'text-center' }\n\ntype OnSubmitType = ((value: ObjectHash) => void) | null\ntype OnDismissType = (() => void) | null\n\nexport interface ElementStyleDialogProps {\n state: any\n element: ElementType\n onSubmit: ((values: ElementType['attrs']) => void) | null\n onDismiss: (() => void) | null\n onHide: () => void\n}\n\nexport type StyleDialogOpener = (\n element: ElementType,\n onSubmit: ElementStyleDialogProps['onSubmit'],\n onDismiss: ElementStyleDialogProps['onDismiss']\n) => void\n\nfunction getValuesFromFormState(formState: ObjectHash) {\n return formState.reduce((acc: ObjectHash, cur: ObjectHash) => {\n acc[cur.name] = cur.value\n return acc\n }, {} as ObjectHash)\n}\n\nenum DialogTabs {\n Style,\n Visibility,\n}\n\nexport function ElementStyleDialog(props: ElementStyleDialogProps) {\n const config = props.element.getModalConfig()\n const initialFormStateRef = React.useRef[]>(JSON.parse(JSON.stringify(config.inputs)))\n const [formState, setFormState] = React.useState[]>(config.inputs)\n const finalFocusRef = React.useRef(getElementToFocus())\n const [selectedTab, setSelectedTab] = React.useState(DialogTabs.Style)\n const [isSubmitDisabled, setIsSubmitDisabled] = React.useState(false) // If string, the value is used as title for disabled button.\n\n const isDrawingElement = props.element.getIsDrawing()\n\n React.useEffect(() => {\n props.element.isEditInProgress = true\n return () => {\n props.element.isEditInProgress = false\n props.element.trigger('change', props.element)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleValuesChange = React.useCallback(\n ({\n values,\n shouldSubmit = false,\n shouldDismiss = false,\n }: {\n values: ObjectHash\n shouldSubmit?: boolean\n shouldDismiss?: boolean\n }) => {\n const hasOnSubmit = typeof props.onSubmit === 'function'\n const hasOnDismiss = typeof props.onDismiss === 'function'\n\n props.element.set(values)\n if (shouldSubmit && hasOnSubmit) {\n props.onSubmit!(values)\n } else if (shouldDismiss && hasOnDismiss) {\n props.onDismiss!()\n }\n\n if (shouldSubmit || shouldDismiss) {\n props.state.hide()\n }\n },\n [props]\n )\n\n const handleValuesChangeDebounceRef = React.useRef(\n debounce(\n (newFormState) => {\n const values = getValuesFromFormState(newFormState)\n handleValuesChange({ values })\n },\n 50,\n { maxWait: 100 }\n )\n )\n\n React.useEffect(\n () => () => {\n handleValuesChangeDebounceRef.current.cancel()\n },\n []\n )\n\n const onSubmit: React.FormEventHandler = React.useCallback(\n (ev: React.FormEvent) => {\n ev.preventDefault()\n if (ev.currentTarget.checkValidity()) {\n const values = getValuesFromFormState(formState)\n handleValuesChange({ values, shouldSubmit: true })\n }\n },\n [formState, handleValuesChange]\n )\n\n const handleCloseDialog = React.useCallback(() => {\n const values = getValuesFromFormState(initialFormStateRef.current)\n handleValuesChange({ values, shouldDismiss: true })\n }, [handleValuesChange])\n\n const getShouldRenderInputForTab = (inputType: string) => {\n if (selectedTab === DialogTabs.Visibility && inputType === 'visibility') return true\n if (selectedTab !== DialogTabs.Visibility && inputType !== 'visibility') return true\n return false\n }\n\n return (\n \n {config.title}\n
\n \n {isDrawingElement && (\n \n setSelectedTab(DialogTabs.Style)}\n data-testid=\"dialog-tab-button-style\"\n >\n Style\n \n setSelectedTab(DialogTabs.Visibility)}\n data-testid=\"dialog-tab-button-visibility\"\n >\n Visibility\n \n \n )}\n\n {formState.map((input) => {\n const InputComponent = getInputForType(input.type) as React.FC<{\n onChange: (value: string) => void\n handleDisableSubmit?: typeof setIsSubmitDisabled\n }>\n return (\n getShouldRenderInputForTab(input.type) && (\n {\n setFormState((prevState) => {\n const newFormState = prevState.map((stateInput) => {\n if (stateInput.name === input.name) {\n return { ...stateInput, value }\n }\n return stateInput\n })\n handleValuesChangeDebounceRef.current(newFormState)\n return newFormState\n })\n }}\n handleDisableSubmit={setIsSubmitDisabled}\n />\n )\n )\n })}\n \n \n \n Close\n \n \n Save\n \n \n
\n \n )\n}\n\nexport const ElementStyleDialogContext = React.createContext>(() => {})\n\nexport function withElementStyleDialogState

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const context = React.useContext(ElementStyleDialogContext)\n\n return \n }\n}\n\nexport function ElementStyleDialogWrapper(props: { children: React.ReactNode }) {\n const [element, setElement] = React.useState(null)\n const [onSubmit, setOnSubmit] = React.useState(null)\n const [onDismiss, setOnDismiss] = React.useState(null)\n const dialog = useDialogState({ modal: false })\n\n const openDialog = (element: CanvasElement, onSubmit?: OnSubmitType, onDismiss?: OnDismissType) => {\n if (onSubmit) {\n setOnSubmit(() => onSubmit)\n }\n if (onDismiss) {\n setOnDismiss(() => onDismiss)\n }\n\n setElement(element)\n dialog.show()\n }\n\n const onHide = () => {\n setElement(null)\n setOnSubmit(null)\n setOnDismiss(null)\n }\n\n return (\n \n {props.children}\n {element && (\n \n )}\n \n )\n}\n","import { ChartConfigChartPane } from '../../../types/shared'\nimport { IndicatorType } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport Element from '../../models/element'\nimport PaneModel from '../../models/pane'\nimport { HLC, compareHlc, incrementHlc, receiveHlc } from '../../utils/hlc'\nimport {\n AutoSaveChangeType,\n AutoSaveElement,\n AutoSaveElementDBRecord,\n DrawingChangeTimestamp,\n DrawingContainerType,\n} from './constants'\n\nexport function getContainerTypeFromPaneConfig(pane: ChartConfigChartPane) {\n const indicatorElement = pane.elements.find((el) => el.type.startsWith('indicators/'))\n if (indicatorElement) {\n return indicatorElement.type as DrawingContainerType\n }\n const chartElement = pane.elements.find((el) => el.type.startsWith('charts/'))\n if (chartElement) {\n return 'chart'\n }\n return null\n}\n\nexport function getContainerType(model: PaneModel) {\n const mainElement = model.mainElement()\n const indicatorType = mainElement?.instance?.type ?? null\n if (mainElement?.isIndicator() && indicatorType !== IndicatorType.None) {\n return indicatorType as DrawingContainerType\n }\n if (mainElement?.isChart()) {\n return 'chart'\n }\n return null\n}\n\nexport function updateInternalStoreWithChangedElement({\n element,\n changeType,\n currentInternalStore,\n lastUpdateTimestamp,\n}: {\n element: Element\n changeType: AutoSaveChangeType\n currentInternalStore: AutoSaveElement[]\n lastUpdateTimestamp: HLC\n}) {\n const paneModel = element.pane()\n const ticker = paneModel.getQuoteRawTicker()\n const containerType = getContainerType(paneModel)\n if (ticker && paneModel && containerType && (!element.destroyed || changeType === 'destroy')) {\n const instanceJson = element.instance.toAutosaveConfig()\n const newDrawing: AutoSaveElement = {\n elementId: element.elementId!,\n zIndex: element.zIndex,\n ticker,\n lastChange: lastUpdateTimestamp,\n changeType,\n containerType,\n elementAttrs: JSON.stringify(instanceJson),\n }\n\n const newInternalStore = [...currentInternalStore]\n const updateDrawingIndex = newInternalStore.findIndex(\n (drawingElement) => drawingElement.elementId === newDrawing.elementId\n )\n\n let shouldSyncAndSave = false\n if (updateDrawingIndex > -1) {\n const updatedRecord = newInternalStore[updateDrawingIndex]\n const hasChangedZIndex = updatedRecord.zIndex !== newDrawing.zIndex\n const hasChangedType = updatedRecord.changeType !== newDrawing.changeType\n const hasChangedAttrs = updatedRecord.elementAttrs !== newDrawing.elementAttrs\n const hasChange = hasChangedType || hasChangedAttrs || hasChangedZIndex\n if (\n !element.instance.isEditInProgress &&\n updatedRecord.ticker === ticker &&\n hasChange &&\n updatedRecord.changeType !== 'destroy'\n ) {\n newInternalStore[updateDrawingIndex] = newDrawing\n shouldSyncAndSave = true\n }\n } else {\n newInternalStore.push(newDrawing)\n shouldSyncAndSave = true\n }\n\n return {\n newInternalStore,\n shouldSyncAndSave,\n newDrawing,\n }\n }\n}\n\nexport function getTickersAndContainerTypesInLayoutModel(chartLayout: ChartLayout) {\n const tickers: string[] = []\n const containerTypes: Array = ['note']\n\n chartLayout.getAllPanes().forEach((paneModel) => {\n const ticker = paneModel.getQuoteRawTicker()\n const containerType = getContainerType(paneModel)\n if (ticker && !tickers.includes(ticker)) {\n tickers.push(ticker)\n }\n if (containerType && !containerTypes.includes(containerType)) {\n containerTypes.push(containerType)\n }\n })\n return { tickers, containerTypes }\n}\n\nexport function mergeUpdatedDrawingsToInternalStore({\n updatedDrawings,\n currentInternalStore,\n lastUpdateTimestamp,\n isRefetchAll,\n}: {\n updatedDrawings: AutoSaveElement[]\n currentInternalStore: AutoSaveElement[]\n lastUpdateTimestamp: DrawingChangeTimestamp\n isRefetchAll: boolean\n}) {\n let newLastUpdateTimestamp = lastUpdateTimestamp\n const newInternalStore = [...currentInternalStore]\n const updatedElementIds: string[] = []\n\n updatedDrawings.forEach((drawing) => {\n newLastUpdateTimestamp = receiveHlc(newLastUpdateTimestamp, drawing.lastChange)\n const drawingIndex = newInternalStore.findIndex(({ elementId }) => drawing.elementId === elementId)\n const currentDrawing = drawingIndex > -1 ? newInternalStore[drawingIndex] : null\n if (currentDrawing === null) {\n newInternalStore.push(drawing)\n updatedElementIds.push(drawing.elementId)\n } else if (currentDrawing.containerType === 'note' && isRefetchAll) {\n const currentNote = getElementNoteText(currentDrawing)\n const autoSavedNote = getElementNoteText(drawing)\n if (currentNote !== autoSavedNote) {\n newInternalStore[drawingIndex] = {\n ...drawing,\n lastChange: incrementHlc(receiveHlc(currentDrawing.lastChange, drawing.lastChange), Date.now()),\n elementAttrs: JSON.stringify({\n ...JSON.parse(drawing.elementAttrs),\n text: `${currentNote}\\r\\n${autoSavedNote}`,\n }),\n }\n }\n updatedElementIds.push(drawing.elementId)\n } else if (compareHlc(newInternalStore[drawingIndex].lastChange, drawing.lastChange) < 0) {\n newInternalStore[drawingIndex] = drawing\n updatedElementIds.push(drawing.elementId)\n }\n })\n return { newLastUpdateTimestamp, newInternalStore, updatedElementIds }\n}\n\nexport function getInitialStoreDrawings(): null | AutoSaveElement[] {\n const initialDrawings = (\n window.FinvizSettings?.initialDrawingsStore ?? window.FinvizChartsSettings?.initialDrawingsStore\n )?.drawings as null | AutoSaveElementDBRecord[]\n\n return initialDrawings?.map((item) => getAutosaveElementFromDBRecord(item)) ?? null\n}\n\nexport function handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod,\n}: {\n chartLayoutModel: ChartLayout\n elementMethod: keyof Pick\n}) {\n chartLayoutModel.getAllElements().forEach((element) => {\n if (element.isDrawing()) {\n element[elementMethod]()\n }\n })\n}\n\nexport function getNoteElementId(ticker: string) {\n return `note-${ticker}`\n}\n\nexport function getElementNoteText(noteElement?: AutoSaveElement) {\n return (noteElement ? JSON.parse(noteElement.elementAttrs)?.text : '') ?? ''\n}\n\nexport function getTickerNoteText({ ticker, elements }: { ticker: string; elements: AutoSaveElement[] }) {\n const noteElement = elements.find(({ elementId }) => elementId === getNoteElementId(ticker))\n return getElementNoteText(noteElement)\n}\n\nexport function getAutosaveElementFromDBRecord(item: AutoSaveElementDBRecord): AutoSaveElement {\n return {\n elementId: item.elementId,\n ticker: item.ticker,\n zIndex: item.zIndex,\n changeType: item.changeType,\n containerType: item.containerType,\n elementAttrs: item.elementAttrs,\n lastChange: {\n ts: item.lastChangeTimestamp,\n count: item.lastChangeCounter,\n uuid: item.lastChangeNodeUUID,\n },\n }\n}\n\nexport function getDBRecordFromAutosaveElement(item: AutoSaveElement): Omit {\n return {\n elementId: item.elementId,\n ticker: item.ticker,\n zIndex: item.zIndex,\n changeType: item.changeType,\n containerType: item.containerType,\n elementAttrs: JSON.stringify(item.elementAttrs),\n lastChangeTimestamp: item.lastChange.ts,\n lastChangeCounter: item.lastChange.count,\n lastChangeNodeUUID: item.lastChange.uuid,\n }\n}\n","import { IndicatorType } from '../../constants/common'\nimport { HLC } from '../../utils/hlc'\n\nexport type DrawingChangeTimestamp = HLC\nexport type DrawingContainerType = IndicatorType | 'chart' | 'note' | null\nexport type AutoSaveChangeType = 'update' | 'destroy'\n\nexport interface AutoSaveElement {\n elementId: string\n ticker: string\n zIndex: number\n lastChange: DrawingChangeTimestamp\n changeType: AutoSaveChangeType\n containerType: DrawingContainerType\n elementAttrs: string\n}\n\nexport type AutoSaveElementDBRecord = Omit & { lastChange: string } & {\n lastChangeTimestamp: number\n lastChangeCounter: number\n lastChangeNodeUUID: string\n}\n\nexport const DRAWINGS_UPDATE_INTERVAL_MS = process.env.IS_E2E_TESTING ? 3000 : 15000\nexport const DRAWINGS_SAVE_INTERVAL_MS = 250\n","import React from 'react'\n\nimport fetchApi, {\n ContentType,\n ForbiddenError,\n GenericStatusCodeError,\n InternalServerError,\n} from '../../utils/fetch_api'\nimport { getUuid } from '../../utils/helpers'\nimport { HLC, compareHlc, incrementHlc } from '../../utils/hlc'\nimport { getByteLengthOfString } from '../../utils/string-byte-length'\nimport { AutoSaveElement, AutoSaveElementDBRecord, DrawingContainerType } from './constants'\nimport { getAutosaveElementFromDBRecord, getDBRecordFromAutosaveElement } from './utils'\n\nconst RETRY_LIMIT = 5\n\nexport function useDrawingAutoSaveApi() {\n const postRetryCountRef = React.useRef(0)\n const deleteRetryCountRef = React.useRef(0)\n\n const fetchDrawings = React.useCallback(\n async ({\n tickers,\n containerTypes,\n lastChange,\n }: {\n tickers: string[]\n containerTypes: DrawingContainerType[]\n lastChange: HLC\n }) => {\n try {\n const data = await fetchApi<{\n drawings: AutoSaveElementDBRecord[]\n }>({\n location: '/api/auto_save.ashx',\n queryParameters: {\n ticker: tickers.join(','),\n containerTypes: containerTypes.join(',') || undefined,\n lastChangeTimestamp: lastChange.ts,\n lastChangeCounter: lastChange.count,\n lastChangeNodeUUID: lastChange.uuid,\n },\n throwOnStatusCodes: [403, 404],\n })\n return data.drawings.map((drawing) => getAutosaveElementFromDBRecord(drawing))\n } catch {\n // ignore error\n }\n\n return []\n },\n []\n )\n\n const saveDrawings = React.useCallback(async (drawings: AutoSaveElement[]): Promise => {\n if (drawings.length === 0) {\n return undefined\n }\n\n try {\n const bodyJsonString = JSON.stringify(drawings.map((item) => getDBRecordFromAutosaveElement(item)))\n let keepalive = false\n try {\n keepalive = getByteLengthOfString(bodyJsonString) < 64000\n } catch (error: any) {\n window.Sentry?.captureException(error)\n }\n await fetchApi({\n location: '/api/auto_save.ashx',\n method: 'POST',\n throwOnStatusCodes: [400, 403, 404, 500],\n contentType: ContentType.ApplicationJson,\n body: bodyJsonString,\n keepalive,\n })\n const [latestChangeHlc] = [...drawings].sort((a, b) => compareHlc(b.lastChange, a.lastChange))\n postRetryCountRef.current = 0\n return latestChangeHlc.lastChange\n } catch (error) {\n if (error instanceof InternalServerError) {\n // try again\n if (postRetryCountRef.current < RETRY_LIMIT) {\n postRetryCountRef.current = postRetryCountRef.current + 1\n await new Promise((r) => setTimeout(r, 1000))\n return saveDrawings(drawings)\n } else {\n // continue to report to Sentry\n postRetryCountRef.current = 0\n }\n } else if (error instanceof ForbiddenError) {\n // ignore error\n return undefined\n }\n\n // report error to Sentry\n window.Sentry?.captureException(error, {\n extra: (error instanceof GenericStatusCodeError\n ? (error.response as ObjectHash).invalidItems\n : drawings\n ).reduce(\n (acc: ObjectHash, cur: ObjectHash, index: number) => ({ ...acc, [`item-${index}`]: JSON.stringify(cur) }),\n {} as ObjectHash\n ),\n })\n\n return undefined\n }\n }, [])\n\n const deleteAllDrawings = React.useCallback(\n async ({ tickers, lastLocalChange }: { tickers: string[]; lastLocalChange: HLC }): Promise => {\n try {\n const newHlc = {\n ...incrementHlc(lastLocalChange, Date.now()),\n uuid: getUuid(), // we provide new UUID for HLC so we can fetch 'destroy' changes in next GET request\n }\n await fetchApi({\n location: `/api/auto_save.ashx?ticker=${tickers.join(',')}&lastChangeTimestamp=${\n newHlc.ts\n }&lastChangeCounter=${newHlc.count}&lastChangeNodeUUID=${newHlc.uuid}`,\n method: 'DELETE',\n throwOnStatusCodes: [403, 404, 500],\n keepalive: true,\n })\n deleteRetryCountRef.current = 0\n } catch (error) {\n if (error instanceof InternalServerError) {\n // try again\n if (deleteRetryCountRef.current < RETRY_LIMIT) {\n deleteRetryCountRef.current = deleteRetryCountRef.current + 1\n await new Promise((r) => setTimeout(r, 1000))\n return deleteAllDrawings({ tickers, lastLocalChange })\n } else {\n // continue to report to Sentry\n deleteRetryCountRef.current = 0\n }\n } else if (error instanceof ForbiddenError) {\n // ignore error\n return\n }\n\n // report error to Sentry\n window.Sentry?.captureException(error)\n }\n },\n []\n )\n\n return { fetchDrawings, saveDrawings, deleteAllDrawings }\n}\n","// byteLengthCharCode2 from https://stackoverflow.com/a/63893237\n\nexport function getByteLengthOfString(s: string) {\n //assuming the String is UCS-2(aka UTF-16) encoded\n let n = 0\n for (let i = 0, l = s.length; i < l; i++) {\n const hi = s.charCodeAt(i)\n if (hi < 0x0080) {\n n += 1\n } else if (hi < 0x0800) {\n n += 2\n } else if (hi < 0xd800) {\n n += 3\n } else if (hi < 0xdc00) {\n const lo = s.charCodeAt(++i)\n if (i < l && lo >= 0xdc00 && lo <= 0xdfff) {\n n += 4\n } else {\n throw new Error('UCS-2 String malformed')\n }\n } else if (hi < 0xe000) {\n throw new Error('UCS-2 String malformed')\n } else {\n n += 3\n }\n }\n return n\n}\n","import React from 'react'\n\nimport { DrawingSpineOptions, DrawingSpineOptionsEvent } from '../../../types/shared'\nimport ElementCanvas from '../../canvas/element'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { getCanvasElementByType } from '../../helpers/get-canvas-element-by-type'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport Element from '../../models/element'\nimport { compareHlc, incrementHlc, initHlc, receiveHlc } from '../../utils/hlc'\nimport { AutoSaveChangeType, AutoSaveElement, DRAWINGS_SAVE_INTERVAL_MS } from './constants'\nimport { useDrawingAutoSaveApi } from './use-drawing-autosave-api'\nimport { useIsAutoSaveActive } from './use-is-auto-save-active'\nimport {\n getContainerType,\n getNoteElementId,\n getTickerNoteText,\n getTickersAndContainerTypesInLayoutModel,\n mergeUpdatedDrawingsToInternalStore,\n updateInternalStoreWithChangedElement,\n} from './utils'\n\nexport function useDrawingAutoSaveControls(chartLayout: ChartLayout) {\n const { fetchDrawings, saveDrawings, deleteAllDrawings } = useDrawingAutoSaveApi()\n const isAutoSaveActive = useIsAutoSaveActive(chartLayout)\n const drawingsInternalStore = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\n const saveTimeoutRef = React.useRef()\n\n React.useEffect(\n () => () => {\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current)\n }\n },\n []\n )\n\n const saveLatestChanges = React.useCallback(\n (\n withDelayInMs = DRAWINGS_SAVE_INTERVAL_MS,\n saveQueueExtraFilterCallback: ((item: AutoSaveElement) => boolean) | null = null\n ) => {\n if (saveTimeoutRef.current) {\n clearTimeout(saveTimeoutRef.current)\n }\n const saveQueue = drawingsInternalStore.elements.filter(\n (item) =>\n compareHlc(item.lastChange, drawingsInternalStore.latestLocalUpdateTimestamp) > 0 &&\n item.lastChange.uuid === drawingsInternalStore.instanceUUID &&\n (saveQueueExtraFilterCallback === null || saveQueueExtraFilterCallback(item))\n )\n if (saveQueue.length === 0) {\n return\n }\n\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Unsaved)\n\n const save = async () => {\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saving)\n const result = await saveDrawings(saveQueue)\n if (result) {\n drawingsInternalStore.updateAttributes({\n latestLocalUpdateTimestamp: receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, result),\n })\n }\n drawingsInternalStore.setAutoSaveState(AutoSaveState.Saved)\n\n return result\n }\n\n if (withDelayInMs === 0) {\n return save()\n }\n\n saveTimeoutRef.current = setTimeout(save, withDelayInMs)\n },\n [saveDrawings, drawingsInternalStore]\n )\n\n const syncChartLayoutDrawings = React.useCallback(\n (drawing: AutoSaveElement) => {\n if (drawing.containerType === 'note') {\n return\n }\n const isRemove = drawing.changeType === 'destroy'\n\n chartLayout.getAllPanes().forEach((paneModel) => {\n const ticker = paneModel.getQuoteRawTicker()\n const paneContainerType = getContainerType(paneModel)\n if (!paneContainerType || drawing.ticker !== ticker) {\n return\n }\n const paneInternalStoreElements = drawingsInternalStore.elements.filter(\n (autoSaveElement) => autoSaveElement.ticker === ticker && autoSaveElement.containerType === paneContainerType\n )\n const paneElements = paneModel.getAllElements()\n let element: Element | undefined\n paneElements.forEach((paneElement) => {\n if (paneElement.isDrawing() && !paneElement.instance.isCreator) {\n const paneDrawing = paneInternalStoreElements.find(({ elementId }) => elementId === paneElement.elementId)\n if (!paneDrawing || paneDrawing.changeType === 'destroy') {\n paneElement.destroyCascade()\n } else if (paneElement.elementId && paneElement.elementId === drawing.elementId) {\n element = paneElement\n }\n }\n })\n\n const parsedElementAttrs = JSON.parse(drawing.elementAttrs)\n if (element) {\n if (drawing.elementAttrs !== JSON.stringify(element.instance.toAutosaveConfig())) {\n if (element.pane().selection !== element.instance && !element.hasOngoingInteraction()) {\n element.instance.set(parsedElementAttrs)\n element.instance.updateScales()\n }\n }\n if (drawing.zIndex !== element.zIndex) {\n element.updateAttributes({ zIndex: drawing.zIndex })\n }\n if (isRemove || paneContainerType !== drawing.containerType) {\n element.destroyCascade()\n }\n } else if (!isRemove && paneContainerType === drawing.containerType) {\n const instance = getCanvasElementByType(parsedElementAttrs.type).fromObject(\n parsedElementAttrs,\n paneModel\n ) as ElementCanvas\n paneModel.elements().create({ elementId: drawing.elementId, instance, zIndex: drawing.zIndex })\n instance.updateScales()\n }\n })\n },\n [chartLayout, drawingsInternalStore]\n )\n\n const handleAutoSaveNoteChange = React.useCallback(\n (note: string, ticker?: string) => {\n if (ticker) {\n const newNoteElement: AutoSaveElement = {\n elementId: getNoteElementId(ticker),\n zIndex: 0,\n ticker: ticker,\n lastChange: incrementHlc(drawingsInternalStore.latestLocalUpdateTimestamp, Date.now()),\n changeType: 'update',\n containerType: 'note',\n elementAttrs: JSON.stringify({ text: note }),\n }\n\n drawingsInternalStore.updateAttributes({\n elements: [\n ...drawingsInternalStore.elements.filter(({ elementId }) => elementId !== newNoteElement.elementId),\n newNoteElement,\n ],\n })\n }\n },\n [drawingsInternalStore]\n )\n\n const handleIdeaNoteChange = React.useCallback(\n (note: string) => {\n if (chartLayout.idea?.note !== note && (chartLayout.idea || note)) {\n chartLayout.updateAttribute('idea', { ...chartLayout.idea, note })\n handleAutoSaveNoteChange(note, chartLayout.activeChart?.getQuoteRawTicker() ?? undefined)\n }\n },\n [chartLayout, handleAutoSaveNoteChange]\n )\n\n const checkDrawingUpdate = React.useCallback(\n async (isRefetchAll = false) => {\n const { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n if (isRefetchAll) {\n drawingsInternalStore.updateAttributes({\n latestRemoteUpdateTimestamp: initHlc(drawingsInternalStore.instanceUUID, 0),\n })\n }\n\n const updatedDrawings = await fetchDrawings({\n tickers,\n containerTypes,\n lastChange: drawingsInternalStore.latestRemoteUpdateTimestamp,\n })\n const { newLastUpdateTimestamp, updatedElementIds, newInternalStore } = mergeUpdatedDrawingsToInternalStore({\n updatedDrawings,\n currentInternalStore: drawingsInternalStore.elements,\n lastUpdateTimestamp: drawingsInternalStore.latestRemoteUpdateTimestamp,\n isRefetchAll,\n })\n\n drawingsInternalStore.updateAttributes({\n // Even if there are no changes in elements, newInternalStore is new array with the same content which may cause unnecessary rerenders\n ...(updatedElementIds.length > 0 ? { elements: newInternalStore } : {}),\n latestRemoteUpdateTimestamp: newLastUpdateTimestamp,\n latestLocalUpdateTimestamp:\n isRefetchAll && newInternalStore.length > 0\n ? receiveHlc(drawingsInternalStore.latestLocalUpdateTimestamp, newLastUpdateTimestamp)\n : drawingsInternalStore.latestLocalUpdateTimestamp,\n })\n\n if (updatedElementIds.length > 0 || isRefetchAll) {\n saveLatestChanges(0)\n const allElements = chartLayout.getAllElements()\n updatedElementIds.forEach((elementId) => {\n const element = allElements.find((element) => element.elementId === elementId)\n\n if (element && element.isDrawing() && !element.hasOngoingInteraction()) {\n element.destroyCascade()\n }\n })\n\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\n chartLayout.getAllPanes().forEach((paneModel) => {\n paneModel.normalizeZIndexes()\n })\n\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage) {\n const activeTicker = chartLayout.activeChart?.getQuoteRawTicker() ?? ''\n handleIdeaNoteChange(getTickerNoteText({ ticker: activeTicker, elements: newInternalStore }))\n }\n }\n },\n [\n chartLayout,\n drawingsInternalStore,\n syncChartLayoutDrawings,\n fetchDrawings,\n handleIdeaNoteChange,\n saveLatestChanges,\n ]\n )\n\n const updateInternalStoreWithElement = React.useCallback(\n (element: Element, changeType: AutoSaveChangeType) => {\n const updateResult = updateInternalStoreWithChangedElement({\n element,\n changeType,\n currentInternalStore: drawingsInternalStore.elements,\n lastUpdateTimestamp: incrementHlc(\n receiveHlc(\n drawingsInternalStore.latestLocalUpdateTimestamp,\n drawingsInternalStore.latestRemoteUpdateTimestamp\n ),\n Date.now()\n ),\n })\n\n if (updateResult) {\n const { shouldSyncAndSave, newInternalStore, newDrawing } = updateResult\n if (shouldSyncAndSave) {\n drawingsInternalStore.updateAttributes({ elements: newInternalStore })\n syncChartLayoutDrawings(newDrawing)\n }\n }\n },\n [syncChartLayoutDrawings, drawingsInternalStore]\n )\n\n const deleteAllAutoSavedElements = React.useCallback(async () => {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n\n await deleteAllDrawings({ tickers, lastLocalChange: drawingsInternalStore.latestLocalUpdateTimestamp })\n await checkDrawingUpdate()\n }, [chartLayout, deleteAllDrawings, drawingsInternalStore, checkDrawingUpdate])\n\n const onElementChange = React.useCallback(\n (element: Element, _?: any, options?: DrawingSpineOptions) => {\n const elementPane = element.pane()\n // This may happen if pane had been removed already, in most cases \"element.destroyed\" should be true,\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\n if (!element.isDrawing() || element.instance.isCreator || !elementPane) {\n return\n }\n const elementContainerType = getContainerType(elementPane)\n const elementPaneTicker = elementPane.getQuoteRawTicker()\n const isElementInCurrentChartLayout = chartLayout\n .getAllPanes()\n .some(\n (model) => getContainerType(model) === elementContainerType && model.getQuoteRawTicker() === elementPaneTicker\n )\n if (isElementInCurrentChartLayout) {\n const isRemove = options?.eventType === DrawingSpineOptionsEvent.Remove\n updateInternalStoreWithElement(element, isRemove ? 'destroy' : 'update')\n }\n },\n [updateInternalStoreWithElement, chartLayout]\n )\n\n return {\n drawingsInternalStore,\n onElementChange,\n handleIdeaNoteChange,\n deleteAllAutoSavedElements,\n isAutoSaveActive,\n handleAutoSaveNoteChange,\n syncChartLayoutDrawings,\n saveLatestChanges,\n checkDrawingUpdate,\n }\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\n\nexport function useIsAutoSaveActive(chartLayout: ChartLayout) {\n const chartLayoutModel = useModelState(chartLayout, {\n watchProperties: ['isInit', 'isPreserveDrawingsActive', 'idea'],\n })\n const { idea, isInit, isPreserveDrawingsActive } = chartLayoutModel\n return React.useMemo(\n () =>\n getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel) && isPreserveDrawingsActive && !!isInit && !idea?.id,\n [isPreserveDrawingsActive, isInit, idea?.id, chartLayoutModel]\n )\n}\n","import React from 'react'\n\nimport { CustomSpineEvents } from '../../../types/shared'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartModel from '../../models/chart'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport Element from '../../models/element'\nimport { usePrevious } from '../../utils/use-prev-state'\nimport { DRAWINGS_UPDATE_INTERVAL_MS } from './constants'\nimport { useDrawingAutoSaveControls } from './use-drawing-auto-save-controls'\nimport { getTickersAndContainerTypesInLayoutModel } from './utils'\n\nfunction useDrawingAutoSave(chartLayout: ChartLayout) {\n const {\n onElementChange,\n deleteAllAutoSavedElements,\n checkDrawingUpdate,\n syncChartLayoutDrawings,\n saveLatestChanges,\n isAutoSaveActive,\n } = useDrawingAutoSaveControls(chartLayout)\n\n const drawingsInternalStoreUnwatched = React.useMemo(() => chartLayout.drawingsInternalStore(), [chartLayout])\n const drawingsInternalStore = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['elements'] })\n const prevIsAutoSaveActive = usePrevious(isAutoSaveActive)\n\n const runInitialSaveAndRefetchUpdate = React.useCallback(async () => {\n chartLayout.getAllElements().forEach((element) => {\n // Adds drawings to internal store if isAutoSaveActive and they are not in the store yet\n if (!drawingsInternalStore.elements.some((drawing) => drawing.elementId === element.elementId)) {\n onElementChange(element)\n }\n })\n\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\n // Notes are merged in checkDrawingUpdate fn\n await saveLatestChanges(0, (item) => item.containerType !== 'note')\n\n checkDrawingUpdate(true)\n }, [checkDrawingUpdate, chartLayout, onElementChange, drawingsInternalStore.elements, saveLatestChanges])\n\n React.useEffect(() => {\n if (isAutoSaveActive) {\n saveLatestChanges()\n }\n }, [saveLatestChanges, drawingsInternalStore.elements, isAutoSaveActive])\n\n React.useEffect(() => {\n if (!isAutoSaveActive) {\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Off)\n return\n }\n chartLayout.drawingsInternalStore().setAutoSaveState(AutoSaveState.Saved)\n if (!prevIsAutoSaveActive && isAutoSaveActive) {\n runInitialSaveAndRefetchUpdate()\n }\n\n let { tickers, containerTypes } = getTickersAndContainerTypesInLayoutModel(chartLayout)\n\n const onChartOrIndicatorChange = () => {\n const { tickers: newTickers, containerTypes: newContainerTypes } =\n getTickersAndContainerTypesInLayoutModel(chartLayout)\n if (\n JSON.stringify(tickers) !== JSON.stringify(newTickers) ||\n JSON.stringify(containerTypes) !== JSON.stringify(newContainerTypes)\n ) {\n tickers = newTickers\n containerTypes = newContainerTypes\n checkDrawingUpdate(true)\n }\n }\n\n ChartModel.bind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\n Element.bind('change', onElementChange)\n\n drawingsInternalStore.elements.forEach(syncChartLayoutDrawings)\n const checkDrawingUpdateInterval = setInterval(checkDrawingUpdate, DRAWINGS_UPDATE_INTERVAL_MS)\n\n return () => {\n clearInterval(checkDrawingUpdateInterval)\n ChartModel.unbind(`${CustomSpineEvents.IndicatorsChange} change`, onChartOrIndicatorChange)\n Element.unbind('change', onElementChange)\n }\n }, [\n chartLayout,\n drawingsInternalStore,\n checkDrawingUpdate,\n onElementChange,\n syncChartLayoutDrawings,\n isAutoSaveActive,\n prevIsAutoSaveActive,\n runInitialSaveAndRefetchUpdate,\n ])\n\n return { deleteAllAutoSavedElements, isAutoSaveActive }\n}\n\ninterface Props {\n chartLayoutModel: ChartLayout\n}\n\nexport const withDrawingsAutoSave = (Component: any) => (props: Props) => {\n const { deleteAllAutoSavedElements, isAutoSaveActive } = useDrawingAutoSave(props.chartLayoutModel)\n\n return (\n \n )\n}\n","import React from 'react'\n\nexport function usePrevious(value: any) {\n const ref = React.useRef()\n React.useEffect(() => {\n ref.current = value\n }, [value])\n return ref.current\n}\n","import omit from 'lodash.omit'\nimport queryString from 'query-string'\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport { Instrument, ObjectHash } from '../../types/shared'\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader } from '../components'\nimport { ChartsOrQuotePageQueryParams, LayoutType } from '../constants/common'\nimport { getTickerNoteText } from '../controllers/autosave/utils'\nimport ChartLayout from '../models/chart_layout'\nimport Quote from '../models/quote'\nimport { getInstrument } from '../utils/chart'\nimport fetchApi, { getFormDataFromObject } from '../utils/fetch_api'\nimport { captureException } from '../utils/helpers'\nimport { decodeQueryString } from '../utils/query_string'\n\ninterface IIdea {\n ticker: string\n instrument: string\n period: string\n company?: string\n date: string\n note: string\n id: string\n}\n\nfunction getIdeaUrl({ ticker, instrument, period, id }: Pick) {\n const searchObject = { t: ticker, p: period, i: id }\n const isStock = instrument === Instrument.Stock\n const isQuotePage = /\\/quote\\b/.test(window.location.pathname)\n const isStockOnQute = isQuotePage && isStock\n const path = !isQuotePage || isStock ? window.location.pathname : '/charts.ashx'\n\n return `${path}?${queryString.stringify({ ...searchObject, ...(isStockOnQute ? { ta: '2' } : { l: '1h1v' }) })}`\n}\n\nfunction IdeasList() {\n const [hasError, setHasError] = useState(false)\n const [hasFetched, setHasFetched] = useState(false)\n const [isDeleting, setIsDeleting] = useState(false)\n const [ideas, setIdeas] = useState([])\n const { i: currentIdea } = decodeQueryString()\n\n useEffect(() => {\n async function fetchIdeas() {\n window.gtag?.('event', 'load', { event_category: 'ideas' })\n try {\n const data = await fetchApi({ location: '/api/ideas_load.ashx', throwOnStatusCodes: [404] })\n const ideas = data.ideas.map((idea: IIdea) => ({\n ...idea,\n instrument: getInstrument(idea.ticker),\n }))\n\n setIdeas(ideas)\n setHasFetched(true)\n } catch {\n setHasError(true)\n }\n }\n\n fetchIdeas()\n }, [])\n\n const onDeleteIdeaClick = useRef(async (idea: IIdea) => {\n if (!window.confirm('Do you really want to delete this idea?')) return\n\n const body = [\n ['id', idea.id],\n ['ticker', idea.ticker],\n ['queryString', document.location.search],\n ['locationPathname', document.location.pathname],\n ['currentIdea', currentIdea],\n ]\n .map((row) => row.join('='))\n .join('&')\n\n setIsDeleting(true)\n\n const response = await fetch('/api/idea_delete.ashx', {\n body,\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n method: 'post',\n })\n\n if (currentIdea === String(idea.id)) {\n window.location.href = response.url\n return\n }\n\n // Check if the page was loaded with the idea which is going to be deleted here\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\n const configIdeaId = window.FinvizChartsSettings?.ideaChart?.idea?.id ?? window.globalChartConfig?.idea?.id\n if (configIdeaId === idea.id) {\n window.location.reload()\n return\n }\n\n setIdeas((ideas) => ideas.filter((stateIdea) => stateIdea.id !== idea.id))\n setIsDeleting(false)\n })\n\n if (!hasFetched || hasError) {\n return (\n

\n {hasError ? 'Unexpected error occured, please refresh the page.' : 'Loading…'}\n
\n )\n }\n\n if (ideas.length === 0) {\n return (\n \n No saved ideas.\n \n )\n }\n\n return (\n <>\n {ideas.map((idea) => (\n (document.location = getIdeaUrl(idea))}\n >\n
\n

\n {idea.ticker}\n {idea.company && ' - ' + idea.company}\n

\n \n {idea.date}\n \n {idea.note !== '' ? (\n

{idea.note}

\n ) : null}\n
\n
\n \n ) => {\n ev.stopPropagation()\n onDeleteIdeaClick.current(idea)\n }}\n >\n Delete\n \n
\n \n ))}\n \n )\n}\n\nexport function IdeasDialog(props: any) {\n return (\n \n props.state.hide()}>Your ideas\n \n \n \n \n \n \n \n )\n}\n\nexport async function saveIdea(layoutModel: ChartLayout) {\n const activeChart = layoutModel.activeChart\n const activeChartQuote = activeChart.quote().toJSON()\n const { ticker, instrument, cid } = activeChart\n const period = activeChartQuote.timeframe\n const { ChartSettings } = layoutModel.settings\n const layout: ObjectHash = layoutModel.toObject()\n layout.layout = LayoutType['1h1v']\n layout.barWidth = ChartSettings.center.barWidth\n layout.barMargin = ChartSettings.center.barMargin\n layout.charts = layout.charts\n .filter((c: ObjectHash) => c.chartId === cid)\n .map((c: ObjectHash) => ({ ...c, dateRange: null, refreshData: false }))\n\n delete layout.charts[0].chartId\n\n // TODO: replace with better solution after indicators overhaul\n const getChartTickers = (layoutModelObjectPanes: { elements: { type: string; tickers: string }[] }[]) => {\n let tickers = []\n let tickersString = ''\n for (const pane of layoutModelObjectPanes) {\n for (const element of pane.elements) {\n if (element.type === 'indicators/perf') {\n tickersString = element.tickers\n }\n }\n }\n tickers = tickersString.split(',').filter((item) => item)\n if (!tickers.includes(ticker)) {\n tickers.push(ticker.replace('@', ''))\n }\n return tickers\n }\n const tickers = getChartTickers(layout.charts[0].panes)\n const quotes = Quote.select(\n (quote: Quote) =>\n tickers.includes(quote.ticker) && quote.timeframe === activeChart.timeframe && layoutModel.isIdeaId(quote.ideaID)\n ).filter((element, index, array) => array.findIndex((t) => t.ticker === element.ticker) === index)\n const quotesJsonString = JSON.stringify(quotes.map((q) => omit(q.toJSON(), ['ideaID', 'chartUuid'])))\n\n const chart = JSON.stringify(layout)\n const note =\n layoutModel.idea?.note ||\n getTickerNoteText({ ticker, elements: layoutModel.drawingsInternalStore().elements }) ||\n ''\n window.gtag?.('event', 'save', { event_category: 'ideas' })\n\n if (tickers.length !== quotes.length) {\n captureException(new Error('Idea saved with inconsistent quotes data'), {\n extra: {\n tickers,\n quoteTickersTimeframes: quotes.map((quote) => ({ ticker: quote.ticker, timeframe: quote.timeframe })),\n chartLayout: layoutModel.toConfig(['colors', 'panes']),\n },\n })\n }\n\n const data = await fetchApi<{ id: string }>({\n location: '/api/idea_save.ashx',\n method: 'POST',\n body: getFormDataFromObject({ ticker, period, chart, quotes: quotesJsonString, note }),\n })\n\n const ideaUrl = getIdeaUrl({\n ticker,\n period,\n instrument,\n id: data.id,\n })\n\n if (process.env.IS_E2E_TESTING) {\n window.location.href = ideaUrl\n } else {\n // need to be in setTimeout because Safari block any call to window.open made in async,\n // this is hack to force run window.open in main thread\n setTimeout(() => {\n window.open(ideaUrl, 'FinvizSavedIdea')\n })\n }\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport {\n Button,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Spinner,\n Tooltip,\n TooltipTrigger,\n useDialogState,\n useDropdownState,\n useTooltipState,\n} from '../../components'\nimport { IdeasDialog, saveIdea } from '../../modals/ideas'\nimport ChartLayout from '../../models/chart_layout'\nimport Quote from '../../models/quote'\nimport { getIsMobileScreenSize } from '../../utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\ninterface IdeaDropdownProps {\n model: ChartLayout\n rounding?: 'none' | 'regular'\n theme?: string\n size?: string\n dropdownButtonClassName?: string\n}\n\nexport function IdeasDropdown({\n model,\n rounding,\n dropdownButtonClassName,\n ...props\n}: React.PropsWithChildren) {\n const tooltipState = useTooltipState({ placement: 'right-start' })\n const [isAnyQuoteLoading, setIsAnyQuoteLoading] = React.useState(false)\n const ref = React.useRef(null)\n const dialog = useDialogState()\n const dropdown = useDropdownState()\n const hideTooltip = tooltipState.hide\n\n React.useEffect(() => {\n const checkIfAnyQuoteIsLoading = () => {\n const fetchingQuotes = Quote.select((quote) => quote.isFetching && quote.fetchedAt === -1)\n setIsAnyQuoteLoading(fetchingQuotes.length > 0)\n }\n\n Quote.bind('change', checkIfAnyQuoteIsLoading)\n return () => {\n Quote.unbind('change', checkIfAnyQuoteIsLoading)\n }\n }, [])\n\n React.useEffect(() => {\n if (!isAnyQuoteLoading || !dropdown.visible) {\n hideTooltip()\n }\n }, [isAnyQuoteLoading, dropdown.visible, hideTooltip])\n\n if (!window.FinvizSettings.hasUserPremium) {\n return (\n \n )\n }\n\n return (\n <>\n \n }\n >\n {\n if (isAnyQuoteLoading) {\n tooltipState.show()\n return\n }\n saveIdea(model)\n }}\n >\n Save idea\n \n \n Load idea\n \n \n \n \n
\n \n
\n \n Some data is still loading. Please wait.\n \n
\n \n )\n}\n","export const publishModalAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"modals-publish\" */ './module-entry'),\n cacheKey: 'modals-publish',\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Button, Delayed, DialogTrigger, Icon, Spinner, useDialogState } from '../../components'\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\n\ninterface PublishProps {\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function Publish({ model, ...props }: React.PropsWithChildren) {\n const dialog = useDialogState()\n const [publishModalModule, { isLoading }] = useAsyncModule({\n ...publishModalAsyncModule,\n shouldLoadModule: dialog.visible,\n errorSeverity: 'medium',\n onError: () => dialog.hide(),\n })\n const PublishDialog = publishModalModule?.default\n const buttonProps = isLoading\n ? {\n leftContent: (\n \n }\n >\n \n \n ),\n }\n : {\n as: DialogTrigger,\n state: dialog,\n leftContent: 'share',\n }\n return (\n <>\n \n {PublishDialog && }\n \n )\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Button, Delayed, Icon, Spinner, useTour } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { getRequestFullscreen, isRedesignEnabled } from '../../utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\ninterface TourDefinition {\n id: string\n steps: Array<{\n title?: React.ReactNode\n body: React.ReactNode\n target?: string\n placement?: string\n overlayRadius?: number\n overlayPadding?: number\n }>\n skip?: boolean\n}\n\nconst isPremium = window.FinvizSettings.hasUserPremium\n\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\nfunction getTour(page: SpecificChartFunctionality): TourDefinition[] {\n return [\n {\n id: 'chart-tour',\n steps: [\n {\n title: 'Chart Tour',\n body: 'Discover powerful Chart features in the 2-min tour to master your analysis of trading opportunities.',\n },\n ...(isPremium\n ? [\n {\n title: 'Scale the Timeline',\n body: 'Grab the timeline to zoom it in and out. Double-click the timeline to reset the scaling.',\n target: '[data-testid=\"chart-0-pane-0-zoomer\"]',\n },\n {\n title: 'Scale the Price Axis',\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.',\n target: '[data-testid=\"chart-0-pane-0-scaler\"]',\n },\n {\n title: 'Drawing tools & settings',\n body: 'Pick any Drawing Tool to analyze the market. Tailor your drawing experience with additional settings.',\n target: '#toolbar',\n },\n {\n title: 'Fine-tune Drawings',\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.',\n target: '[data-testid=\"chart-0-pane-0\"]',\n },\n ]\n : [\n {\n title: 'Enable Drawing mode',\n body: (\n <>\n \n Finviz*Elite\n {' '}\n subscribers get access a whole suite of drawing tools which allow them to draw on and annotate the\n chart.
\n While in drawing mode, you can also pan the chart, scale the timeline and price axis and much more.\n \n ),\n target: '[data-testid=\"quote-toggle-draw-btn\"]',\n placement: 'bottom-start',\n },\n ]),\n {\n title: 'Save your best Ideas',\n body: isPremium\n ? 'Besides your drawings being autosaved, you can manually save ideas that you wish to revisit later.'\n : 'Your drawings will be saved automatically, but you can also manually save ideas that you wish to revisit later.',\n target: '[data-testid=\"chart-toolbar-ideas\"]',\n placement: 'bottom-start',\n },\n ...(page === SpecificChartFunctionality.quotePage\n ? []\n : [\n {\n title: 'Chart Layouts & Charts Sync',\n body: 'Switch between Chart Layouts to view multiple charts on your screen. Synchronize Ticker, Timeframe or Crosshair position across your charts.',\n target: '[data-testid=\"chart-layout-layout\"]',\n },\n ]),\n ...(!getRequestFullscreen(document.documentElement) && page === SpecificChartFunctionality.chartPage\n ? []\n : [\n {\n title: 'Fullscreen mode',\n body:\n page === SpecificChartFunctionality.quotePage\n ? 'Open the chart in an expanded view for full-page display and split-screen charts.'\n : 'Toggle the window to fill your entire screen.',\n target: '[data-testid=\"chart-layout-fullscreen\"]',\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\n },\n ]),\n {\n title: 'Share chart',\n body: 'Share a chart together with your analysis and ideas.',\n target: '[data-testid=\"chart-toolbar-publish\"]',\n overlayPadding: page === SpecificChartFunctionality.quotePage ? 3 : undefined,\n placement: 'bottom',\n },\n ...(isRedesignEnabled() || page === SpecificChartFunctionality.chartPage\n ? [\n {\n title: 'Theme',\n body: 'Switch between the Light and Dark theme.',\n target: '[data-testid=\"chart-layout-theme\"]',\n },\n ]\n : []),\n {\n title: 'Study Settings',\n body: 'Customize the Chart Type and appearance. Add Overlays, Indicators and toggle Extended Hours.',\n target: '[data-testid=\"chart-settings-open-btn\"]',\n placement: page === SpecificChartFunctionality.chartPage ? 'bottom' : 'bottom-end',\n },\n ],\n },\n page === SpecificChartFunctionality.chartPage && {\n id: 'sidebar-watchlist',\n steps: [\n {\n title: 'Explore Your Portfolios',\n body: 'Effortlessly navigate through your portfolio holdings. With just a click, visualize individual stock charts, gain insights, and stay updated on your investments.',\n target: '[data-testid=\"sidebar-portfolio-btn\"]',\n placement: 'left-start',\n },\n ],\n },\n ].filter(Boolean) as TourDefinition[]\n}\n\ninterface TourButtonProps {\n page: SpecificChartFunctionality\n rounding?: 'none' | 'regular'\n size?: string\n theme?: string\n className?: string\n}\n\nexport function TourButton({ page, className, theme, ...props }: React.PropsWithChildren) {\n const tour = useTour()\n const pageTours = getTour(page)\n const [userTour, setCurrentTour] = React.useState(tour.getStepsForUser(pageTours))\n const buttonTheme = userTour.hasNewTours ? 'blue' : theme ?? 'headerItem'\n\n return (\n \n }\n >\n \n \n ) : (\n \n )\n }\n className={className}\n contentClass={page !== SpecificChartFunctionality.quotePage ? 'hidden lg:flex' : ''}\n title=\"Explore new features\"\n onClick={async () => {\n if (userTour) {\n const activeTour = await tour.startTour(userTour.tour)\n activeTour?.once('inactive', () => {\n setCurrentTour(tour.getStepsForUser(pageTours))\n })\n }\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { Link } from 'react-router-dom'\n\nimport { Icon, Select, SelectOption } from '../../components'\nimport ChartLayout from '../../models/chart_layout'\nimport { useChartTypes } from './use-chart-types'\nimport { TypeBaseOption } from './utils'\n\nconst isNativeMobileSelect = true // explicitly enable native select for mobile devices\n\nexport function ChartTypesSelect({\n isPremium,\n model,\n ...props\n}: {\n isPremium: boolean\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}) {\n const { chartTypes, getCurrentType } = useChartTypes({ isPremium, model })\n const currentType = getCurrentType()\n const [selectedType, setSelectedType] = React.useState(currentType)\n const icon = chartTypes.find((item) => item.value === selectedType)?.iconName\n\n React.useEffect(() => {\n setSelectedType(currentType)\n }, [currentType])\n\n return (\n item.value === selectedType)?.iconName} className=\"text-gray-300\" />\n )\n }\n rightContent={props.theme === 'chip' ? 'caretDown' : undefined}\n hasPopoverButtonWidthLimit={false}\n isNativeMobileSelect={isNativeMobileSelect}\n onChange={(item: TypeBaseOption) => setSelectedType(item.value)}\n >\n {chartTypes.map((item) => (\n \n {item.label}\n \n ))}\n \n )\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport {\n DEFAULT_TYPES,\n FREE_TYPES_QUOTE,\n FREE_TYPES_QUOTE_VALUES,\n QuoteLongToShortType,\n QuoteNodeChartTypes,\n QuoteShortToLongType,\n QuoteUrlChartTypes,\n TypeBaseOption,\n} from './utils'\n\nexport function useChartTypes({ isPremium, model }: { isPremium: boolean; model: ChartLayout }) {\n const location = useLocation()\n const { b, t, ta, ty, p = 'd', r } = decodeQueryString(location.search)\n const taInt = ta ? Number.parseInt(ta) : 1\n const isQuotePage = model.specificChartFunctionality === SpecificChartFunctionality.quotePage\n\n const getCurrentType = React.useCallback(() => {\n const defaultType =\n ((ty as QuoteUrlChartTypes | undefined) && QuoteShortToLongType[ty as QuoteUrlChartTypes]) ??\n (window.FinvizQuoteTypeCurrent as QuoteNodeChartTypes)\n\n return !isPremium && defaultType === QuoteNodeChartTypes.candlestick && taInt === 0\n ? QuoteNodeChartTypes.candlesticksimple\n : defaultType\n }, [isPremium, taInt, ty])\n\n const generateRouterPath = React.useCallback(\n (type: QuoteNodeChartTypes) => {\n if (isPremium || FREE_TYPES_QUOTE_VALUES.includes(type)) {\n return `${location.pathname}?${encodeQueryString({\n b,\n t,\n r,\n ty:\n type === QuoteNodeChartTypes.candlesticksimple\n ? QuoteLongToShortType.candlestick\n : QuoteLongToShortType[type],\n ta: type === QuoteNodeChartTypes.candlestick ? '1' : '0',\n p,\n })}`\n }\n return `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: 'quote-chart-type-select',\n })}`\n },\n [isPremium, location.pathname, b, t, r, p]\n )\n\n const chartTypes = React.useMemo(() => {\n const options = isPremium || !isQuotePage ? DEFAULT_TYPES : FREE_TYPES_QUOTE\n\n return options.map((item) => ({\n ...item,\n href: generateRouterPath(item.value as QuoteNodeChartTypes),\n reloadDocument: !isPremium,\n })) as TypeBaseOption[]\n }, [generateRouterPath, isPremium, isQuotePage])\n\n return { getCurrentType, chartTypes }\n}\n","import classnames from 'classnames'\nimport * as React from 'react'\n\nimport { Paragraph } from '../../components'\nimport math from '../../helpers/math'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { getTickerChange } from '../../utils/chart'\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\nimport { withSuspense } from '../../website-shared'\n\ninterface Props {\n chartIndex: number\n}\n\ninterface ChangeLabelProps {\n children: React.ReactNode\n changePoints: number\n isTiny: boolean\n}\n\nconst CHANGE_UPATE_EVENTS = ['change', 'update']\nconst QUOTE_MODEL_CHANGE_EVENTS = [...CHANGE_UPATE_EVENTS, ...Object.values(QuoteFetchType)]\n\nfunction ChangeLabel({ children, changePoints, isTiny }: ChangeLabelProps) {\n return (\n 0,\n 'text-red-400': changePoints < 0,\n })}\n >\n {children}\n \n )\n}\n\nexport function DailyChangeDisplayComponent({ chartIndex }: Props) {\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\n const chartModel = useModelState(chartLayoutModel?.getAllCharts()[chartIndex] ?? null, {\n watchProperties: ['quote'],\n listenOnEvents: CHANGE_UPATE_EVENTS,\n })\n const quoteModel = useModelState(chartModel?.quote() ?? null, {\n watchProperties: ['lastClose', 'prevClose', 'afterClose'],\n listenOnEvents: QUOTE_MODEL_CHANGE_EVENTS,\n })\n\n const tickerChange = quoteModel && getTickerChange({ data: quoteModel })\n const isTiny =\n !!tickerChange?.tickerChange &&\n math.getInstrumentDecimalPlaces({\n instrument: quoteModel!.instrument,\n value: quoteModel!.lastClose,\n }) >= 6\n\n return (\n
\n {tickerChange?.tickerChange && (\n <>\n {tickerChange.tickerAfterChange && (\n \n {tickerChange.tickerAfterChange.string}\n \n )}\n \n {tickerChange.tickerChange.string}\n \n \n )}\n
\n )\n}\n\nexport const DailyChangeDisplay = React.memo(\n withSuspense(DailyChangeDisplayComponent),\n (prevProps, nextProps) => prevProps.chartIndex === nextProps.chartIndex\n)\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport utils from '../../utils'\nimport { DRAWING_COOKIE_NAME, getIsDrawingEnabled } from '../../utils/chart'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-draw-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive-chart',\n [SpecificChartFunctionality.forexPage]: 'forex-interactive-chart',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive-chart',\n}\n\nconst testId: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-toggle-draw-btn',\n [SpecificChartFunctionality.futuresPage]: 'futures-interactive',\n [SpecificChartFunctionality.forexPage]: 'forex-interactive',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-interactive',\n}\n\ninterface DrawButtonProps {\n isPremium: boolean\n specificChartFunctionality: SpecificChartFunctionality\n active?: boolean\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function DrawButton({\n isPremium,\n specificChartFunctionality,\n ...props\n}: React.PropsWithChildren) {\n const buttonProps = React.useMemo(() => {\n if (!isPremium) {\n return {\n as: 'a',\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[specificChartFunctionality],\n })}`,\n }\n }\n\n return {\n onClick: (ev: React.MouseEvent) => {\n ev.preventDefault()\n const newValue = getIsDrawingEnabled() ? 'off' : 'on'\n\n fetch('/api/set_cookie.ashx?cookie=' + DRAWING_COOKIE_NAME + '&value=' + newValue)\n .catch(() => {})\n .then((res) => {\n if (!res?.ok) {\n // fallback to JS otherwise draw toggle won't work if API don't work\n const expires = new Date()\n expires.setMonth(expires.getMonth() + 1)\n utils.setCookie(DRAWING_COOKIE_NAME, newValue, expires)\n }\n\n const { i: idea, ...rest } = decodeQueryString()\n if (idea) {\n document.location = `quote.ashx?${encodeQueryString(rest)}`\n } else {\n document.location.reload()\n }\n })\n },\n }\n }, [isPremium, specificChartFunctionality])\n\n return (\n \n )\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { Button } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nfunction getTickersString(tickers: string[], tickersCount: number) {\n return Array.from({ length: Math.min(tickersCount, 6) })\n .map((_, index) => tickers[index] ?? tickers[tickers.length - 1])\n .join(',')\n}\n\nfunction getLayoutType(tickersCount: number) {\n switch (tickersCount) {\n case 0: // shouldn't happen\n case 1:\n return '1h1v'\n case 2:\n return '2h1v'\n case 3:\n return '3h1v'\n case 4:\n return '2h2v'\n case 5:\n default:\n // 6 and more\n return '3h2v'\n }\n}\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-fullscreen-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-fullscreen-button',\n [SpecificChartFunctionality.forexPage]: 'forex-fullscreen-button',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-fullscreen-button',\n}\n\ninterface FullscreenButtonProps {\n model: ChartLayout\n isPremium: boolean\n title?: string\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function FullscreenButton({ model, isPremium, ...props }: React.PropsWithChildren) {\n const location = useLocation()\n const { i, p = 'd', r } = decodeQueryString(location.search)\n const urlTickers = model\n .charts()\n .all()\n .map((chart) => chart.quote().getRawTicker())\n\n return (\n p).join(','),\n l: getLayoutType(urlTickers.length),\n r,\n })}`\n : `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[model.specificChartFunctionality],\n })}`\n }\n />\n )\n}\n","import React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport {\n Button,\n Dialog,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Icon,\n Spinner,\n Search as WebsiteSearchComponent,\n useDialogState,\n useDropdownState,\n} from '../../components'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { createAlertAsyncModule, saveToPortfolioAsyncModule } from '../../website-shared'\n\ninterface SearchProps {\n ticker: string\n instrument: Instrument\n onTickerSelected: (ticker: string) => void\n chartIndex: number\n}\n\nexport default function Search({ ticker, instrument, onTickerSelected, chartIndex }: SearchProps) {\n const dropdownState = useDropdownState({ placement: 'bottom-end' })\n const saveToPortfolioDialogState = useDialogState()\n const createAlertDialogState = useDialogState()\n const [saveToPortfolioModule, { isLoading: isLoadingSaveToPortfolio }] = useAsyncModule({\n ...saveToPortfolioAsyncModule,\n shouldLoadModule: saveToPortfolioDialogState.visible,\n onError: () => saveToPortfolioDialogState.hide(),\n })\n const [createAlertModule, { isLoading: isLoadingCreateAlert }] = useAsyncModule({\n ...createAlertAsyncModule,\n shouldLoadModule: createAlertDialogState.visible,\n onError: () => createAlertDialogState.hide(),\n })\n const SaveToPortfolio = saveToPortfolioModule?.SaveToPortfolio\n const CreateAlert = createAlertModule?.CreateAlert\n\n const detailLink = React.useMemo(() => {\n const formattedTicker = ticker.replace('@', '')\n\n switch (instrument) {\n case Instrument.Stock:\n return `/quote.ashx?t=${formattedTicker}`\n case Instrument.Futures:\n return `/futures_charts.ashx?t=${formattedTicker}`\n case Instrument.Forex:\n return `/forex_charts.ashx?t=${formattedTicker}`\n case Instrument.Crypto:\n return `/crypto_charts.ashx?t=${formattedTicker}`\n }\n }, [ticker, instrument])\n\n return (\n
\n }\n />\n }\n >\n {\n window.gtag?.('event', 'click', { event_category: 'open-stock-detail' })\n }}\n >\n {instrument === Instrument.Stock ? 'Open Stock Detail' : 'Open Detail'}\n \n {instrument === Instrument.Stock && (\n {\n window.gtag?.('event', 'click', { event_category: 'save-to-portfolio' })\n }}\n >\n Save to Portfolio\n \n )}\n {instrument === Instrument.Stock && (\n {\n window.gtag?.('event', 'click', { event_category: 'create-alert' })\n }}\n >\n Create Alert\n \n )}\n \n }\n />\n \n {isLoadingSaveToPortfolio && (\n
\n \n
\n )}\n {SaveToPortfolio && }\n
\n \n {isLoadingCreateAlert && (\n
\n \n
\n )}\n {CreateAlert && }\n
\n
\n )\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport {\n Button,\n Delayed,\n Popover,\n PopoverTrigger,\n Spinner,\n getExtendedDialogState,\n useElementMeasure,\n usePopoverState,\n} from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport {\n chartSettingsAsyncModule,\n preventClosingUnsavedChangesAsyncModule,\n} from '../../controllers/chart-settings/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { encodeQueryString } from '../../utils/query_string'\n\nconst SETTINGS_WIDTH = 580 // w-145\nconst BUTTON_POPOVER_GUTTER = 16\nconst SETTINGS_POPOVER_ID = 'settings-popover'\n\nconst utmCampaign: Partial> = {\n [SpecificChartFunctionality.quotePage]: 'quote-settings-button',\n [SpecificChartFunctionality.futuresPage]: 'futures-settings-button',\n [SpecificChartFunctionality.forexPage]: 'forex-settings-button',\n [SpecificChartFunctionality.cryptoPage]: 'crypto-settings-button',\n}\n\ntype PopoverStylesType = { body?: React.CSSProperties; wrapper?: React.CSSProperties }\n\nexport function ScrollableChartSettingsPopover({ state, model }: { state: any; model: ChartLayout }) {\n const { elementWidth: bodyWidth } = useElementMeasure(document.body)\n const [chartSettingsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n shouldLoadModule: state.visible,\n errorSeverity: 'medium',\n onError: () => state.hide(),\n })\n const [preventClosingUnsavedChangesModule] = useAsyncModule({\n ...preventClosingUnsavedChangesAsyncModule,\n shouldLoadModule: state.visible,\n errorSeverity: 'medium',\n onError: () => state.hide(),\n })\n\n /**\n * The reason for this workaround is that the popover with a loader while fetching async modules remounts and resets\n * all animations when all async modules are loaded and the popover is rerendered inside PreventClosingUnsavedChanges\n * */\n const checkForUnsavedChangesAndCloseRef = React.useRef(() => {})\n\n const { ChartSettings } = chartSettingsModule ?? {}\n const { PreventClosingUnsavedChanges } = preventClosingUnsavedChangesModule ?? {}\n const { isFullyClosed } = getExtendedDialogState(state)\n const chartElement = document.getElementById('chart')\n const popoverContentElement = document.getElementById(SETTINGS_POPOVER_ID)\n const settingsButton: HTMLButtonElement = state.unstable_referenceRef.current\n\n const popoverStyles = React.useMemo(() => {\n const newPopoverStyles: PopoverStylesType = {}\n if (!settingsButton || !chartElement) {\n return newPopoverStyles\n }\n const buttonRect = settingsButton.getBoundingClientRect()\n const topOffset = buttonRect.top + buttonRect.height\n newPopoverStyles.body = {\n maxHeight: window.innerHeight - topOffset - BUTTON_POPOVER_GUTTER * 2,\n position: 'sticky',\n top: -topOffset + BUTTON_POPOVER_GUTTER - window.scrollY,\n }\n if (!popoverContentElement) {\n return newPopoverStyles\n }\n const chartHeight = chartElement.clientHeight\n const popoverContentHeight = popoverContentElement.offsetHeight\n const emptySpaceDiff = bodyWidth - model.width\n const maxOffset = SETTINGS_WIDTH - buttonRect.width\n\n let rightOffset = emptySpaceDiff > 150 ? (emptySpaceDiff / 2) * -1 : 0\n if (emptySpaceDiff / 2 > maxOffset) rightOffset = maxOffset * -1\n\n newPopoverStyles.wrapper = {\n height: popoverContentHeight < chartHeight ? chartHeight : undefined,\n marginRight: rightOffset,\n }\n\n return newPopoverStyles\n }, [settingsButton, chartElement, popoverContentElement, model.width, bodyWidth])\n\n const hasAsyncModules = !!(PreventClosingUnsavedChanges && ChartSettings)\n\n return (\n \n {hasAsyncModules ? (\n \n {({ checkForUnsavedChangesAndClose }) => {\n checkForUnsavedChangesAndCloseRef.current = checkForUnsavedChangesAndClose\n return !isFullyClosed ? (\n {}} onClose={checkForUnsavedChangesAndClose} />\n ) : null\n }}\n \n ) : (\n \n
\n \n
\n
\n )}\n \n )\n}\n\ninterface ChartSettingsButtonProps {\n isPremium: boolean\n placement?: string\n model: ChartLayout\n theme?: string\n size?: string\n rounding?: string\n}\n\nexport function ChartSettingsButton({\n isPremium,\n model,\n placement,\n ...props\n}: React.PropsWithChildren) {\n const settingsPopoverState = usePopoverState({ placement: placement ?? 'bottom-end' })\n\n const buttonProps = React.useMemo(() => {\n if (model.specificChartFunctionality !== SpecificChartFunctionality.quotePage && !isPremium) {\n return {\n as: 'a',\n href: `/elite.ashx?${encodeQueryString({\n utm_source: 'finviz',\n utm_medium: 'banner',\n utm_campaign: utmCampaign[model.specificChartFunctionality],\n })}`,\n }\n }\n\n return {\n as: PopoverTrigger,\n state: settingsPopoverState,\n active: settingsPopoverState.visible,\n }\n }, [model, isPremium, settingsPopoverState])\n\n return (\n <>\n \n \n \n )\n}\n","import * as React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { ChartsOrQuotePageQueryParams, SpecificChartFunctionality } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { useModelRef } from '../../model-hooks/useModelRef'\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { createRequestAbortController, removeFromAbortCache } from '../../utils/abort_controller'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport { getLeftOffset } from '../renderUtils'\n\nconst getQuoteRequestKey = (chartModel: Chart) =>\n `quoteReq-${chartModel.ticker}-${chartModel.instrument}-${chartModel.id}`\n\nexport function useChartControls({\n chartModel: unwatchedChartModel,\n isInteractive,\n}: {\n chartModel: Chart | null\n isInteractive: boolean\n}) {\n const location = useLocation()\n const navigate = useNavigate()\n const chartModel = useModelState(unwatchedChartModel, {\n watchProperties: ['ticker', 'timeframe', 'dateRange'],\n })\n const chartLayoutModel = useModelState(chartModel?.chart_layout() ?? null, {\n watchProperties: ['idea', 'settings'],\n })\n const chartModelRef = useModelRef(chartModel)\n const [isLoading, setIsLoading] = React.useState(false)\n const abortControllerKeyRef = React.useRef('')\n const isIdeaChart = !!chartLayoutModel?.idea?.id\n\n const updateChartModelWithNewQuote = React.useCallback((quote: Quote) => {\n const chart = chartModelRef.current\n if (!chart) {\n return\n }\n\n const chartLayoutModel = chart.chart_layout()\n const isSameTicker = chart.getQuoteRawTicker() === quote.getRawTicker()\n\n chart.getAllPanes().forEach((pane) => {\n if (!!pane.getChartOrIndicatorElement()) {\n pane.updateAttribute('scaleRange', null)\n }\n })\n\n chart.updateAttributes({ leftOffset: getLeftOffset({ quote, chartModel: chart }), quote, isScrolled: true })\n\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\n chart\n .getAllQuotes()\n .filter((chartQuote) => !chartQuote.eql(quote))\n .forEach((quote) => {\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\n })\n\n const chartPane = chart.getChartPane()\n chartLayoutModel.activeChartEvent?.instance.toggleIsOpen(false)\n\n const elements = [...chart.getAllElements(), ...(chartPane?.getAllChartEvents(false) ?? [])]\n for (const element of elements) {\n const isDrawing = element.isDrawing()\n const isChartEvent = element.isChartEvent()\n if (isDrawing || isChartEvent) {\n // We want to remove all drawings on ticker change but if autosave is enabled we let the autosave hook take care of that\n if (isSameTicker && (isChartEvent || chartLayoutModel.isPreserveDrawingsActive)) {\n element.instance.updateScales()\n } else {\n element.destroyCascade()\n }\n }\n }\n\n chart.setChartEvents(quote.chartEvents, true)\n\n chartPane?.updateChartEventsZIndexes()\n\n // The only dependency here is a ref , so no need to add it to dependencies\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const fetchQuote = React.useCallback(async () => {\n if (!isInteractive || !chartModel || isIdeaChart) {\n return\n }\n setIsLoading(true)\n\n const { ticker, instrument, timeframe, hasChartEvents } = chartModel\n const { premarket, aftermarket } = Quote.first()\n const patterns = chartModel.getHasPatterns()\n const currentQuote = chartModel.quote()\n if (currentQuote.getRawTicker() !== ticker || currentQuote.timeframe !== timeframe) {\n abortControllerKeyRef.current = getQuoteRequestKey(chartModel)\n const abortController = createRequestAbortController({\n key: abortControllerKeyRef.current,\n shouldAbortRunningRequest: !Quote.select(\n (quote) =>\n quote.ticker === ticker &&\n quote.timeframe === timeframe &&\n quote.isFetching &&\n chartModel.chart_layout().isIdeaId(quote.ideaID)\n ),\n })\n\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe,\n options: {\n premarket,\n aftermarket,\n events: hasChartEvents,\n patterns,\n cachePredicate: (quote) => quote.ideaID === undefined,\n fetchNewDataOnCachedQuote: true,\n },\n abortController,\n })\n\n if (quote.wasFetchAborted) {\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\n const isQuoteUsedInOtherCharts = chartModel\n .chart_layout()\n .getAllCharts()\n .filter((chart) => !chartModel.eql(chart))\n .some((chart) => quote.eql(chart.quote()))\n\n // If the quote hasn't been fetched yet and is not anywhere else we can destroy the model\n if (quote.fetchedAt === -1 && !isQuoteUsedInOtherCharts) {\n quote.destroy()\n }\n\n return\n }\n\n removeFromAbortCache(abortControllerKeyRef.current)\n\n updateChartModelWithNewQuote(quote)\n }\n\n setIsLoading(false)\n\n // We don't want to create new function on any chartModel change as it may be the same chart with different object instance\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n chartModel?.id,\n chartModel?.ticker,\n chartModel?.timeframe,\n chartModel?.instrument,\n isIdeaChart,\n updateChartModelWithNewQuote,\n isInteractive,\n ])\n\n React.useEffect(() => {\n fetchQuote()\n }, [fetchQuote])\n\n // There are several ways how to turn off dateRange, e.g. moving the charts\n // This effect listens to dateRange changes on chartmodel and updates the url if there's a change\n // Consider refactoring this part so we only update chart models on route changes not the other way around\n React.useEffect(() => {\n if (chartModel) {\n const decodedQueryString = decodeQueryString(location.search)\n const rangesArray = chartModel\n .chart_layout()\n .getAllCharts()\n .map((chart) => chart.dateRange)\n const ranges = rangesArray.every((i) => !i) ? undefined : rangesArray.join(',')\n\n if (decodedQueryString.r !== ranges) {\n navigate({\n search: `?${encodeQueryString({\n ...decodedQueryString,\n r: ranges,\n })}`,\n })\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chartModel?.dateRange])\n\n // https://github.com/finvizhq/charts/pull/1253/files#r1052266805\n // React.useEffect(\n // () => () => {\n // if (isInteractive && abortControllerKeyRef.current !== '') {\n // abortRequest(abortControllerKeyRef.current)\n // }\n // },\n // [isInteractive]\n // )\n\n React.useEffect(() => {\n const chart = chartModelRef.current\n const quote = chart?.quote()\n\n let shouldRecalculateOnCharts = false\n if (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage && !isIdeaChart) {\n const settings = chartLayoutModel?.settings\n const barWidth = 3\n const barMargin = 1\n if (settings) {\n const hasSameBarWidth = [\n settings.ChartSettings.center.barWidth,\n settings.IndicatorSettings.center.barWidth,\n ].every((value) => value === barWidth)\n const hasSameBarMargin = [\n settings.ChartSettings.center.barMargin,\n settings.IndicatorSettings.center.barMargin,\n ].every((value) => value === barMargin)\n\n shouldRecalculateOnCharts = !hasSameBarWidth || !hasSameBarMargin\n if (shouldRecalculateOnCharts) {\n settings.ChartSettings.center.barWidth = barWidth\n settings.IndicatorSettings.center.barWidth = barWidth\n settings.ChartSettings.center.barMargin = barMargin\n settings.IndicatorSettings.center.barMargin = barMargin\n\n chartLayoutModel.updateAttributes({ settings })\n }\n }\n }\n\n if (\n chart &&\n quote &&\n (chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage ||\n shouldRecalculateOnCharts) &&\n !isIdeaChart\n ) {\n const leftOffset = getLeftOffset({ quote, chartModel: chart })\n chart.updateAttributes({ leftOffset })\n }\n // This effect should run only on timeframe change & idea change\n // The reason we need to recalculate the left offset is that quote timeframe change changes chart and chart bars sizes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chartModel?.quote()?.timeframe, chartLayoutModel?.settings, isIdeaChart])\n\n return { isLoading }\n}\n","import Spine from '@finviz/spine'\nimport * as React from 'react'\n\nexport function useModelRef(model: Model | null) {\n const modelRef = React.useRef(model)\n\n React.useEffect(() => {\n modelRef.current = model\n }, [model])\n\n return modelRef\n}\n","import classnames from 'classnames'\nimport React from 'react'\nimport { useNavigate } from 'react-router-dom'\n\nimport {\n CustomDateRange,\n Heading,\n TimeframeBar,\n useCustomDateRangeDialog,\n useFavoriteTimeframes,\n} from '../../components'\nimport { ChartEditorEnum, SpecificChartFunctionality, TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport { IdeasDropdown } from '../header/ideas_dropdown'\nimport { Publish } from '../header/publish'\nimport { TourButton } from '../header/tour_button'\nimport { ChartTypesSelect } from './chart-type-select'\nimport { DailyChangeDisplay } from './daily-change-display'\nimport { DrawButton } from './draw-button'\nimport { FullscreenButton } from './fullscreen-button'\nimport Search from './search'\nimport { ChartSettingsButton } from './settings-button'\nimport { useChartControls } from './use-chart-controls'\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\n\ninterface SettingsComponentProps {\n chartModel: Chart\n chartIndex: number\n}\n\nconst isPremium = window.FinvizSettings.hasUserPremium\nconst hasRedesignEnabled = window.FinvizSettings.hasRedesignEnabled\n\nexport function ChartControls({ chartIndex, chartModel: unwatchedChartModel }: SettingsComponentProps) {\n const rounding = hasRedesignEnabled ? undefined : 'none'\n // This memo is required for publish, otherwise it ends up in a loop\n const chartLayout = React.useMemo(() => unwatchedChartModel.chart_layout(), [unwatchedChartModel])\n const chartModel = useModelState(unwatchedChartModel, {\n watchProperties: ['ticker', 'quote', 'dateRange'],\n })\n const { instrument } = chartModel?.quote() || {}\n const isQuotePage = chartLayout.specificChartFunctionality === SpecificChartFunctionality.quotePage\n\n const navigate = useNavigate()\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes()\n const { isLoading } = useChartControls({\n chartModel,\n isInteractive: true,\n })\n const {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\n useCustomDateRangeDialog({\n instrument,\n anchorDate,\n pathGenerator: generateChartLayoutRouterPath,\n })\n\n const handleTickerSelect = React.useCallback(\n (ticker: string) => {\n const upperCaseTicker = ticker.toUpperCase()\n\n navigate(\n generateChartLayoutRouterPath({\n ticker: upperCaseTicker,\n timeframe: chartModel.timeframe,\n dateRange: chartModel.dateRange,\n })\n )\n },\n [chartModel, generateChartLayoutRouterPath, navigate]\n )\n\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\n if (!dateRangeTimeframe) return\n\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\n if (isValid) onDialogSubmit(dateRangeTimeframe)\n }\n\n const timeframeBarProps = React.useMemo(\n () => ({\n size: 'medium',\n chartIndex: chartIndex,\n timeFrameGroups: timeframeGroupsWithHref(isPremium),\n dateRangeGroups: dateRangeGroupsWithHref({ isPremium, customRange: chartModel.dateRange, instrument }),\n selectedTimeframe: chartModel.timeframe,\n onTimeframeSelect: () => {},\n selectedDateRange: chartModel.dateRange,\n favoriteTimeframes: favoriteTimeframes,\n loadingTimeframe: isLoading ? chartModel.timeframe : undefined,\n onDateRangeSelect: handleDateRangeSelect,\n isFavoritesEnabled: isPremium,\n onFavoriteTimeframeToggle: ({ value }: { value: TIMEFRAME }) => {\n toggleFavoriteTimeframe(value)\n },\n }),\n [\n chartIndex,\n chartModel.dateRange,\n chartModel.timeframe,\n dateRangeGroupsWithHref,\n favoriteTimeframes,\n handleDateRangeSelect,\n instrument,\n isLoading,\n timeframeGroupsWithHref,\n toggleFavoriteTimeframe,\n ]\n )\n\n if (chartLayout.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n return (\n
\n {chartModel.chart_layout().canChangeTicker && (\n \n )}\n\n \n\n \n\n \n
\n )\n }\n\n const hasTimeframe = chartLayout.editors.includes(ChartEditorEnum.timeframe)\n\n return (\n \n
\n {!isQuotePage && (\n \n {chartModel.quote().name ?? chartModel.ticker}\n \n )}\n {chartLayout.editors.includes(ChartEditorEnum.tools) && (\n \n Draw\n \n )}\n {chartLayout.editors.includes(ChartEditorEnum.ideas) && (\n \n Ideas\n \n )}\n {!hasTimeframe && (\n
\n \n
\n )}\n
\n\n {hasTimeframe && (\n
\n
\n
\n \n
\n
\n \n \n
\n
\n
\n )}\n\n
\n {chartLayout.editors.includes(ChartEditorEnum.publish) && (\n \n Share\n \n )}\n {isQuotePage && (\n \n )}\n \n {!isQuotePage && 'Fullscreen'}\n \n {chartLayout.editors.includes(ChartEditorEnum.settings) && (\n \n {!isQuotePage && 'Settings'}\n \n )}\n {!isQuotePage && (\n
\n \n
\n )}\n
\n \n )\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = FLibs.Hammerjs;","export const CHART_LAYOUT_CHILD_CHANGE_EVENT = 'chartLayoutChildChange'\n","import Spine from '@finviz/spine'\n\nimport { TodoObjectHashAnyType } from '../../types/shared'\n\ntype TodoContextConfig = TodoObjectHashAnyType\n\nclass ContextMenu extends Spine.Model {\n static initClass() {\n this.configure('ContextMenu', 'shown', 'config', 'top', 'left')\n }\n\n declare shown: boolean\n declare config: TodoContextConfig\n declare top: number\n declare left: number\n}\n\nContextMenu.initClass()\n\nconst contextMenu = ContextMenu.create() as ContextMenu\ncontextMenu.save()\n\nexport default contextMenu\n","import React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { ObjectHash } from '../../types/shared'\nimport { ContextMenu as ContextMenuComponent } from '../components'\nimport model from '../models/context_menu'\nimport { ready } from '../utils'\n\nconst selector = '.context-menu'\n\nclass ContextMenu extends React.Component {\n componentDidMount() {\n model.bind('update', this.update)\n }\n\n componentWillUnmount() {\n model.unbind('update', this.update)\n }\n\n update = () => {\n this.forceUpdate()\n }\n\n render() {\n if (model.shown) {\n document.querySelector(selector)?.classList.remove('hidden')\n } else {\n document.querySelector(selector)?.classList.add('hidden')\n return null\n }\n\n return (\n <>\n this.hide()}\n onContextMenu={(e) => e.preventDefault()}\n data-testid=\"charts-context-menu-overlay\"\n >\n \n \n )\n }\n\n hide() {\n model.updateAttribute('shown', false)\n }\n}\nready(() => {\n const el = document.querySelector(selector)\n if (el) {\n ReactDOM.render(, el)\n }\n})\n\nconst contextMenuControl = {\n show: (event: MouseEvent | React.MouseEvent, config: ObjectHash) => {\n model.updateAttributes({\n shown: true,\n config: config,\n top: event.clientY + window.pageYOffset,\n left: event.clientX,\n })\n },\n}\n\nexport default contextMenuControl\n","import classNames from 'classnames'\nimport React from 'react'\n\nimport {\n Delayed,\n DialogBody,\n Popover,\n PopoverTrigger,\n Spinner,\n ZIndexContext,\n getExtendedDialogState,\n usePopoverState,\n} from '../../components'\nimport { ChartEventBadgeType } from '../../constants/common'\nimport { chartEventsAsyncModule } from '../../controllers/chart-events/async-modules'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartModel from '../../models/chart'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { useClickAway } from '../../utils/use-click-away'\n\ninterface ChartEventPopoverWithStateProps {\n chartModel: ChartModel\n}\n\nconst POPOVER_ID = 'badge-popover'\n\nexport function ChartEventPopoverWithState({ chartModel }: ChartEventPopoverWithStateProps) {\n const unwatchedChartLayout = React.useMemo(() => chartModel.chart_layout() ?? null, [chartModel])\n const { activeChartEvent, theme } = useModelState(unwatchedChartLayout, { watchProperties: ['activeChartEvent'] })\n const popoverState = usePopoverState({ placement: 'top' })\n const { isFullyClosed } = getExtendedDialogState(popoverState)\n const [style, setStyle] = React.useState({\n top: 0,\n left: 0,\n })\n const [chartEventsModule] = useAsyncModule({\n ...chartEventsAsyncModule,\n shouldLoadModule: !isFullyClosed,\n errorSeverity: 'medium',\n onError: () => popoverState.hide(),\n })\n const elementId = activeChartEvent?.elementId\n const isChartEventOfThisChart = activeChartEvent?.pane().chart().eql(chartModel)\n const [data, setData] = React.useState(null)\n const clickAwayRef = useClickAway(() => {\n const isAnyBadgeHovered = !!chartModel\n .getChartPane()\n ?.getAllChartEvents()\n .some((chartEvent) => chartEvent.instance.isHovered)\n\n if (!isAnyBadgeHovered && activeChartEvent && isChartEventOfThisChart) {\n activeChartEvent.instance.toggleIsOpen(false)\n }\n }, !!activeChartEvent && isChartEventOfThisChart)\n // This is intentional, it doesn't need to be in useEffect, it would just call effect function which is redundant\n clickAwayRef.current = popoverState.unstable_popoverRef.current\n const popoverShow = popoverState.show\n const popoverHide = popoverState.hide\n\n React.useEffect(() => {\n if (!activeChartEvent?.instance.isOpen || !isChartEventOfThisChart) {\n if (isFullyClosed) {\n return setData(null)\n }\n return popoverHide()\n }\n if (!isChartEventOfThisChart) return\n const { top, left } = activeChartEvent.instance\n const newData = activeChartEvent.getChartEventData()\n if (newData?.elementId !== data?.elementId) {\n setData({\n ...newData,\n badgeType: activeChartEvent.instance.getChartEvenBadgeType(),\n })\n }\n\n if (style.top !== top || style.left !== left) {\n popoverHide()\n setStyle({\n top,\n left,\n })\n }\n if (!popoverState.visible) {\n popoverShow()\n }\n }, [\n elementId,\n isFullyClosed,\n data,\n style,\n popoverShow,\n popoverHide,\n popoverState.visible,\n activeChartEvent,\n chartModel,\n isChartEventOfThisChart,\n ])\n\n return (\n <>\n \n {data && !isFullyClosed && (\n \n \n \n {chartEventsModule ? (\n \n ) : (\n
\n \n \n \n
\n )}\n \n \n
\n )}\n \n )\n}\n","import React from 'react'\n\nimport Utils from '../utils'\n\nexport function useClickAway(callback: (event: MouseEvent | TouchEvent) => void, isListening = true) {\n const ref = React.useRef(null)\n const refCallback = React.useRef(callback)\n\n React.useLayoutEffect(() => {\n refCallback.current = callback\n })\n\n React.useEffect(() => {\n if (!isListening) {\n return\n }\n const isMobile = Utils.isMobile()\n const handler = (e: MouseEvent | TouchEvent) => {\n const element = ref.current\n if (element && e.target && !element.contains(e.target as HTMLElement)) {\n refCallback.current(e)\n }\n }\n\n document.addEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\n\n return () => {\n document.removeEventListener(isMobile ? 'touchstart' : 'mousedown', handler)\n }\n }, [callback, isListening])\n\n return ref\n}\n","import React from 'react'\n\nimport { Button, ButtonGroup, Delayed, Icon, Spinner } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport { QuoteFetchType } from '../../models/quote/constants'\nimport { useIsMounted } from '../../utils/use-is-mounted'\n\ninterface LoadLatestDataButtonProps {\n chartModel: Chart\n}\n\nexport function LoadLatestDataButton({ chartModel: chartModelUnwatched }: LoadLatestDataButtonProps) {\n const getIsMounted = useIsMounted()\n const chartModel = useModelState(chartModelUnwatched, { watchProperties: ['quote'] })\n const quoteModel = useModelState(chartModel.quote(), { watchProperties: ['isFetching'] })\n const [hasNewDataAvailable, setHasNewDataAvailable] = React.useState(false)\n\n React.useEffect(() => {\n if (!chartModel.getRefreshInterval()) {\n // We will do a check here if we have correct new data\n chartModel\n .quote()\n .isPossibleToFetchSequentialData()\n .then((hasNewData) => {\n if (getIsMounted()) {\n setHasNewDataAvailable(hasNewData)\n }\n })\n }\n // We need to run it only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const handleLoadLatestData = async () => {\n const promises = chartModel\n .getAllQuotes()\n .map(async (quote) => quote.fetchData({ fetchType: QuoteFetchType.NewerData }))\n chartModel.updateAttributes({ refreshData: true })\n await Promise.all(promises)\n if (getIsMounted()) {\n setHasNewDataAvailable(false)\n window.gtag?.('event', 'load-latest-data', { event_category: 'ideas' })\n }\n }\n\n if (!hasNewDataAvailable) {\n return null\n }\n\n return (\n \n }>\n \n \n ) : (\n 'refresh'\n )\n }\n disabled={quoteModel?.isFetching}\n title=\"Load latest data\"\n onClick={handleLoadLatestData}\n data-testid=\"load-latest-data-button\"\n >\n Load latest data\n \n \n )\n}\n","// Copy if this file is in Website repo in Website/js/main/hooks/ folder\nimport * as React from 'react'\n\nexport function useIsMounted() {\n const isMountedRef = React.useRef(false)\n const getIsMounted = React.useCallback(() => isMountedRef.current, [])\n\n React.useEffect(() => {\n isMountedRef.current = true\n return () => {\n isMountedRef.current = false\n }\n }, [])\n\n return getIsMounted\n}\n","import classnames from 'classnames'\nimport debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { Button, ButtonGroup, Icon } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport Chart from '../../models/chart'\nimport Utils from '../../utils'\nimport { getLeftOffset } from '../renderUtils'\nimport { LoadLatestDataButton } from './load-latest-data-button'\n\nexport const ZOOM_CONTROLS_ACTIVE_CLASS = 'is-active'\nexport const ZOOM_CONTROLS_IS_IN_AREA_CLASS = 'is-in-area'\n\nconst buttonCommonProps = {\n size: 'none',\n className: 'w-7 h-6',\n contentClass: 'flex justify-center',\n}\n\nconst isMobile = Utils.isMobile()\n\ninterface ZoomControlsProps {\n zoomControlsRef: React.RefObject\n isVisible: boolean\n chartModel: Chart\n onZoomIn: () => void\n onZoomOut: () => void\n onZoomReset: () => void\n}\n\nconst getDefaultLeftOffset = (chartModel: Chart) =>\n getLeftOffset({\n quote: chartModel.quote(),\n chartModel,\n config: {},\n })\n\nexport function ZoomControls({\n zoomControlsRef,\n chartModel,\n isVisible,\n onZoomIn,\n onZoomOut,\n onZoomReset,\n}: ZoomControlsProps) {\n const chartLayoutModel = useModelState(chartModel.chart_layout(), { watchProperties: ['idea'] })\n const [isGoToRecentVisible, setIsGoToRecentVisible] = React.useState(false)\n const { defaultZoomFactor } = chartLayoutModel\n const [isZoomResetVisible, setIsZoomResetVisible] = React.useState(chartModel.zoomFactor !== defaultZoomFactor)\n const handleGoToMostRecent = React.useCallback(() => {\n chartModel.updateAttributes({ leftOffset: getDefaultLeftOffset(chartModel), dateRange: null })\n }, [chartModel])\n\n React.useEffect(() => {\n const handleChartModelChangeDebounced = debounce(\n () => {\n setIsZoomResetVisible(chartModel.zoomFactor !== defaultZoomFactor)\n setIsGoToRecentVisible(chartModel.leftOffset !== getDefaultLeftOffset(chartModel))\n },\n 100,\n { maxWait: 333 }\n )\n chartModel.bind('change', handleChartModelChangeDebounced)\n return () => {\n handleChartModelChangeDebounced.cancel()\n chartModel.unbind('change', handleChartModelChangeDebounced)\n }\n }, [defaultZoomFactor, chartModel])\n\n return (\n \n {!isMobile && (\n
\n {isZoomResetVisible && (\n
\n \n \n \n \n \n
\n )}\n \n \n \n \n\n \n \n
\n )}\n\n
\n {!!chartLayoutModel.idea?.id && }\n\n {isGoToRecentVisible && (\n \n \n \n \n \n )}\n
\n \n )\n}\n","import Spine from '@finviz/spine'\nimport classnames from 'classnames'\nimport Hammer from 'hammerjs'\nimport debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { CustomSpineEvents, DrawingSpineOptionsEvent, EmptyObject, ObjectHash, PaneArea } from '../../../types/shared'\nimport CanvasElement from '../../canvas/element'\nimport ChartEvent from '../../chart-events/chart-event'\nimport { Button, Notification, Paragraph, withNotificationContext } from '../../components'\nimport { IndicatorType, ScaleType, SetVisibilityTo, SpecificChartFunctionality } from '../../constants/common'\nimport IndicatorElement from '../../indicators/indicator'\nimport { getContextWithCache } from '../../lib/shims'\nimport { withElementStyleDialogState } from '../../modals/element_style'\nimport ChartModel from '../../models/chart'\nimport ChartEventElement from '../../models/chart-event-element'\nimport ElementModel from '../../models/element'\nimport MouseModel from '../../models/mouse'\nimport PaneModel from '../../models/pane'\nimport Quote from '../../models/quote'\nimport { handleRemoveIndicatorPane } from '../../models/utils'\nimport Utils, { isRedesignedPage } from '../../utils'\nimport { getBarWidthWithMargin, unmountCanvas } from '../../utils/chart'\nimport { setElementCursor } from '../../utils/cursor'\nimport { getValueInRange, isPrimaryClick } from '../../utils/helpers'\nimport { getInitialStoreDrawings } from '../autosave/utils'\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from '../chart_layout/constants'\nimport ContextMenu from '../context_menu'\nimport { getMinMaxLeftOffset, getSettings, recountScale, renderPane } from '../renderUtils'\nimport { DrawingTool } from '../toolbar/interfaces'\nimport { getChartAlt } from '../utils'\nimport { ChartEventPopoverWithState } from './chart-event-popover-with-state'\nimport { withPaneModel } from './with-pane-model'\nimport { ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS, ZoomControls } from './zoom_controls'\n\n// Indicates how many time lower/higher can new scale be compared to original one\nconst ALLOWED_MIN_MAX_ZOOM = 10000\n\ninterface PaneProps {\n model: PaneModel\n chartModel: ChartModel\n activeTool: DrawingTool\n activeChartInteraction: string | null\n chartIndex: number\n paneIndex: number\n touchEventsDisabled: boolean\n onPaneClick: (model: PaneModel) => void\n onZoomerReset: () => void\n onZoomerMouseDown: React.MouseEventHandler\n onZoomerTouchStart: React.TouchEventHandler\n onAddToZoomFactor: (data: { diff: number; shouldCalculateRightAlign: boolean }) => void\n onResizerMouseDown: (e: React.MouseEvent, model: PaneModel) => void\n onPaneDestroy: (paneId: string) => void\n setActiveChartInteraction: (value: string | null) => void\n openElementStyleDialog?: (element: CanvasElement | IndicatorElement) => void\n notificationContext: { show: (element: JSX.Element, options: { inline?: boolean }) => void; hide: () => void }\n}\n\ninterface PaneState {\n hasSeenCrossNotification: boolean\n}\n\nclass Pane extends React.Component {\n rafId?: number | null = null\n crossRafId?: number | null = null\n quoteModel: Quote\n paneRef = React.createRef()\n scalerRef = React.createRef()\n zoomerRef = React.createRef()\n zoomControlsRef = React.createRef()\n canvasWrapperRef = React.createRef()\n canvasRef = React.createRef()\n crossCanvasRef = React.createRef()\n chartLayoutModel = this.props.chartModel.chart_layout()\n paneHammer!: HammerManager\n scalerHammer!: HammerManager\n zoomerHammer!: HammerManager\n canvasWrapperHammer!: HammerManager\n mouseDown = false\n lastClientX?: number\n lastClientY?: number\n currentViewRange: { min: number; max: number } | null = null\n lastX!: number\n lastY!: number\n lastActiveTool: DrawingTool\n scalerLastY: number | null = null\n isElementHovered = false\n hoveredElement: CanvasElement | null = null\n isMobile: boolean\n isDisableTouchCrossAvailable = true\n\n canvas: HTMLCanvasElement | null = null\n canvasCtx: CanvasRenderingContext2D | null = null\n crossCanvas: HTMLCanvasElement | null = null\n crossCanvasCtx: CanvasRenderingContext2D | null = null\n isIndicatorPane = false\n\n state: PaneState = {\n hasSeenCrossNotification: !!window.localStorage.getItem('hasSeenCrossNotification'),\n }\n\n // expects chartModel, model, onResizerMouseDown, onPaneDestroy\n constructor(props: PaneProps) {\n super(props)\n\n this.quoteModel = this.props.chartModel.quote()\n props.model.updateAttribute('instance', this)\n props.model.bind('update', this.onModelUpdate)\n props.model\n .elements()\n .bind('create', this.onElementCreate)\n .bind('destroy', this.onElementDestroy)\n .bind('replace', this.onElementReplace)\n .bind('select', this.onElementSelect)\n .bind('makeClone', this.onElementClone)\n .bind('change', this.immediateRecountScaleOnChartIndicatorChange)\n .bind('change', debounce(this.recountScale, 50))\n props.model.bind(CustomSpineEvents.ManualChange, this.recountScale)\n\n props.model.chartEvents().bind('create', this.onElementCreate).bind('change', debounce(this.recountScale, 50))\n\n this.props.chartModel.bind('update', this.onChartUpdate)\n this.props.chartModel.bind(`change ${CustomSpineEvents.IndicatorsChange}`, this.recountScale)\n this.quoteModel.bind('change', this.recountScale)\n this.isMobile = !!Utils.isMobile()\n this.lastActiveTool = props.activeTool\n if (!MouseModel.pane()) {\n MouseModel.updateAttribute('pane', props.model)\n }\n this.isIndicatorPane = props.model.getIsIndicatorPane()\n this.recountScale()\n }\n\n componentDidMount() {\n const { model } = this.props\n this.chartLayoutModel.bind('theme', this.renderAll)\n this.chartLayoutModel.bind('theme', this.renderCross)\n\n const initialStoreDrawings = getInitialStoreDrawings() ?? []\n const elements = [...model.getAllElements(), ...model.getAllChartEvents(false)]\n elements.forEach((element) => {\n this.onElementCreate(element)\n if (element.isDrawing()) {\n const hasDrawingInInitialCache = initialStoreDrawings.some(({ elementId }) => element.elementId === elementId)\n if (hasDrawingInInitialCache) {\n element.instance?.updateScales()\n }\n element.instance.cachePointPositionTimestamp()\n } else if (element.isChartEvent()) {\n element.instance?.updateScales()\n }\n })\n\n model?.updateChartEventsZIndexes()\n\n this.canvas = this.canvasRef.current\n this.canvasCtx = getContextWithCache(this.canvasRef.current)\n this.crossCanvas = this.crossCanvasRef.current\n this.crossCanvasCtx = getContextWithCache(this.crossCanvasRef.current)\n\n this.paneHammer = new Hammer.Manager(this.paneRef.current!, { touchAction: 'none' })\n this.paneHammer.add(new Hammer.Press({ threshold: 5, time: 500 })) // chrome simulator \"long touch\" -> \"oncontextmenu\" is 680ms +- 2ms\n this.paneHammer.on('press', this.onPress)\n this.canvasWrapperHammer = new Hammer(this.canvasWrapperRef.current!, { touchAction: 'none' })\n this.canvasWrapperHammer.on('tap', this.onClick)\n this.canvasWrapperRef.current?.addEventListener('touchmove', this.onTouchMove, { passive: false })\n\n if (this.chartLayoutModel.scrollable || !this.isMobile) {\n if (this.scalerRef.current) {\n this.scalerHammer = new Hammer(this.scalerRef.current, { touchAction: 'none' })\n this.scalerHammer.on('doubletap', this.onScalerReset)\n }\n if (this.zoomerRef.current) {\n this.zoomerHammer = new Hammer(this.zoomerRef.current, { touchAction: 'none' })\n this.zoomerHammer.on('doubletap', this.props.onZoomerReset)\n }\n this.canvasWrapperHammer.on('doubletap', this.onDoubleClick)\n }\n\n this.onChartUpdate({ width: this.props.chartModel.width })\n this.onModelUpdate({ height: model.height })\n this.forceUpdate()\n this.chartLayoutModel.trigger(CHART_LAYOUT_CHILD_CHANGE_EVENT)\n }\n\n componentWillUnmount() {\n this.canvasWrapperRef.current?.removeEventListener('touchmove', this.onTouchMove)\n unmountCanvas(this.canvas)\n unmountCanvas(this.crossCanvas)\n this.props.chartModel.unbind('update', this.onChartUpdate)\n this.props.chartModel.unbind('change', this.recountScale)\n this.quoteModel.unbind('change', this.recountScale)\n }\n\n render() {\n const { activeTool, touchEventsDisabled, onPaneClick, paneIndex, chartIndex, model, chartModel } = this.props\n if (touchEventsDisabled) {\n this.paneHammer?.set({ touchAction: 'auto' })\n this.scalerHammer?.set({ touchAction: 'auto' })\n this.zoomerHammer?.set({ touchAction: 'auto' })\n this.canvasWrapperHammer?.set({ touchAction: 'auto' })\n } else {\n const touchAction = this.getIsHammerAllowScrollActive() ? 'auto' : 'none'\n this.scalerHammer?.set({ touchAction: 'none' })\n this.zoomerHammer?.set({ touchAction: 'none' })\n this.paneHammer?.set({ touchAction })\n this.canvasWrapperHammer?.set({ touchAction })\n }\n\n const isChartPane = model.getIsChartPane()\n\n return (\n onPaneClick(model)}\n onTouchStart={() => onPaneClick(model)}\n onContextMenu={this.onContextMenu}\n data-testid={`chart-${chartIndex}-pane-${paneIndex}`}\n >\n {isChartPane && }\n {paneIndex !== 0 && (\n this.props.onResizerMouseDown(e, model)}\n data-testid={`chart-${chartIndex}-pane-${paneIndex}-resizer`}\n />\n )}\n {this.chartLayoutModel.initialScrollable && (\n \n )}\n\n {this.chartLayoutModel.initialScrollable && isChartPane && (\n <>\n \n {\n this.props.onAddToZoomFactor({ diff: 0.1, shouldCalculateRightAlign: true })\n }}\n onZoomOut={() => {\n this.props.onAddToZoomFactor({ diff: -0.1, shouldCalculateRightAlign: true })\n }}\n onZoomReset={this.props.onZoomerReset}\n />\n \n )}\n \n {getChartAlt(this.quoteModel)}\n {this.chartLayoutModel.cross && }\n \n \n )\n }\n\n getIsHammerAllowScrollActive = () =>\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage &&\n !this.chartLayoutModel.isTouchCrossActive &&\n !this.chartLayoutModel.scrollable\n\n onElementCreate = (el: ElementModel | ChartEventElement) => {\n el.instance.bind('change', this.renderAll)\n this.renderAll()\n }\n\n onElementReplace = (el: ElementModel, oldElementInstance: CanvasElement) => {\n oldElementInstance.unbind('change', this.renderAll)\n el.instance.bind('change', this.renderAll)\n if (oldElementInstance === this.props.model.selection && !this.chartLayoutModel.isDrawingModeContinuousActive) {\n this.setSelection(el.instance)\n } else {\n this.setSelection(null)\n }\n this.renderAll()\n }\n\n onElementDestroy = (el: ElementModel) => {\n const { type } = el.instance\n el.instance.unbind('change', this.renderAll)\n if (el.instance === this.props.model.selection) {\n this.setSelection(null)\n }\n if (type.startsWith('charts/') || type.startsWith('indicators/')) {\n this.props.onPaneDestroy(el['pane_id'])\n }\n this.renderAll()\n }\n\n onElementSelect = (el: ElementModel) => {\n this.setSelectedElement(el.instance)\n }\n\n onElementClone = (_: unknown, clonedElementInstance: CanvasElement) => {\n this.setSelectedElement(clonedElementInstance)\n }\n\n onModelUpdate = ({ height }: { height: number }) => {\n this.setCanvasSize({\n width: this.props.chartModel.width,\n height,\n })\n }\n\n onChartUpdate = ({ width }: { width: number }) => {\n const { model, chartModel } = this.props\n this.setCanvasSize({\n width,\n height: model.height,\n })\n const quote = chartModel.quote()\n if (!this.quoteModel.eql(quote)) {\n this.quoteModel.unbind('change', this.recountScale)\n if (quote) {\n this.quoteModel = quote\n this.quoteModel.bind('change', this.recountScale)\n }\n }\n }\n\n onZoomerMouseMove: React.MouseEventHandler = (e) => {\n if (!this.chartLayoutModel.scrollable || (this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) return\n const area = this.getArea(e)\n MouseModel.updateAttributes({\n position: { x: area.x, y: null },\n pane: this.props.model,\n })\n }\n\n onMouseMoveOnScrolling = (event: TouchEvent | MouseEvent) => {\n if (this.props.activeChartInteraction) {\n return\n }\n\n let { clientX, clientY } = event as MouseEvent\n const { model } = this.props\n\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\n if (isTouch && event.targetTouches?.length > 0) {\n clientX = event.targetTouches[0].clientX\n clientY = event.targetTouches[0].clientY\n }\n if (!model.selection && !this.chartLayoutModel.activeChartEvent) {\n if (this.lastClientX != null) {\n const dif = this.lastClientX - clientX\n this.addToLeftOffset(-dif)\n }\n if (model.scaleRange && this.lastClientY != null) {\n let { min, max } = model.scaleRange\n let difY\n switch (this.props.chartModel.scale) {\n case ScaleType.Logarithmic: {\n difY = this.lastClientY - clientY\n min = model.scale.y.invert(model.scale.y(min) + difY)\n max = model.scale.y.invert(model.scale.y(max) + difY)\n break\n }\n default: {\n difY = (this.lastClientY - clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\n min -= difY\n max -= difY\n break\n }\n }\n\n model.updateAttribute('scaleRange', { min, max })\n this.recountScale()\n this.currentViewRange = this.props.model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\n }\n }\n this.lastClientX = clientX\n this.lastClientY = clientY\n }\n\n onScalerTouchStart: React.TouchEventHandler = (e) => {\n if (!this.chartLayoutModel.scrollable || this.props.touchEventsDisabled) return\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\n this.onScalerMouseDown(e.targetTouches[0])\n }\n }\n\n onScalerTouchMove = (e: TouchEvent) => {\n if (this.chartLayoutModel.scrollable && e.targetTouches.length === 1) {\n this.onScalerMouseMove(e.targetTouches[0])\n }\n }\n\n onScalerTouchEnd = () => {\n if (this.chartLayoutModel.scrollable) {\n this.onScalerMouseUp()\n }\n }\n\n onScalerMouseEnter = () => {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n }\n\n onScalerMouseDown = (event: React.MouseEvent | React.Touch) => {\n const { activeChartInteraction, setActiveChartInteraction, model } = this.props\n if ((event instanceof MouseEvent && event.button) || activeChartInteraction || !this.chartLayoutModel.scrollable) {\n return\n }\n setActiveChartInteraction('scaler')\n\n this.scalerLastY = event.clientY\n // here we need current domain scale or former \"nice\" value\n const [currentDomainMax, currentDomainMin] = model.scale.y.domain()\n this.currentViewRange = { min: currentDomainMin, max: currentDomainMax }\n document.addEventListener<'mousemove'>('mousemove', this.onScalerMouseMove)\n document.addEventListener('mouseup', this.onScalerMouseUp)\n document.addEventListener('touchmove', this.onScalerTouchMove)\n document.addEventListener('touchend', this.onScalerTouchEnd)\n }\n\n onScalerMouseMove = (event: MouseEvent | Touch) => {\n const { model, chartModel } = this.props\n if (model.scaleRange === null && this.currentViewRange === null) {\n return\n }\n let { min, max } = model.scaleRange || this.currentViewRange!\n let difY\n switch (this.props.chartModel.scale) {\n case ScaleType.Logarithmic: {\n difY = this.scalerLastY! - event.clientY\n min = model.scale.y.invert(model.scale.y(min) - difY)\n max = model.scale.y.invert(model.scale.y(max) + difY)\n break\n }\n default: {\n difY = -(this.scalerLastY! - event.clientY) * (model.scale.y.invert(0) - model.scale.y.invert(1))\n min -= difY\n max += difY\n break\n }\n }\n this.scalerLastY = event.clientY\n\n const originalMinMax = model.getChartOrIndicatorElement()?.instance?.getMinMax?.()\n if (originalMinMax) {\n const currentDiff = Math.abs(max - min)\n const originalDiff = Math.abs(originalMinMax.max - originalMinMax.min)\n\n if (currentDiff > originalDiff * ALLOWED_MIN_MAX_ZOOM || currentDiff < originalDiff / ALLOWED_MIN_MAX_ZOOM) {\n return\n }\n }\n\n model.updateAttribute('scaleRange', { min, max })\n chartModel.updateAttribute('dateRange', null)\n this.recountScale()\n }\n\n onScalerMouseUp = () => {\n this.scalerLastY = null\n\n document.removeEventListener('mousemove', this.onScalerMouseMove)\n document.removeEventListener('mouseup', this.onScalerMouseUp)\n document.removeEventListener('touchmove', this.onScalerTouchMove)\n document.removeEventListener('touchend', this.onScalerTouchEnd)\n this.props.setActiveChartInteraction(null)\n }\n\n onScalerReset = () => {\n const { model, chartModel } = this.props\n if (!this.chartLayoutModel.scrollable) return\n chartModel.updateAttribute('dateRange', null)\n model.updateAttribute('scaleRange', null)\n this.recountScale()\n }\n\n addToLeftOffset = (n: number) => {\n const quote = this.props.chartModel.quote()\n const barWidth = getBarWidthWithMargin({\n chartLayout: this.chartLayoutModel,\n zoomFactor: this.props.chartModel.zoomFactor,\n })\n const leftOffset = getMinMaxLeftOffset({\n newLeftOffset: this.props.chartModel.leftOffset + n,\n chartModel: this.props.chartModel,\n barWidth,\n barIndex: quote.barIndex[quote.open.length - 1],\n })\n\n if (leftOffset > barWidth) {\n quote.fetchOlderData()\n }\n this.props.chartModel.updateAttributes({\n leftOffset,\n dateRange: null,\n })\n }\n\n onDoubleClick = (event: HammerInput) => {\n event.preventDefault()\n const area = this.getArea(event)\n const element = this.props.model.selection || this.getElement(area)\n if (element && element.type !== IndicatorType.Cot) {\n setTimeout(() => {\n this.props.openElementStyleDialog!(element)\n }, 0)\n element.trigger('dblclick', event)\n }\n }\n\n onPress = (e: ObjectHash) => {\n if (e.pointerType !== 'touch') return\n\n e.clientX = e.center.x\n e.clientY = e.center.y\n\n const el = this.props.model.selection || this.getElement(this.getArea(e))\n if (!this.chartLayoutModel.isTouchCrossActive) {\n if (!el) {\n this.onCanvasPress(e as React.MouseEvent)\n } else {\n this.onContextMenu(e as React.MouseEvent, el)\n }\n }\n }\n\n onContextMenu = (e: React.MouseEvent, element?: IndicatorElement | CanvasElement) => {\n e.preventDefault()\n const area = this.getArea(e)\n const elementInArea = this.getElement(area)\n const el = element ?? elementInArea\n if (!el || el.thumbsAreInArea(area)) {\n return\n }\n const elementModel = ElementModel.findByAttribute('instance', el)\n if (!elementModel) return\n this.setSelectedElement(el)\n const hasProperties =\n ['indicator', 'canvas'].some((type) => el.type.startsWith(type)) && el.type !== IndicatorType.Cot\n const isElementDrawing = elementModel.isDrawing()\n\n return ContextMenu.show(\n e,\n [\n hasProperties && {\n id: 'edit',\n label: 'Edit style',\n onClick: () => this.props.openElementStyleDialog!(el),\n },\n\n !(elementModel.isChart() || elementModel?.isIndicator()) && {\n id: 'clone',\n label: 'Clone',\n onClick: () => elementModel.makeClone(),\n },\n\n ...(isElementDrawing\n ? [\n { type: 'divider', label: 'Visibility' },\n\n {\n id: 'visibility-current-and-above',\n label: 'Current interval and above',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndAbove),\n },\n\n {\n id: 'visibility-current-and-below',\n label: 'Current interval and below',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentAndBelow),\n },\n\n {\n id: 'visibility-current-only',\n label: 'Current interval only',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.currentOnly),\n },\n\n {\n id: 'visibility-all-intervals',\n label: 'All intervals',\n onClick: () => elementModel.instance.setVisibilityTo(SetVisibilityTo.all),\n },\n ]\n : []),\n\n (isElementDrawing || hasProperties) && { type: 'divider' },\n\n {\n id: 'bring-to-front',\n label: 'Bring to Front',\n onClick: () => elementModel.bringToFront(),\n },\n {\n id: 'send-to-back',\n label: 'Send to Back',\n onClick: () => elementModel.sendToBack(),\n },\n {\n id: 'bring-forward',\n label: 'Bring Forward',\n onClick: () => elementModel.bringForward(),\n },\n {\n id: 'send-backward',\n label: 'Send Backward',\n onClick: () => elementModel.sendBackward(),\n },\n\n { type: 'divider' },\n\n {\n id: 'remove',\n label: 'Remove',\n onClick: () => {\n if (elementModel.isIndicator()) {\n handleRemoveIndicatorPane({ paneIndex: this.props.paneIndex, chartLayoutModel: this.chartLayoutModel })\n } else {\n elementModel.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\n this.props.model.normalizeZIndexes()\n }\n },\n },\n ]\n .filter(Boolean)\n .map((item) => ({ ...item, gtag: { element_type: el.type } }))\n )\n }\n\n immediateRecountScaleOnChartIndicatorChange = (element?: ElementModel) => {\n if (element?.isChart() || element?.isIndicator()) {\n this.recountScale()\n }\n }\n\n recountScale = (_?: unknown, updateType?: Spine.Event) => {\n const { model } = this.props\n const chartModel = model.chart()\n if (updateType === 'destroy' || !chartModel || !chartModel.quote()) {\n return\n }\n\n recountScale({ chartModel, paneModel: model })\n\n if (this.canvasCtx) {\n this.renderAll()\n }\n }\n\n onBlur = () => {\n if (this.props.model.selection?.getIsCreator?.()) {\n this.setSelection(null)\n } else {\n this.setSelectedElement(null)\n }\n if (this.hoveredElement) {\n this.hoveredElement.setIsHovered(false)\n this.hoveredElement = null\n }\n this.props.model.getAllElements().forEach((element) => {\n if (element.instance.getIsCreator?.() && !element.instance.getIsCreatorDialogOpen?.()) {\n element.destroyCascade()\n }\n })\n }\n\n renderAll = (type?: string) => {\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = true\n if (type === 'cross' && this.chartLayoutModel.cross) {\n if (this.crossRafId === null) {\n this.crossRafId = window.requestAnimationFrame(() => {\n this.renderCross()\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\n })\n }\n } else if (this.rafId == null && this.canvasCtx) {\n this.rafId = window.requestAnimationFrame(() => {\n this._renderAll()\n if (process.env.IS_E2E_TESTING) window.isRenderInProgress = Date.now()\n })\n }\n }\n\n _renderAll = () => {\n const { model } = this.props\n // _renderAll may be called after Chart was deleted because of requestAnimationFrame\n if (model.chart() === null || this.canvasRef.current === null || !this.canvasCtx) {\n return\n }\n if (this.getIsUpdatedDesign()) {\n if (this.crossRafId === null) {\n this.crossRafId = window.requestAnimationFrame(this.renderCross)\n }\n }\n this.rafId = undefined\n\n renderPane({\n chartLayoutModel: this.chartLayoutModel,\n chartModel: this.props.chartModel,\n paneModel: model,\n canvasCtx: this.canvasCtx,\n })\n }\n\n getIsUpdatedDesign() {\n const { specificChartFunctionality } = this.chartLayoutModel\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isRedesignedFuturesForexCrypto = isRedesignedPage({ specificChartFunctionality })\n\n return isCharts || isRedesignedFuturesForexCrypto\n }\n\n renderCross = () => {\n const { model } = this.props\n const isMouseInPane = MouseModel.getShouldRenderCrossInPane(model)\n this.crossRafId = null\n if (!this.crossCanvasCtx) {\n return\n }\n this.crossCanvasCtx.clearRect(0, 0, this.props.chartModel.width, model.height)\n const isCrossDisabled =\n PaneModel.select((p) => !!p.selection && !p.selection.type.startsWith('indicators/')).length !== 0 ||\n this.props.chartModel.getIsDisabled() ||\n !isMouseInPane\n\n for (const { instance: elementInstance } of model.getAllElements()) {\n if (\n (!isCrossDisabled && elementInstance.renderCross != null) ||\n (isCrossDisabled && elementInstance.renderCrossText != null)\n ) {\n this.crossCanvasCtx.save()\n if (isCrossDisabled) {\n elementInstance.renderCrossText!(this.crossCanvasCtx, Number.NaN)\n } else {\n elementInstance.renderCross!(this.crossCanvasCtx)\n }\n this.crossCanvasCtx.restore()\n }\n }\n }\n\n getArea = (e: ObjectHash, additionalData?: T): PaneArea => {\n const { model } = this.props\n const clientX = e.clientX || additionalData?.clientX\n const clientY = e.clientY || additionalData?.clientY\n const Settings = getSettings(model)\n const areaRectangle = this.canvas!.getBoundingClientRect()\n const areaRectangleCursorX = clientX - areaRectangle.left\n const areaRectangleCursorY = clientY - areaRectangle.top\n const x = areaRectangleCursorX - model.chart().leftOffset - Settings.left.width\n const y = areaRectangleCursorY - Settings.top.height\n const scale = model.scale\n const chartLeftX = areaRectangle.left + Settings.left.width\n const chartRightX = areaRectangle.right - Settings.right.width\n return {\n ...(additionalData as T),\n // TODO: rewrite if canvas uses padding/border\n x: scale.x.invert(x),\n y: scale.y.invert(y),\n scaled: {\n x,\n y,\n },\n width: 1,\n height: 1,\n cursorX: areaRectangleCursorX,\n cursorY: areaRectangleCursorY,\n isCursorInChartWidthBoundaries: clientX > chartLeftX && clientX < chartRightX,\n }\n }\n\n setCanvasSize = ({ width, height }: { width: number; height: number }) => {\n const ratio = Utils.getScaleRatio()\n const canvasElement = this.canvasRef.current\n\n /**\n * It seems that value passed into element attr (e.g. height) is ceiled down,\n * so if you provide canvas element with height 100.5 we'll get integer 100 from canvasElement.height\n * If the difference in values between \"new height\" and canvasElement.height is less than 1, I treat it as the same value\n */\n if (\n this.canvasCtx &&\n canvasElement &&\n (Math.abs(height * ratio - canvasElement.height) >= 1 || Math.abs(width * ratio - canvasElement.width) >= 1)\n ) {\n Utils.setSizeOnCanvasElement({ canvasElement, width, height })\n this.canvasCtx.scale(ratio, ratio)\n if (this.chartLayoutModel.cross && this.crossCanvasCtx) {\n Utils.setSizeOnCanvasElement({\n canvasElement: this.crossCanvasRef.current,\n width,\n height,\n })\n this.crossCanvasCtx.scale(ratio, ratio)\n }\n setTimeout(() => {\n this.recountScale()\n })\n }\n }\n\n onClick = (event: HammerInput) => {\n const area = this.getArea(event, {\n clientX: event.center.x,\n clientY: event.center.y,\n })\n const element = this.props.model.selection || this.getElement(area)\n element?.trigger('click', area)\n\n if (!this.isDisableTouchCrossAvailable) {\n this.isDisableTouchCrossAvailable = true\n return\n }\n\n if (this.chartLayoutModel.isTouchCrossActive) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n this.chartLayoutModel.updateAttributes({\n scrollable: this.chartLayoutModel.initialScrollable,\n isTouchCrossActive: false,\n })\n } else if (\n this.isMobile &&\n !this.state.hasSeenCrossNotification &&\n this.lastActiveTool === DrawingTool.Mouse &&\n this.chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.smallIndex\n ) {\n const isChartsPage = this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n\n this.setState({ hasSeenCrossNotification: true })\n this.props.notificationContext.show(\n {\n this.props.notificationContext.hide()\n window.localStorage.setItem('hasSeenCrossNotification', 'true')\n }}\n theme=\"dark\"\n >\n Got it\n \n }\n >\n Long press the chart to show the crosshair.\n ,\n { inline: !isChartsPage }\n )\n }\n\n this.lastActiveTool = this.props.activeTool\n }\n\n onPaneMouseLeave = () => {\n // timout in onPaneMouseMove may cause racecondition where active class is added right after it's been removed\n setTimeout(() => {\n this.zoomControlsRef.current?.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS, ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n })\n if (this.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n this.renderCross()\n }\n }\n\n onPaneMouseMove = (e: React.MouseEvent | React.Touch, isMouseDownIgnored = false) => {\n const { model, chartModel } = this.props\n const zoomControls = this.zoomControlsRef.current\n const paneHeight = model.height\n if (zoomControls) {\n const area = this.getArea<{ mouseDown: boolean; clientX: number; clientY: number }>(e, {\n mouseDown: !isMouseDownIgnored && this.mouseDown,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n\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\n setTimeout(() => {\n // 103 is the destance between pane bottom and zoom-controls top\n // zoomer bottom (8 px) + zoomer height (20px) - 13px + zoom controls height (75px) = 90px\n const isInArea = model.height - 90 <= area.cursorY && paneHeight > 210\n\n if (\n isInArea &&\n !zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS) &&\n !chartModel.getIsDisabled()\n ) {\n zoomControls.classList.add(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n } else if (!isInArea && zoomControls.classList.contains(ZOOM_CONTROLS_IS_IN_AREA_CLASS)) {\n zoomControls.classList.remove(ZOOM_CONTROLS_IS_IN_AREA_CLASS)\n }\n\n if (!area.mouseDown && !model.selection && isInArea && !chartModel.getIsDisabled()) {\n if (!zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\n zoomControls.classList.add(ZOOM_CONTROLS_ACTIVE_CLASS)\n }\n } else if (zoomControls.classList.contains(ZOOM_CONTROLS_ACTIVE_CLASS)) {\n zoomControls.classList.remove(ZOOM_CONTROLS_ACTIVE_CLASS)\n }\n })\n }\n }\n\n onMouseLeave = () => {\n this.mouseDown = false\n }\n\n onTouchStart = (e: React.TouchEvent) => {\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\n const touchEvent = e.targetTouches[0]\n if (this.chartLayoutModel.scrollable) {\n this.onCanvasInteractionStart(touchEvent)\n } else if (this.chartLayoutModel.isTouchCrossActive) {\n this.lastClientX = touchEvent.clientX\n this.lastClientY = touchEvent.clientY\n if (!MouseModel.pane()?.eql(this.props.model)) {\n const area = this.getArea(touchEvent, {\n mouseDown: this.mouseDown,\n clientX: touchEvent.clientX,\n clientY: touchEvent.clientY,\n })\n this.setMousePosition(this.getMousePositionInBoundaries(area))\n this.isDisableTouchCrossAvailable = false\n }\n } else {\n const area = this.getArea(touchEvent, { isTouch: true }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\n const element = this.getElement(area)\n if (element?.getIsChartEvent?.()) {\n const chartEventElement = element as ChartEvent\n chartEventElement.toggleIsOpen()\n }\n }\n this.onPaneMouseMove(touchEvent, true)\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (!this.props.touchEventsDisabled) {\n if (!this.getIsHammerAllowScrollActive()) {\n e.preventDefault()\n }\n if (!this.props.touchEventsDisabled && e.targetTouches.length === 1) {\n this.onCanvasInteractionMove(e.targetTouches[0])\n }\n }\n }\n\n onTouchEnd = (e: React.TouchEvent) => {\n if (!this.props.touchEventsDisabled && this.chartLayoutModel.scrollable) {\n this.onCanvasInteractionEnd(e)\n }\n }\n\n onCanvasPress = (e: React.MouseEvent) => {\n if (this.chartLayoutModel.scrollable) {\n this.chartLayoutModel.updateAttribute('scrollable', false)\n document.removeEventListener('touchmove', this.onMouseMoveOnScrolling)\n }\n if (!this.chartLayoutModel.isTouchCrossActive) {\n this.chartLayoutModel.updateAttribute('isTouchCrossActive', true)\n this.onCanvasInteractionMove(e)\n }\n }\n\n onCanvasInteractionStart = (e: React.Touch | React.MouseEvent) => {\n const { activeTool, activeChartInteraction, chartModel, model } = this.props\n const isTouch = typeof Touch !== 'undefined' && e instanceof Touch\n this.lastActiveTool = activeTool\n\n if (isPrimaryClick(e) && !activeChartInteraction && !chartModel.getIsDisabled()) {\n const area = this.getArea(e, { isTouch }) // passing isTouch is pretty confusing, it's used in Tools.jsx -> onMouseDown method\n const element = this.getElement(area)\n if (this.chartLayoutModel.scrollable) {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'grabbing' })\n if (model.scaleRange) {\n this.currentViewRange = model.getChartOrIndicatorElement()?.instance?.getMinMax?.() ?? null\n }\n document.addEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\n document.addEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\n }\n if (element?.getIsChartEvent?.()) {\n this.setSelectedElement(null)\n const chartEventElement = element as ChartEvent\n chartEventElement.toggleIsOpen()\n } else if (\n activeTool === DrawingTool.Mouse ||\n model.getAllElements().some(({ instance }) => instance.isCreator)\n ) {\n element?.trigger('mousedown', area)\n this.setSelectedElement(element)\n }\n model.trigger('mousedown', model, area, element)\n this.mouseDown = true\n this.lastX = area.x\n this.lastY = area.y\n }\n\n this.lastClientX = e.clientX\n this.lastClientY = e.clientY\n }\n\n onCanvasInteractionMove = (e: React.MouseEvent | React.Touch) => {\n const area = this.getArea(e, {\n mouseDown: this.mouseDown,\n clientX: e.clientX,\n clientY: e.clientY,\n })\n if (!area.isCursorInChartWidthBoundaries) {\n MouseModel.updateAttributes({\n position: null,\n pane: null,\n })\n return\n }\n\n const { model } = this.props\n const hoveredElement = this.getElement(area)\n const element = model.selection || hoveredElement\n\n if (!(this.isMobile && !this.chartLayoutModel.isTouchCrossActive)) {\n this.isDisableTouchCrossAvailable = true\n this.setMousePosition(\n this.lastClientX && this.lastClientY && this.chartLayoutModel.isTouchCrossActive && MouseModel.position\n ? this.getMousePositionInBoundaries({\n x: MouseModel.position.x + (model.scale.x.invert(area.clientX) - model.scale.x.invert(this.lastClientX)),\n y: MouseModel.position.y + (model.scale.y.invert(area.clientY) - model.scale.y.invert(this.lastClientY)),\n })\n : { x: area.x, y: area.y }\n )\n }\n\n if (!this.chartLayoutModel.scrollable) {\n this.lastClientX = area.clientX\n this.lastClientY = area.clientY\n }\n\n element?.trigger('mousemove', area)\n if (\n this.mouseDown &&\n model.selection instanceof CanvasElement &&\n !model.selection.activeThumb &&\n !this.chartLayoutModel.activeChartEvent\n ) {\n if (!model.selection.getIsCreator?.()) {\n model.selection.moveBy(area.x - this.lastX, area.y - this.lastY)\n }\n this.lastX = area.x\n this.lastY = area.y\n this.renderAll()\n }\n const isElementHovered =\n this.props.activeTool === DrawingTool.Mouse &&\n ((element && element === hoveredElement) || hoveredElement instanceof CanvasElement)\n\n if (hoveredElement !== this.hoveredElement && this.hoveredElement instanceof CanvasElement) {\n this.hoveredElement.setIsHovered(false)\n this.hoveredElement = null\n }\n\n if (isElementHovered && hoveredElement instanceof CanvasElement) {\n if (!hoveredElement.isHovered && !hoveredElement.isSelected) {\n hoveredElement.setIsHovered(true)\n this.hoveredElement = hoveredElement\n }\n }\n\n if (isElementHovered !== this.isElementHovered && this.canvas && hoveredElement?.type !== IndicatorType.Cot) {\n this.canvas.className = isElementHovered ? 'hover' : ''\n if (this.chartLayoutModel.cross && this.crossCanvas) {\n this.crossCanvas.className = `second${isElementHovered ? ' hover' : ''}`\n }\n this.isElementHovered = isElementHovered\n }\n }\n\n onCanvasInteractionEnd = (event: TouchEvent | MouseEvent | React.TouchEvent) => {\n if (MouseModel.position) {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'crosshair' })\n } else {\n setElementCursor({ elementId: this.chartLayoutModel.getHTMLElementId(), cursor: 'default' })\n }\n const isTouch = typeof TouchEvent !== 'undefined' && event instanceof TouchEvent\n this.mouseDown = false\n const area = this.getArea(event)\n const element = this.props.model.selection || this.getElement(area)\n element?.trigger('mouseup', area)\n document.removeEventListener(isTouch ? 'touchmove' : 'mousemove', this.onMouseMoveOnScrolling)\n document.removeEventListener(isTouch ? 'touchend' : 'mouseup', this.onCanvasInteractionEnd)\n }\n\n getMousePositionInBoundaries = ({ x, y }: { x: number; y: number }) => {\n const { model } = this.props\n const Settings = getSettings(model)\n const canvasAreaRectangle = this.canvas!.getBoundingClientRect()\n const chartLeft = model.scale.x.invert(-model.chart().leftOffset + 1)\n const chartRight = model.scale.x.invert(\n canvasAreaRectangle.width - Settings.right.width - Settings.left.width - model.chart().leftOffset - 1\n )\n const chartTop = model.scale.y.invert(0)\n const chartBottom = model.scale.y.invert(canvasAreaRectangle.height - Settings.bottom.height - Settings.top.height)\n\n return {\n x: getValueInRange({\n value: x,\n min: chartLeft,\n max: chartRight,\n }),\n y: getValueInRange({\n value: y,\n min: chartBottom,\n max: chartTop,\n }),\n }\n }\n\n setMousePosition = ({ x, y }: { x: number; y: number }) => {\n const isSameMouseModel = !!MouseModel.pane()?.eql(this.props.model)\n MouseModel.updateAttributes({\n position: { x, y },\n ...(isSameMouseModel ? {} : { pane: this.props.model }),\n })\n }\n\n setSelection = (selection: IndicatorElement | CanvasElement | null) => {\n if (selection instanceof CanvasElement) {\n selection?.setIsSelected(true)\n }\n\n this.props.model.updateAttribute('selection', selection)\n }\n\n setSelectedElement = (element: IndicatorElement | CanvasElement | null) => {\n const { selection } = this.props.model\n const isSelectionCanvas = selection instanceof CanvasElement\n if (element !== selection || (isSelectionCanvas && element && !selection?.isSelected)) {\n if (isSelectionCanvas) {\n selection?.setIsSelected(false)\n }\n if (isSelectionCanvas && selection?.isCreator) {\n this.setSelection(null)\n } else {\n this.setSelection(element)\n }\n }\n }\n\n getElement = (area: PaneArea) => {\n const chartEvents = this.props.model.getAllChartEvents(false)\n\n for (let i = chartEvents.length - 1; i >= 0; i--) {\n const el = chartEvents[i].instance\n if (el.getIsInChartView(this.props.chartModel) && el.isInArea(area)) {\n return el\n }\n }\n\n const elements = this.props.model.getAllElements()\n\n for (let i = elements.length - 1; i >= 0; i--) {\n const el = elements[i].instance\n if (el.getIsInChartView(this.props.chartModel) && el.isInArea(area)) {\n return el\n }\n }\n return null\n }\n\n getCanvasDOMNode = () =>\n // This is used in app/modals/publish/publish.jsx\n this.canvasRef.current\n}\n\nexport default withNotificationContext(withElementStyleDialogState(withPaneModel(Pane)))\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport PaneModel from '../../models/pane'\n\nexport function withPaneModel

(Component: React.ComponentType

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

(Component: React.ComponentType

) {\n return function WrappedComponent(props: P) {\n const model = useModelState(props.chartModel, { watchProperties: ['panes'] })\n\n return \n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = FLibs.ReactErrorBoundary;","import * as React from 'react'\nimport { FallbackProps } from 'react-error-boundary'\n\nimport { DefaultErrorBoundary } from '../../../components'\n\nexport function ModuleLoadFailed(props: Partial) {\n return (\n \n )\n}\n","export const portfolioWatchlistAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\n cacheKey: 'portfolio-watchlist',\n}\n","import React from 'react'\n\nimport { portfolioWatchlistAsyncModule } from './portfolio-watchlist/async-modules'\nimport { withModuleAsyncLoad } from './with-module-async-load'\n\nexport enum SidebarModule {\n portfolio = 'portfolio',\n}\n\nexport type SidebarModuleType = {\n key: SidebarModule\n icon: string\n description: string\n content: React.ComponentType\n width?: {\n min?: number | string\n max?: number | string\n default?: { desktop?: number; mobile?: number }\n }\n}\n\nexport const sidebarModules: Record = Object.freeze({\n [SidebarModule.portfolio]: {\n key: SidebarModule.portfolio,\n icon: 'briefcase',\n description: 'Portfolio watchlist',\n content: withModuleAsyncLoad(portfolioWatchlistAsyncModule, true),\n width: { min: 200, default: { mobile: 275 } },\n },\n})\n","import React from 'react'\n\nimport { Delayed, Spinner } from '../../../components'\nimport { useAsyncModule } from '../../../utils/async-modules-utils'\nimport { ModuleLoadFailed } from './module-load-failed'\n\nexport function withModuleAsyncLoad<\n T extends { default: React.ComponentType<{ setIsComponentReady: React.Dispatch> }> },\n>(asyncModule: { importFn: () => Promise; cacheKey: string }, withInitialLoading = false) {\n return function InnerFunction() {\n const [isComponentReady, setIsComponentReady] = React.useState(false)\n const [sidebarModule, { isError }] = useAsyncModule({\n ...asyncModule,\n isSuspenseMode: true,\n })\n\n const SidebarModule = sidebarModule?.default\n\n if (isError) {\n return \n }\n\n return (\n <>\n {!isComponentReady && withInitialLoading && (\n \n

\n \n
\n \n )}\n {!!SidebarModule && }\n \n )\n }\n}\n","import { Resizable } from 're-resizable'\nimport React from 'react'\n\nimport Utils from '../../utils'\nimport { DEFAULT_WIDTHS, SidebarDirection } from './constants'\nimport { useSidebarContext } from './hooks/sidebar-context'\n\ntype SidebarContentProps = {\n children: React.ReactNode\n}\n\nexport default function SidebarContent({ children }: SidebarContentProps) {\n const { direction, onResize, close, width } = useSidebarContext()\n const minWidth = width?.min ?? DEFAULT_WIDTHS.min\n const maxWidth = width?.max ?? DEFAULT_WIDTHS.max\n const defaultMobile = width?.default?.mobile ?? minWidth\n const defaultDesktop = width?.default?.desktop ?? maxWidth\n\n return (\n <>\n {direction === SidebarDirection.vertical && (\n \n {children}\n \n )}\n {direction === SidebarDirection.horizontal && (\n <>\n
\n
\n {children}\n
\n \n )}\n \n )\n}\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { Button, Icon, Paragraph, Tooltip, TooltipTrigger, useTooltipState } from '../../components'\nimport { SidebarDirection } from './constants'\nimport { useSidebarContext } from './hooks/sidebar-context'\nimport { sidebarModules } from './modules/modules'\n\nexport const MOBILE_TOOLBAR_DIV_ID = 'toolbar-mobile'\n\ntype SidebarTabsProps = {\n className?: string\n}\n\nexport default function SidebarTabs({ className }: SidebarTabsProps) {\n const { isOpen, direction, activeModule, selectModule } = useSidebarContext()\n const tooltipState = useTooltipState({ placement: 'left', unstable_timeout: 300 })\n\n return (\n \n {/* reserved space for drawing button on mobile devices */}\n {direction === SidebarDirection.horizontal && (\n \n )}\n\n {Object.entries(sidebarModules).map(([key, value]) => {\n const isActive = activeModule?.key === key\n return (\n \n \n {\n selectModule(isActive ? undefined : value.key)\n }}\n className={classnames({ 'ml-2': direction === SidebarDirection.horizontal })}\n data-testid={`sidebar-${key}-btn`}\n >\n \n \n \n \n {value.description}\n \n \n )\n })}\n
\n )\n}\n","import * as React from 'react'\nimport { ErrorBoundary } from 'react-error-boundary'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\n\nimport { Delayed, Spinner } from '../../components'\nimport { getIsMobilePortrait } from '../../utils'\nimport { localStorage } from '../../website-shared'\nimport { SidebarDirection } from './constants'\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\nimport { ModuleLoadFailed } from './modules/module-load-failed'\nimport { SidebarModule, SidebarModuleType, sidebarModules } from './modules/modules'\nimport SidebarContent from './sidebar-content'\nimport SidebarTabs from './sidebar-tabs'\n\nexport const SIDEBAR_QUERY_PARAM = 'sidebar'\n\n// This is a temp function, to remove unused property from localstorage\nfunction removeSidebarFromLocalstorage() {\n const SIDEBAR_LOCAL_STORAGE_KEY = 'sidebarModule'\n localStorage.removeValue(SIDEBAR_LOCAL_STORAGE_KEY)\n}\nremoveSidebarFromLocalstorage()\n\ntype SidebarProps = {\n onShouldResize: () => void\n direction: SidebarDirection\n tabsClassName?: string\n}\n\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\nlet isInit = false\n\nexport function Sidebar({ onShouldResize, direction, tabsClassName }: SidebarProps) {\n const navigate = useNavigate()\n const [urlSearchParams] = useSearchParams()\n const sidebarModuleKey = (urlSearchParams.get(SIDEBAR_QUERY_PARAM) as keyof typeof sidebarModules | null) || null\n const [activeModule, setActiveModule] = React.useState(null)\n\n const isOpen = !!activeModule\n const handleSelectModule = React.useCallback(\n (key?: SidebarModule) => {\n const newUrlSearchParams = new URLSearchParams(urlSearchParams)\n if (key) {\n newUrlSearchParams.set(SIDEBAR_QUERY_PARAM, key)\n } else {\n newUrlSearchParams.delete(SIDEBAR_QUERY_PARAM)\n }\n navigate({ search: newUrlSearchParams.toString() }, { replace: true })\n },\n [urlSearchParams, navigate]\n )\n\n const handleCloseSidebar = React.useCallback(() => {\n handleSelectModule(undefined)\n }, [handleSelectModule])\n\n // Resize charts every time the sidebar is opened/closed or active module is changed\n React.useEffect(() => {\n onShouldResize()\n }, [activeModule, onShouldResize])\n\n // Set active module based on sidebarModuleKey\n React.useEffect(() => {\n let sidebarModule = sidebarModuleKey && sidebarModules[sidebarModuleKey]\n\n if (!isInit && getIsMobilePortrait()) {\n sidebarModule = null\n handleCloseSidebar()\n }\n\n setActiveModule(sidebarModule)\n isInit = true\n }, [sidebarModuleKey, handleCloseSidebar])\n\n const contextValue: SidebarContextType = React.useMemo(\n () => ({\n direction,\n isOpen,\n isCloseVisible: direction === SidebarDirection.horizontal,\n width: activeModule?.width,\n activeModule,\n onResize: onShouldResize,\n close: handleCloseSidebar,\n selectModule: handleSelectModule,\n }),\n [direction, isOpen, onShouldResize, activeModule, handleCloseSidebar, handleSelectModule]\n )\n\n return (\n \n {activeModule && (\n \n \n \n
\n \n
\n \n }\n >\n \n \n
\n
\n )}\n \n
\n )\n}\n","export const drawingCreatorsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"drawing-creators\" */ './module-entry'),\n cacheKey: 'drawing-creators',\n}\n","import { DrawingActions, IToolbarDrawingAction, IToolbarDrawingActionItem } from './interfaces'\n\nexport const drawingActions: Record = {\n [DrawingActions.AddNote]: {\n id: DrawingActions.AddNote,\n title: 'Add note',\n icon: 'note',\n },\n [DrawingActions.DeleteDrawings]: {\n id: DrawingActions.DeleteDrawings,\n title: 'Remove all drawings',\n icon: 'drawingActionDelete',\n },\n [DrawingActions.DeleteAutoSavedDrawings]: {\n id: DrawingActions.DeleteAutoSavedDrawings,\n title: 'Remove all autosaved drawings',\n icon: 'drawingActionDelete',\n },\n}\n\nexport const getToolbarDrawingActions = ({\n isAutoSaveActive,\n isAddNoteAvailable = false,\n isIdea,\n}: {\n isAutoSaveActive: boolean\n isAddNoteAvailable?: boolean\n isIdea?: boolean\n}): Array => [\n ...(isAddNoteAvailable\n ? [\n {\n defaultItem: drawingActions[DrawingActions.AddNote],\n isDisabled: isIdea,\n disabledTooltip: 'Add note is not available in ideas',\n },\n ]\n : []),\n {\n defaultItem:\n drawingActions[isAutoSaveActive ? DrawingActions.DeleteAutoSavedDrawings : DrawingActions.DeleteDrawings],\n },\n]\n","import { DrawingSetting, IToolbarDrawingSetting, IToolbarDrawingsSettingItem } from './interfaces'\n\nconst drawingSettings: Record = {\n [DrawingSetting.PreserveDrawings]: {\n id: DrawingSetting.PreserveDrawings,\n icon: 'drawingSettingPreserveDrawings',\n iconActive: 'drawingSettingPreserveDrawingsActive',\n title: 'Preserve drawings: Off',\n titleActive: 'Preserve drawings: On',\n },\n [DrawingSetting.DrawingModeContinuous]: {\n id: DrawingSetting.DrawingModeContinuous,\n icon: 'drawingSettingDrawingMode',\n iconActive: 'drawingSettingDrawingModeActive',\n title: 'Drawing mode: Single',\n titleActive: 'Drawing mode: Continuous',\n },\n [DrawingSetting.HideDrawings]: {\n id: DrawingSetting.HideDrawings,\n icon: 'drawingSettingHide',\n iconActive: 'drawingSettingShow',\n title: 'Hide drawings',\n titleActive: 'Show drawings',\n },\n [DrawingSetting.LockDrawings]: {\n id: DrawingSetting.LockDrawings,\n icon: 'drawingSettingLock',\n iconActive: 'drawingSettingUnlock',\n title: 'Lock drawings',\n titleActive: 'Unlock drawings',\n },\n}\n\nconst preserveDrawingsAutosaveOverride = {\n id: DrawingSetting.PreserveDrawings, // DrawingSetting.PreserveDrawings so it works with current settings sync to DB\n icon: 'drawingSettingAutosaveOff',\n iconActive: 'drawingSettingAutosaveOn',\n iconAction: 'drawingSettingAutosaveSaving',\n title: 'Drawings autosave: Off',\n titleActive: 'Drawings Autosave: On',\n titleAction: 'Drawings Autosave: Saving',\n}\n\nexport const getToolbarDrawingSettings = ({\n isPreserveDrawingsAndAutosaveAvailable,\n isIdea,\n isAutoSaveInProgress,\n}: {\n isPreserveDrawingsAndAutosaveAvailable?: boolean\n isIdea?: boolean\n isAutoSaveInProgress?: boolean\n}): Array => {\n const toolbarSettings = [\n {\n defaultItem: drawingSettings[DrawingSetting.DrawingModeContinuous],\n },\n ...(isPreserveDrawingsAndAutosaveAvailable\n ? [\n {\n defaultItem: preserveDrawingsAutosaveOverride,\n isDisabled: isIdea,\n isInAction: isAutoSaveInProgress,\n disabledTooltip: 'Autosave is not available in ideas',\n },\n ]\n : []),\n {\n defaultItem: drawingSettings[DrawingSetting.HideDrawings],\n },\n {\n defaultItem: drawingSettings[DrawingSetting.LockDrawings],\n },\n ]\n\n return toolbarSettings\n}\n","import { DrawingTool, IToolbarDrawingTool, IToolbarDrawingToolItem } from './interfaces'\n\nexport const drawingTools: Record = {\n [DrawingTool.Mouse]: {\n id: DrawingTool.Mouse,\n title: 'Mouse',\n icon: 'toolMouse',\n },\n [DrawingTool.Measure]: {\n id: DrawingTool.Measure,\n title: 'Measure',\n icon: 'toolMeasure',\n },\n [DrawingTool.ScaledLine]: {\n id: DrawingTool.ScaledLine,\n title: 'Line',\n icon: 'toolLine',\n },\n [DrawingTool.Arrow]: {\n id: DrawingTool.Arrow,\n title: 'Arrow',\n icon: 'toolArrow',\n },\n [DrawingTool.VerticalLine]: {\n id: DrawingTool.VerticalLine,\n title: 'Vertical line',\n icon: 'toolMidLineV',\n },\n [DrawingTool.HorizontalLine]: {\n id: DrawingTool.HorizontalLine,\n title: 'Horizontal line',\n icon: 'toolMidLineH',\n },\n [DrawingTool.Rectangle]: {\n id: DrawingTool.Rectangle,\n title: 'Rectangle',\n icon: 'toolRect',\n },\n [DrawingTool.RotatedRectangle]: {\n id: DrawingTool.RotatedRectangle,\n title: 'Rotated rectangle',\n icon: 'toolRectRotated',\n },\n [DrawingTool.Triangle]: {\n id: DrawingTool.Triangle,\n title: 'Triangle',\n icon: 'toolTriangle',\n },\n [DrawingTool.Ellipse]: {\n id: DrawingTool.Ellipse,\n title: 'Ellipse',\n icon: 'toolEllipse',\n },\n [DrawingTool.Curve]: {\n id: DrawingTool.Curve,\n title: 'Curve',\n icon: 'toolCurve',\n },\n [DrawingTool.Pitchfork]: {\n id: DrawingTool.Pitchfork,\n title: 'Pitchfork',\n icon: 'toolPitchfork',\n },\n [DrawingTool.Polygon]: {\n id: DrawingTool.Polygon,\n title: 'Polygon',\n icon: 'toolPolygon',\n },\n [DrawingTool.Xabcd]: {\n id: DrawingTool.Xabcd,\n title: 'XABCD',\n icon: 'toolXABCD',\n },\n [DrawingTool.ScaledText]: {\n id: DrawingTool.ScaledText,\n title: 'Text',\n icon: 'toolText',\n },\n [DrawingTool.Brush]: {\n id: DrawingTool.Brush,\n title: 'Brush',\n icon: 'toolBrush',\n },\n [DrawingTool.ElliottWaves]: {\n id: DrawingTool.ElliottWaves,\n title: 'Elliott waves',\n icon: 'toolElliottWave',\n },\n [DrawingTool.FibonacciRetracements]: {\n id: DrawingTool.FibonacciRetracements,\n title: 'Fibonacci retracements',\n icon: 'toolFibonacci',\n },\n [DrawingTool.Position]: {\n id: DrawingTool.Position,\n title: 'Position',\n icon: 'toolPosition',\n },\n [DrawingTool.Callout]: {\n id: DrawingTool.Callout,\n title: 'Callout',\n icon: 'toolCallout',\n },\n}\n\nexport const toolbarDrawingTools: Array = [\n {\n defaultItem: drawingTools[DrawingTool.Mouse],\n },\n {\n defaultItem: drawingTools[DrawingTool.Measure],\n },\n {\n defaultItem: drawingTools[DrawingTool.ScaledLine],\n toolGroup: [\n drawingTools[DrawingTool.ScaledLine],\n drawingTools[DrawingTool.VerticalLine],\n drawingTools[DrawingTool.HorizontalLine],\n drawingTools[DrawingTool.Curve],\n ],\n toolGroupTitle: 'Line tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.Arrow],\n },\n {\n defaultItem: drawingTools[DrawingTool.Rectangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.RotatedRectangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.Triangle],\n },\n {\n defaultItem: drawingTools[DrawingTool.Ellipse],\n },\n {\n defaultItem: drawingTools[DrawingTool.Polygon],\n },\n {\n defaultItem: drawingTools[DrawingTool.Xabcd],\n toolGroup: [drawingTools[DrawingTool.Xabcd], drawingTools[DrawingTool.Pitchfork]],\n toolGroupTitle: 'XABCD tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.ScaledText],\n toolGroup: [drawingTools[DrawingTool.ScaledText], drawingTools[DrawingTool.Callout]],\n toolGroupTitle: 'Text tools',\n },\n {\n defaultItem: drawingTools[DrawingTool.Brush],\n },\n {\n defaultItem: drawingTools[DrawingTool.ElliottWaves],\n },\n {\n defaultItem: drawingTools[DrawingTool.FibonacciRetracements],\n },\n {\n defaultItem: drawingTools[DrawingTool.Position],\n },\n]\n","import classnames from 'classnames'\nimport React from 'react'\n\nimport { PaneArea } from '../../../types/shared'\nimport { Toolbar as ToolbarComponent, ToolbarDivider, ToolbarItem } from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { drawingCreatorsAsyncModule } from '../../creators/async-modules'\nimport { ElementStyleDialogContext } from '../../modals/element_style'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { AutoSaveState } from '../../models/constants'\nimport PaneModel from '../../models/pane'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable } from '../../utils/chart'\nimport { getToolbarDrawingActions } from './drawingActions'\nimport { getToolbarDrawingSettings } from './drawingSettings'\nimport { drawingTools, toolbarDrawingTools } from './drawingTools'\nimport { DrawingSetting, DrawingTool, IToolBarProps } from './interfaces'\n\nexport const DISABLED_ITEM_TOOLTIP_LABEL = \"Disabled due 'lock/hide' drawings active\"\n\nexport default function Toolbar({\n isSidebar,\n isHorizontal,\n isMobileOverlay,\n activeTool,\n chartLayoutModel,\n onActiveToolChange,\n onDrawingActionClick,\n onDrawingSettingClick,\n onDrawingEnd,\n drawingSettings,\n isAlternativeTheme,\n areToolsDisabled,\n}: IToolBarProps) {\n const [drawingCreatorsModule, { isLoading: isDrawingCreatorsModuleLoading }] = useAsyncModule({\n ...drawingCreatorsAsyncModule,\n shouldLoadModule: true,\n })\n const { autoSaveState } = useModelState(\n React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel]),\n { watchProperties: ['autoSaveState'] }\n )\n const [isDrawing, setIsDrawing] = React.useState(false)\n const openElementStyleDialog = React.useContext(ElementStyleDialogContext)\n\n const availableDrawingSettings = getToolbarDrawingSettings({\n isPreserveDrawingsAndAutosaveAvailable: getIsPreserveDrawingsAndAutosaveAvailable(chartLayoutModel),\n isAutoSaveInProgress: autoSaveState === AutoSaveState.Saving,\n isIdea: !!chartLayoutModel.idea?.id,\n })\n\n const availableDrawingActions = getToolbarDrawingActions({\n isAutoSaveActive: autoSaveState !== AutoSaveState.Off,\n isAddNoteAvailable: chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage,\n isIdea: !!chartLayoutModel.idea?.id,\n })\n\n React.useEffect(() => {\n if (!drawingCreatorsModule) {\n return\n }\n\n const onMouseDown = (model: PaneModel, area: PaneArea & { isTouch: boolean }) => {\n const isDrawingModeContinuous = drawingSettings[DrawingSetting.DrawingModeContinuous]\n const hasData = model.chart().quote().close.length > 0\n const hasHiddenDrawings = drawingSettings[DrawingSetting.HideDrawings]\n const tool = drawingTools[activeTool].id\n\n if (tool === DrawingTool.Mouse || isDrawing || hasHiddenDrawings || !hasData) {\n return\n }\n\n setIsDrawing(true)\n const { drawingToolsTouchCreatorsByType, drawingToolsCreatorsByType } = drawingCreatorsModule\n const ToolClass = area.isTouch ? drawingToolsTouchCreatorsByType[tool] : drawingToolsCreatorsByType[tool]\n const element = model.elements().create({\n instance: new ToolClass(area, {}, model, openElementStyleDialog, () => {\n if (!isDrawingModeContinuous) {\n onActiveToolChange(DrawingTool.Mouse)\n }\n setIsDrawing(false)\n onDrawingEnd?.()\n }),\n })\n element.one('destroy', ({ instance }) => {\n if (instance.getIsCreator()) {\n setIsDrawing(false)\n onDrawingEnd?.()\n }\n })\n\n element.trigger('select', element)\n }\n PaneModel.bind('mousedown', onMouseDown)\n return () => {\n PaneModel.unbind('mousedown', onMouseDown)\n }\n }, [\n activeTool,\n onActiveToolChange,\n openElementStyleDialog,\n onDrawingEnd,\n drawingCreatorsModule,\n drawingSettings,\n isDrawing,\n ])\n\n return (\n \n {toolbarDrawingTools.map((item) => {\n const isActive = activeTool === item.defaultItem.id || item.toolGroup?.some((tool) => tool.id === activeTool)\n const isToolLoading = isDrawingCreatorsModuleLoading && isActive\n\n return (\n \n )\n })}\n \n {availableDrawingSettings.map((item) => (\n \n ))}\n {availableDrawingActions.map((item) => (\n \n ))}\n \n )\n}\n","import Toolbar from './toolbar'\n\nexport default Toolbar\n","import React from 'react'\n\nimport { ObjectHash } from '../../../../types/shared'\nimport { Textarea } from '../../../components'\nimport { useModelState } from '../../../model-hooks/use-model-state'\nimport Chart from '../../../models/chart'\nimport ChartLayout from '../../../models/chart_layout'\nimport { useDrawingAutoSaveControls } from '../../autosave/use-drawing-auto-save-controls'\nimport { getElementNoteText, getTickersAndContainerTypesInLayoutModel } from '../../autosave/utils'\n\ninterface ChartAutoSaveNoteProps {\n ticker: string\n note: string\n onNoteChange: (note: string, ticker: string) => void\n}\n\nfunction ChartAutoSaveNote({ ticker, note, onNoteChange }: ChartAutoSaveNoteProps) {\n return (\n ) => {\n onNoteChange(e.target.value, ticker)\n }}\n />\n )\n}\n\ninterface Props {\n chartLayoutModel: ChartLayout\n}\n\nexport function ChartAutoSaveNotes({ chartLayoutModel }: Props) {\n const { handleAutoSaveNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\n const [tickers, setTickers] = React.useState([])\n const unwatchedInternalStore = React.useMemo(() => chartLayoutModel.drawingsInternalStore(), [chartLayoutModel])\n const drawingsInternalStore = useModelState(unwatchedInternalStore, { watchProperties: ['elements'] })\n\n React.useEffect(() => {\n // There was no better way how to listen on ticker changes which is necessary for displaying correct text areas\n const handleChartChange = () => {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\n setTickers(tickers)\n }\n\n Chart.bind('change', handleChartChange)\n handleChartChange()\n return () => {\n Chart.unbind('change', handleChartChange)\n }\n }, [chartLayoutModel])\n\n const tickerNoteMap = React.useMemo(() => {\n const map: ObjectHash = {}\n drawingsInternalStore.elements.forEach((element) => {\n if (element.containerType === 'note' && tickers.includes(element.ticker)) {\n map[element.ticker] = getElementNoteText(element)\n }\n })\n\n return map\n }, [drawingsInternalStore.elements, tickers])\n\n return (\n
\n {tickers.map((ticker) => (\n \n ))}\n
\n )\n}\n","import React from 'react'\n\nimport { Dialog, DialogBody, DialogHeader } from '../../../components'\nimport ChartLayout from '../../../models/chart_layout'\nimport { ChartAutoSaveNotes } from './auto-save-notes'\n\ninterface INoteDialog {\n dialogState: any\n chartLayoutModel: ChartLayout\n}\n\nexport function AutoSaveNotesDialog({ dialogState, chartLayoutModel }: INoteDialog) {\n return (\n \n dialogState.hide()}>Notes\n \n {(dialogState.visible || dialogState.animating) && }\n \n \n )\n}\n","import React from 'react'\n\nimport { Button, ConfirmationDialog as ConfirmationDialogComponent } from '../../components'\n\nconst getDialogContent = ({\n isAutosaveDialogContent,\n tickers,\n}: {\n isAutosaveDialogContent: boolean\n tickers: string[]\n}) => {\n if (isAutosaveDialogContent) {\n return {\n title: 'Remove all autosaved drawings?',\n message: (\n <>\n Do you really want to remove all autosaved drawings? This action is irreversible and will remove all\n non-idea drawings for {tickers.join(', ')}.\n \n ),\n }\n }\n return {\n title: 'Remove all drawings?',\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.`,\n }\n}\n\nexport interface IConfirmationDialog {\n state: any\n onCancel: () => void\n onAction: () => void\n isAutosaveDialogContent: boolean\n tickers: string[]\n}\n\nexport function ConfirmationDialog({\n onCancel,\n onAction,\n state,\n isAutosaveDialogContent = false,\n tickers,\n}: IConfirmationDialog) {\n const dialogContent = getDialogContent({ isAutosaveDialogContent, tickers })\n\n return (\n \n \n \n \n }\n >\n {dialogContent.message}\n \n )\n}\n","import React from 'react'\n\nimport { Button, Icon } from '../../../components'\nimport { drawingTools } from '../drawingTools'\nimport { DrawingTool } from '../interfaces'\n\ntype ToolButtonProps = {\n onClick: () => void\n activeTool: DrawingTool\n}\n\nexport default function ToolButton({ activeTool, onClick }: ToolButtonProps) {\n return (\n \n )\n}\n","import classNames from 'classnames'\nimport React from 'react'\nimport ReactDOM from 'react-dom'\nimport { useSearchParams } from 'react-router-dom'\n\nimport { Button } from '../../../components'\nimport { SIDEBAR_QUERY_PARAM } from '../../sidebar/sidebar'\nimport { MOBILE_TOOLBAR_DIV_ID } from '../../sidebar/sidebar-tabs'\nimport { DrawingActions, DrawingTool, IToolBarProps } from '../interfaces'\nimport Toolbar from '../toolbar'\nimport ToolButton from './tool-button'\n\ntype ToolbarMobileProps = Omit\n\nexport default function ToolbarMobile({\n activeTool,\n onActiveToolChange,\n onDrawingActionClick,\n ...rest\n}: ToolbarMobileProps) {\n const [isToolbarVisible, setIsToolbarVisible] = React.useState(false)\n const [urlSearchParams, setUrlSearchParams] = useSearchParams()\n const [toolbarMobileElement, setToolbarMobileElement] = React.useState(null)\n\n // get toolbar mobile element on first render\n React.useEffect(() => {\n setToolbarMobileElement(document.getElementById(MOBILE_TOOLBAR_DIV_ID))\n }, [])\n\n const handleActiveToolChange = React.useCallback(\n (drawingTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => {\n onActiveToolChange(drawingTool, trigger)\n\n if (trigger !== 'group') return setIsToolbarVisible(false)\n },\n [onActiveToolChange]\n )\n\n // Hide toolbar on click outside\n const wrapperRef = React.useRef(null)\n React.useEffect(() => {\n if (!isToolbarVisible) return\n\n function handleClickOutside(event: TouchEvent | MouseEvent) {\n // Get the currently open select\n const openSelect = document.querySelector('.finviz-popover[data-enter]')\n if (wrapperRef.current?.contains(event.target as Node) || openSelect?.contains(event.target as Node)) return\n setIsToolbarVisible(false)\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('touchstart', handleClickOutside)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('touchstart', handleClickOutside)\n }\n }, [isToolbarVisible])\n\n const handleDrawingActionClick = (actionId: DrawingActions) => {\n onDrawingActionClick?.(actionId)\n setIsToolbarVisible(false)\n }\n\n if (!toolbarMobileElement) return null\n\n return ReactDOM.createPortal(\n <>\n \n \n \n {urlSearchParams.has(SIDEBAR_QUERY_PARAM) || activeTool === DrawingTool.Mouse ? (\n {\n setIsToolbarVisible(true)\n setUrlSearchParams((params) => {\n params.delete(SIDEBAR_QUERY_PARAM)\n return params\n })\n }}\n >\n Draw\n \n ) : (\n {\n setIsToolbarVisible(true)\n }}\n />\n )}\n ,\n toolbarMobileElement\n )\n}\n","import React from 'react'\n\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\n\ninterface LoadLatestDataButtonProps {\n chartLayoutModel: ChartLayout\n}\n\nexport function AutoSaveStateIndicator({ chartLayoutModel }: LoadLatestDataButtonProps) {\n const drawingsInternalStoreUnwatched = React.useMemo(\n () => chartLayoutModel.drawingsInternalStore(),\n [chartLayoutModel]\n )\n const { autoSaveState } = useModelState(drawingsInternalStoreUnwatched, { watchProperties: ['autoSaveState'] })!\n const [isVisible, setIsVisible] = React.useState(false)\n\n React.useEffect(() => {\n if (autoSaveState === AutoSaveState.Off) {\n return\n }\n\n let setVisibilityTimeout: NodeJS.Timeout | null = null\n const newIsVisible = autoSaveState !== AutoSaveState.Saved\n\n setVisibilityTimeout = setTimeout(\n () => {\n setIsVisible(newIsVisible)\n },\n newIsVisible ? 0 : 3000\n )\n\n const checkIfNeededPreventLeaving = (event: BeforeUnloadEvent) => {\n if (autoSaveState === AutoSaveState.Saved) {\n return undefined\n }\n\n const message = `Your latest changes haven't been saved yet. If you leave now, your changes might be lost.`\n event.returnValue = message\n return message\n }\n\n window.addEventListener('beforeunload', checkIfNeededPreventLeaving)\n\n return () => {\n window.removeEventListener('beforeunload', checkIfNeededPreventLeaving)\n if (setVisibilityTimeout) {\n clearTimeout(setVisibilityTimeout)\n }\n }\n }, [autoSaveState])\n\n if (!isVisible) {\n return null\n }\n\n // @todo - add proper indicator component here\n return null\n}\n","import React from 'react'\n\nimport { Textarea } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { isRedesignEnabled } from '../../utils'\nimport { useDrawingAutoSaveControls } from '../autosave/use-drawing-auto-save-controls'\n\ninterface Props {\n chartLayoutModel: ChartLayout\n ideaNoteRef?: React.RefObject\n}\n\nconst hasRedesign = isRedesignEnabled()\n\nexport function ChartLayoutAutoSaveNote({ chartLayoutModel: chartLayoutModelUnwatched, ideaNoteRef }: Props) {\n const chartLayoutModel = useModelState(chartLayoutModelUnwatched, {\n watchProperties: ['idea'],\n })!\n const { handleIdeaNoteChange } = useDrawingAutoSaveControls(chartLayoutModel)\n\n if (!chartLayoutModel.editable) {\n return null\n }\n\n return (\n
\n {!hasRedesign &&
Note:
}\n
\n ) => {\n handleIdeaNoteChange(e.target.value)\n }}\n />\n
\n
\n )\n}\n","import React from 'react'\n\nimport { getExtendedDialogState, useDialogState } from '../../components'\nimport { publishModalAsyncModule } from '../../modals/publish/async-modules'\nimport ChartLayout from '../../models/chart_layout'\nimport { useAsyncModule } from '../../utils/async-modules-utils'\n\ninterface PublishOldButtonClickListenerProps {\n isListening: boolean\n layoutModel: ChartLayout\n}\n\nexport function getPublishChartHtmlElements() {\n const publishChartElements = document.getElementsByClassName('js-publish-chart')\n const publishChartHtmlElements = Array.from(publishChartElements) as HTMLElement[]\n\n return publishChartHtmlElements\n}\n\nfunction getChartImgUrl(index: number) {\n const imgElement = document.getElementById(`chart${index}`) as HTMLImageElement | null\n return imgElement?.src ?? null\n}\n\nexport function PublishOldButtonClickListener({ isListening, layoutModel }: PublishOldButtonClickListenerProps) {\n const dialog = useDialogState()\n const { isFullyClosed } = getExtendedDialogState(dialog)\n const [dialogConfig, setDialogConfig] = React.useState({\n isCanvas: true,\n chartImgUrl: null as null | string,\n timeframe: '',\n ticker: '',\n })\n const [publishModalModule] = useAsyncModule({\n ...publishModalAsyncModule,\n shouldLoadModule: !isFullyClosed,\n })\n const PublishDialog = publishModalModule?.default\n\n React.useEffect(() => {\n const publishChartHtmlElements = getPublishChartHtmlElements()\n const clickHandler = (event: MouseEvent) => {\n const { index, ticker, timeframe } = (event.currentTarget as HTMLElement).dataset\n if (index && ticker && timeframe) {\n const indexInt = Number.parseInt(index)\n setDialogConfig({\n ticker,\n timeframe,\n isCanvas: indexInt === 0,\n chartImgUrl: indexInt > 0 ? getChartImgUrl(indexInt) : null,\n })\n dialog.show()\n }\n }\n\n if (isListening) {\n publishChartHtmlElements.forEach((el) => {\n el.addEventListener('click', clickHandler)\n })\n }\n\n return () => {\n publishChartHtmlElements.forEach((el) => {\n el.removeEventListener('click', clickHandler)\n })\n }\n }, [dialog, isListening])\n\n return PublishDialog ? : null\n}\n","import React from 'react'\n\nimport { Button, Dialog, DialogBody, DialogFooter, DialogHeader, Paragraph } from '../../components'\n\nexport enum IdeaDrawingsConfirmationOptions {\n Merge,\n Override,\n Nothing,\n Cancel,\n}\n\ninterface IIdeaLeaveDialog {\n state: any\n actionCallback: (action: IdeaDrawingsConfirmationOptions) => void\n}\n\nexport function IdeaLeaveDialog({ actionCallback, state }: IIdeaLeaveDialog) {\n return (\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}\n finalFocusRef={{ current: document.body }}\n >\n actionCallback(IdeaDrawingsConfirmationOptions.Cancel)}>\n You’re About to Leave your Idea\n \n \n
\n What would you like to do with the drawings from your current Idea?\n \n Replace Drawings\n
\n Your Autosaved Drawings for this ticker will be deleted, and the Idea Drawings will be copied to the live\n chart.\n
\n \n Combine Drawings\n
\n The Idea Drawings will be copied to the live chart without changing the positions or settings of any\n Autosaved Drawings. This may cause duplicates if some drawings were also autosaved.\n
\n \n Do Nothing\n
\n Close the idea without changing any Autosaved Drawings.\n
\n
\n
\n \n actionCallback(IdeaDrawingsConfirmationOptions.Override)}\n >\n Replace\n \n actionCallback(IdeaDrawingsConfirmationOptions.Merge)}\n >\n Combine\n \n actionCallback(IdeaDrawingsConfirmationOptions.Nothing)}\n >\n Do Nothing\n \n \n \n )\n}\n","import * as dateFns from 'date-fns'\nimport React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { useDialogState } from '../../components'\nimport {\n ChartElementType,\n ChartsOrQuotePageQueryParams,\n ChartsPageQueryParams,\n QuotePageQueryChartTypes,\n QuotePageQueryParams,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../../constants/common'\nimport Chart from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport { getRawTickerForInstrument } from '../../models/utils'\nimport utils from '../../utils'\nimport { getInstrument, handleTypeChange } from '../../utils/chart'\nimport { getUuid } from '../../utils/helpers'\nimport { initHlc } from '../../utils/hlc'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\nimport { useTrackPageView } from '../../website-shared'\nimport { IdeaLeaveDialog } from '../autosave/idea-leave-dialog'\nimport { IdeaDrawingsConfirmationOptions } from '../autosave/idea-leave-dialog'\nimport { useDrawingAutoSaveApi } from '../autosave/use-drawing-autosave-api'\nimport { getTickersAndContainerTypesInLayoutModel, handleCallMethodOnAllDrawings } from '../autosave/utils'\nimport { getChartElementTypeFromResponseType } from '../utils'\n\nconst getChartElementTypeFromQueryType = (queryType: QuotePageQueryChartTypes | null) => {\n switch (queryType) {\n case QuotePageQueryChartTypes.l:\n return ChartElementType.LineChart\n case QuotePageQueryChartTypes.hc:\n return ChartElementType.HollowCandleStick\n case QuotePageQueryChartTypes.ha:\n return ChartElementType.HeikinAshi\n case QuotePageQueryChartTypes.o:\n return ChartElementType.OhlcChart\n case QuotePageQueryChartTypes.p:\n return ChartElementType.PerfChart\n case QuotePageQueryChartTypes.c:\n case QuotePageQueryChartTypes.cs:\n return ChartElementType.CandleStick\n default:\n return (\n getChartElementTypeFromResponseType(window.FinvizSettings?.TA?.style ?? null) ?? ChartElementType.CandleStick\n )\n }\n}\n\nconst useChartRouteChange = (chartLayoutModel: ChartLayoutModel | null) => {\n useTrackPageView({ trackInitial: false })\n const location = useLocation()\n const navigate = useNavigate()\n const { deleteAllDrawings } = useDrawingAutoSaveApi()\n const dialog = useDialogState()\n\n const isQuotePage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isChartPage = chartLayoutModel?.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(chartLayoutModel?.specificChartFunctionality as SpecificChartFunctionality)\n\n React.useEffect(() => {\n if (isChartPage) {\n utils.setCookie(\n 'chartsUrl',\n `?${encodeQueryString({ ...decodeQueryString(location.search), i: undefined, settings: undefined })}`,\n dateFns.add(new Date(), { months: 1 })\n )\n }\n }, [isChartPage, location.search])\n\n React.useEffect(() => {\n const decodedQueryString = decodeQueryString(location.search)\n // We can navigate to idea chart without a refresh e.g. using browser back button\n // It breaks charts because we don't have idea data & idea quote anymore\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\n if (chartLayoutModel && decodedQueryString.i && !chartLayoutModel.idea?.id) {\n window.location.reload()\n }\n // No need to have chartLayoutModel as dependecny here , I'm only interested in idea on the model\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [location.search, chartLayoutModel?.idea?.id])\n\n const updateChartConfig = React.useCallback(() => {\n if (!chartLayoutModel) return\n\n const decodedSearch = decodeQueryString(location.search)\n\n const urlType = (decodedSearch as QuotePageQueryParams).ty ?? null\n handleTypeChange({\n type: getChartElementTypeFromQueryType(urlType),\n chartLayoutModel,\n })\n\n if (isChartPage && chartLayoutModel.layout !== (decodedSearch as ChartsPageQueryParams).l) {\n chartLayoutModel.updateAttributes({ layout: (decodedSearch as ChartsPageQueryParams).l })\n }\n\n chartLayoutModel.getAllCharts().forEach((chartModel, chartIndex) => {\n const urlTicker = decodedSearch.t.split(',')[chartIndex] ?? null\n const urlTimeframe = decodedSearch.p?.split(',')[chartIndex] ?? null\n const urlDateRange = decodedSearch.r?.split(',')[chartIndex] ?? null\n const upperCaseTicker = urlTicker?.toUpperCase()\n\n /**\n * Only Charts page charts can change instruments. Other pages need forced\n * instrument because we might not be able to guess it from urlTicker\n */\n let instrument = getInstrument(upperCaseTicker)\n if (chartLayoutModel.specificChartFunctionality !== SpecificChartFunctionality.chartPage) {\n instrument = chartModel.instrument\n }\n\n const newChartConfig = {\n instrument,\n ticker: getRawTickerForInstrument(instrument, upperCaseTicker),\n timeframe: urlTimeframe,\n dateRange: urlDateRange,\n }\n\n if (Object.entries(newChartConfig).some(([key, value]) => chartModel[key as keyof Chart] !== value)) {\n chartModel.updateAttributesAndSync(newChartConfig)\n }\n })\n }, [chartLayoutModel, location.search, isChartPage])\n\n React.useEffect(() => {\n const decodedSearch = decodeQueryString(location.search)\n\n if (\n !chartLayoutModel ||\n !decodedSearch.p ||\n !decodedSearch.t ||\n !(isQuotePage || isChartPage || isFuturesForexCryptoPage)\n ) {\n if (!decodedSearch.p && isQuotePage) {\n navigate(\n {\n search: `?${encodeQueryString({\n ...decodedSearch,\n p: window.FinvizSettings.defaultPeriod ?? TIMEFRAME.d,\n r: window.FinvizSettings.defaultDateRange,\n })}`,\n },\n {\n replace: true,\n }\n )\n }\n return\n }\n if (chartLayoutModel.idea?.id && dialog.visible) {\n dialog.hide()\n }\n\n if (!decodedSearch.i && chartLayoutModel.idea?.id) {\n const urlTicker = decodedSearch.t.split(',')\n const isSameTicker = chartLayoutModel\n .getAllCharts()\n .every((chart, i) => chart.getQuoteRawTicker() === urlTicker[i])\n\n if (isSameTicker && window.FinvizSettings.hasUserPremium && chartLayoutModel.isPreserveDrawingsActive) {\n dialog.show()\n return\n }\n if (!chartLayoutModel.isPreserveDrawingsActive || !isSameTicker) {\n handleCallMethodOnAllDrawings({ chartLayoutModel, elementMethod: 'destroyCascade' })\n }\n chartLayoutModel.exitIdea()\n }\n updateChartConfig()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n location.search,\n dialog.show,\n navigate,\n chartLayoutModel,\n isQuotePage,\n isChartPage,\n isFuturesForexCryptoPage,\n updateChartConfig,\n ])\n\n const handleIdeaLeave = React.useCallback(\n async (action: IdeaDrawingsConfirmationOptions) => {\n if (!chartLayoutModel) return\n if (action === IdeaDrawingsConfirmationOptions.Cancel) {\n navigate(-1)\n return\n }\n switch (action) {\n case IdeaDrawingsConfirmationOptions.Merge: {\n handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod: 'refreshElementId',\n })\n break\n }\n case IdeaDrawingsConfirmationOptions.Override: {\n const { tickers } = getTickersAndContainerTypesInLayoutModel(chartLayoutModel)\n await deleteAllDrawings({ tickers, lastLocalChange: initHlc(getUuid(), Date.now()) })\n break\n }\n case IdeaDrawingsConfirmationOptions.Nothing: {\n handleCallMethodOnAllDrawings({\n chartLayoutModel,\n elementMethod: 'destroyCascade',\n })\n break\n }\n default:\n break\n }\n chartLayoutModel.exitIdea()\n updateChartConfig()\n dialog.hide()\n },\n [dialog, chartLayoutModel, updateChartConfig, deleteAllDrawings, navigate]\n )\n\n return {\n dialog,\n handleIdeaLeave,\n }\n}\n\nfunction getChartLayoutWithChartRouteChange

(\n Component: React.ComponentType

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

(\n Component: React.ComponentType

\n) {\n // Chart layout is used in ReactRouter context and also outside of RR context\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\n const ChartLayoutComponent = getChartLayoutWithChartRouteChange(Component)\n return function WrappedComponent(props: P) {\n const { ty } = decodeQueryString()\n const isChartPage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isQuotePage = props.chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isFuturesForexCryptoPage = [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(props.chartLayoutModel.specificChartFunctionality)\n if (isChartPage || (isQuotePage && ty !== 'p') || isFuturesForexCryptoPage) {\n return \n }\n\n return \n }\n}\n","import merge from 'lodash.merge'\nimport React from 'react'\n\nimport { RootChartConfigObject, Theme } from '../../../types/shared'\nimport {\n ChartEditorEnum,\n MOBILE_BARS_TO_VIEW,\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n SpecificChartFunctionality,\n} from '../../constants/common'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport DrawingsInternalStore from '../../models/drawings-internal-store'\nimport { getSettings } from '../../models/settings'\nimport utils, { isRedesignedPage } from '../../utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getZoomFactorForBarsToDisplay } from '../../utils/chart'\nimport { getContainerTypeFromPaneConfig, getInitialStoreDrawings } from '../autosave/utils'\nimport { DrawingSetting } from '../toolbar/interfaces'\nimport { CHART_LAYOUT_CHILD_CHANGE_EVENT } from './constants'\n\ninterface Props {\n config: RootChartConfigObject\n onRegisterChartLayoutModel?: (chartLayoutModel: ChartLayoutModel) => void\n parentElement?: HTMLElement\n}\n\nfunction getDefaultZoomFactor(chartLayout: ChartLayoutModel) {\n const innerWidth = window.innerWidth\n if (\n innerWidth >= MOBILE_VIEW_BREAKPOINT_WIDTH ||\n chartLayout.specificChartFunctionality !== SpecificChartFunctionality.chartPage\n ) {\n return 1\n }\n\n return getZoomFactorForBarsToDisplay({\n chartLayout,\n numOfVisibleBars: MOBILE_BARS_TO_VIEW,\n chartVisibleWidth: innerWidth,\n })\n}\n\nfunction OnInitListener({\n chartLayoutModel,\n config,\n onRegisterChartLayoutModel,\n parentElement,\n}: Props & { chartLayoutModel: ChartLayoutModel; parentElement?: HTMLElement }) {\n const [isInit, setIsInit] = React.useState(false)\n\n /*\n * This entire effect is used to check for updates in entire chart layout obj tree.\n * Once config object matches object generated from chart layout, the layout model is completely initialised.\n *\n * We couldn't just add a callback to `componentDidMount` (or equivalent) because its children are rendered asynchronously.\n *\n * */\n React.useEffect(() => {\n if (onRegisterChartLayoutModel && chartLayoutModel && !isInit) {\n const checkIfInitIsComplete = () => {\n const { charts } = chartLayoutModel.toConfig()\n const isReady =\n charts.length === config.charts.length &&\n charts.every(\n (chart, chartIndex) =>\n chart.panes.length === config.charts[chartIndex].panes.length &&\n chart.panes.every(\n (pane, paneIndex) =>\n pane.elements.length === config.charts[chartIndex].panes[paneIndex].elements.length &&\n pane.elements.every(\n (element, elementIndex) =>\n element.overlays?.length ===\n config.charts[chartIndex].panes[paneIndex].elements[elementIndex].overlays?.length\n )\n )\n )\n\n if (isReady) {\n setIsInit(true)\n chartLayoutModel.updateAttributes({ isInit: true })\n onRegisterChartLayoutModel(chartLayoutModel)\n if (parentElement) {\n parentElement.style.opacity = 'unset'\n parentElement.style.minHeight = 'unset'\n }\n }\n }\n\n chartLayoutModel.bind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\n\n checkIfInitIsComplete()\n\n return () => {\n chartLayoutModel.unbind(CHART_LAYOUT_CHILD_CHANGE_EVENT, checkIfInitIsComplete)\n }\n }\n }, [chartLayoutModel, config, isInit, onRegisterChartLayoutModel, parentElement])\n\n return null\n}\n\nexport const withCompleteLayoutModelInit = (Component: any) => (props: Props) => {\n const config = React.useMemo(() => {\n const newConfig = merge({}, props.config, {\n editable: props.config.editable ?? true,\n canChangeTicker: props.config.canChangeTicker ?? true,\n scrollable: props.config.scrollable ?? true,\n cross: props.config.cross ?? true,\n theme:\n props.config.theme && [Theme.light, Theme.dark].includes(props.config.theme) ? props.config.theme : Theme.light,\n editors: props.config.editors ?? [ChartEditorEnum.publish, ChartEditorEnum.tools, ChartEditorEnum.ideas],\n ideas: props.config.ideas ?? true,\n specificChartFunctionality: props.config.specificChartFunctionality ?? SpecificChartFunctionality.default,\n initialStoreDrawings: [],\n })\n\n if (!newConfig.ideas) {\n newConfig.editors = newConfig.editors.filter((x) => x !== 'ideas')\n }\n\n // We need to add these because ideas might not have them and chart controls wouldn’t render properly\n if (isRedesignedPage(newConfig, [SpecificChartFunctionality.quotePage])) {\n newConfig.editors = newConfig.editors.concat([ChartEditorEnum.settings, ChartEditorEnum.timeframe])\n }\n\n const initialStoreDrawings = getInitialStoreDrawings()?.filter(({ changeType }) => changeType !== 'destroy') ?? []\n const isQuotePage = newConfig.specificChartFunctionality === SpecificChartFunctionality.quotePage\n const isQuotePageWithDrawingsOff = isQuotePage && utils.getCookie('charts-draw') !== 'on'\n\n if (initialStoreDrawings.length === 0 || isQuotePageWithDrawingsOff) {\n return newConfig\n }\n\n const noteDrawing = initialStoreDrawings.find(\n ({ containerType, ticker }) =>\n containerType === 'note' && props.config.charts.some((chart) => chart.ticker === ticker)\n )\n\n const note = noteDrawing && JSON.parse(noteDrawing.elementAttrs)?.text\n const ideaObject = isQuotePage && note ? { note } : undefined\n\n return {\n ...newConfig,\n initialStoreDrawings,\n idea: newConfig.idea ?? ideaObject,\n charts: newConfig.charts.map((chart) => {\n const { ticker, panes } = chart\n return {\n ...chart,\n panes: panes.map((pane) => {\n const containerType = getContainerTypeFromPaneConfig(pane)\n const newElements = initialStoreDrawings\n .filter(\n (drawing) =>\n drawing.containerType === containerType &&\n drawing.ticker === ticker &&\n !pane.elements.some((paneElement) => paneElement.elementId === drawing.elementId)\n )\n .map(({ elementId, zIndex, elementAttrs }) => ({\n elementId,\n zIndex,\n ...JSON.parse(elementAttrs),\n }))\n return {\n ...pane,\n elements: [...pane.elements, ...newElements],\n }\n }),\n }\n }),\n }\n // We need to disable the eslint check because the hook is supposed to run only once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const chartLayoutModel = React.useMemo(() => {\n const settings = getSettings({ ...config, theme: config.theme! })\n const chartLayout = ChartLayoutModel.create({\n layout: config.layout,\n width: config.width,\n height: config.height,\n editable: config.editable,\n canChangeTicker: config.canChangeTicker,\n scrollable: config.scrollable,\n initialScrollable: config.scrollable,\n cross: config.cross,\n editors: config.editors,\n theme: config.theme,\n idea: config.idea,\n settings,\n isWheelZoomEnabled: config.specificChartFunctionality === SpecificChartFunctionality.chartPage,\n specificChartFunctionality: config.specificChartFunctionality,\n isHideDrawingsActive: false,\n isPreserveDrawingsActive: !!(\n getIsPreserveDrawingsAndAutosaveAvailable(config) &&\n window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings]\n ),\n isLockDrawingsActive: false,\n uuid: config.uuid,\n drawingsInternalStore: DrawingsInternalStore.create({\n elements: config.initialStoreDrawings,\n }),\n })\n\n chartLayout.updateAttributes({ defaultZoomFactor: getDefaultZoomFactor(chartLayout) })\n\n return chartLayout\n\n // We need to disable the eslint check because the hook is supposed to run only once on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return chartLayoutModel ? (\n <>\n \n \n \n ) : null\n}\n","import debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\n\nconst MAX_QUOTE_CACHE_TIME_IN_MS = 300000 // 5 min\n\nexport const withQuoteCacheManagement = (Component: any) => (props: any) => {\n React.useEffect(() => {\n const cleanupQuoteCache = () => {\n const allQuotes = Quote.all()\n const allCharts = Chart.all()\n const allChartQuotes = allCharts.flatMap((chart) => chart.getAllQuotes())\n\n allQuotes.forEach((quote) => {\n if (\n !allChartQuotes.some((usedQuote) => usedQuote.eql(quote)) &&\n !quote.isFetching &&\n quote.fetchedAt > -1 &&\n quote.fetchedAt < Date.now() - MAX_QUOTE_CACHE_TIME_IN_MS\n ) {\n quote.destroy()\n }\n })\n }\n\n const checkQuoteCacheDebounce = debounce(cleanupQuoteCache, 500)\n\n Quote.bind('change', checkQuoteCacheDebounce)\n return () => {\n checkQuoteCacheDebounce.cancel()\n Quote.unbind('change', checkQuoteCacheDebounce)\n }\n }, [])\n\n return \n}\n","import debounce from 'lodash.debounce'\nimport React from 'react'\n\nimport { ObjectHash } from '../../../types/shared'\nimport { EXTRA_MARKET_BUFFER_MINUTES, QUOTE_FETCH_EVENT } from '../../constants/common'\nimport Chart from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport Pane from '../../models/pane'\nimport { QuoteFetchType } from '../../models/quote/constants'\n\ninterface Props {\n chartLayoutModel: ChartLayoutModel\n}\n\ntype PollingIntervalToChartsType = ObjectHash\n\n/*\n * This HOC loops through all charts and checks if they are supposed to be refetch in some interval\n * It creates groups of charts to be refreshed grouped by the refresh interval\n * */\nexport const withQuotePolling = (Component: any) => (props: Props) => {\n const [pollingIntervalToCharts, setPollingIntervalToCharts] = React.useState({})\n const checkForChartsWithPolling = React.useCallback(() => {\n // check for charts which have some refresh interval and group chart ids by the interval value e.g. { interval_in_ms: [id1, id2] }\n const newPollingIntervalToCharts: PollingIntervalToChartsType = {} // example { 60000: ['c-0', 'c-1'], 9000: ['c-4'] }\n props.chartLayoutModel.getAllCharts().forEach((chart) => {\n const chartRefreshInterval = chart.getRefreshInterval()\n\n if (chartRefreshInterval) {\n newPollingIntervalToCharts[chartRefreshInterval] = newPollingIntervalToCharts[chartRefreshInterval] ?? []\n newPollingIntervalToCharts[chartRefreshInterval].push(chart.id)\n }\n })\n\n if (JSON.stringify(newPollingIntervalToCharts) !== JSON.stringify(pollingIntervalToCharts)) {\n setPollingIntervalToCharts(newPollingIntervalToCharts)\n }\n }, [props.chartLayoutModel, pollingIntervalToCharts])\n const intervalIdsRef = React.useRef([])\n\n React.useEffect(() => {\n const checkForChartsWithPollingDebounced = debounce(checkForChartsWithPolling)\n const chartsCheckerIntervalId = window.setInterval(\n checkForChartsWithPollingDebounced,\n EXTRA_MARKET_BUFFER_MINUTES * 1000\n )\n\n // listen on any changes in all charts & panes and call debounced check for charts/indicators with quotes that needs to be refetched periodically\n Chart.bind('change', checkForChartsWithPollingDebounced)\n Pane.bind('change', checkForChartsWithPollingDebounced)\n\n return () => {\n checkForChartsWithPollingDebounced.cancel()\n Chart.unbind('change', checkForChartsWithPollingDebounced)\n Pane.unbind('change', checkForChartsWithPollingDebounced)\n window.clearInterval(chartsCheckerIntervalId)\n }\n }, [checkForChartsWithPolling])\n\n React.useEffect(() => {\n const timeoutDurations = Object.keys(pollingIntervalToCharts).map(Number)\n const allCharts = props.chartLayoutModel.getAllCharts()\n const timeoutDurationsMin = Math.min(...timeoutDurations)\n\n timeoutDurations.forEach((duration) => {\n const timeoutId = window.setInterval(() => {\n const chartIds = pollingIntervalToCharts[duration]\n // get all UNIQUE quotes used in charts and refetch them\n allCharts\n .filter((chart) => chartIds.includes(chart.id))\n .flatMap((chart) => chart.getAllQuotes())\n .filter(\n (quote, index, quotesToUpdate) =>\n !quote.isFetching && index === quotesToUpdate.findIndex((quoteToUpdate) => quote.eql(quoteToUpdate))\n )\n .forEach((quote) => {\n quote.fetchData({ fetchType: QuoteFetchType.NewerData })\n })\n if (duration === timeoutDurationsMin) {\n document.dispatchEvent(new Event(QUOTE_FETCH_EVENT))\n }\n }, duration)\n intervalIdsRef.current.push(timeoutId)\n })\n\n return () => {\n if (intervalIdsRef.current.length > 0) {\n intervalIdsRef.current.forEach((timeoutId) => {\n window.clearInterval(timeoutId)\n })\n intervalIdsRef.current = []\n }\n }\n }, [props.chartLayoutModel, pollingIntervalToCharts])\n\n return \n}\n","import Spine from '@finviz/spine'\nimport classnames from 'classnames'\nimport flowRight from 'lodash.flowright'\nimport merge from 'lodash.merge'\nimport throttle from 'lodash.throttle'\nimport React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport { ChartConfigObject, DrawingSpineOptionsEvent, IIdea, RootChartConfigObject } from '../../../types/shared'\nimport { ChartGrid, ChartGridCell } from '../../components'\nimport { ChartEditorEnum, LAYOUTS, LayoutType, SpecificChartFunctionality } from '../../constants/common'\nimport ChartModel from '../../models/chart'\nimport ChartLayoutModel from '../../models/chart_layout'\nimport ChartLayout from '../../models/chart_layout'\nimport { AutoSaveState } from '../../models/constants'\nimport ElementModel from '../../models/element'\nimport utils, {\n getChartsDimensions,\n getFullscreenStatus,\n getIsMobilePortrait,\n isRedesignEnabled,\n isRedesignedPage,\n} from '../../utils'\nimport { getIsPreserveDrawingsAndAutosaveAvailable, getIsSidebarEnabled } from '../../utils/chart'\nimport fetchApi from '../../utils/fetch_api'\nimport { getTickersAndContainerTypesInLayoutModel } from '../autosave/utils'\nimport { withDrawingsAutoSave } from '../autosave/with-auto-save'\nimport Chart from '../chart'\nimport { SidebarDirection } from '../sidebar/constants'\nimport { Sidebar } from '../sidebar/sidebar'\nimport Toolbar from '../toolbar'\nimport { AutoSaveNotesDialog } from '../toolbar/auto-save-notes'\nimport { ConfirmationDialog } from '../toolbar/confirmation_dialog'\nimport { DrawingActions, DrawingSetting, DrawingTool } from '../toolbar/interfaces'\nimport ToolbarMobile from '../toolbar/mobile/toolbar-mobile'\nimport { withDialogState } from '../with_dialog_state_hook'\nimport { AutoSaveStateIndicator } from './auto-save-state-indicator'\nimport { ChartLayoutAutoSaveNote } from './chart-layout-auto-save-note'\nimport { PublishOldButtonClickListener, getPublishChartHtmlElements } from './publish_old_button_click_listener'\nimport { withChartPageTitle } from './with-chart-page-title'\nimport { withChartRouteChange } from './with-chart-route-change'\nimport { withCompleteLayoutModelInit } from './with-complete-layout-model-init'\nimport { withIdeaModelState } from './with-idea-model-state'\nimport { withQuoteCacheManagement } from './with-quote-cache-management'\nimport { withQuotePolling } from './with-quote-polling'\n\ninterface ChartLayoutComponentProps {\n config: RootChartConfigObject\n confirmationDialogState: any\n noteDialogState: any\n shouldResize?: boolean\n chartLayoutModel: ChartLayoutModel\n idea?: IIdea\n deleteAllAutoSavedElements: () => void\n isAutoSaveActive: boolean\n}\n\ninterface ChartLayoutComponentState {\n editable: boolean\n editors: ChartEditorEnum[]\n layout: LayoutType\n activeChartInteraction: string | null\n touchEventsDisabled: boolean\n isToolbarHorizontal: boolean\n activeTool: DrawingTool\n drawingSettings: Record\n}\n\nclass ChartLayoutComponentBase extends React.Component {\n // expects config, bindPublic\n model: ChartLayoutModel\n isMobile = Boolean(utils.isMobile(true))\n charts: Array<{ model: ChartModel; config: ChartConfigObject }>\n orientationChangeTimeout: number | undefined\n preserveDrawingAbortController = new AbortController()\n\n constructor(props: ChartLayoutComponentProps) {\n super(props)\n\n this.model = props.chartLayoutModel\n const config = props.config\n\n this.charts = []\n for (const chartConfig of config.charts) {\n const modelProperties: Partial = merge({}, chartConfig)\n\n modelProperties.chart_layout = this.model\n delete modelProperties.panes\n if (modelProperties.zoomFactor == null) {\n modelProperties.zoomFactor = this.model.defaultZoomFactor\n }\n if (modelProperties.refreshData == null) {\n modelProperties.refreshData = true\n }\n if (!modelProperties.dateRange) {\n modelProperties.dateRange = null\n }\n modelProperties.isHideDrawingsActive = this.model.isHideDrawingsActive\n modelProperties.isScrolled = false\n const model = this.model.charts().create(modelProperties)\n this.charts.push({ model, config: chartConfig })\n }\n this.model.updateAttribute('activeChart', this.model.charts().first())\n\n this.state = {\n editable: this.model.editable,\n editors: this.model.editors,\n layout: this.model.layout,\n activeChartInteraction: null,\n activeTool: DrawingTool.Mouse,\n touchEventsDisabled: false,\n isToolbarHorizontal: true,\n drawingSettings: {\n [DrawingSetting.DrawingModeContinuous]: false,\n [DrawingSetting.PreserveDrawings]: this.handleInitialPreserveDrawingsState(),\n [DrawingSetting.HideDrawings]: false,\n [DrawingSetting.LockDrawings]: false,\n },\n }\n }\n\n componentDidMount() {\n if (this.state.editable) {\n const DELETE = 46\n window.addEventListener('keyup', (e) => {\n const selected = this.model.getPaneWithSelection()\n if (e.keyCode === DELETE && selected) {\n const element = ElementModel.findByAttribute('instance', selected.selection)\n if (element) {\n const elementPane = element.pane()\n element.destroyCascade({ eventType: DrawingSpineOptionsEvent.Remove })\n elementPane.normalizeZIndexes()\n }\n }\n })\n }\n\n if (this.isMobile) {\n this.model.settings.ThumbSettings.size = this.model.settings.ThumbSettings.touchSize\n }\n\n this.onModelChange()\n\n this.model.bind('change', this.onModelChange)\n this.model.charts().bind('destroy', this.onChartDestroy)\n\n this.setToolbarPosition()\n window.addEventListener('resize', this.onWindowResize)\n window.addEventListener('orientationchange', this.handleOrientationChange)\n\n if (this.isMobile) {\n this.checkTouchEventsDisabled()\n window.addEventListener('touchend', this.checkTouchEventsDisabled)\n }\n }\n\n componentDidUpdate(prevProps: Readonly): void {\n if (prevProps.idea && !this.props.idea) {\n if (this.model.specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n this.onWindowResize()\n }\n document.querySelector('#idea-title-container')?.remove()\n }\n\n this.setToolbarPosition()\n }\n\n componentWillUnmount() {\n this.preserveDrawingAbortController.abort()\n this.model.unbind('change', this.onModelChange)\n\n window.removeEventListener('resize', this.onWindowResize)\n window.removeEventListener('orientationchange', this.handleOrientationChange)\n\n if (this.isMobile) {\n window.removeEventListener('touchend', this.checkTouchEventsDisabled)\n }\n\n clearTimeout(this.orientationChangeTimeout)\n this.throttledResize.cancel()\n this.model.destroyCascade()\n }\n\n handleInitialPreserveDrawingsState = () => {\n let preserveDrawings = false\n if (getIsPreserveDrawingsAndAutosaveAvailable(this.model)) {\n if (window.FinvizSettings.toolsState?.[DrawingSetting.PreserveDrawings] !== undefined) {\n preserveDrawings = window.FinvizSettings.toolsState[DrawingSetting.PreserveDrawings]\n } else {\n this.handlePreserveDrawingsSettings()\n }\n }\n this.model.updateAttribute('isPreserveDrawingsActive', preserveDrawings)\n return preserveDrawings\n }\n\n handlePreserveDrawingsSettings = async (value?: boolean) => {\n const setPreserveDrawings = (val: boolean) => {\n this.model.updateAttribute('isPreserveDrawingsActive', val)\n this.setState((prevState) => ({\n drawingSettings: {\n ...prevState.drawingSettings,\n [DrawingSetting.PreserveDrawings]: val,\n },\n }))\n }\n\n try {\n this.preserveDrawingAbortController.abort()\n this.preserveDrawingAbortController = new AbortController()\n const response = await fetchApi({\n location: '/api/tools_state.ashx',\n method: value !== undefined ? 'POST' : 'GET',\n body:\n value !== undefined\n ? new URLSearchParams({ tools_state: JSON.stringify({ [DrawingSetting.PreserveDrawings]: value }) })\n : undefined,\n throwOnStatusCodes: [404],\n abortController: this.preserveDrawingAbortController,\n })\n\n if (value === undefined && response?.[DrawingSetting.PreserveDrawings] !== undefined) {\n setPreserveDrawings(response[DrawingSetting.PreserveDrawings])\n }\n } catch {\n if (value !== undefined) {\n setPreserveDrawings(!value)\n }\n }\n }\n\n handleOrientationChange = () => {\n this.orientationChangeTimeout = window.setTimeout(() => {\n this.setToolbarPosition()\n if (this.props.shouldResize) {\n this.handleResize()\n }\n })\n }\n\n onWindowResize = () => {\n this.setToolbarPosition()\n\n if (this.props.shouldResize) {\n this.throttledResize()\n }\n }\n\n handleResize = () => {\n const modelAttrs: Partial = getChartsDimensions(this.model.getHTMLElementId())\n this.model.updateAttributes(modelAttrs)\n }\n\n throttledResize = throttle(this.handleResize, 200)\n\n setToolbarPosition() {\n // quote page toolbar\n // 210px represents: (20px (toolbar left margin) + 80px (toolbar width) + 5px (toolbar rigth margin)) * 2 (both sides of chart)\n const newIsToolbarHorizontal = this.model.width + 210 > window.innerWidth || window.innerWidth < 1000\n if (newIsToolbarHorizontal !== this.state.isToolbarHorizontal) {\n this.setState({\n isToolbarHorizontal: newIsToolbarHorizontal,\n })\n }\n }\n\n checkTouchEventsDisabled = () => {\n if (!/\\bcharts\\b/.test(window.location.pathname) || getFullscreenStatus() || this.getVisualViewportScale() === 1) {\n this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: false })\n } else {\n !this.state?.touchEventsDisabled && this.setState({ touchEventsDisabled: true })\n }\n }\n\n getVisualViewportScale = () => {\n if (process.env.IS_E2E_TESTING) {\n return 1\n }\n if (window.visualViewport && this.isMobile) {\n return window.visualViewport.scale\n } else {\n return 1\n }\n }\n\n handleActiveToolChange = (activeTool: DrawingTool) => {\n if (!this.model.isLockDrawingsActive) {\n this.setState({ activeTool })\n }\n }\n\n handleDrawingAction = (actionId: DrawingActions) => {\n switch (actionId) {\n case DrawingActions.AddNote:\n this.props.noteDialogState.toggle()\n break\n case DrawingActions.DeleteDrawings:\n case DrawingActions.DeleteAutoSavedDrawings:\n this.props.confirmationDialogState.show()\n break\n default:\n return\n }\n }\n\n handleConfirmationDialogCloseBtn = () => {\n this.props.confirmationDialogState.hide()\n }\n\n handleConfirmationDialogDeleteBtn = () => {\n if (this.model.drawingsInternalStore().autoSaveState !== AutoSaveState.Off) {\n this.props.deleteAllAutoSavedElements()\n }\n this.model.getAllElements().forEach((element) => element.isDrawing() && element.destroyCascade())\n this.handleConfirmationDialogCloseBtn()\n }\n\n handleDrawingsSetting = (settingId: DrawingSetting) => {\n const newObj = { ...this.state.drawingSettings, [settingId]: !this.state.drawingSettings[settingId] }\n\n switch (settingId) {\n case DrawingSetting.HideDrawings:\n this.handleActiveToolChange(DrawingTool.Mouse)\n this.toggleHideDrawings(newObj[DrawingSetting.HideDrawings])\n this.handleLockDrawings(newObj)\n break\n case DrawingSetting.PreserveDrawings:\n this.handlePreserveDrawingsSettings(newObj[DrawingSetting.PreserveDrawings])\n this.model.updateAttribute('isPreserveDrawingsActive', newObj[DrawingSetting.PreserveDrawings])\n break\n case DrawingSetting.LockDrawings:\n this.handleActiveToolChange(DrawingTool.Mouse)\n this.handleLockDrawings(newObj)\n break\n case DrawingSetting.DrawingModeContinuous:\n this.model.updateAttribute('isDrawingModeContinuousActive', newObj[DrawingSetting.DrawingModeContinuous])\n newObj[DrawingSetting.DrawingModeContinuous] === false && this.handleActiveToolChange(DrawingTool.Mouse)\n break\n default:\n break\n }\n\n this.setState({ drawingSettings: newObj })\n window.gtag?.('event', 'drawings_settings_toggle', {\n event_category: newObj[settingId] ? 'enable' : 'disable',\n event_label: settingId,\n })\n }\n\n handleLockDrawings = (drawingSettings: Record) => {\n this.model.updateAttribute(\n 'isLockDrawingsActive',\n !(!drawingSettings[DrawingSetting.HideDrawings] && !drawingSettings[DrawingSetting.LockDrawings])\n )\n }\n\n toggleHideDrawings(value: boolean) {\n this.model.updateAttribute('isHideDrawingsActive', value)\n this.model.getAllCharts().forEach((chart) => chart.updateAttribute('isHideDrawingsActive', value))\n }\n\n renderToolbar(args: any) {\n const { activeTool, drawingSettings } = this.state\n return args.isOverlayToolbar ? (\n \n ) : (\n \n )\n }\n\n render() {\n const { newCharts, useGrid } = this.props.config\n const { activeTool, editable, editors, isToolbarHorizontal } = this.state\n const publish = editors.includes(ChartEditorEnum.publish) && getPublishChartHtmlElements().length > 0\n const chartLayout = LAYOUTS[this.model.layout]\n const isMobilePortrait = getIsMobilePortrait(this.isMobile)\n const { tickers } = getTickersAndContainerTypesInLayoutModel(this.model)\n\n if (newCharts) {\n const isSidebarEnabled = getIsSidebarEnabled(SpecificChartFunctionality.chartPage)\n return (\n <>\n

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

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

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

(\n Component: React.ComponentType

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

(\n Component: React.ComponentType

\n) {\n return function WrappedComponent(props: P) {\n const chartLayoutModel = useModelState(props.chartLayoutModel, { watchProperties: ['idea'] })\n return \n }\n}\n","import React from 'react'\n\nimport { RootChartConfigObject } from '../../../types/shared'\nimport { NotificationWrapper } from '../../components'\nimport { ElementStyleDialogWrapper } from '../../modals/element_style'\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\nimport { withSuspense } from '../../website-shared'\nimport { ChartLayoutComponent } from './chart_layout_component'\n\ninterface ChartLayoutProps {\n config: RootChartConfigObject\n shouldResize?: boolean\n parentElement?: HTMLElement\n isWithNotifications?: boolean\n}\n\nexport function ChartLayout({ config, shouldResize, isWithNotifications = true }: ChartLayoutProps) {\n const Wrapper = isWithNotifications ? NotificationWrapper : React.Fragment\n return (\n \n \n \n \n \n )\n}\n\nexport function ChartLayoutWithGlobalStateRaw({\n config,\n shouldResize,\n parentElement,\n}: Omit) {\n const { setChartLayoutModel, getChartLayoutModelConfig, lastGlobalRerender } = useChartLayoutGlobalModelAsync()\n\n return (\n \n {config && (\n \n )}\n \n )\n}\n\nexport const ChartLayoutWithGlobalState = withSuspense(ChartLayoutWithGlobalStateRaw)\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport Utils, { getExitFullscreen, getFullscreenStatus, getRequestFullscreen } from '../../utils'\n\nconst isIPad = Utils.isIPad()\nconst IPAD_FULLSCREEN_CLASS = 'is-ipad-fullscreen'\n\nexport function FullscreenButton() {\n const [isFullscreen, setIsFullscreen] = React.useState(getFullscreenStatus())\n const requestFullscreen = getRequestFullscreen(document.documentElement)\n const exitFullscreen = getExitFullscreen()\n\n const onClick = React.useRef(() => {\n if (getFullscreenStatus()) {\n exitFullscreen.call(document)\n } else {\n requestFullscreen.call(document.documentElement)\n }\n })\n\n React.useEffect(() => {\n const checkFullscreen = () => {\n if (isIPad) {\n if (getFullscreenStatus()) {\n document.body.classList.add(IPAD_FULLSCREEN_CLASS)\n } else {\n document.body.classList.remove(IPAD_FULLSCREEN_CLASS)\n }\n }\n setIsFullscreen(getFullscreenStatus())\n }\n\n document.addEventListener('webkitfullscreenchange', checkFullscreen)\n document.addEventListener('fullscreenchange', checkFullscreen)\n return () => {\n document.removeEventListener('webkitfullscreenchange', checkFullscreen)\n document.removeEventListener('fullscreenchange', checkFullscreen)\n }\n }, [])\n\n if (!requestFullscreen) return null\n\n return (\n \n {isFullscreen ? 'Exit Full screen' : 'Full screen'}\n \n )\n}\n","import * as React from 'react'\nimport { useLocation, useNavigate } from 'react-router-dom'\n\nimport { Button, Dropdown, DropdownItem, DropdownSeparator, Icon, Paragraph, useDropdownState } from '../../components'\nimport { LAYOUTS } from '../../constants/common'\nimport { sortObjects } from '../../helpers/sorter'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { ChartSyncableParts } from '../../models/chart/contstants'\nimport ChartLayout from '../../models/chart_layout'\nimport { decodeQueryString } from '../../utils/query_string'\nimport { useChartsPathLocation } from '../chart-controls/use-charts-path-location'\n\nconst SORTED_LAYOUT_KEYS = sortObjects(\n Object.entries(LAYOUTS).map(([key, value]) => ({ ...value, key })),\n [{ sortBy: 'columns' }, { sortBy: 'count' }]\n).map(({ key }) => key)\n\nexport function ChartLayoutDropdown({ model }: { model: ChartLayout }) {\n const location = useLocation()\n const navigate = useNavigate()\n const parsedQuery = decodeQueryString(location.search)\n const chartLayoutModel = useModelState(model, { watchProperties: ['layout', 'syncChartParts'] })\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel })\n const state = useDropdownState({ placement: 'bottom', orientation: 'horizontal' })\n\n return (\n \n Layout\n \n }\n >\n

\n
\n {SORTED_LAYOUT_KEYS.map((layout) => (\n {\n navigate(getChartsToPath({ layout }))\n }}\n >\n \n \n ))}\n
\n \n
\n
\n Sync:\n
\n {ChartSyncableParts.map(({ value, label }) => {\n const isChartPartInSync = chartLayoutModel.getIsChartPartInSync(value)\n return (\n {\n chartLayoutModel.setSyncChartParts(value, !isChartPartInSync)\n if (!isChartPartInSync) window.gtag?.('event', 'sync', { event_label: value })\n }}\n >\n {label}\n \n )\n })}\n
\n
\n \n )\n}\n","import { ObjectHash } from '../../types/shared'\nimport { SORT_DIRECTION } from '../constants/common'\n\nexport function sortObjects(\n arr: ObjectHash[],\n options: Array<{ sortBy: string; sortDirection?: keyof typeof SORT_DIRECTION }> = []\n) {\n return arr.sort((a, b) =>\n options.reduce((acc, option) => {\n const { sortBy, sortDirection = SORT_DIRECTION.ASC } = option\n const directionMultiplier = sortDirection === SORT_DIRECTION.ASC ? 1 : -1\n return acc === 0 ? (a[sortBy] - b[sortBy]) * directionMultiplier : acc\n }, 0)\n )\n}\n","import * as React from 'react'\n\nimport { Button } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { updateSettings } from '../../models/settings'\n\nexport function ThemeToggleButton({ model }: { model: ChartLayout }) {\n const chartLayoutModel = useModelState(model, { watchProperties: ['theme'] })\n const isDarkMode = model.theme === 'dark'\n\n const onClick = () => {\n const theme = isDarkMode ? 'light' : 'dark'\n chartLayoutModel.updateAttributes({ theme, settings: updateSettings(chartLayoutModel, theme) })\n chartLayoutModel.trigger('theme', chartLayoutModel)\n fetch(`/api/set_cookie.ashx?cookie=chartsTheme&value=${theme}`).catch(() => {})\n\n if (isDarkMode) {\n document.documentElement.classList.remove('dark')\n } else {\n document.documentElement.classList.add('dark')\n }\n }\n\n if (!chartLayoutModel) {\n return null\n }\n\n return (\n \n )\n}\n","import * as React from 'react'\n\nimport { Button, Time } from '../../components'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport ChartLayout from '../../models/chart_layout'\nimport { FullscreenButton } from './fullscreen_button'\nimport { IdeasDropdown } from './ideas_dropdown'\nimport { ChartLayoutDropdown } from './layout_dropdown'\nimport { Publish } from './publish'\nimport { ThemeToggleButton } from './theme_toggle_button'\nimport { TourButton } from './tour_button'\n\nconst BREAKPOINTS = [\n { minWidth: -Infinity, marketBadgeText: false, timeFormat: 'timeOnly' },\n { minWidth: 550, marketBadgeText: false, timeFormat: 'short' },\n { minWidth: 700, marketBadgeText: false, timeFormat: 'long' },\n { minWidth: 768, marketBadgeText: true, timeFormat: 'long' },\n]\n\ninterface ChartLayoutHeaderProps {\n model: ChartLayout\n onSettingsOpen: () => void\n refreshHeader: () => void\n hasPublish: boolean\n}\n\nexport function ChartLayoutHeaderComponent({ model, onSettingsOpen = () => {}, hasPublish }: ChartLayoutHeaderProps) {\n const chartLayout = useModelState(model, { watchProperties: ['idea'] })!\n\n return (\n <>\n
\n \n Ideas\n \n
\n
\n \n Chart tour\n \n \n \n {hasPublish && (\n \n Share\n \n )}\n \n \n \n
\n \n )\n}\n\nexport const ChartLayoutHeader = React.memo(\n ChartLayoutHeaderComponent,\n (prevProps, nextProps) =>\n prevProps.model === nextProps.model &&\n prevProps.onSettingsOpen === nextProps.onSettingsOpen &&\n prevProps.hasPublish === nextProps.hasPublish\n)\n","import React from 'react'\n\nimport { Instrument } from '../../../types/shared'\nimport { CustomDateRange, TimeframeBar, useCustomDateRangeDialog, useFavoriteTimeframes } from '../../components'\nimport { TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { isRedesignEnabled } from '../../utils'\nimport { useChartLayoutGlobalModelAsync } from '../../utils/useChartLayoutGlobalModelAsync'\nimport { withSuspense } from '../../website-shared'\nimport { useChartControls } from './use-chart-controls'\nimport { IDateRange, useChartModelCustomDateRangeValues } from './use-chart-model-custom-date-range-values'\n\nfunction StockDetailTimeframeBarRaw({\n size = 'regular',\n className = '!m-0 space-x-2',\n isDateRangeAvailable,\n isPremium,\n isLoadingOverride,\n isScrollIntoViewEnabled = false,\n onTimeframeSelect = () => {},\n onDateRangeSelect = () => {},\n}: {\n size?: string\n className?: string\n isDateRangeAvailable: boolean\n isPremium: boolean\n isLoadingOverride?: boolean\n isScrollIntoViewEnabled?: boolean\n onTimeframeSelect?: (timeframe: any) => void\n onDateRangeSelect?: (timeframe: any) => void\n}) {\n const { chartLayoutModel } = useChartLayoutGlobalModelAsync()\n const chartModelUnwatched = React.useMemo(() => chartLayoutModel?.getAllCharts()[0] ?? null, [chartLayoutModel])\n const { favoriteTimeframes, toggleFavoriteTimeframe } = useFavoriteTimeframes(isPremium)\n const chartModel = useModelState(chartModelUnwatched, {\n watchProperties: ['timeframe', 'dateRange'],\n })\n const { instrument = Instrument.Stock } = chartModel?.quote() || {}\n const { isLoading } = useChartControls({\n chartModel,\n isInteractive: isDateRangeAvailable,\n })\n\n const {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n } = useChartModelCustomDateRangeValues({ chartModel, isPremium })\n const { onDialogSubmit, customDateRangeDialogState, handleDateRangeSelect, getDateRangeTimeframe } =\n useCustomDateRangeDialog({\n instrument,\n anchorDate,\n pathGenerator: generateChartLayoutRouterPath,\n })\n\n const dateRangeGroups = dateRangeGroupsWithHref({ isPremium, customRange: chartModel?.dateRange, instrument })\n const timeFrameGroups = timeframeGroupsWithHref(isPremium)\n\n async function handleCustomRangeSubmit(values: { dateRange: string | null }) {\n const dateRangeTimeframe = getDateRangeTimeframe(values.dateRange) as IDateRange | null\n if (!dateRangeTimeframe) return\n\n const isValid = await handleCustomDateRangeValidation(dateRangeTimeframe)\n if (isValid) onDialogSubmit(dateRangeTimeframe)\n }\n\n return (\n <>\n {\n handleDateRangeSelect(value)\n onDateRangeSelect?.(value)\n }}\n onTimeframeSelect={onTimeframeSelect}\n onFavoriteTimeframeToggle={({ value }: { value: TIMEFRAME }) => {\n toggleFavoriteTimeframe(value)\n }}\n isDateRangeAvailable={isDateRangeAvailable}\n containerElement={document.body}\n className={className}\n isFavoritesEnabled={isPremium}\n isScrollIntoViewEnabled={isScrollIntoViewEnabled}\n />\n\n {chartModel && (\n \n )}\n \n )\n}\n\nexport const StockDetailTimeframeBar = withSuspense(StockDetailTimeframeBarRaw)\n","import { ChartConfigChartPane, Position, RootChartConfigObject, TaConfigObject } from '../../types/shared'\nimport { ChartElementType, IndicatorType, OverlayType, PANE_HEIGHT_DEFAULT, ScaleType } from '../constants/common'\n\nfunction hasPaneWithCOTCode(panes: ChartConfigChartPane[], code: string) {\n return panes.some(({ elements }) =>\n elements.some((element) => element.type === IndicatorType.Cot && element.code === code)\n )\n}\nfunction pushIndicators(\n panes: ChartConfigChartPane[],\n indicator: { name: string; parameters: string },\n options?: { COTs?: string[] }\n) {\n if (indicator.name === 'cot') {\n const cotKeys = options?.COTs ?? []\n if (cotKeys.length === 0) {\n cotKeys.push('')\n }\n cotKeys.forEach(function (code: string) {\n if (!hasPaneWithCOTCode(panes, code)) {\n panes.push({\n height: PANE_HEIGHT_DEFAULT.indicator,\n elements: [\n {\n type: IndicatorType.Cot,\n code,\n },\n ],\n })\n }\n })\n } else {\n panes.push({\n height: PANE_HEIGHT_DEFAULT.indicator,\n elements: [\n {\n type: ('indicators/' + indicator.name) as IndicatorType,\n period: indicator.parameters,\n },\n ],\n })\n }\n}\n\nfunction getChartTypeByTaConfigStyle(style: string) {\n const chartTypeMap = {\n candlestick: ChartElementType.CandleStick,\n heikinashi: ChartElementType.HeikinAshi,\n hollowcandlestick: ChartElementType.HollowCandleStick,\n line: ChartElementType.LineChart,\n ohlc: ChartElementType.OhlcChart,\n }\n return chartTypeMap[style as keyof typeof chartTypeMap]\n}\n\nfunction getChartScaleByTaConfigScale(scale: string | undefined) {\n const chartScaleMap = {\n linear: ScaleType.Linear,\n percentage: ScaleType.Percentage,\n logarithmic: ScaleType.Logarithmic,\n }\n return chartScaleMap[scale as keyof typeof chartScaleMap] ?? ScaleType.Linear\n}\n\n/*\n * Merges chartConfig (in \"chart\" format) with taConfig (in format that TA is preserved in DB)\n */\nexport const mergeChartAndTAConfig = function convertTA(\n chartConfig: RootChartConfigObject,\n taConfig: TaConfigObject,\n options?: { COTs: string[] }\n) {\n const panes = chartConfig.charts[0].panes\n const chart = chartConfig.charts[0]\n\n chart.scale = getChartScaleByTaConfigScale(taConfig.scale)\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Above)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n const overlays = taConfig.overlays.map(function (overlay) {\n return {\n type: ('overlays/' + overlay.name) as OverlayType,\n period: overlay.parameters ?? '',\n color: overlay.color ?? '',\n }\n })\n panes.push({\n height: PANE_HEIGHT_DEFAULT.chart,\n elements: [\n {\n type: getChartTypeByTaConfigStyle(taConfig.style),\n overlays: overlays,\n },\n ],\n })\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Below)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n chartConfig.height = chart.height = PANE_HEIGHT_DEFAULT.chart + (panes.length - 1) * PANE_HEIGHT_DEFAULT.indicator\n}\n\nexport const getPanes = function getPanes(taConfig: TaConfigObject) {\n const options = {}\n const panes: ChartConfigChartPane[] = []\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Above)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n const overlays = taConfig.overlays.map(function (overlay) {\n return {\n type: ('overlays/' + overlay.name) as OverlayType,\n period: overlay.parameters ?? '',\n color: overlay.color ?? '',\n }\n })\n panes.push({\n height: PANE_HEIGHT_DEFAULT.chart,\n elements: [\n {\n type: getChartTypeByTaConfigStyle(taConfig.style),\n overlays: overlays,\n },\n ],\n })\n\n taConfig.indicators\n .filter((indicator) => indicator.position === Position.Below)\n .forEach((indicator) => {\n pushIndicators(panes, indicator, options)\n })\n\n return panes\n}\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = () => ([]);\nwebpackEmptyContext.resolve = webpackEmptyContext;\nwebpackEmptyContext.id = 7176;\nmodule.exports = webpackEmptyContext;","/**\n * User type definition\n * @typedef {Object} ComponentsExport\n * @property {import('react').FC} Button\n * @property {import('react').FC} ButtonGroup\n * @property {import('react').FC} Checkbox\n * @property {import('react').FC} ContextMenu\n * @property {import('react').FC} Heading\n * @property {import('react').FC} Paragraph\n * @property {import('react').FC} Label\n * @property {Function} useDialogState\n * @property {Function} getExtendedDialogState\n * @property {Function} useListState\n * @property {import('react').FC} Dialog\n * @property {import('react').FC} DialogBody\n * @property {import('react').FC} DialogFooter\n * @property {import('react').FC} DialogHeader\n * @property {import('react').FC} DialogTrigger\n * @property {import('react').FC} ConfirmationDialog\n * @property {import('react').VF} CopyToClipboard\n * @property {import('react').FC} DatePicker\n * @property {import('react').VF} ColorPicker\n * @property {import('react').VF} ColorPreview\n * @property {import('react').VF} InputColorPicker\n * @property {Function} useDropdownState\n * @property {import('react').FC} Dropdown\n * @property {import('react').FC} DropdownBar\n * @property {import('react').FC} DropdownItem\n * @property {import('react').FC} DropdownSeparator\n * @property {import('react').FC} MoreButtonDropdown\n * @property {import('react').Context} DropdownContext\n * @property {import('react').FC<{ title?: import('react').ReactNode; message?: import('react').ReactNode; showContact?: boolean; showRefresh?: boolean }>} DefaultErrorBoundary\n * @property {import('react').FC} GridLayout\n * @property {import('react').FC} ChartGrid\n * @property {import('react').FC} ChartGridCell\n * @property {any} IconName\n * @property {import('react').FC} Icon\n * @property {import('react').FC} Logo\n * @property {import('react').FC} CircleLogo\n * @property {any} InputTheme\n * @property {import('react').FC} Input\n * @property {import('react').FC} InnerState\n * @property {import('react').FC} TooltipInput\n * @property {import('react').FC} Textarea\n * @property {import('react').FC} HighlightedResult\n * @property {import('react').FC} ListItem\n * @property {import('react').FC} List\n * @property {import('react').FC} CategoryList\n * @property {Function} searchByValue\n * @property {Function} sortByLabel\n * @property {Function} useListSearch\n * @property {Function} usePopoverState\n * @property {import('react').FC} PopoverTrigger\n * @property {import('react').FC} Popover\n * @property {import('react').VF} RangeSlider\n * @property {import('react').FC} TickerSearch\n * @property {import('react').FC} Search\n * @property {import('react').FC} Select\n * @property {import('react').FC} StatelessSelect\n * @property {import('react').FC} SelectOption\n * @property {import('react').FC} Spinner\n * @property {import('react').FC} Delayed\n * @property {import('react').FC} ColorSelect\n * @property {import('react').FC} Toolbar\n * @property {import('react').FC} ToolbarItem\n * @property {import('react').FC} ToolbarDivider\n * @property {import('react').FC} ToolbarButton\n * @property {any} DrawingTool\n * @property {Function} useTooltipState\n * @property {import('react').FC} Tooltip\n * @property {import('react').FC} TooltipTrigger\n * @property {Function} useTour\n * @property {import('react').FC} Paragraph\n * @property {import('react').FC} ButtonColorPicker\n * @property {import('react').FC} InnerState\n * @property {import('react').FC} TimeframeBar\n * @property {(elementOverride?: TElement | null) => { setElementRef: React.Dispatch>; elementWidth: number; elementHeight: number }} useElementMeasure\n * @property {Function} convertColorToHEX\n * @property {Function} hexStringToRGBA\n * @property {Function} rgbaToRGBAString\n * @property {Function} withNotificationContext\n * @property {Function} useNotification\n * @property {import('react').FC} Notification\n * @property {import('react').FC} NotificationWrapper\n * @property {import('react').FC} Time\n * @property {import('react').FC} CustomDateRange\n * @property {import('react').Context} ZIndexContext\n * @property {Function} useCustomDateRangeDialog\n * @property {Function} useFavoriteTimeframes\n * @property {Function} getTimeframeGroups\n * @property {Function} getDateRangeGroups\n * @property {Function} getDateRangeGroupsWithHref\n * @property {Function} generatePathForTimeframeDateRange\n * @property {Record} timeframeUtm\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {ComponentsExport}\n */\nconst componentsLib = window.FLibs.components\n\nmodule.exports = componentsLib\n","// Keep in sync with Website repository colors.js file in: config/colors.js\n\nmodule.exports = {\n white: '#fff',\n black: '#000',\n inherit: 'inherit',\n transparent: 'transparent',\n current: 'currentColor',\n finviz: {\n 'blue-gray': '#262931',\n blue: '#4fa4f4',\n },\n gray: {\n 50: '#f3f3f5',\n 100: '#dedfe5',\n 200: '#c3c6d0',\n 300: '#a3a8b9',\n 400: '#868ea5',\n 500: '#676f85',\n 600: '#4c5263',\n 700: '#353945',\n 750: '#2c303b',\n 800: '#22262f',\n 900: '#14161d',\n },\n red: {\n 50: '#fef0f0',\n 100: '#fcd6d6',\n 200: '#fbb4b4',\n 300: '#fd8487',\n 400: '#fb5057',\n 500: '#d91e2b',\n 600: '#9f1f2a',\n 700: '#691f24',\n 800: '#45171a',\n 900: '#280e0f',\n },\n orange: {\n 50: '#fef2eb',\n 100: '#fdd9c5',\n 200: '#fab889',\n 300: '#ef9323',\n 400: '#ca7b14',\n 500: '#a0600e',\n 600: '#79460a',\n 700: '#583006',\n 800: '#3d1e03',\n 900: '#261101',\n },\n amber: {\n 50: '#fef2e7',\n 100: '#fedab5',\n 200: '#fbba56',\n 300: '#de9c1a',\n 400: '#bb830f',\n 500: '#956600',\n 600: '#704b00',\n 700: '#4f3400',\n 800: '#372200',\n 900: '#211300',\n },\n yellow: {\n 50: '#fdf2df',\n 100: '#fcdc86',\n 200: '#f3c736',\n 300: '#cda30b',\n 400: '#b08900',\n 500: '#8b6a00',\n 600: '#664e21',\n 700: '#46371e',\n 800: '#2f2516',\n 900: '#1b150d',\n },\n brightYellow: {\n 50: '#fff699',\n 100: '#fff200',\n },\n lime: {\n 50: '#ebfad6',\n 100: '#caec90',\n 200: '#aad547',\n 300: '#8db61e',\n 400: '#769913',\n 500: '#5b7800',\n 600: '#435900',\n 700: '#2e3e00',\n 800: '#1e2a00',\n 900: '#111900',\n },\n green: {\n 50: '#e7f7e8',\n 100: '#beeac1',\n 200: '#86d895',\n 300: '#34c062',\n 400: '#00a449',\n 500: '#19803d',\n 600: '#265d35',\n 700: '#1e4027',\n 800: '#162b1b',\n 900: '#0d1810',\n },\n emerald: {\n 50: '#ddfaee',\n 100: '#a2f0d2',\n 200: '#4dddaf',\n 300: '#25be93',\n 400: '#1d9f7b',\n 500: '#157e60',\n 600: '#035d47',\n 700: '#004139',\n 800: '#002c22',\n 900: '#001a13',\n },\n teal: {\n 50: '#e0f8fc',\n 100: '#9beef7',\n 200: '#4fd8e5',\n 300: '#27b9c4',\n 400: '#109ba5',\n 500: '#007c83',\n 600: '#005b62',\n 700: '#004045',\n 800: '#002b2e',\n 900: '#00191b',\n },\n blue: {\n 50: '#ebf4fe',\n 100: '#cae2fc',\n 200: '#9bcbfa',\n 300: '#57aefb',\n 400: '#2f91ef',\n 500: '#306dca',\n 600: '#2f5091',\n 700: '#263766',\n 800: '#1b2542',\n 900: '#101527',\n },\n violet: {\n 50: '#f4f2fe',\n 100: '#e1dbfd',\n 200: '#c9befc',\n 300: '#ad9bfb',\n 400: '#9978f9',\n 500: '#7c51e7',\n 600: '#5e36b8',\n 700: '#402979',\n 800: '#2a1e4e',\n 900: '#18122c',\n },\n purple: {\n 50: '#f9f1fe',\n 100: '#eed8fd',\n 200: '#e1b6fc',\n 300: '#d38bfb',\n 400: '#c85bf9',\n 500: '#ae27e0',\n 600: '#8514ac',\n 700: '#60077e',\n 800: '#44005a',\n 900: '#2a003a',\n },\n pink: {\n 50: '#fef1f4',\n 100: '#fdd6e1',\n 200: '#fcb2c7',\n 300: '#f984aa',\n 400: '#f25090',\n 500: '#cd2a74',\n 600: '#9d1658',\n 700: '#700c42',\n 800: '#4e052b',\n 900: '#32011a',\n },\n}\n","/**\n * Type definitions for assets exported in website FLibs\n * @typedef {Object} AssetsExport\n * @property {string} logo\n * @property {string} logo_light\n */\n\n/**\n * @typedef {Object} SaveToPortfolio\n * @property {() => Promise<{ SaveToPortfolio: React.ComponentType }>} importFn\n * @property {string} cacheKey\n */\n\n/**\n * @typedef {Object} CreateAlert\n * @property {() => Promise<{ CreateAlert: React.ComponentType }>} importFn\n * @property {string} cacheKey\n\n/**\n * @typedef {Object} PortfolioWatchlistTable\n * @property {() => Promise<{ PortfolioWatchlistTable: React.ComponentType }>} importFn\n * @property {string} cacheKey\n */\n\n/**\n * @typedef {Object} LocalStorageService\n * @property {(key: string, defaultValue: ValueType) => ValueType} getValue\n * @property {(key: string, valueGetter: React.SetStateAction, defaultValue: ValueType, emit?: boolean) => void} setValue\n * @property {(key: string, emit?: boolean) => void} removeValue\n * @property {(key: string, transformValue: NewValue | ((oldValue: PrevValue | NewValue) => NewValue), defaultValue: NewValue) => void} migrateValue\n */\n\n/**\n * Type definitions for functions exported in website FLibs\n * @typedef {Object} FLibsExport\n * @property {AssetsExport} assets\n * @property {(date?: Date, format?: TimeFormatType) => string} getFormattedDateString\n * @property {(date: Date) => string} formatDateToStringUS\n * @property {(key: string, defaultValue: ValueType) => ({ state: ValueType, setState: (value: React.SetStateAction) => void })} useSyncLocalStorage\n * @property {(props: { trackInitial?: boolean; trackAutomatically?: boolean; }) => () => void} useTrackPageView\n * @property {SaveToPortfolio} saveToPortfolioAsyncModule\n * @property {CreateAlert} createAlertAsyncModule\n * @property {PortfolioWatchlistTable} portfolioWatchlistTableAsyncModule\n * @property {LocalStorageService} localStorage\n * @property {(importFn: () => Promise, retries = 0) => Promise} importWithRetry\n * @property {

>(Component: React.ComponentType

, fallback?: React.ReactNode) => ((props: P) => JSX.Element)} withSuspense\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {FLibsExport}\n */\nconst FLibsExports = typeof window === 'undefined' ? {} : window.FLibs\n\nmodule.exports = FLibsExports\n","export { getFullChartWidth, getIntradayChartConfig } from './controllers/renderUtils'\n\nexport { ChartLayout, ChartLayoutWithGlobalState } from './controllers/chart_layout'\nexport { ChartLayoutHeader } from './controllers/header'\nexport { Sidebar } from './controllers/sidebar/sidebar'\nexport { StockDetailTimeframeBar } from './controllers/chart-controls/stock-detail-timeframe-bar'\nexport { getTimeframeGroupsWithHref } from './controllers/chart-controls/utils'\nexport { useModelState } from './model-hooks/use-model-state'\nexport { default as Quote } from './models/quote'\nexport * as Settings from './models/settings'\nexport { default as Utils } from './utils'\nexport { useChartLayoutGlobalModelAsync } from './utils/useChartLayoutGlobalModelAsync'\nexport * as convertTa from './utils/convert_ta'\nexport { FREE_DATE_RANGES } from './constants/common'\n\nexport {\n chartSettingsAsyncModule,\n useChartLayoutGlobalModelAsyncModule,\n preventClosingUnsavedChangesAsyncModule,\n} from './controllers/chart-settings/async-modules'\n\nexport { withCompleteLayoutModelInit } from './controllers/chart_layout/with-complete-layout-model-init'\nexport { withQuotePolling } from './controllers/chart_layout/with-quote-polling'\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IArrowAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n border: DrawingBorder\n}\n\nclass Arrow extends Element {\n static type = CanvasElementType.arrow\n\n declare scaled: Pick\n name = 'Arrow'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'l',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'r',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 3,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineCap', 'round')\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const angle = Math.PI / 8\n const d = 20\n\n context.beginPath()\n context.moveTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n\n const lineAngle = Math.atan2(roundedXY.y2 - roundedXY.y1, roundedXY.x2 - roundedXY.x1)\n const h = Math.abs(d / Math.cos(angle))\n\n const angle1 = lineAngle + angle\n const topx = roundedXY.x1 + Math.cos(angle1) * h\n const topy = roundedXY.y1 + Math.sin(angle1) * h\n const angle2 = lineAngle - angle\n const botx = roundedXY.x1 + Math.cos(angle2) * h\n const boty = roundedXY.y1 + Math.sin(angle2) * h\n\n context.beginPath()\n context.moveTo(topx, topy)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(botx, boty)\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'l') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nArrow.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default Arrow\n","import { DrawingBorder, PaneArea, RequireByKey, ResizeByThumbFuncProps } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport { getContextWithCache } from '../../lib/shims'\nimport PaneModel from '../../models/pane'\nimport Element, { EdgeValues } from '../element'\nimport Thumb from '../thumb'\n\nexport type BrushPoints = Array<[x: number, y: number]>\n\nexport interface IBrushAttrs {\n points: BrushPoints\n fill: string\n border: DrawingBorder\n isPolyLineClosed: boolean\n positionPointsTimestamps: BrushPoints\n}\n\nclass Brush extends Element {\n static type = CanvasElementType.brushV1\n\n untranslatedContext: CanvasRenderingContext2D | null = null\n\n name = 'Brush'\n\n brushPath: Path2D | null = null\n\n cachedFill = {\n previousFill: '',\n shouldRenderFill: false,\n }\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\n this.setFillCache()\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultTransparentFill,\n border: {\n width: 3,\n color: ElementSettings.Colors.border,\n },\n isPolyLineClosed: false,\n } as Partial\n }\n\n setFillCache() {\n this.cachedFill.previousFill = this.attrs.fill\n if (this.attrs.fill.length === 9) {\n this.cachedFill.shouldRenderFill = this.attrs.fill.slice(7) !== '00'\n } else {\n this.cachedFill.shouldRenderFill = true\n }\n }\n\n getShouldRenderFill() {\n if (this.attrs.fill !== this.cachedFill.previousFill) {\n this.setFillCache()\n }\n return this.cachedFill.shouldRenderFill\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (this.attrs.border != null) {\n context.set('strokeStyle', this.attrs.border.color)\n }\n context.set('lineCap', 'round')\n context.set('lineJoin', 'round')\n\n const brushPath = new Path2D()\n const { points } = this.attrs\n context.beginPath()\n brushPath.moveTo(this.fx(points[0][0]), this.fy(points[0][1]))\n let i\n if (points.length > 3) {\n for (i = 0; i < points.length - 2; i++) {\n const xc = (this.fx(points[i][0]) + this.fx(points[i + 1][0])) / 2\n const yc = (this.fy(points[i][1]) + this.fy(points[i + 1][1])) / 2\n brushPath.quadraticCurveTo(this.fx(points[i][0]), this.fy(points[i][1]), xc, yc)\n }\n brushPath.quadraticCurveTo(\n this.fx(points[i][0]),\n this.fy(points[i][1]),\n this.fx(points[i + 1][0]),\n this.fy(points[i + 1][1])\n )\n } else {\n for (const point of points) {\n brushPath.lineTo(this.fx(point[0]), this.fy(point[1]))\n }\n }\n\n if (this.attrs.isPolyLineClosed) {\n brushPath.closePath()\n }\n this.brushPath = brushPath\n if (this.attrs.fill && this.getShouldRenderFill()) {\n context.set('fillStyle', this.attrs.fill)\n context.fill(brushPath)\n }\n if (this.attrs?.border?.width) {\n context.set('lineWidth', this.attrs.border.width)\n context.stroke(brushPath)\n }\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n const [firstX, firstY] = this.attrs.points[0]\n const [lastX, lastY] = this.attrs.points[this.attrs.points.length - 1]\n\n return [\n new Thumb(\n 'first',\n () => firstX,\n () => firstY,\n this.moveByThumb,\n this.model\n ),\n new Thumb(\n 'last',\n () => lastX,\n () => lastY,\n this.moveByThumb,\n this.model\n ),\n ]\n }\n\n moveByThumb = ({ difX, difY }: RequireByKey) => {\n this.moveBy(difX, difY)\n }\n\n moveBy(x: number, y: number) {\n if (this.getIsCreator()) return\n for (const point of this.attrs.points) {\n point[0] += x\n point[1] += y\n }\n }\n\n onMouseUp() {\n const [currentDomainMax, currentDomainMin] = this.model.scale.y.domain()\n for (const point of this.attrs.points) {\n point[0] = this.roundToFixed(point[0], 2)\n point[1] = this.roundY(point[1], currentDomainMax - currentDomainMin)\n }\n super.onMouseUp()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const { points } = this.attrs\n if (\n (this.getShouldRenderFill() || this.attrs.isPolyLineClosed) &&\n this.brushPath &&\n this.untranslatedContext?.isPointInPath(this.brushPath, area.scaled.x, area.scaled.y)\n ) {\n return true\n } else if (points.length > 1) {\n for (let i = 0; i < points.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: this.fx(points[i][0]),\n y1: this.fy(points[i][1]),\n x2: this.fx(points[i + 1][0]),\n y2: this.fy(points[i + 1][1]),\n }) <= 10\n ) {\n return true\n }\n }\n }\n return super.isInArea(area)\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart()?.quote()\n if (quote) {\n const positionPointsTimestamps = this.attrs.points.map(([x, y]) => [quote.getTimestampFomPositionX(x), y])\n this.set({ positionPointsTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionPointsTimestamps } = this.attrs\n if (!quote || !positionPointsTimestamps) {\n // positionPointsTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const points = positionPointsTimestamps.map(([x, y]) => [quote.getPositionXFromTimestamp(x), y])\n this.set({ points } as Partial)\n }\n\n roundToFixed = (value: number, places: number) => Number.parseFloat(math.round({ value, overridePlaces: places }))\n\n roundY = (y: number, domainDiff: number) => {\n if (domainDiff < 1) {\n const numberOfLeadingZeros = Math.abs(Math.floor(Math.log10(Math.abs(domainDiff)) + 1))\n if (numberOfLeadingZeros > 0) {\n return this.roundToFixed(y, numberOfLeadingZeros + 4)\n } else {\n return this.roundToFixed(y, numberOfLeadingZeros + 3)\n }\n } else if (domainDiff < 10) {\n return this.roundToFixed(y, 3)\n }\n return this.roundToFixed(y, 2)\n }\n\n getAutosaveOmittedProperties() {\n return ['points']\n }\n\n getEdgeXYValues() {\n if (this.edgeXYValues === null) {\n const edgeXYValues = {} as EdgeValues\n this.attrs.points.forEach(([x, y]) => {\n edgeXYValues.minX = Math.min(x, edgeXYValues.minX ?? x)\n edgeXYValues.minY = Math.min(y, edgeXYValues.minY ?? y)\n edgeXYValues.maxX = Math.max(x, edgeXYValues.maxX ?? x)\n edgeXYValues.maxY = Math.max(y, edgeXYValues.maxY ?? y)\n })\n\n this.edgeXYValues = edgeXYValues\n }\n\n return this.edgeXYValues\n }\n}\n\nBrush.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, max: 20, default: {} },\n { type: 'checkbox', name: 'isPolyLineClosed', label: 'Close line' },\n ],\n}\n\nexport default Brush\n","import math from '../../helpers/math'\n\ninterface ICoordinates {\n x: number\n y: number\n}\nexport interface IRectangleSidesCoordinates {\n topLeft: ICoordinates\n topRight: ICoordinates\n rightTop: ICoordinates\n rightBottom: ICoordinates\n bottomRight: ICoordinates\n bottomLeft: ICoordinates\n leftBottom: ICoordinates\n leftTop: ICoordinates\n}\n\nexport interface ITailCoordinates {\n tailRoot: ICoordinates\n tailTip: ICoordinates\n}\n\nexport enum TailDirection {\n noTail,\n topLeftCorner,\n topRightCorner,\n bottomLeftCorner,\n bottomRightCorner,\n topSide,\n rightSide,\n bottomSide,\n leftSide,\n}\n\nexport const getRectangleSidesCoordinates = ({\n padding,\n radius,\n x2,\n y2,\n textWidth,\n measuredHeight,\n}: {\n padding: number\n radius: number\n x2: number\n y2: number\n textWidth: number\n measuredHeight: number\n}): IRectangleSidesCoordinates => ({\n topLeft: {\n x: x2 - padding + radius,\n y: y2 - padding,\n },\n topRight: {\n x: x2 + textWidth + padding - radius,\n y: y2 - padding,\n },\n rightTop: {\n x: x2 + textWidth + padding,\n y: y2 - padding + radius,\n },\n rightBottom: {\n x: x2 + textWidth + padding,\n y: y2 + padding + measuredHeight - radius,\n },\n bottomRight: {\n x: x2 + textWidth + padding - radius,\n y: y2 + padding + measuredHeight,\n },\n bottomLeft: {\n x: x2 - padding + radius,\n y: y2 + padding + measuredHeight,\n },\n leftBottom: {\n x: x2 - padding,\n y: y2 + padding + measuredHeight - radius,\n },\n leftTop: {\n x: x2 - padding,\n y: y2 - padding + radius,\n },\n})\n\nexport const getTailCoordinates = ({\n rectangleSides,\n x1,\n y1,\n}: {\n rectangleSides: IRectangleSidesCoordinates\n x1: number\n y1: number\n}): ITailCoordinates => ({\n tailRoot: {\n x: rectangleSides.topLeft.x + (rectangleSides.topRight.x - rectangleSides.topLeft.x) / 2,\n y: rectangleSides.leftTop.y + (rectangleSides.leftBottom.y - rectangleSides.leftTop.y) / 2,\n },\n tailTip: {\n x: x1,\n y: y1,\n },\n})\n\nconst getTailHalfWidth = (halfWidth: number, p1: ICoordinates, p2: ICoordinates): number => {\n const dist = math.distance(p1, p2)\n if (dist < halfWidth * 2) {\n return dist / 2\n } else {\n return halfWidth\n }\n}\n\nexport const getTailToSideIntersection = ({\n tail,\n rectangleSides,\n}: {\n tail: ITailCoordinates\n rectangleSides: IRectangleSidesCoordinates\n}): TailDirection => {\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\n const { tailTip, tailRoot } = tail\n if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, leftTop)) {\n return TailDirection.topLeftCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topRight, rightTop)) {\n return TailDirection.topRightCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, leftBottom)) {\n return TailDirection.bottomLeftCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomRight, rightBottom)) {\n return TailDirection.bottomRightCorner\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)) {\n return TailDirection.topSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)) {\n return TailDirection.rightSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, bottomLeft, bottomRight)) {\n return TailDirection.bottomSide\n } else if (math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)) {\n return TailDirection.leftSide\n } else {\n return TailDirection.noTail\n }\n}\n\ninterface IRenderCallout {\n context: any\n radius: number\n requiredTailHalfWidth: number\n tail: ITailCoordinates\n rectangleSides: IRectangleSidesCoordinates\n tailDirection: TailDirection\n}\n\nexport const renderCallout = ({\n context,\n radius,\n requiredTailHalfWidth,\n tail,\n rectangleSides,\n tailDirection,\n}: IRenderCallout): void => {\n const { topLeft, topRight, rightTop, rightBottom, bottomRight, bottomLeft, leftBottom, leftTop } = rectangleSides\n const { tailTip, tailRoot } = tail\n\n // draw rounded rectangle from top left corner clockwise\n // !!! ORDER OF RENDER MATTERS !!!\n\n // renderTopLeftCorner\n if (tailDirection === TailDirection.topLeftCorner) {\n context.moveTo(leftTop.x, leftTop.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topLeft.x, topLeft.y)\n } else {\n context.moveTo(leftTop.x, leftTop.y)\n context.arcTo(leftTop.x, topLeft.y, topLeft.x, topLeft.y, radius)\n }\n\n // renderTopLine\n if (tailDirection === TailDirection.topSide) {\n const tailLineToTopLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, topLeft, topRight)\n if (!tailLineToTopLineIntersection) {\n context.lineTo(topRight.x, topRight.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, topLeft, topRight)\n if (tailLineToTopLineIntersection.x - tailHalfWidth < topLeft.x) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topLeft.x + tailHalfWidth * 2, tailLineToTopLineIntersection.y)\n } else if (tailLineToTopLineIntersection.x + tailHalfWidth > topRight.x) {\n context.lineTo(topRight.x - tailHalfWidth * 2, tailLineToTopLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(topRight.x, tailLineToTopLineIntersection.y)\n } else {\n context.lineTo(tailLineToTopLineIntersection.x - tailHalfWidth, tailLineToTopLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToTopLineIntersection.x + tailHalfWidth, tailLineToTopLineIntersection.y)\n context.lineTo(topRight.x, topRight.y)\n }\n } else {\n context.lineTo(topRight.x, topRight.y)\n }\n\n // renderTopRightCorner\n if (tailDirection === TailDirection.topRightCorner) {\n context.lineTo(topRight.x, topRight.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightTop.x, rightTop.y)\n } else {\n context.arcTo(rightTop.x, topRight.y, rightTop.x, rightTop.y, radius)\n }\n\n // renderRightLine\n if (tailDirection === TailDirection.rightSide) {\n const tailLineToRightLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, rightTop, rightBottom)\n if (!tailLineToRightLineIntersection) {\n context.lineTo(rightBottom.x, rightBottom.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, rightTop, rightBottom)\n if (tailLineToRightLineIntersection.y - tailHalfWidth < rightTop.y) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightTop.x, rightTop.y + tailHalfWidth * 2)\n } else if (tailLineToRightLineIntersection.y + tailHalfWidth > rightBottom.y) {\n context.lineTo(rightBottom.x, rightBottom.y - tailHalfWidth * 2)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(rightBottom.x, rightBottom.y)\n } else {\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y - tailHalfWidth)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToRightLineIntersection.x, tailLineToRightLineIntersection.y + tailHalfWidth)\n context.lineTo(rightBottom.x, rightBottom.y)\n }\n } else {\n context.lineTo(rightBottom.x, rightBottom.y)\n }\n\n // renderBottomRightCorner\n if (tailDirection === TailDirection.bottomRightCorner) {\n context.lineTo(rightBottom.x, rightBottom.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomRight.x, bottomRight.y)\n } else {\n context.arcTo(rightBottom.x, bottomRight.y, bottomRight.x, bottomRight.y, radius)\n }\n\n // renderBottomLine\n if (tailDirection === TailDirection.bottomSide) {\n const tailLineToBottomLineIntersection = math.twoSegmentLinesIntersection(\n tailTip,\n tailRoot,\n bottomLeft,\n bottomRight\n )\n if (!tailLineToBottomLineIntersection) {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, bottomLeft, bottomRight)\n if (tailLineToBottomLineIntersection.x + tailHalfWidth > bottomRight.x) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomRight.x - tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\n } else if (tailLineToBottomLineIntersection.x - tailHalfWidth < bottomLeft.x) {\n context.lineTo(bottomLeft.x + tailHalfWidth * 2, tailLineToBottomLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(bottomLeft.x, tailLineToBottomLineIntersection.y)\n } else {\n context.lineTo(tailLineToBottomLineIntersection.x + tailHalfWidth, tailLineToBottomLineIntersection.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToBottomLineIntersection.x - tailHalfWidth, tailLineToBottomLineIntersection.y)\n context.lineTo(bottomLeft.x, bottomLeft.y)\n }\n } else {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n }\n\n // renderBottomLeftCorner\n if (tailDirection === TailDirection.bottomLeftCorner) {\n context.lineTo(bottomLeft.x, bottomLeft.y)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftBottom.x, leftBottom.y)\n } else {\n context.arcTo(leftBottom.x, bottomLeft.y, leftBottom.x, leftBottom.y, radius)\n }\n\n // renderLeftLine\n if (tailDirection === TailDirection.leftSide) {\n const tailLineToLeftLineIntersection = math.twoSegmentLinesIntersection(tailTip, tailRoot, leftTop, leftBottom)\n if (!tailLineToLeftLineIntersection) {\n context.lineTo(leftTop.x, leftTop.y)\n return\n }\n const tailHalfWidth = getTailHalfWidth(requiredTailHalfWidth, leftTop, leftBottom)\n if (tailLineToLeftLineIntersection.y + tailHalfWidth > leftBottom.y) {\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftBottom.x, leftBottom.y - tailHalfWidth * 2)\n } else if (tailLineToLeftLineIntersection.y - tailHalfWidth < leftTop.y) {\n context.lineTo(leftTop.x, leftTop.y + tailHalfWidth * 2)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(leftTop.x, leftTop.y)\n } else {\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y + tailHalfWidth)\n context.lineTo(tailTip.x, tailTip.y)\n context.lineTo(tailLineToLeftLineIntersection.x, tailLineToLeftLineIntersection.y - tailHalfWidth)\n context.lineTo(leftTop.x, leftTop.y)\n }\n } else {\n context.lineTo(leftTop.x, leftTop.y)\n }\n}\n","import merge from 'lodash.merge'\n\nimport { PaneArea, RequireByKey, ResizeByThumbWithTypeAndDifs, TextAttrs } from '../../../types/shared'\nimport { PADDING } from '../../constants/common'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport Chart from '../../models/chart'\nimport PaneModel from '../../models/pane'\nimport Text from '../text'\nimport Thumb from '../thumb'\nimport {\n TailDirection,\n getRectangleSidesCoordinates,\n getTailCoordinates,\n getTailToSideIntersection,\n renderCallout,\n} from './callout_utils'\nimport { IRectangleSidesCoordinates, ITailCoordinates } from './callout_utils'\n\nexport interface ICalloutAttrs {\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\ninterface FontFamilyHeightCoefficient {\n Arial: {\n firstLine: number\n otherLines: number\n }\n Verdana: {\n firstLine: number\n otherLines: number\n }\n}\n\ntype CalloutTextAttrs = ICalloutAttrs & RequireByKey\n\nclass Callout extends Text {\n static type = CanvasElementType.calloutV1\n\n name = 'Callout'\n\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\n declare isActualBoundingBoxAvailable: boolean\n declare lastAttrs: Attrs\n declare scaled: Pick\n declare measuredHeight: number\n declare requiredTailHalfWidth: number\n declare rectangleSides: IRectangleSidesCoordinates\n declare tail: ITailCoordinates\n declare tailDirection: TailDirection\n declare font: string\n declare context: CanvasRenderingContext2D\n declare lines: {\n text: string\n metrics: TextMetrics\n }[]\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'tail',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n getModalConfigBase() {\n return {\n inputs: [\n { type: 'multiline_string', name: 'text', required: true },\n { type: 'font', name: 'font' },\n {\n type: 'background',\n name: 'fillStyle',\n label: 'Color',\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n {\n type: 'background',\n name: 'background',\n label: 'Background',\n default: 'rgba(0,0,0,0)',\n },\n {\n type: 'border',\n name: 'border',\n min: 0,\n },\n ],\n }\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n text: '',\n font: {\n size: 15,\n family: 'Arial',\n style: 'normal',\n weight: 'normal',\n },\n fillStyle: ElementSettings.Colors.textWithoutBackground,\n lineHeight: 15,\n // left | right | center | start | end\n textAlign: 'left',\n // top | middle | alphabetic | bottom\n textBaseline: 'alphabetic',\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n background: ElementSettings.defaultFill,\n border: { color: ElementSettings.Colors.line, width: 1 },\n } as Partial\n }\n\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle)\n context.set('textAlign', this.attrs.textAlign)\n context.set('textBaseline', this.attrs.textBaseline)\n this.setupTextMetricsCache()\n }\n\n setupTextMetricsCache() {\n if (\n this.attrs.text !== this.lastAttrs?.text ||\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)\n ) {\n this.lastAttrs = merge({}, this.attrs)\n this.lines = this.getLines().map((line) => ({\n text: line,\n metrics: this.context.measureText(line),\n }))\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\n const lineHeight =\n current.metrics.actualBoundingBoxAscent +\n current.metrics.actualBoundingBoxDescent +\n (currentIndex !== this.lines.length - 1 ? PADDING.S : 0)\n return acc + lineHeight\n }, 0)\n }\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n this.render(context)\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n renderText() {\n let y = this.scaled.y2 + this.attrs.padding.top\n let previousDescent = 0\n this.lines.forEach((line, index) => {\n y += index === 0 ? 0 : line.metrics.actualBoundingBoxAscent + previousDescent + PADDING.S\n this.context.fillText(line.text, this.scaled.x2 + this.attrs.padding.left, y)\n previousDescent = line.metrics.actualBoundingBoxDescent\n })\n }\n\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n const textWidth = this.attrs.text === '' ? this.attrs.font.size * 2 : this.width\n const minRadius = this.attrs.font.size * 0.5\n const padding = this.attrs.border.width / 2 + this.attrs.font.size * 0.5\n const radius = textWidth < minRadius ? textWidth / 2 : minRadius\n this.requiredTailHalfWidth = minRadius\n if (this.measuredHeight < minRadius) {\n this.measuredHeight = radius * 2\n }\n const y2 =\n this.scaled.y2 -\n (this.lines[0].metrics.actualBoundingBoxAscent\n ? this.lines[0].metrics.actualBoundingBoxAscent\n : this.measuredHeight)\n\n // Points diagram\n //.......X-----------------X.......\n //.................................\n //...X.........................X...\n //...|.........................|...\n //...|.........................|...\n //...X.........................X...\n //.................................\n //.......X-----------------X.......\n\n this.rectangleSides = getRectangleSidesCoordinates({\n padding,\n radius,\n x2: this.scaled.x2,\n y2,\n textWidth,\n measuredHeight: this.measuredHeight,\n })\n this.tail = getTailCoordinates({ rectangleSides: this.rectangleSides, x1: this.scaled.x1, y1: this.scaled.y1 })\n this.tailDirection = getTailToSideIntersection({ tail: this.tail, rectangleSides: this.rectangleSides })\n this.context.beginPath()\n this.context.set('fillStyle', this.attrs.background)\n this.context.lineJoin = 'round'\n renderCallout({\n context: this.context,\n radius,\n requiredTailHalfWidth: this.requiredTailHalfWidth,\n tail: this.tail,\n rectangleSides: this.rectangleSides,\n tailDirection: this.tailDirection,\n })\n this.context.closePath()\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle)\n this.renderBorder()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n // is in rectangle\n if (\n this.lines &&\n this.rectangleSides &&\n this.rectangleSides.leftTop.x < area.scaled.x &&\n this.rectangleSides.topLeft.y < area.scaled.y &&\n this.rectangleSides.rightBottom.x > area.scaled.x &&\n this.rectangleSides.bottomRight.y > area.scaled.y\n ) {\n return true\n }\n // is in tail\n if (this.tail) {\n const tailP1 = math.perpendicularPointToLine({\n distance: this.requiredTailHalfWidth,\n line: { x1: this.tail.tailTip.x, y1: this.tail.tailTip.y, x2: this.tail.tailRoot.x, y2: this.tail.tailRoot.y },\n })\n const pointOffsetX = tailP1.x - this.tail.tailRoot.x\n const pointOffsetY = tailP1.y - this.tail.tailRoot.y\n const tailP2 = { x: this.tail.tailRoot.x + -1 * pointOffsetX, y: this.tail.tailRoot.y + -1 * pointOffsetY }\n const polygon = [this.tail.tailTip, tailP1, tailP2]\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n }\n return super.isInArea(area)\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tail') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n }\n }\n\n getIsInChartView(chart: Chart) {\n if (this.getIsCreator() || !this.lines) {\n return true\n }\n\n return [...Object.values(this.rectangleSides), this.tail.tailRoot, this.tail.tailTip].some(\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\n )\n }\n}\n\nexport default Callout\n","import { Bezier } from 'bezier-js'\n\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport Chart from '../models/chart'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ICurveAttrs {\n x1: number\n x2: number\n x3: number\n cp1x: number\n cp2x: number\n y1: number\n y2: number\n y3: number\n cp1y: number\n cp2y: number\n border: DrawingBorder\n}\n\nclass Curve extends Element {\n static type = CanvasElementType.curve\n\n name = 'Curve'\n declare scaled: Pick\n declare curve: Bezier\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.render = this.render.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'a',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x3 || this.attrs.x2,\n () => this.attrs.y3 || this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n drawQuadraticCurve(context: CanvasRenderingContext2D, curve: Bezier) {\n const { points } = curve\n context.beginPath()\n context.moveTo(points[0].x, points[0].y)\n context.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y)\n context.stroke()\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n context.translate(0.5, 0.5)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if (!x3 || !y3) {\n context.beginPath()\n context.moveTo(x1, y1)\n context.lineTo(x2, y2)\n context.lineTo(x3, y3)\n context.stroke()\n } else {\n this.curve = Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5)\n this.drawQuadraticCurve(context, this.curve)\n }\n\n context.translate(-0.5, -0.5)\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.x3 += x\n this.attrs.cp1x += x\n this.attrs.cp2x += x\n\n this.attrs.y1 += y\n this.attrs.y2 += y\n this.attrs.y3 += y\n this.attrs.cp1y += y\n this.attrs.cp2y += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'a':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'b':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'c':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (this.curve && this.curve.project(area.scaled).d! <= 10) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n\n getIsInChartView(chart: Chart) {\n if (this.getIsCreator()) {\n return true\n }\n\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n if (!x3 || !y3) {\n return true\n }\n const isInView =\n Bezier.quadraticFromPoints({ x: x1, y: y1 }, { x: x2, y: y2 }, { x: x3, y: y3 }, 0.5).points.some(\n ({ x, y }) => x <= -chart.leftOffset + chart.width && x >= -chart.leftOffset && y >= 0 && y <= this.model.height\n ) ?? true\n\n return isInView\n }\n}\n\nCurve.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default Curve\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IEllipseAttrs {\n x1: number\n x2: number\n x3: number\n cp1x: number\n cp2x: number\n y1: number\n y2: number\n y3: number\n cp1y: number\n cp2y: number\n width: number\n fill: string\n border: DrawingBorder\n}\n\ninterface ICoordinates {\n topCenterX: number\n topCenterY: number\n topRightX: number\n topRightY: number\n topLeftX: number\n topLeftY: number\n centerLeftX: number\n centerLeftY: number\n centerRightX: number\n centerRightY: number\n bottomCenterX: number\n bottomCenterY: number\n bottomLeftX: number\n bottomLeftY: number\n bottomRightX: number\n bottomRightY: number\n}\n\n// OLD Ellipse \"v0\" kept for backward-compatibiluty for old saved ideas\n// current Ellipse tool located in ellipse folder\nclass Ellipse extends Element {\n static type = CanvasElementType.ellipse\n\n name = 'Ellipse'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'x1',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'x2',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'lw',\n () => this.model.scale.x.invert(this.getCoordinates().centerLeftX),\n () => this.model.scale.y.invert(this.getCoordinates().centerLeftY),\n this.resize,\n this.model\n ),\n new Thumb(\n 'rw',\n () => this.model.scale.x.invert(this.getCoordinates().centerRightX),\n () => this.model.scale.y.invert(this.getCoordinates().centerRightY),\n this.resize,\n this.model\n ),\n ]\n const boundingPointKeys = this.getBoundingPointKeys()\n this.scale({ x: [...boundingPointKeys.x, 'width'], y: boundingPointKeys.y })\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const c = this.getCoordinates()\n\n context.set('fillStyle', this.attrs.fill)\n\n context.beginPath()\n context.moveTo(c.bottomCenterX, c.bottomCenterY)\n context.bezierCurveTo(c.bottomRightX, c.bottomRightY, c.topRightX, c.topRightY, c.topCenterX, c.topCenterY)\n context.bezierCurveTo(c.topLeftX, c.topLeftY, c.bottomLeftX, c.bottomLeftY, c.bottomCenterX, c.bottomCenterY)\n context.closePath()\n context.fill()\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'x1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'x2':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'lw':\n this.attrs.width += difX\n break\n case 'rw':\n this.attrs.width -= difX\n break\n default:\n break\n }\n }\n\n getCoordinates(): ICoordinates {\n // TODO cache?\n // http://stackoverflow.com/questions/14169234/the-relation-of-the-bezier-curve-and-ellipse\n const rotationAngle =\n Math.PI + Math.atan(-1 / ((this.scaled.y2 - this.scaled.y1) / (this.scaled.x2 - this.scaled.x1)))\n\n const sign = this.scaled.y1 > this.scaled.y2 ? 1 : -1\n const radiusX = this.scaled.width / 2\n let radiusY = (sign * Math.abs(this.scaled.y1 - this.scaled.y2)) / Math.cos(rotationAngle) / 2\n if (this.scaled.y1 === this.scaled.y2) {\n radiusY = Math.abs(this.scaled.x1 - this.scaled.x2) / 2\n }\n\n const width_two_thirds = (radiusX * 4) / 3\n\n const dx1 = Math.sin(rotationAngle) * radiusY\n const dy1 = Math.cos(rotationAngle) * radiusY\n const dx2 = Math.cos(rotationAngle) * width_two_thirds\n const dy2 = Math.sin(rotationAngle) * width_two_thirds\n\n const x = this.scaled.x1 + dx1\n const y = this.scaled.y1 - dy1\n\n const topCenterX = x - dx1\n const topCenterY = y + dy1\n const topRightX = topCenterX + dx2\n const topRightY = topCenterY + dy2\n const topLeftX = topCenterX - dx2\n const topLeftY = topCenterY - dy2\n\n const bottomCenterX = x + dx1\n const bottomCenterY = y - dy1\n const bottomRightX = bottomCenterX + dx2\n const bottomRightY = bottomCenterY + dy2\n const bottomLeftX = bottomCenterX - dx2\n const bottomLeftY = bottomCenterY - dy2\n\n const centerRightX = x + dx2\n const centerRightY = y + dy2\n const centerLeftX = x - dx2\n const centerLeftY = y - dy2\n\n return {\n topCenterX,\n topCenterY,\n topRightX,\n topRightY,\n topLeftX,\n topLeftY,\n centerLeftX,\n centerLeftY,\n centerRightX,\n centerRightY,\n bottomCenterX,\n bottomCenterY,\n bottomLeftX,\n bottomLeftY,\n bottomRightX,\n bottomRightY,\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const c = this.getCoordinates()\n const left = Math.min(this.scaled.x1, this.scaled.x2, c.centerRightX)\n const right = Math.max(this.scaled.x1, this.scaled.x2, c.centerLeftX)\n const top = Math.min(this.scaled.y1, this.scaled.y2, c.centerRightY)\n const bottom = Math.max(this.scaled.y1, this.scaled.y2, c.centerLeftY)\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n\n getIsInChartView() {\n return true\n }\n}\n\nEllipse.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Ellipse\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ntype RotatedRectangleCoordiantes = [[number, number], [number, number], [number, number], [number, number]]\n\nexport interface IRotatedRectangleAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n height: number\n fill: string\n border: DrawingBorder\n}\n\n// OLD RotatedRectangle \"v0\" kept for backward-compatibiluty for old saved ideas\n// current RotatedRectangle tool located in rotated_rectangle folder\nclass RotatedRectangle extends Element {\n static type = CanvasElementType.rotatedRectangle\n\n name = 'Rotated rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n const x = this.model.scale.x.invert\n const y = this.model.scale.y.invert\n this._thumbs = [\n new Thumb(\n 'ml',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'mr',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'tl',\n () => x(this.getRectCoordinates()[0][0]),\n () => y(this.getRectCoordinates()[0][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'tr',\n () => x(this.getRectCoordinates()[1][0]),\n () => y(this.getRectCoordinates()[1][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'bl',\n () => x(this.getRectCoordinates()[2][0]),\n () => y(this.getRectCoordinates()[2][1]),\n this.resize,\n this.model\n ),\n new Thumb(\n 'br',\n () => x(this.getRectCoordinates()[3][0]),\n () => y(this.getRectCoordinates()[3][1]),\n this.resize,\n this.model\n ),\n ]\n const boundingPointKeys = this.getBoundingPointKeys()\n this.scale({ x: [...boundingPointKeys.x, 'height'], y: boundingPointKeys.y })\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n\n context.beginPath()\n const coords = this.getRectCoordinates()\n for (const point of coords) {\n context.lineTo(point[0], point[1])\n }\n context.lineTo(coords[0][0], coords[0][1])\n context.fill()\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRectCoordinates(): RotatedRectangleCoordiantes {\n const mx1 = this.scaled.x1\n const mx2 = this.scaled.x2\n const my1 = this.scaled.y1\n const my2 = this.scaled.y2\n const { height } = this.scaled\n\n const k = (my2 - my1) / (mx2 - mx1)\n const nk = -1 / k\n\n const sign = my1 > my2 ? 1 : -1\n const dx = (sign * Math.sqrt((height * height) / (1 + nk * nk))) / 2\n const dy = nk * dx\n\n let x1 = mx1 - dx\n let y1 = my1 - dy\n let x2 = mx2 - dx\n let y2 = my2 - dy\n\n let x3 = mx2 + dx\n let y3 = my2 + dy\n let x4 = mx1 + dx\n let y4 = my1 + dy\n\n if (my1 === my2) {\n x1 = mx1\n y1 = my1 - height / 2\n x2 = mx2\n y2 = my2 - height / 2\n\n x3 = mx2\n y3 = my2 + height / 2\n x4 = mx1\n y4 = my1 + height / 2\n }\n\n return [\n [x1, y1],\n [x2, y2],\n [x3, y3],\n [x4, y4],\n ]\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'ml':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'mr':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'tl':\n case 'tr':\n this.attrs.height += difY\n break\n case 'bl':\n case 'br':\n this.attrs.height -= difY\n break\n default:\n return\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const coords = this.getRectCoordinates()\n const polygon = coords.map((c) => ({ x: c[0], y: c[1] }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n\n getIsInChartView() {\n return true\n }\n}\n\nRotatedRectangle.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default RotatedRectangle\n","// TODO FontAwesome font or similar needs to be loaded before using Symbol\nimport { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ISymbolAttrs {\n x1: number\n scaleX: number\n y1: number\n scaleY: number\n angle: number\n fill: string\n symbol: string\n border: DrawingBorder\n}\n\nclass SymbolElement extends Element {\n static type = CanvasElementType.symbol\n\n name = 'Symbol'\n\n declare textWidth: number\n declare textHeight: number\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n const sx = (sign: number) =>\n this.getRotatedCoordinates(this.scaled.x1 + sign * (this.textWidth / 2) * this.attrs.scaleX, this.scaled.y1)\n const sy = (sign: number) =>\n this.getRotatedCoordinates(this.scaled.x1, this.scaled.y1 + sign * (this.textHeight / 2) * this.attrs.scaleY)\n this._thumbs = [\n new Thumb(\n 'xr',\n () => this.model.scale.x.invert(sx(+1).x),\n () => this.model.scale.y.invert(sx(+1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'xl',\n () => this.model.scale.x.invert(sx(-1).x),\n () => this.model.scale.y.invert(sx(-1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'yt',\n () => this.model.scale.x.invert(sy(+1).x),\n () => this.model.scale.y.invert(sy(+1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'yb',\n () => this.model.scale.x.invert(sy(-1).x),\n () => this.model.scale.y.invert(sy(-1).y),\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.attrs.angle = this.attrs.angle || 0\n }\n\n getBoundingPointKeys = () => ({ x: ['x1'], y: ['y1'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('font', '36px FontAwesome')\n context.set('fillStyle', this.attrs.fill)\n context.set('textAlign', 'left')\n context.set('textBaseline', 'top')\n\n this.textWidth = context.measureText(this.attrs.symbol).width\n this.textHeight = 36\n const xScale = this.attrs.scaleX\n const yScale = this.attrs.scaleY\n\n const xOffset = this.textWidth / -2\n const yOffset = this.textHeight / -2\n\n context.save()\n context.translate(this.scaled.x1, this.scaled.y1)\n context.rotate(this.attrs.angle)\n context.scale(xScale, yScale)\n context.fillText(this.attrs.symbol, xOffset, yOffset)\n context.restore()\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRotatedCoordinates(x: number, y: number) {\n const cx = this.scaled.x1\n const cy = this.scaled.y1\n const dx = x - cx\n const dy = y - cy\n const rx = dx * Math.cos(this.attrs.angle) - dy * Math.sin(this.attrs.angle)\n const ry = dy * Math.cos(this.attrs.angle) + dx * Math.sin(this.attrs.angle)\n return { x: cx + rx, y: cy + ry }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n return (this.attrs.y1 += y)\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'xl':\n this.attrs.scaleX -= difX\n break\n case 'xr':\n this.attrs.scaleX += difX\n break\n case 'yt':\n this.attrs.scaleY -= difY\n break\n case 'yb':\n this.attrs.scaleY += difY\n break\n case 'c':\n this.attrs.angle += difX / 5\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const halfWidth = (this.textWidth / 2) * this.attrs.scaleX\n const halfHeight = (this.textHeight / 2) * this.attrs.scaleY\n const left = Math.min(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\n const right = Math.max(this.scaled.x1 - halfWidth, this.scaled.x1 + halfWidth)\n const top = Math.min(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\n const bottom = Math.max(this.scaled.y1 - halfHeight, this.scaled.y1 + halfHeight)\n if (left < area.scaled.x && area.scaled.x < right && top < area.scaled.y && area.scaled.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nSymbolElement.prototype.defaults = { fill: 'rgba(0,0,0,1)' }\n\nSymbolElement.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill', label: 'Fill' }],\n}\n\nexport default SymbolElement\n","import { CanvasElementType } from '../constants/common'\nimport arrow from './arrow'\nimport brush_v1 from './brush/brush_v1'\nimport callout_v1 from './callout/callout_v1'\nimport curve from './curve'\nimport element from './element'\nimport elliottWaves from './elliott_waves/elliott_waves'\nimport ellipse from './ellipse'\nimport ellipse_v1 from './ellipse/ellipse_v1'\nimport fibonacci from './fibonacci_retracements'\nimport horizontalLine from './horizontal_line'\nimport line from './line'\nimport measure from './measure'\nimport pitchfork_v1 from './pitchfork/pitchfork_v1'\nimport polygon from './polygon'\nimport position from './position'\nimport rectangle from './rectangle'\nimport rotatedRectangle from './rotated_rectangle'\nimport rotatedRectangle_v1 from './rotated_rectangle/rotated_rectangle_v1'\nimport scaledLine from './scaled_line'\nimport scaledText from './scaled_text'\nimport symbolElement from './symbol'\nimport text from './text'\nimport triangle from './triangle'\nimport verticalLine from './vertical_line'\nimport xabcd from './xabcd'\n\nexport const drawingToolsByType = Object.freeze({\n [CanvasElementType.element]: element,\n [CanvasElementType.arrow]: arrow,\n [CanvasElementType.brushV1]: brush_v1,\n [CanvasElementType.calloutV1]: callout_v1,\n [CanvasElementType.curve]: curve,\n [CanvasElementType.elliottWaves]: elliottWaves,\n [CanvasElementType.ellipse]: ellipse,\n [CanvasElementType.ellipseV1]: ellipse_v1,\n [CanvasElementType.fibonacciRetracements]: fibonacci,\n [CanvasElementType.horizontalLine]: horizontalLine,\n [CanvasElementType.line]: line,\n [CanvasElementType.measure]: measure,\n [CanvasElementType.pitchforkV1]: pitchfork_v1,\n [CanvasElementType.polygon]: polygon,\n [CanvasElementType.position]: position,\n [CanvasElementType.rectangle]: rectangle,\n [CanvasElementType.rotatedRectangle]: rotatedRectangle,\n [CanvasElementType.rotatedRectangleV1]: rotatedRectangle_v1,\n [CanvasElementType.scaledLine]: scaledLine,\n [CanvasElementType.scaledText]: scaledText,\n [CanvasElementType.symbol]: symbolElement,\n [CanvasElementType.text]: text,\n [CanvasElementType.triangle]: triangle,\n [CanvasElementType.verticalLine]: verticalLine,\n [CanvasElementType.xabcd]: xabcd,\n})\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\nimport mergewith from 'lodash.mergewith'\nimport omit from 'lodash.omit'\n\nimport {\n ChartConfigChartPaneElement,\n ObjectHash,\n PaneArea,\n RequireByKey,\n TodoObjectHashAnyType,\n} from '../../types/shared'\nimport Thumb from '../canvas/thumb'\nimport {\n CanvasElementType,\n ChartElementType,\n ChartEventType,\n IVisibility,\n IndicatorType,\n MacroTimeframe,\n MicroMacroTimeframe,\n OverlayType,\n SetVisibilityTo,\n TIMEFRAME,\n} from '../constants/common'\nimport Chart from '../models/chart'\nimport PaneModel, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport { isInRange } from '../utils/helpers'\n\nexport type TodoModalConfig = TodoObjectHashAnyType\ntype TodoPositionTimestamps = TodoObjectHashAnyType\n\nexport interface DefaultAttrs extends ObjectHash {\n positionTimestamps?: TodoPositionTimestamps\n visibility?: IVisibility\n}\n\nexport type EdgeValues = { minX?: number; maxX?: number; minY?: number; maxY?: number }\n\nclass Element extends Spine.Module {\n static type: CanvasElementType | OverlayType | ChartElementType | IndicatorType | ChartEventType =\n CanvasElementType.element\n\n static fromObject(obj: T['attrs'], model: T['model']) {\n return new this(obj, model) as T\n }\n\n static getNumOfBarsBuffer(\n _?: RequireByKey | RequireByKey\n ) {\n return 0\n }\n\n isCreator = false\n isCreatorDialogOpen = false\n attrs: Attrs = {} as Attrs\n\n model: any\n _thumbs: Thumb[]\n\n getDefaults?(): Partial\n renderCross?(ctx: RenderingContext2DType): void\n renderCrossText?(\n ctx: RenderingContext2DType,\n crossIndex: number,\n getDataByCrossIndex?: (key: keyof Quote, shouldReturnRoundedString?: boolean) => string | undefined\n ): void\n\n renderContent?(ctx: RenderingContext2DType): void\n renderGrid?(ctx: RenderingContext2DType): void\n renderLabels?(ctx: RenderingContext2DType): void\n declare defaults?: Partial\n getModalConfigBase?(): TodoModalConfig\n declare modalConfig?: TodoModalConfig\n getMinMax?(): { min: number; max: number }\n setupAxis?(fx: ScaleAxis): void | { min: number; max: number }\n\n activeThumb: Thumb | null = null\n isMouseDown = false\n isSelected = false\n isHovered = false\n isEditInProgress = false\n edgeXYValues: EdgeValues | null = null\n declare scaled?: ObjectHash | Partial\n\n declare toolsCallback: () => void\n\n constructor(values: Partial, model: Model) {\n super(values, model)\n this.model = model\n if (this.getDefaults) {\n this.set(this.getDefaults() || {})\n } else {\n this.set(this.defaults || {})\n }\n this.set(values)\n this._thumbs = []\n\n this.onMouseDown = this.onMouseDown.bind(this)\n this.onMouseMove = this.onMouseMove.bind(this)\n this.onMouseUp = this.onMouseUp.bind(this)\n this.bind('mousedown', this.onMouseDown)\n this.bind('mousemove', this.onMouseMove)\n this.bind('mouseup', this.onMouseUp)\n this.bind('change', () => {\n // elements is optional because this.model is not Pane in all usecases, e.g. base_chart extends this element and sets Chart as model\n const element = this.getIsChartEvent()\n ? this.model.chartEvents?.()?.findByAttribute('instance', this)\n : this.model.elements?.()?.findByAttribute('instance', this)\n\n element?.trigger('change', element)\n })\n }\n\n get type() {\n return (this.constructor as typeof Element).type\n }\n\n getThumbs() {\n return this._thumbs\n }\n\n moveBy(_: number, __: number) {}\n\n setIsSelected(isSelected: boolean) {\n this.isSelected = isSelected\n this.trigger('change')\n }\n\n setIsHovered(isHovered: boolean) {\n this.isHovered = isHovered\n this.trigger('change')\n }\n\n getShouldRenderThumbs() {\n return this.isSelected || this.isHovered\n }\n\n getIsPaneSelection(): boolean {\n const paneModel = this.model.elements().findByAttribute('instance', this)?.pane() as PaneModel | undefined\n return paneModel?.selection === this\n }\n\n set(obj: Partial) {\n const attrsSubset = Object.keys(obj).reduce(\n (acc, key) => ({ ...acc, [key]: this.attrs[key] }),\n {} as Partial\n )\n if (JSON.stringify(obj) !== JSON.stringify(attrsSubset)) {\n const customizer = (objValue: Partial, srcValue: Partial, key: keyof Attrs) => {\n if (this.getIsDrawing() && key === 'visibility') {\n return srcValue ?? {}\n }\n }\n mergewith(this.attrs, obj, customizer)\n if (this.getIsPaneSelection() && !this.getIsCreator()) {\n this.cachePointPositionTimestamp()\n }\n this.trigger('change', this)\n }\n this.edgeXYValues = null\n return this\n }\n\n get(key: T) {\n return this.attrs[key]\n }\n\n getBoundingPointKeys = (): { x: string[]; y: string[] } | void => {}\n\n fx = (x: number) => this.model.scale.x(x)\n\n fy = (y: number) => this.model.scale.y(y)\n\n scale({ x, y }: { x: string[]; y: string[] }) {\n this.scaled = {}\n x.forEach((el) => {\n Object.defineProperty(this.scaled, el, {\n get: () => this.fx(this.attrs[el]),\n })\n })\n\n y.forEach((el) => {\n Object.defineProperty(this.scaled, el, {\n get: () => this.fy(this.attrs[el]),\n })\n })\n }\n\n render(_: RenderingContext2DType) {}\n\n renderThumbs(context: CanvasRenderingContext2D) {\n const isHoveredThumbStyle = this.isHovered && !this.isSelected\n if (isHoveredThumbStyle) {\n context.globalAlpha = 0.5\n }\n this.getThumbs().map((thumb) => thumb.render(context))\n context.globalAlpha = 1\n }\n\n onMouseDown(area: PaneArea) {\n this.isMouseDown = true\n this.isEditInProgress = true\n for (const thumb of this.getThumbs()) {\n if (thumb.isInArea(area)) {\n this.activeThumb = thumb\n this.activeThumb.startEditing(area)\n return\n }\n }\n }\n\n onMouseMove(area: PaneArea) {\n if (!area.mouseDown) {\n return\n }\n if (this.activeThumb != null) {\n this.activeThumb.moveTo(area)\n this.trigger('change')\n }\n }\n\n onMouseUp(_?: PaneArea) {\n this.isMouseDown = false\n this.isEditInProgress = false\n this.activeThumb = null\n if (!this.getIsCreator() && !this.getIsChartEvent()) {\n this.cachePointPositionTimestamp()\n }\n this.trigger('change', this)\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart().quote()\n if (quote) {\n const { x: xPointKeys } = this.getBoundingPointKeys()!\n const positionTimestamps = xPointKeys.reduce((acc, key) => {\n const positionX = this.attrs[key]\n const timeStamp = positionX && quote.getTimestampFomPositionX(positionX)\n return {\n ...acc,\n [key]: timeStamp,\n }\n }, {}) as TodoPositionTimestamps\n this.set({ positionTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionTimestamps } = this.attrs\n if (!quote || !positionTimestamps) {\n // positionTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const pointPoitionsFromTimestamp = Object.entries(positionTimestamps).reduce(\n (acc, [key, timestamp]) => ({\n ...acc,\n [key]: timestamp && quote.getPositionXFromTimestamp(timestamp),\n }),\n {}\n )\n this.set(pointPoitionsFromTimestamp)\n }\n\n thumbsAreInArea(area: PaneArea) {\n for (const thumb of this.getThumbs()) {\n if (thumb.isInArea(area)) {\n return true\n }\n }\n return false\n }\n\n isInArea(area: PaneArea) {\n return this.thumbsAreInArea(area)\n }\n\n isDrawingElementLockedOrInvisible() {\n return this.model.chart().chart_layout().isLockDrawingsActive || !this.getIsVisible()\n }\n\n getModalConfig() {\n let config\n if (this.getModalConfigBase) {\n config = merge({}, this.getModalConfigBase())\n } else {\n config = merge({}, this.modalConfig)\n }\n if (this.getIsDrawing()) {\n config.inputs.push({ type: 'visibility', name: 'visibility', label: 'Visibility' })\n }\n if (config.title == null) {\n config.title = this.name\n }\n for (const input of config.inputs) {\n if (input.default != null) {\n input.value = input.default\n }\n if (this.attrs[input.name] != null) {\n input.value = this.attrs[input.name]\n }\n }\n return config\n }\n\n toObject() {\n return merge({}, this.attrs, { type: this.type })\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return this.toObject()\n }\n\n getAutosaveOmittedProperties() {\n return this.attrs.positionTimestamps ? Object.keys(this.attrs.positionTimestamps) : []\n }\n\n toAutosaveConfig() {\n // We don't want to save attrs which are stored in \"position timestamps\" because they are relative to timeframe for example\n // so in order to keep drawings in sync across different timeframes we can't rely on its position but we have to rely on \"position timestamps\" and then call updateScales to calculate correct positions for given timeframe\n return omit(this.toConfig(), this.getAutosaveOmittedProperties()) as Partial\n }\n\n replaceMyself(element: Element) {\n setTimeout(() => {\n element.cachePointPositionTimestamp()\n const el = this.model.elements().findByAttribute('instance', this)\n if (!el) {\n // Temporary code below\n // additional info gaining for https://finvizcom.sentry.io/issues/3990343438/events/e87ce8b4108341cf81f15ec78707c65e/?project=33153&query=is%3Aunresolved+Cannot+read+properties+of+undefined&referrer=previous-event&statsPeriod=14d&stream_index=0\n window.Sentry?.captureMessage('element.ts replaceMyself', {\n extra: {\n oldElement: {\n type: this?.type,\n isCreator: this?.isCreator,\n isMouseDown: this?.isMouseDown,\n isSelected: this?.isSelected,\n isHovered: this?.isHovered,\n isEditInProgress: this?.isEditInProgress,\n },\n newElement: {\n type: element?.type,\n isCreator: element?.isCreator,\n isMouseDown: element?.isMouseDown,\n isSelected: element?.isSelected,\n isHovered: element?.isHovered,\n isEditInProgress: element?.isEditInProgress,\n },\n },\n })\n } else {\n el.replace(element)\n }\n })\n }\n\n toString() {\n return this.name\n }\n\n getIsCreator() {\n return this.isCreator\n }\n\n getIsCreatorDialogOpen() {\n return this.isCreatorDialogOpen\n }\n\n release() {\n this.cachePointPositionTimestamp()\n this.unbind()\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart().chart_layout())\n }\n\n getIsDrawing() {\n return !!this.type.startsWith('canvas/')\n }\n\n getIsChartEvent() {\n return !!this?.type.startsWith('chartEvent/')\n }\n\n getIsVisible() {\n const { micro, macro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\n const visibility = this.attrs.visibility?.[macro]\n\n // this.attrs.visibility.minutes === undefined: drawing visible on any minutes timeframe\n if (visibility === undefined) return true\n // this.attrs.visibility.minutes === {}: drawing invisible on any minutes timeframe\n if (Object.keys(visibility).length === 0) return false\n // this.attrs.visibility.minutes === {from: 5, to: 15}: drawing visible on minutes TF between 5 & 15 interval\n return isInRange({ value: micro, min: visibility.from, max: visibility.to })\n }\n\n setVisibilityTo(setTo: SetVisibilityTo) {\n const { macro, micro } = MicroMacroTimeframe[this.model.chart().quote().timeframe as TIMEFRAME]\n const currentIndex = Object.keys(MacroTimeframe).indexOf(macro)\n\n let timeframesToSet: string[] = []\n let attrsToSet: { from?: number; to?: number } = {}\n\n switch (setTo) {\n case SetVisibilityTo.currentAndAbove: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index < currentIndex)\n attrsToSet = { from: micro }\n break\n }\n case SetVisibilityTo.currentAndBelow: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index > currentIndex)\n attrsToSet = { to: micro }\n break\n }\n case SetVisibilityTo.currentOnly: {\n timeframesToSet = Object.keys(MacroTimeframe).filter((key, index) => index !== currentIndex)\n attrsToSet = { from: micro, to: micro }\n break\n }\n case SetVisibilityTo.all:\n default: {\n this.set({ visibility: {} } as Partial)\n return\n }\n }\n\n this.set({\n visibility: Object.assign({}, ...timeframesToSet.map((item) => ({ [item]: {} })), { [macro]: attrsToSet }),\n } as Partial)\n }\n\n getEdgeXYValues() {\n const { x: xPoints, y: yPoints } = this.getBoundingPointKeys() ?? {}\n if (this.edgeXYValues === null) {\n const edgeXYValues = {} as EdgeValues\n xPoints?.forEach((key) => {\n const positionX = this.attrs[key]\n if (positionX !== undefined) {\n edgeXYValues.minX = Math.min(positionX, edgeXYValues.minX ?? positionX)\n edgeXYValues.maxX = Math.max(positionX, edgeXYValues.maxX ?? positionX)\n }\n })\n yPoints?.forEach((key) => {\n const positionY = this.attrs[key]\n if (positionY !== undefined) {\n edgeXYValues.minY = Math.min(positionY, edgeXYValues.minY ?? positionY)\n edgeXYValues.maxY = Math.max(positionY, edgeXYValues.maxY ?? positionY)\n }\n })\n\n this.edgeXYValues = edgeXYValues\n }\n\n return this.edgeXYValues\n }\n\n getIsInChartView(chart: Chart) {\n const { minX, maxX, minY, maxY } = this.getEdgeXYValues()\n\n if (this.getIsCreator()) {\n return true\n }\n\n const isMaxXInvalid = maxX === undefined || isNaN(maxX)\n const isMinXInvalid = minX === undefined || isNaN(minX)\n if (\n !isMaxXInvalid &&\n !isMinXInvalid &&\n !(this.fx(maxX) >= -chart.leftOffset && this.fx(minX) <= -chart.leftOffset + chart.width)\n ) {\n return false\n }\n\n if (minY === undefined || maxY === undefined) {\n return true\n }\n\n const topBound = this.model.scale.y.invert(0)\n const bottomBound = this.model.scale.y.invert(this.model.height)\n return topBound >= minY && bottomBound <= maxY\n }\n}\n\nexport default Element\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../../constants/common'\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Text from '../text'\nimport Thumb from '../thumb'\n\nexport interface IElliottWavesAttrs {\n waves: Array<{ x: number; y: number }>\n positionWavesTimestamps?: Array<{ x: number; y: number }>\n border: DrawingBorder\n}\n\nclass ElliottWaves extends Element {\n static type = CanvasElementType.elliottWaves\n\n name = 'Elliott Wave'\n waves = ['', 'I', 'II', 'III', 'IV', 'V']\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n }\n\n getDefaults() {\n return {\n border: {\n width: 2,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n } as Partial\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n context.translate(offset, offset)\n context.beginPath()\n context.moveTo(Math.round(this.fx(this.attrs.waves[0].x)), Math.round(this.fy(this.attrs.waves[0].y)))\n for (const p of this.attrs.waves.slice(1)) {\n context.lineTo(Math.round(this.fx(p.x)), Math.round(this.fy(p.y)))\n }\n context.stroke()\n context.translate(offset * -1, offset * -1)\n\n const text = new Text(\n {\n font: { size: 8, style: 'bold' },\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.center,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n this.model\n )\n for (let i = 0; i < this.attrs.waves.length; i++) {\n let y\n const p = this.attrs.waves[i]\n if (i > 0 && this.attrs.waves[i - 1].y > p.y) {\n y = this.fy(p.y) + 8\n } else {\n y = this.fy(p.y) - 8\n }\n text.set({ text: this.waves[i], x: this.fx(p.x), y })\n text.render(context)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n return this.attrs.waves.map(\n (wave, index) =>\n new Thumb(\n `${index}`,\n () => wave.x,\n () => wave.y,\n this.resize,\n this.model\n )\n )\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart().quote()\n if (quote) {\n const positionWavesTimestamps = this.attrs.waves.map((wave) => ({\n ...wave,\n x: quote.getTimestampFomPositionX(wave.x),\n }))\n\n this.set({ positionWavesTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionWavesTimestamps } = this.attrs\n if (!quote || !positionWavesTimestamps) {\n // positionWavesTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const waves = positionWavesTimestamps.map((wave) => ({\n ...wave,\n x: quote.getPositionXFromTimestamp(wave.x),\n }))\n this.set({ waves } as Partial)\n }\n\n moveBy(x: number, y: number) {\n for (const point of this.attrs.waves) {\n point.x += x\n point.y += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n this.attrs.waves[+type].x += difX\n this.attrs.waves[+type].y += difY\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const waves = this.attrs.waves\n for (let i = 0; i < waves.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: this.fx(waves[i].x),\n y1: this.fy(waves[i].y),\n x2: this.fx(waves[i + 1].x),\n y2: this.fy(waves[i + 1].y),\n }) <= 10\n ) {\n return true\n }\n }\n return super.isInArea(area)\n }\n\n getAutosaveOmittedProperties() {\n return ['waves']\n }\n}\n\nElliottWaves.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default ElliottWaves\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport math from '../../helpers/math'\nimport { getContextWithCache } from '../../lib/shims'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport interface IEllipseAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n cursorTargetX: number\n cursorTargetY: number\n\n fill: string\n border: DrawingBorder\n}\n\ninterface Coordinates {\n P1: Point\n P2: Point\n P3: Point\n P4: Point\n CP1: Point\n CP2: Point\n CP3: Point\n CP4: Point\n}\n\nclass EllipseV1 extends Element {\n static type = CanvasElementType.ellipseV1\n\n name = 'Ellipse'\n\n untranslatedContext: CanvasRenderingContext2D | null = null\n declare ellipsePath: Path2D\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this.untranslatedContext = getContextWithCache(document.createElement('canvas'))\n this._thumbs = [\n new Thumb(\n 'left',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'right',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'top',\n () => this.getEllipsePoints(true).P2.x || this.attrs.x1,\n () => this.getEllipsePoints(true).P2.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottom',\n () => this.getEllipsePoints(true).P4.x || this.attrs.x2,\n () => this.getEllipsePoints(true).P4.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const coordinates = this.getEllipsePoints() as Coordinates\n const ellipse = new Path2D()\n context.set('fillStyle', this.attrs.fill)\n context.beginPath()\n if (coordinates.P2.x === coordinates.P3.x || coordinates.P2.y === coordinates.P3.y) {\n ellipse.lineTo(coordinates.P1.x, coordinates.P1.y)\n ellipse.lineTo(coordinates.P2.x, coordinates.P2.y)\n } else {\n ellipse.moveTo(coordinates.P4.x, coordinates.P4.y)\n ellipse.bezierCurveTo(\n coordinates.CP4.x,\n coordinates.CP4.y,\n coordinates.CP1.x,\n coordinates.CP1.y,\n coordinates.P2.x,\n coordinates.P2.y\n )\n ellipse.bezierCurveTo(\n coordinates.CP2.x,\n coordinates.CP2.y,\n coordinates.CP3.x,\n coordinates.CP3.y,\n coordinates.P4.x,\n coordinates.P4.y\n )\n ellipse.closePath()\n this.ellipsePath = ellipse\n context.fill(ellipse)\n }\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n context.stroke(ellipse)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getEllipsePoints(inverted = false) {\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\n\n const P1 = { x: x2, y: y2 }\n const P3 = { x: x1, y: y1 }\n\n let perpendicularPoint\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\n const cursor = { x: cursorTargetX, y: cursorTargetY }\n const line = { x1, y1, x2, y2 }\n const distance = math.distanceToLine(cursor, line)\n perpendicularPoint = math.perpendicularPointToLine({\n distance,\n line,\n })\n } else {\n return {\n P1: P3,\n P2: P1,\n P3: P1,\n P4: P3,\n }\n }\n\n const lineCenterX = (P1.x + P3.x) / 2\n const lineCenterY = (P1.y + P3.y) / 2\n const pointOffsetX = perpendicularPoint.x - P1.x\n const pointOffsetY = perpendicularPoint.y - P1.y\n\n const P2 = { x: lineCenterX + pointOffsetX, y: lineCenterY + pointOffsetY }\n const P4 = { x: lineCenterX + -1 * pointOffsetX, y: lineCenterY + -1 * pointOffsetY }\n const invertX = this.model.scale.x.invert\n const invertY = this.model.scale.y.invert\n if (inverted) {\n return {\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\n }\n }\n\n const perpendicularPointEllipseOffsetX = (perpendicularPoint.x - P2.x) / 0.75 - (perpendicularPoint.x - P2.x)\n const perpendicularPointEllipseOffsetY = (perpendicularPoint.y - P2.y) / 0.75 - (perpendicularPoint.y - P2.y)\n\n const P1WithOffsetX = P1.x + perpendicularPointEllipseOffsetX\n const P1WithOffsetY = P1.y + perpendicularPointEllipseOffsetY\n\n const P3WithOffsetX = P3.x - perpendicularPointEllipseOffsetX\n const P3WithOffsetY = P3.y - perpendicularPointEllipseOffsetY\n\n const CP1 = {\n x: perpendicularPoint.x + perpendicularPointEllipseOffsetX,\n y: perpendicularPoint.y + perpendicularPointEllipseOffsetY,\n }\n const controlPointOffsetX = CP1.x - P1WithOffsetX\n const controlPointOffsetY = CP1.y - P1WithOffsetY\n\n const CP2 = { x: P3WithOffsetX + controlPointOffsetX, y: P3WithOffsetY + controlPointOffsetY }\n const CP3 = { x: P3WithOffsetX + -1 * controlPointOffsetX, y: P3WithOffsetY + -1 * controlPointOffsetY }\n const CP4 = { x: P1WithOffsetX + -1 * controlPointOffsetX, y: P1WithOffsetY + -1 * controlPointOffsetY }\n\n return {\n P1,\n P2,\n P3,\n P4,\n CP1,\n CP2,\n CP3,\n CP4,\n }\n }\n\n getRotatedPointCoordinates = ({\n rotationAxisPoint,\n pointToRotate,\n oldLinePoint,\n newLinePoint,\n }: {\n rotationAxisPoint: { x: number; y: number }\n pointToRotate: { x: number; y: number }\n oldLinePoint: { x: number; y: number }\n newLinePoint: { x: number; y: number }\n }) => {\n const angle = math.sharedPointLinesAngle({\n sharedPoint: rotationAxisPoint,\n oldLinePoint,\n newLinePoint,\n })\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n })\n return {\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.cursorTargetX += x\n this.attrs.cursorTargetY += y\n }\n\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'left':\n const newLeftPoint = {\n x: this.attrs.x1 + difX,\n y: this.attrs.y1 + difY,\n }\n const leftRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\n newLinePoint: { x: this.model.scale.x(newLeftPoint.x), y: this.model.scale.y(newLeftPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x1: newLeftPoint.x,\n y1: newLeftPoint.y,\n cursorTargetX: leftRotatedCursorPoint.x,\n cursorTargetY: leftRotatedCursorPoint.y,\n }\n break\n case 'right':\n const newRightPoint = {\n x: this.attrs.x2 + difX,\n y: this.attrs.y2 + difY,\n }\n const rightRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\n newLinePoint: { x: this.model.scale.x(newRightPoint.x), y: this.model.scale.y(newRightPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x2: newRightPoint.x,\n y2: newRightPoint.y,\n cursorTargetX: rightRotatedCursorPoint.x,\n cursorTargetY: rightRotatedCursorPoint.y,\n }\n break\n case 'top':\n case 'bottom':\n this.attrs = {\n ...this.attrs,\n cursorTargetX: area.x,\n cursorTargetY: area.y,\n }\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (this.ellipsePath && this.untranslatedContext?.isPointInPath(this.ellipsePath, area.scaled.x, area.scaled.y)) {\n return true\n }\n return super.isInArea(area)\n }\n\n getIsInChartView() {\n return true\n }\n}\n\nEllipseV1.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default EllipseV1\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ntype Coefficients = string\n\nexport interface IFibonacciRetracementsAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n coefficients: Coefficients\n border: DrawingBorder\n}\n\nclass FibonacciRetracements<\n Attrs extends IFibonacciRetracementsAttrs = IFibonacciRetracementsAttrs,\n> extends Element {\n static type = CanvasElementType.fibonacciRetracements\n\n name = 'Fibonacci Retracements'\n declare coefficients: { default: string; parsed: number[]; max: number }\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'oneCoefficient_1',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'oneCoefficient_2',\n () => this.attrs.x2,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'zeroCoefficient_1',\n () => this.attrs.x1,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'zeroCoefficient_2',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.parseCoefficients(this.attrs.coefficients)\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.line,\n },\n coefficients: [0, 0.236, 0.382, 0.5, 0.618, 1].toString(),\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n parseCoefficients(coefficients: Coefficients) {\n if (!this.coefficients || coefficients !== this.coefficients.default) {\n const parsed = coefficients.split(',').map((x) => parseFloat(x.trim()))\n this.coefficients = { default: coefficients, parsed, max: Math.max(...parsed) }\n }\n }\n\n getMaxCoefficientUnscaledY() {\n return this.model.scale.y.invert(this.scaled.y2 - this.coefficients.max * (this.scaled.y2 - this.scaled.y1))\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY, y2: roundedXY.y1 })\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n this.parseCoefficients(this.attrs.coefficients)\n\n const height = this.attrs.y2 - this.attrs.y1\n const heightScaled = roundedXY.y2 - roundedXY.y1\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n for (const p of this.coefficients.parsed) {\n context.moveTo(roundedXY.x1, Math.round(y2 - p * heightScaled))\n context.lineTo(roundedXY.x2, Math.round(y2 - p * heightScaled))\n }\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n const text = new Text(\n {\n x: roundedXY.x1,\n font: { size: 8, style: 'bold' },\n textBaseline: TextBaseline.bottom,\n fillStyle: this.attrs.border.color,\n textAlign: TextAlign.left,\n },\n this.model\n )\n if (roundedXY.x1 > roundedXY.x2) {\n text.set({ textAlign: TextAlign.right })\n }\n\n for (const p of this.coefficients.parsed) {\n const y = this.attrs.y2 - p * height\n text.set({\n text: (p * 100).toFixed(1) + '%: ' + y.toFixed(2),\n y: Math.round(this.fy(y) - this.attrs.border.width / 2),\n } as Partial)\n text.render(context)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n if (this.coefficients.max > 1 && this._thumbs.length < 6) {\n this._thumbs = [\n ...this._thumbs,\n new Thumb(\n 'maxCoefficient_1',\n () => this.attrs.x1,\n () => this.getMaxCoefficientUnscaledY(),\n this.resize,\n this.model\n ),\n new Thumb(\n 'maxCoefficient_2',\n () => this.attrs.x2,\n () => this.getMaxCoefficientUnscaledY(),\n this.resize,\n this.model\n ),\n ]\n }\n if (this.coefficients.max <= 1 && this._thumbs.length > 4) {\n this._thumbs.splice(4)\n }\n\n return this._thumbs\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'oneCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'oneCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y1 += difY\n break\n case 'zeroCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y2 += difY\n break\n case 'zeroCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'maxCoefficient_1':\n this.attrs.x1 += difX\n this.attrs.y1 += difY / this.coefficients.max\n break\n case 'maxCoefficient_2':\n this.attrs.x2 += difX\n this.attrs.y1 += difY / this.coefficients.max\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const maxCoefficientY = this.coefficients.max > 1 && this.getMaxCoefficientUnscaledY()\n const left = Math.min(this.attrs.x1, this.attrs.x2)\n const right = Math.max(this.attrs.x1, this.attrs.x2)\n const top = maxCoefficientY\n ? Math.min(this.attrs.y1, this.attrs.y2, maxCoefficientY)\n : Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = maxCoefficientY\n ? Math.max(this.attrs.y1, this.attrs.y2, maxCoefficientY)\n : Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nFibonacciRetracements.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'border' },\n { type: 'string', name: 'coefficients', label: 'Coefficients' },\n ],\n}\n\nexport default FibonacciRetracements\n","import { Maybe, RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\nimport Text from './text'\n\nconst DEFAULT_DECIMAL_PLACES = 2\n\nclass HorizontalLine extends ScaledLine {\n static type = CanvasElementType.horizontalLine\n\n name = 'Horizontal line'\n decimalPlaces = DEFAULT_DECIMAL_PLACES\n declare scaled: Pick\n declare model: PaneModel\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.updateDecimalPlaces()\n\n if (this.attrs.y1) {\n this.attrs.y1 = Number(math.round({ value: this.attrs.y1, overridePlaces: this.decimalPlaces }))\n }\n if (this.modalConfig) {\n const step = `0.${'0'.repeat(this.decimalPlaces - 1)}1`\n this.modalConfig.inputs[1] = {\n ...this.modalConfig.inputs[1],\n step,\n min: Number(step),\n }\n }\n this.renderContent = this.renderContent.bind(this)\n this._thumbs = []\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n updateDecimalPlaces() {\n const quote = this.model.chart().quote()\n this.decimalPlaces = quote\n ? math.getInstrumentDecimalPlaces({\n instrument: quote.instrument,\n value: quote.lastClose,\n })\n : DEFAULT_DECIMAL_PLACES\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n this.attrs.y2 = this.attrs.y1\n // mixing scaled and unscaled values, do not copy paste as solution\n this.attrs.x1 = ChartSettings.left.width * -1\n this.attrs.x2 =\n this.model\n .chart()\n .quote()\n .getBarIndex(this.model.chart().quote().close.length - 1) + this.model.chart().width\n super.renderContent(context)\n }\n\n renderLabels(context: CanvasRenderingContext2D) {\n if (this.attrs.y1) {\n this.updateDecimalPlaces()\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const isIndicatorPane = this.model\n .elements()\n .all()\n .some((element) => element.isIndicator())\n const settings = isIndicatorPane ? IndicatorSettings : ChartSettings\n context.translate(this.model.chart().width - settings.right.width, settings.top.height)\n new Text(\n {\n x: 6,\n y: this.scaled.y1,\n font: { size: 8, style: 'bold' },\n lineHeight: 8,\n padding: {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2,\n },\n fillStyle: '#fff',\n background: '#000',\n textBaseline: TextBaseline.middle,\n text: this.attrs.y1.toFixed(this.decimalPlaces).toString(),\n },\n this.model\n ).render(context)\n }\n }\n\n moveBy(x: Maybe, y: number) {\n this.attrs.y1 += y\n }\n\n resize({ difY }: RequireByKey) {\n this.moveBy(0, difY)\n }\n}\n\nHorizontalLine.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'border' },\n { type: 'number', name: 'y1', label: 'Price', allowDecimal: true },\n ],\n}\n\nexport default HorizontalLine\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\ninterface ILineAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n dashLength: number\n lineWidth: number\n strokeStyle: string\n}\n\nclass Line extends Element {\n static type = CanvasElementType.line\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.render = this.render.bind(this)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'l',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'r',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n }\n\n getDefaults() {\n return {\n lineWidth: 1,\n strokeStyle: this.getChartLayoutSettings().ElementSettings.Colors.line,\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n render(context: CanvasRenderingContext2D) {\n const { x1, y1, x2, y2, lineWidth } = this.attrs\n const roundedXY = getRoundedObject({ x1, y1, x2, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineWidth', this.attrs.lineWidth)\n context.set('strokeStyle', this.attrs.strokeStyle)\n\n context.moveTo(roundedXY.x1, roundedXY.y1)\n if (this.attrs.dashLength) {\n context.setLineDash([this.attrs.dashLength])\n }\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n if (this.attrs.dashLength) {\n context.setLineDash([])\n }\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'l') {\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area, this.attrs) <= 10) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nexport default Line\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport { numberToStringWithUnitsSuffix } from '../utils'\nimport { getRoundedString } from '../utils/helpers'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ninterface Coordinates {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport interface IMeasureAttrs extends Coordinates {\n fill: string\n}\n\nclass Measure extends Element {\n static type = CanvasElementType.measure\n\n name = 'Measure'\n declare scaled: Pick\n\n x1Dif: number\n x2Dif: number\n startingX1: number\n startingX2: number\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'tl',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'br',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.x1Dif = this.x2Dif = 0\n\n this.startingX1 = this.attrs.x1\n this.startingX2 = this.attrs.x2\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n getVolumeSumString = () => {\n const { volume, barIndex }: { volume: number[]; barIndex: number[] } = this.model.chart().quote()\n const roundedX1 = Math.round(this.attrs.x1)\n const roundedX2 = Math.round(this.attrs.x2)\n // min/max values are offset by 1 so there's no value on such index\n // and at the same time it won't iterate over unlimited number of nonexisting indexes\n const minIndexLimit = barIndex[0] - 1\n const maxIndexLimit = barIndex[barIndex.length - 1] + 1\n const volMinIndex = Math.min(Math.max(Math.min(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\n const volMaxIndex = Math.min(Math.max(Math.max(roundedX1, roundedX2), minIndexLimit), maxIndexLimit)\n\n let volumeSum = 0\n for (let i = volMinIndex; i <= volMaxIndex; i++) {\n const volumeIndex = barIndex.indexOf(i)\n if (volumeIndex >= 0) {\n volumeSum += volume[volumeIndex]\n }\n }\n\n return `Vol ${numberToStringWithUnitsSuffix(volumeSum)}`\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n\n const width = roundedXY.x2 - roundedXY.x1\n const height = roundedXY.y2 - roundedXY.y1\n context.fillRect(x1, roundedXY.y1, width, height)\n\n const priceDif = this.attrs.y2 - this.attrs.y1\n const percentage = (100 / this.attrs.y1) * priceDif\n const heightStr = `${priceDif.toFixed(2)} (${percentage.toFixed(2)}%)`\n\n const text = new Text(\n {\n text: `${getRoundedString({ number: Math.abs(this.attrs.x2 - this.attrs.x1), numOfDecimalPlaces: 2 })} bars`,\n fillStyle: '#333',\n font: { size: 10, family: 'Arial', weight: 'bold' },\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n const baseX = x1 + width / 2\n const baseY = roundedXY.y1 + height / 2\n let textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY - text.getHeight(),\n } as Partial)\n text.render(context)\n\n text.set({ text: heightStr })\n textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY,\n } as Partial)\n text.render(context)\n\n text.set({ text: this.getVolumeSumString() })\n textWidth = text.measure(context)\n text.set({\n x: baseX - textWidth / 2,\n y: baseY + text.getHeight(),\n } as Partial)\n text.render(context)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n addToCoordinates(difs: Partial) {\n this.attrs.y1 += difs.y1 || 0\n this.attrs.y2 += difs.y2 || 0\n\n this.x1Dif += difs.x1 || 0\n this.x2Dif += difs.x2 || 0\n\n // The reason for adding +1 is to \"ceil\" the number when moving to the left (decreasing bar index)\n const newX1 = ~~(this.startingX1 + this.x1Dif) + (this.x1Dif < 0 ? 1 : 0)\n if (~~this.attrs.x1 - newX1 !== 0) {\n this.attrs.x1 = newX1\n }\n const newX2 = ~~(this.startingX2 + this.x2Dif) + (this.x2Dif < 0 ? 1 : 0)\n if (~~this.attrs.x2 - newX2 !== 0) {\n this.attrs.x2 = newX2\n }\n }\n\n moveBy(x: number, y: number) {\n return this.addToCoordinates({\n x1: x,\n y1: y,\n x2: x,\n y2: y,\n })\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tl') {\n this.addToCoordinates({ x1: difX, y1: difY })\n } else {\n this.addToCoordinates({ x2: difX, y2: difY })\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const x1 = Math.round(this.attrs.x1)\n const x2 = Math.round(this.attrs.x2)\n\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n const top = Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n\n onMouseDown(paneArea: PaneArea) {\n super.onMouseDown(paneArea)\n this.startingX1 = this.attrs.x1\n this.startingX2 = this.attrs.x2\n }\n\n onMouseUp(paneArea?: PaneArea) {\n super.onMouseUp(paneArea)\n this.x1Dif = this.x2Dif = 0\n }\n}\n\nMeasure.prototype.defaults = { fill: 'rgba(180,220,255,0.8)' }\n\nMeasure.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill' }],\n}\n\nexport default Measure\n","import { Point } from '../../../types/shared'\nimport { getRoundedObject } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport { isInRange } from '../../utils/helpers'\nimport { ITrendAttrs } from './pitchfork_v1'\n\ninterface IGetEdgeIntersectionPointArguments {\n sides: { x: number; y: number }[][]\n rayOrigin: Point\n rayDirection: Point\n}\n\nexport const getEdgeIntersectionPoint = ({ sides, rayOrigin, rayDirection }: IGetEdgeIntersectionPointArguments) => {\n if (rayOrigin.x === rayDirection.x && rayOrigin.y === rayDirection.y) return rayDirection\n\n let intersection = rayDirection\n let intersectionDistance = 0\n for (let index = 0; index < sides.length; index++) {\n const rayToLineIntersection = math.getRayToLineSegmentIntersection(\n rayOrigin,\n rayDirection,\n sides[index][0],\n sides[index][1]\n )\n if (rayToLineIntersection) {\n const distance = math.distance(rayToLineIntersection, rayOrigin)\n if (distance > intersectionDistance && isInRange({ value: distance })) {\n intersectionDistance = distance\n intersection = { x: rayToLineIntersection.x, y: rayToLineIntersection.y }\n }\n }\n }\n\n return intersection\n}\n\nexport const getChartVisibleAreaBoundaries = (paneModel: PaneModel) => {\n const { left, right, top, bottom } = paneModel.getChartLayoutSettings().ChartSettings\n const { leftOffset, width } = paneModel.chart()\n\n const chartVisibleAreaLeftX = Math.abs(leftOffset)\n const chartVisibleAreaRightX = chartVisibleAreaLeftX + width - left.width - right.width\n const chartVisibleAreaTopY = 0\n const chartVisibleAreaBottomY = paneModel.height - top.height - bottom.height\n\n const chartVisibleAreaTopLeftPoint = {\n x: chartVisibleAreaLeftX,\n y: chartVisibleAreaTopY,\n }\n const chartVisibleAreaTopRightPoint = {\n x: chartVisibleAreaRightX,\n y: chartVisibleAreaTopY,\n }\n const chartVisibleAreaBottomLeftPoint = {\n x: chartVisibleAreaLeftX,\n y: chartVisibleAreaBottomY,\n }\n const chartVisibleAreaBottomRightPoint = {\n x: chartVisibleAreaRightX,\n y: chartVisibleAreaBottomY,\n }\n const topSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaTopRightPoint]\n const rightSide = [chartVisibleAreaTopRightPoint, chartVisibleAreaBottomRightPoint]\n const bottomSide = [chartVisibleAreaBottomLeftPoint, chartVisibleAreaBottomRightPoint]\n const leftSide = [chartVisibleAreaTopLeftPoint, chartVisibleAreaBottomLeftPoint]\n\n const sides = [topSide, rightSide, bottomSide, leftSide]\n\n return sides\n}\n\ninterface IGetPitchforkCoordinates {\n paneModel: PaneModel\n rayOrigin: Point\n rayDirectionControlPoint1: Point\n rayDirectionControlPoint2?: Point\n trend1: ITrendAttrs\n trend2: ITrendAttrs\n}\n\ninterface ILineSegment {\n P1: Point\n P2: Point\n}\n\ninterface ICoordinates {\n medianRay: ILineSegment\n trend1Ray1: ILineSegment | undefined\n trend1Ray2: ILineSegment | undefined\n trend2Ray1: ILineSegment | undefined\n trend2Ray2: ILineSegment | undefined\n}\n\nexport const getPitchforkCoordinates = ({\n paneModel,\n rayOrigin,\n rayDirectionControlPoint1,\n rayDirectionControlPoint2,\n trend1,\n trend2,\n}: IGetPitchforkCoordinates) => {\n const sides = getChartVisibleAreaBoundaries(paneModel)\n\n const coordinates: ICoordinates = {\n medianRay: { P1: rayOrigin, P2: rayDirectionControlPoint1 },\n trend1Ray1: undefined,\n trend2Ray1: undefined,\n trend1Ray2: undefined,\n trend2Ray2: undefined,\n }\n\n // If rayDirectionControlPoint2 doesn't exist return only medianRay with rayDirectionControlPoint1 as rayDirection\n if (!rayDirectionControlPoint2) {\n coordinates.medianRay = {\n P1: getRoundedObject(rayOrigin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin,\n rayDirection: rayDirectionControlPoint1,\n })\n ),\n }\n return coordinates\n }\n\n const medianRayDirectionPoint = math.getMiddlePointOnLineSegment(rayDirectionControlPoint1, rayDirectionControlPoint2)\n const rayOriginToRayDirectionVector = {\n x: medianRayDirectionPoint.x - rayOrigin.x,\n y: medianRayDirectionPoint.y - rayOrigin.y,\n }\n\n const rayDirectionControlPoint1ToPoint2Vector = {\n x: rayDirectionControlPoint1.x - rayDirectionControlPoint2.x,\n y: rayDirectionControlPoint1.y - rayDirectionControlPoint2.y,\n }\n\n const normalizedRayDirectionControlPoint1ToPoint2Vector = math.normalizeVector(\n rayDirectionControlPoint1ToPoint2Vector\n )\n\n const medianRayDirectionPointToRayDirectionControlPoint1Distance = math.distance(\n medianRayDirectionPoint,\n rayDirectionControlPoint1\n )\n\n coordinates.medianRay = {\n P1: getRoundedObject(rayOrigin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin,\n rayDirection: medianRayDirectionPoint,\n })\n ),\n }\n if (trend1.active) {\n const trend1Ray = getTrendRayCoordinates({\n trend: trend1.trend,\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n })\n\n coordinates.trend1Ray1 = trend1Ray.trendRay1\n coordinates.trend1Ray2 = trend1Ray.trendRay2\n }\n if (trend2.active) {\n const trend2Ray = getTrendRayCoordinates({\n trend: trend2.trend,\n medianToControlPointDistance: medianRayDirectionPointToRayDirectionControlPoint1Distance,\n normalizedControlToControlPointVector: normalizedRayDirectionControlPoint1ToPoint2Vector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n })\n\n coordinates.trend2Ray1 = trend2Ray.trendRay1\n coordinates.trend2Ray2 = trend2Ray.trendRay2\n }\n\n return coordinates\n}\n\ninterface IGetTrendRayCoordinates {\n trend: number\n medianToControlPointDistance: number\n normalizedControlToControlPointVector: Point\n rayOriginToRayDirectionVector: Point\n medianRayDirectionPoint: Point\n sides: Point[][]\n}\n\nconst getTrendRayCoordinates = ({\n trend,\n medianToControlPointDistance,\n normalizedControlToControlPointVector,\n rayOriginToRayDirectionVector,\n medianRayDirectionPoint,\n sides,\n}: IGetTrendRayCoordinates) => {\n const medianToTrendLineDistance = medianToControlPointDistance * trend\n\n const trendRayPoint1Origin = math.addPoints(\n medianRayDirectionPoint,\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\n )\n const trendPoint2RayOriginPoint2 = math.subtractPoints(\n medianRayDirectionPoint,\n math.multiplyVectorByScalar(normalizedControlToControlPointVector, medianToTrendLineDistance)\n )\n\n const trendRayPoint1DirectionPoint = {\n x: trendRayPoint1Origin.x + rayOriginToRayDirectionVector.x,\n y: trendRayPoint1Origin.y + rayOriginToRayDirectionVector.y,\n }\n const trendPoint2RayDirectionPoint = {\n x: trendPoint2RayOriginPoint2.x + rayOriginToRayDirectionVector.x,\n y: trendPoint2RayOriginPoint2.y + rayOriginToRayDirectionVector.y,\n }\n\n return {\n trendRay1: {\n P1: getRoundedObject(trendRayPoint1Origin),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin: trendRayPoint1Origin,\n rayDirection: trendRayPoint1DirectionPoint,\n })\n ),\n },\n trendRay2: {\n P1: getRoundedObject(trendPoint2RayOriginPoint2),\n P2: getRoundedObject(\n getEdgeIntersectionPoint({\n sides,\n rayOrigin: trendPoint2RayOriginPoint2,\n rayDirection: trendPoint2RayDirectionPoint,\n })\n ),\n },\n }\n}\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport { getOffsetFromLineWidth } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport Chart from '../../models/chart'\nimport PaneModel from '../../models/pane'\nimport { getHEXWithSpecificAplha } from '../../utils/colors'\nimport Element from '../element'\nimport Thumb from '../thumb'\nimport { getPitchforkCoordinates } from './pitchfork_utils'\n\nexport interface ITrendAttrs {\n active: boolean\n trend: number\n color: string\n}\n\nexport interface IPitchforkAttrs {\n x1: number\n y1: number\n x2: number\n y2: number\n x3: number\n y3: number\n median: { color: string; width: number }\n trend1: ITrendAttrs\n trend2: ITrendAttrs\n}\n\nclass Pitchfork extends Element {\n static type = CanvasElementType.pitchforkV1\n\n declare scaled: Pick\n name = 'Pitchfork'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'medianRayOrigin',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'rayDirectionControlPoint1',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'rayDirectionControlPoint2',\n () => this.attrs.x3,\n () => this.attrs.y3,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n median: { color: '#e72f2f', width: 1 },\n trend1: {\n color: '#004ad31c',\n active: true,\n trend: 1,\n },\n trend2: {\n color: '#00ca4e1f',\n active: true,\n trend: 0.5,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n\n const offset = getOffsetFromLineWidth(this.attrs.median.width)\n context.translate(offset, offset)\n\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\n paneModel: this.model,\n rayOrigin: { x: x1, y: y1 },\n rayDirectionControlPoint1: { x: x2, y: y2 },\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\n trend1: this.attrs.trend1,\n trend2: this.attrs.trend2,\n })\n\n context.set('lineWidth', this.attrs.median.width)\n\n const trendLines = [\n { trend: this.attrs.trend1, line1: trend1Ray1, line2: trend1Ray2 },\n { trend: this.attrs.trend2, line1: trend2Ray1, line2: trend2Ray2 },\n ].sort((a, b) => {\n if (Math.abs(a.trend.trend) > Math.abs(b.trend.trend)) {\n return -1\n }\n if (Math.abs(a.trend.trend) < Math.abs(b.trend.trend)) {\n return 1\n }\n return 0\n })\n\n // Draw trend lines and fill\n trendLines.forEach((trendLine, trendLineIndex) => {\n if (trendLine.line1 && trendLine.line2) {\n const { line1, line2 } = trendLine\n const solidTrendColor = getHEXWithSpecificAplha(trendLine.trend.color)\n const nextTrendLine = trendLines[trendLineIndex + 1]\n\n context.beginPath()\n context.moveTo(line1.P1.x, line1.P1.y)\n context.lineTo(line1.P2.x, line1.P2.y)\n if (trendLineIndex !== trendLines.length - 1 && nextTrendLine.line1 && nextTrendLine.line2) {\n context.lineTo(nextTrendLine.line1.P2.x, nextTrendLine.line1.P2.y)\n context.lineTo(nextTrendLine.line1.P1.x, nextTrendLine.line1.P1.y)\n context.moveTo(nextTrendLine.line2.P1.x, nextTrendLine.line2.P1.y)\n context.lineTo(nextTrendLine.line2.P2.x, nextTrendLine.line2.P2.y)\n }\n context.lineTo(line2.P2.x, line2.P2.y)\n context.lineTo(line2.P1.x, line2.P1.y)\n context.closePath()\n context.set('fillStyle', trendLine.trend.color)\n context.fill()\n\n context.beginPath()\n context.moveTo(line1.P1.x, line1.P1.y)\n context.lineTo(line1.P2.x, line1.P2.y)\n context.moveTo(line2.P1.x, line2.P1.y)\n context.lineTo(line2.P2.x, line2.P2.y)\n context.set('strokeStyle', solidTrendColor)\n context.stroke()\n }\n })\n\n // Draw median ray line\n context.beginPath()\n context.moveTo(medianRay.P1.x, medianRay.P1.y)\n context.lineTo(medianRay.P2.x, medianRay.P2.y)\n\n // Draw line between outer trend lines origin points or if smaller than 1 between direction control points\n const outerTrendLines =\n trendLines.filter(\n (item) => item.line1 && item.line2 && item.trend.active && Math.abs(item.trend.trend) >= 1\n )[0] ?? {}\n\n if (outerTrendLines.line1 && outerTrendLines.line2) {\n context.moveTo(outerTrendLines.line1.P1.x, outerTrendLines.line1.P1.y)\n context.lineTo(outerTrendLines.line2.P1.x, outerTrendLines.line2.P1.y)\n } else if (!Number.isNaN(x3) && !Number.isNaN(y3)) {\n context.moveTo(x2, y2)\n context.lineTo(x3, y3)\n }\n\n context.set('strokeStyle', this.attrs.median.color)\n context.stroke()\n\n context.translate(offset * -1, offset * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.x3 += x\n this.attrs.y3 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'medianRayOrigin':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'rayDirectionControlPoint1':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'rayDirectionControlPoint2':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n const { medianRay, trend1Ray1, trend1Ray2, trend2Ray1, trend2Ray2 } = getPitchforkCoordinates({\n paneModel: this.model,\n rayOrigin: { x: x1, y: y1 },\n rayDirectionControlPoint1: { x: x2, y: y2 },\n rayDirectionControlPoint2: Number.isNaN(x3) || Number.isNaN(y3) ? undefined : { x: x3, y: y3 },\n trend1: this.attrs.trend1,\n trend2: this.attrs.trend2,\n })\n const outerTrendLines =\n Math.abs(this.attrs.trend1.trend) > Math.abs(this.attrs.trend2.trend)\n ? { line1: trend1Ray1, line2: trend1Ray2 }\n : { line1: trend2Ray1, line2: trend2Ray2 }\n\n if (\n math.distanceToSegment(area.scaled, {\n x1: medianRay.P1.x,\n y1: medianRay.P1.y,\n x2: medianRay.P2.x,\n y2: medianRay.P2.y,\n }) <= 10\n ) {\n // cursor is near median ray\n return true\n } else if (\n !Number.isNaN(x3) &&\n !Number.isNaN(y3) &&\n math.distanceToSegment(area.scaled, {\n x1: x2,\n y1: y2,\n x2: x3,\n y2: y3,\n }) <= 10\n ) {\n // cursor is near line connecting direction control points\n return true\n } else if (\n outerTrendLines.line1 &&\n outerTrendLines.line2 &&\n math.pointInPolygon(area.scaled, [\n outerTrendLines.line1.P1,\n outerTrendLines.line1.P2,\n outerTrendLines.line2.P2,\n outerTrendLines.line2.P1,\n ])\n ) {\n // cursor is on polygon created by outer trend lines\n return true\n }\n return super.isInArea(area)\n }\n\n getIsInChartView(_: Chart) {\n return true\n }\n}\n\nPitchfork.prototype.modalConfig = {\n inputs: [\n { type: 'line', name: 'median' },\n { type: 'trend', name: 'trend1' },\n { type: 'trend', name: 'trend2' },\n ],\n}\n\nexport default Pitchfork\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element, { EdgeValues } from './element'\nimport Thumb from './thumb'\n\ntype Points = Array<{ x: number; y: number }>\n\nexport interface IPolygonAttrs {\n points: Points\n fill: string\n border: DrawingBorder\n positionPointsTimestamps?: Points\n}\n\nclass Polygon extends Element {\n static type = CanvasElementType.polygon\n\n name = 'Polygon'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this.attrs.fill = this.attrs.fill || 'rgba(50, 60, 70, 0.8)'\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n context.set('fillStyle', this.attrs.fill)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.translate(offset, offset)\n\n const { points } = this.attrs\n context.beginPath()\n context.moveTo(this.fx(points[0].x), this.fy(points[0].y))\n for (const p of points.slice(1)) {\n context.lineTo(this.fx(p.x), this.fy(p.y))\n }\n\n if (this.isPolygon()) {\n context.closePath()\n context.fill()\n }\n context.translate(offset * -1, offset * -1)\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getThumbs() {\n return this.attrs.points.map(\n (point, index) =>\n new Thumb(\n `${index}`,\n () => point.x,\n () => point.y,\n this.resize,\n this.model\n )\n )\n }\n\n cachePointPositionTimestamp = () => {\n const quote = this.model?.chart()?.quote()\n if (quote) {\n const positionPointsTimestamps = this.attrs.points.map((point) => ({\n ...point,\n x: quote.getTimestampFomPositionX(point.x),\n }))\n\n this.set({ positionPointsTimestamps } as Partial)\n }\n }\n\n updateScales() {\n const quote = this.model.chart().quote()\n const { positionPointsTimestamps } = this.attrs\n if (!quote || !positionPointsTimestamps) {\n // positionWavesTimestamps check is temporary to prevent app from crashing\n // caused by corrupted drawings - https://github.com/finvizhq/charts/pull/1386/files\n return\n }\n const points = positionPointsTimestamps.map((point) => ({\n ...point,\n x: quote.getPositionXFromTimestamp(point.x),\n }))\n this.set({ points } as Partial)\n }\n\n moveBy(x: number, y: number) {\n for (const point of this.attrs.points) {\n point.x += x\n point.y += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n const last = this.attrs.points.length - 1\n if (this.isPolygon() && (+type === 0 || +type === last)) {\n this.attrs.points[0].x += difX\n this.attrs.points[0].y += difY\n this.attrs.points[last].x += difX\n this.attrs.points[last].y += difY\n } else {\n this.attrs.points[+type].x += difX\n this.attrs.points[+type].y += difY\n }\n }\n\n isPolygon() {\n return (\n this.attrs.points[0].x === this.attrs.points.last()?.x && this.attrs.points[0].y === this.attrs.points.last()?.y\n )\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const scaledPoints = this.attrs.points.map((p) => ({\n x: this.fx(p.x),\n y: this.fy(p.y),\n }))\n if (this.isPolygon()) {\n if (math.pointInPolygon(area.scaled, scaledPoints)) {\n return true\n }\n } else {\n for (let i = 0; i < scaledPoints.length - 1; i++) {\n if (\n math.distanceToSegment(area.scaled, {\n x1: scaledPoints[i].x,\n y1: scaledPoints[i].y,\n x2: scaledPoints[i + 1].x,\n y2: scaledPoints[i + 1].y,\n }) <= 10\n ) {\n return true\n }\n }\n }\n\n return super.isInArea(area)\n }\n\n getAutosaveOmittedProperties() {\n return ['points']\n }\n\n getEdgeXYValues() {\n if (this.edgeXYValues === null) {\n const edgeXYValues = {} as EdgeValues\n this.attrs.points.forEach(({ x, y }) => {\n const xPoint = x\n const yPoint = y\n edgeXYValues.minX = Math.min(xPoint, edgeXYValues.minX ?? xPoint)\n edgeXYValues.minY = Math.min(yPoint, edgeXYValues.minY ?? yPoint)\n edgeXYValues.maxX = Math.max(xPoint, edgeXYValues.maxX ?? xPoint)\n edgeXYValues.maxY = Math.max(yPoint, edgeXYValues.maxY ?? yPoint)\n })\n\n this.edgeXYValues = edgeXYValues\n }\n\n return this.edgeXYValues\n }\n}\n\nPolygon.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Polygon\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\ninterface Coordinates {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport interface IPositionAttrs extends Coordinates {\n targetColor: string\n stopColor: string\n targetY: number\n centerY: number\n stopY: number\n}\n\nclass Position extends Element {\n static type = CanvasElementType.position\n\n name = 'Position'\n\n declare scaled: Pick\n\n x1Dif: number\n x2Dif: number\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 't1',\n () => this.attrs.x1,\n () => this.attrs.targetY,\n this.resize,\n this.model\n ),\n new Thumb(\n 't2',\n () => this.attrs.x2,\n () => this.attrs.targetY,\n this.resize,\n this.model\n ),\n new Thumb(\n 's1',\n () => this.attrs.x1,\n () => this.attrs.stopY,\n this.resize,\n this.model\n ),\n new Thumb(\n 's2',\n () => this.attrs.x2,\n () => this.attrs.stopY,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c1',\n () => this.attrs.x1,\n () => this.attrs.centerY,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c2',\n () => this.attrs.x2,\n () => this.attrs.centerY,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n this.x1Dif = this.x2Dif = 0\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['targetY', 'centerY', 'stopY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, targetY, centerY, stopY } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, targetY, centerY, stopY })\n let sign, stopBaseline, targetBaseline\n const width = roundedXY.x2 - roundedXY.x1\n\n context.set('fillStyle', this.attrs.targetColor)\n context.fillRect(roundedXY.x1, roundedXY.targetY, width, roundedXY.centerY - roundedXY.targetY)\n\n context.set('fillStyle', this.attrs.stopColor)\n context.fillRect(roundedXY.x1, roundedXY.centerY, width, roundedXY.stopY - roundedXY.centerY)\n\n const targetDif = Math.abs(this.attrs.targetY - this.attrs.centerY)\n const targetPerc = (100 / this.attrs.centerY) * targetDif\n const targetStr = `Target: ${targetDif.toFixed(2)} (${targetPerc.toFixed(2)}%)`\n\n const stopDif = Math.abs(this.attrs.stopY - this.attrs.centerY)\n const stopPerc = (100 / this.attrs.centerY) * stopDif\n const stopStr = `Stop: ${stopDif.toFixed(2)} (${stopPerc.toFixed(2)}%)`\n\n if (this.attrs.targetY > this.attrs.centerY) {\n sign = 1\n targetBaseline = TextBaseline.bottom\n stopBaseline = TextBaseline.top\n } else {\n sign = -1\n targetBaseline = TextBaseline.top\n stopBaseline = TextBaseline.bottom\n }\n\n const text = new Text(\n {\n text: targetStr,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n font: { size: 10, family: 'Arial', weight: 'bold' },\n y: roundedXY.targetY - sign * 4,\n textBaseline: targetBaseline,\n },\n this.model\n )\n let textWidth = text.measure(context)\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\n text.render(context)\n\n text.set({\n text: stopStr,\n y: roundedXY.stopY + sign * 4,\n textBaseline: stopBaseline,\n })\n textWidth = text.measure(context)\n text.set({ x: roundedXY.x1 + width / 2 - textWidth / 2 } as Partial)\n text.render(context)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n addToCoordinates(difs: Partial) {\n let middle, middle1, result\n if (difs.targetY) {\n result = this.attrs.targetY + difs.targetY\n if (\n (this.attrs.targetY > this.attrs.centerY && result < this.attrs.centerY) ||\n (this.attrs.targetY < this.attrs.centerY && result > this.attrs.centerY)\n ) {\n this.attrs.stopY = this.attrs.centerY - (this.attrs.stopY - this.attrs.centerY) // swap target&stop\n }\n this.attrs.targetY = result\n }\n\n if (difs.stopY) {\n result = this.attrs.stopY + difs.stopY\n if (\n (this.attrs.stopY > this.attrs.centerY && result < this.attrs.centerY) ||\n (this.attrs.stopY < this.attrs.centerY && result > this.attrs.centerY)\n ) {\n this.attrs.targetY = this.attrs.centerY - (this.attrs.targetY - this.attrs.centerY) // swap target&stop\n }\n this.attrs.stopY = result\n }\n\n if (\n difs.centerY &&\n ((this.attrs.stopY < (middle = this.attrs.centerY + difs.centerY) && middle < this.attrs.targetY) ||\n (this.attrs.stopY > (middle1 = this.attrs.centerY + difs.centerY) && middle1 > this.attrs.targetY))\n ) {\n this.attrs.centerY += difs.centerY\n }\n\n this.x1Dif += difs.x1 || 0\n this.x2Dif += difs.x2 || 0\n const roundDif = ~~this.x1Dif || ~~this.x2Dif\n if (roundDif !== 0) {\n if (difs.x1 != null) {\n this.attrs.x1 += roundDif\n }\n if (difs.x2 != null) {\n this.attrs.x2 += roundDif\n }\n this.x1Dif = this.x2Dif = 0\n }\n }\n\n moveBy(x: number, y: number) {\n return this.addToCoordinates({\n x1: x,\n x2: x,\n targetY: y,\n centerY: y,\n stopY: y,\n })\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n const [coordType, coordIndex] = (type as string).split('')\n const yPoints: Record = { t: 'targetY', c: 'centerY', s: 'stopY' }\n const obj: Partial = {\n [`x${coordIndex}`]: difX,\n [yPoints[coordType]]: difY,\n }\n return this.addToCoordinates(obj)\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const x1 = Math.round(this.attrs.x1)\n const x2 = Math.round(this.attrs.x2)\n const left = Math.min(x1, x2)\n const right = Math.max(x1, x2)\n const top = Math.min(this.attrs.targetY, this.attrs.stopY)\n const bottom = Math.max(this.attrs.targetY, this.attrs.stopY)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nPosition.prototype.defaults = {\n targetColor: 'rgba(0,200,0,0.3)',\n stopColor: 'rgba(200,0,0,0.3)',\n}\n\nPosition.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'targetColor' },\n { type: 'background', name: 'stopColor' },\n ],\n}\n\nexport default Position\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface IRectangleAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n fill: string\n border: DrawingBorder\n}\n\nclass Rectangle extends Element {\n static type = CanvasElementType.rectangle\n\n name = 'Rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'br',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'tl',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const width = roundedXY.x2 - roundedXY.x1\n const height = roundedXY.y2 - roundedXY.y1\n\n context.set('fillStyle', this.attrs.fill)\n\n context.fillRect(roundedXY.x1, roundedXY.y1, width, height)\n\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.strokeRect(roundedXY.x1 + offset, roundedXY.y1 + offset, width, height)\n }\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.x2 += x\n this.attrs.y1 += y\n this.attrs.y2 += y\n\n // @todo - Live sync of elements while they are being moved around\n // In order to have live sync across charts we need to trigger change so listeners can update other charts with new values\n // this.set(this.attrs)\n // this.trigger('change', this)\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n if (type === 'tl') {\n this.attrs.x1 += difX\n return (this.attrs.y1 += difY)\n } else {\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const left = Math.min(this.attrs.x1, this.attrs.x2)\n const right = Math.max(this.attrs.x1, this.attrs.x2)\n const top = Math.min(this.attrs.y1, this.attrs.y2)\n const bottom = Math.max(this.attrs.y1, this.attrs.y2)\n if (left < area.x && area.x < right && top < area.y && area.y < bottom) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nRectangle.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default Rectangle\n","import { DrawingBorder, PaneArea, Point, ResizeByThumbWithTypeAndDifs } from '../../../types/shared'\nimport { CanvasElementType } from '../../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../../controllers/renderUtils'\nimport math from '../../helpers/math'\nimport PaneModel from '../../models/pane'\nimport Element from '../element'\nimport Thumb from '../thumb'\n\nexport interface IRotatedRectangleV1Attrs {\n x1: number\n x2: number\n y1: number\n y2: number\n cursorTargetX: number\n cursorTargetY: number\n fill: string\n border: DrawingBorder\n}\n\nclass RotatedRectangleV1 extends Element {\n static type = CanvasElementType.rotatedRectangleV1\n\n name = 'New Rotated Rectangle'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.resize = this.resize.bind(this)\n this._thumbs = [\n new Thumb(\n 'middleLeft',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'middleRight',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'topRight',\n () => this.getRectCoordinates(true).P1.x || this.attrs.x2,\n () => this.getRectCoordinates(true).P1.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'topLeft',\n () => this.getRectCoordinates(true).P2.x || this.attrs.x2,\n () => this.getRectCoordinates(true).P2.y || this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottomLeft',\n () => this.getRectCoordinates(true).P3.x || this.attrs.x1,\n () => this.getRectCoordinates(true).P3.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'bottomRight',\n () => this.getRectCoordinates(true).P4.x || this.attrs.x1,\n () => this.getRectCoordinates(true).P4.y || this.attrs.y1,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'cursorTargetX'], y: ['y1', 'y2', 'cursorTargetY'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { P1, P2, P3, P4 } = this.getRectCoordinates()\n const roundedXY = {\n P1: getRoundedObject(P1),\n P2: getRoundedObject(P2),\n P3: getRoundedObject(P3),\n P4: getRoundedObject(P4),\n }\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.set('fillStyle', this.attrs.fill)\n\n context.translate(offset, offset)\n context.beginPath()\n if (roundedXY.P1.x === roundedXY.P4.x && roundedXY.P1.y === roundedXY.P4.y) {\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\n } else {\n context.lineTo(roundedXY.P1.x, roundedXY.P1.y)\n context.lineTo(roundedXY.P2.x, roundedXY.P2.y)\n context.lineTo(roundedXY.P3.x, roundedXY.P3.y)\n context.lineTo(roundedXY.P4.x, roundedXY.P4.y)\n context.closePath()\n context.fill()\n }\n context.translate(offset * -1, offset * -1)\n\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n context.stroke()\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n getRectCoordinates(inverted = false) {\n const { x1, x2, y1, y2, cursorTargetX, cursorTargetY } = this.scaled\n let perpendicularPoint\n if (!isNaN(cursorTargetX) && !isNaN(cursorTargetY)) {\n const cursor = { x: cursorTargetX, y: cursorTargetY }\n const line = { x1, y1, x2, y2 }\n const distance = math.distanceToLine(cursor, line)\n perpendicularPoint = math.perpendicularPointToLine({\n distance,\n line,\n })\n } else {\n return {\n P1: { x: x2, y: y2 },\n P2: { x: x1, y: y1 },\n P3: { x: x1, y: y1 },\n P4: { x: x2, y: y2 },\n }\n }\n\n const pointOffsetX = perpendicularPoint.x - x2\n const pointOffsetY = perpendicularPoint.y - y2\n\n const P1 = { x: x2 + pointOffsetX, y: y2 + pointOffsetY }\n const P2 = { x: x1 + pointOffsetX, y: y1 + pointOffsetY }\n const P3 = { x: x1 + -1 * pointOffsetX, y: y1 + -1 * pointOffsetY }\n const P4 = { x: x2 + -1 * pointOffsetX, y: y2 + -1 * pointOffsetY }\n\n const invertX = this.model.scale.x.invert\n const invertY = this.model.scale.y.invert\n if (inverted) {\n return {\n P1: { x: invertX(P1.x), y: invertY(P1.y) },\n P2: { x: invertX(P2.x), y: invertY(P2.y) },\n P3: { x: invertX(P3.x), y: invertY(P3.y) },\n P4: { x: invertX(P4.x), y: invertY(P4.y) },\n }\n }\n return { P1, P2, P3, P4 }\n }\n\n getRotatedPointCoordinates = ({\n rotationAxisPoint,\n pointToRotate,\n oldLinePoint,\n newLinePoint,\n }: {\n rotationAxisPoint: Point\n pointToRotate: Point\n oldLinePoint: Point\n newLinePoint: Point\n }) => {\n const angle = math.sharedPointLinesAngle({\n sharedPoint: rotationAxisPoint,\n oldLinePoint,\n newLinePoint,\n })\n const rotatedPoinCoordinates = math.rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n })\n return {\n x: this.model.scale.x.invert(rotatedPoinCoordinates.x),\n y: this.model.scale.y.invert(rotatedPoinCoordinates.y),\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.cursorTargetX += x\n this.attrs.cursorTargetY += y\n }\n\n resize({ type, difX, difY, area }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'middleLeft':\n const newMiddleLeftPoint = {\n x: this.attrs.x1 + difX,\n y: this.attrs.y1 + difY,\n }\n const middleLeftRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x2, y: this.scaled.y2 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x1, y: this.scaled.y1 },\n newLinePoint: { x: this.model.scale.x(newMiddleLeftPoint.x), y: this.model.scale.y(newMiddleLeftPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x1: newMiddleLeftPoint.x,\n y1: newMiddleLeftPoint.y,\n cursorTargetX: middleLeftRotatedCursorPoint.x,\n cursorTargetY: middleLeftRotatedCursorPoint.y,\n }\n break\n case 'middleRight':\n const newMiddleRightPoint = {\n x: this.attrs.x2 + difX,\n y: this.attrs.y2 + difY,\n }\n const middleRightRotatedCursorPoint = this.getRotatedPointCoordinates({\n rotationAxisPoint: { x: this.scaled.x1, y: this.scaled.y1 },\n pointToRotate: {\n x: this.scaled.cursorTargetX,\n y: this.scaled.cursorTargetY,\n },\n oldLinePoint: { x: this.scaled.x2, y: this.scaled.y2 },\n newLinePoint: { x: this.model.scale.x(newMiddleRightPoint.x), y: this.model.scale.y(newMiddleRightPoint.y) },\n })\n this.attrs = {\n ...this.attrs,\n x2: newMiddleRightPoint.x,\n y2: newMiddleRightPoint.y,\n cursorTargetX: middleRightRotatedCursorPoint.x,\n cursorTargetY: middleRightRotatedCursorPoint.y,\n }\n break\n case 'topRight':\n case 'topLeft':\n case 'bottomLeft':\n case 'bottomRight':\n this.attrs = {\n ...this.attrs,\n cursorTargetX: area.x,\n cursorTargetY: area.y,\n }\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const coordinates = this.getRectCoordinates()\n const polygon = Object.keys(coordinates).map((point) => ({\n x: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].x,\n y: coordinates[point as 'P1' | 'P2' | 'P3' | 'P4'].y,\n }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n\n getIsInChartView() {\n return true\n }\n}\n\nRotatedRectangleV1.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1, default: {} },\n ],\n}\n\nexport default RotatedRectangleV1\n","import { DrawingBorder, PaneArea } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Line from './line'\n\nexport interface IScaledLineAttrs {\n x1: number\n x2: number\n y1: number\n y2: number\n dashLength: number\n lineWidth: number\n strokeStyle: string\n border: DrawingBorder\n}\n\nclass ScaledLine extends Line {\n static type = CanvasElementType.scaledLine\n\n name = 'Line'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n return {\n border: {\n width: 1,\n color: this.getChartLayoutSettings().ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, y1, y2 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, y1, y2 })\n const translateXY = getXYOffsetFromLine({ lineWidth: this.attrs.border.width, ...roundedXY })\n\n context.translate(translateXY.x, translateXY.y)\n context.beginPath()\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n context.moveTo(roundedXY.x1, roundedXY.y1)\n if (this.attrs.dashLength) {\n context.setLineDash([this.attrs.dashLength])\n }\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n context.translate(translateXY.x * -1, translateXY.y * -1)\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n if (math.distanceToSegment(area.scaled, this.scaled) <= 10) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n}\n\nScaledLine.prototype.modalConfig = {\n inputs: [{ type: 'line', name: 'border' }],\n}\n\nexport default ScaledLine\n","import merge from 'lodash.merge'\n\nimport { PaneArea } from '../../types/shared'\nimport { PADDING } from '../constants/common'\nimport { CanvasElementType } from '../constants/common'\nimport Chart from '../models/chart'\nimport PaneModel from '../models/pane'\nimport Text, { ITextAttrs } from './text'\n\ninterface FontFamilyHeightCoefficient {\n Arial: {\n firstLine: number\n otherLines: number\n }\n Verdana: {\n firstLine: number\n otherLines: number\n }\n}\n\nclass ScaledText extends Text {\n static type = CanvasElementType.scaledText\n\n name = 'Text'\n declare fontFamilyHeightCoeficient: FontFamilyHeightCoefficient\n declare lastAttrs: Attrs\n declare scaled: Partial\n declare measuredHeight: number\n\n declare font: string\n declare context: CanvasRenderingContext2D\n declare lines: {\n text: string\n metrics: TextMetrics\n }[]\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.scale({ x: ['x'], y: ['y'] })\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n this.render(context)\n }\n\n setupTextMetricsCache() {\n if (\n this.attrs.text !== this.lastAttrs?.text ||\n JSON.stringify(this.attrs.font) !== JSON.stringify(this.lastAttrs?.font)\n ) {\n this.lastAttrs = merge({}, this.attrs)\n this.lines = this.getLines().map((line) => ({\n text: line,\n metrics: this.context.measureText(line),\n }))\n this.measuredHeight = this.lines.reduce((acc, current, currentIndex) => {\n const lineHeight =\n current.metrics.actualBoundingBoxAscent +\n current.metrics.actualBoundingBoxDescent +\n (currentIndex !== this.lines.length - 1 ? PADDING.XXXS : 0)\n return acc + lineHeight\n }, 0)\n }\n }\n\n // private\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle!)\n context.set('textAlign', this.attrs.textAlign!)\n context.set('textBaseline', this.attrs.textBaseline)\n this.setupTextMetricsCache()\n }\n\n // private\n renderText() {\n let y = this.scaled.y! + this.attrs.padding.top\n let previousDescent = 0\n for (let i = 0; i < this.lines.length; i++) {\n y += i === 0 ? 0 : this.lines[i].metrics.actualBoundingBoxAscent + previousDescent + PADDING.XXXS\n this.context.fillText(this.lines[i].text, this.scaled.x! + this.attrs.padding.left, y)\n previousDescent = this.lines[i].metrics.actualBoundingBoxDescent\n }\n }\n\n // private\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\n\n this.context.beginPath()\n this.context.rect(\n this.scaled.x! - padding,\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding,\n this.width + padding * 2,\n this.measuredHeight + padding * 2\n )\n this.context.set('fillStyle', this.attrs.background)\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle!)\n this.renderBorder()\n this.context.closePath()\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n // TODO\n // if @attrs.textBaseline == 'middle'\n // rect.y = @attrs.y - rect.height/2\n if (\n this.lines &&\n this.scaled.x! < area.scaled.x &&\n area.scaled.x < this.scaled.x! + this.width &&\n this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent < area.scaled.y &&\n area.scaled.y < this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent + this.measuredHeight\n ) {\n return true\n }\n return this.thumbsAreInArea(area)\n }\n\n getIsInChartView(chart: Chart) {\n if (this.getIsCreator()) {\n return true\n }\n\n if (!this.lines) {\n return true\n }\n\n const padding = this.attrs.border!.width / 2 + PADDING.XXS\n const textBoxX = this.scaled.x! - padding\n const textBoxY = this.scaled.y! - this.lines[0].metrics.actualBoundingBoxAscent - padding\n const textBoxWidth = this.width + padding * 2\n const textBoxHeight = this.measuredHeight + padding * 2\n\n if (\n textBoxX <= -chart.leftOffset + chart.width &&\n textBoxX + textBoxWidth >= -chart.leftOffset &&\n textBoxY <= this.model.height &&\n textBoxY + textBoxHeight >= 0\n ) {\n return true\n }\n\n return false\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x! += x\n this.attrs.y! += y\n }\n}\n\nexport default ScaledText\n","import { PaneArea, RequireByKey, TextAttrs } from '../../types/shared'\nimport { CanvasElementType, TextAlign, TextBaseline } from '../constants/common'\nimport Element, { TodoModalConfig } from './element'\n\nexport interface Area {\n x: number\n y: number\n}\n\nexport type ITextAttrs = RequireByKey & Partial\n\nconst DEFAULTS: Partial = {\n text: '',\n font: {\n size: 20,\n family: 'Arial',\n style: 'normal',\n weight: 'normal',\n },\n lineHeight: 20,\n // left | right | center | start | end\n textAlign: TextAlign.left,\n // top | hanging | middle | alphabetic | ideographic | bottom\n textBaseline: TextBaseline.alphabetic,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n },\n}\n\nclass Text extends Element {\n static type = CanvasElementType.text\n\n static getMergedPropsWithDefaults>(\n propKey: T,\n props: Partial = {}\n ) {\n return {\n ...DEFAULTS[propKey],\n ...Object.entries(props).reduce((acc, [key, value]) => (value ? { ...acc, [key]: value } : acc), {}),\n }\n }\n\n name = 'Anchored text'\n declare context: CanvasRenderingContext2D\n declare width: number\n declare height: number\n declare font: string\n\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n // TODO: revisit this getter, when you call `this.width` you don't expect/want context change\n if (this.context) {\n this.setupContext(this.context)\n }\n return this.measure() + this.attrs.padding.left + this.attrs.padding.right\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const count = this.getLines().length\n return this.attrs.lineHeight * count + this.attrs.padding.top + this.attrs.padding.bottom\n },\n })\n\n Object.defineProperty(this.prototype, 'font', {\n get() {\n const f = this.attrs.font\n return `${f.style} ${f.weight} ${f.size}pt ${f.family}`\n },\n })\n }\n\n getModalConfigBase() {\n return {\n inputs: [\n { type: 'multiline_string', name: 'text', required: true },\n { type: 'font', name: 'font' },\n {\n type: 'background',\n name: 'fillStyle',\n label: 'Color',\n default: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n },\n {\n type: 'background',\n name: 'background',\n label: 'Background',\n default: 'rgba(0,0,0,0)',\n },\n {\n type: 'border',\n name: 'border',\n min: 0,\n default: { color: 'rgba(0,0,0)', width: 0 },\n },\n ],\n } as unknown as TodoModalConfig\n }\n\n getDefaults() {\n return {\n ...DEFAULTS,\n fillStyle: this.getChartLayoutSettings().ElementSettings.Colors.textWithoutBackground,\n } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: ['y'] })\n\n set(obj: Partial) {\n super.set(obj)\n if (obj.font?.size && !obj.lineHeight) {\n this.attrs.lineHeight = Math.max(obj.font.size, this.attrs.lineHeight)\n }\n return this\n }\n\n render(context: CanvasRenderingContext2D) {\n this.setupContext(context)\n if (this.attrs.angle) {\n // TODO background & multiline text\n this.context.save()\n this.context.translate(this.attrs.x!, this.attrs.y!)\n this.context.rotate((this.attrs.angle * Math.PI) / 180)\n this.context.fillText(this.attrs.text, 0, 0)\n this.context.restore()\n } else {\n this.renderBackground()\n this.renderText()\n }\n }\n\n measure(context?: CanvasRenderingContext2D) {\n if (context) {\n this.setupContext(context)\n }\n const lines = this.getLines()\n let max = 0\n for (const line of lines) {\n max = Math.max(this.context.measureText(line).width, max)\n }\n return ~~max\n }\n\n isInArea(testArea: PaneArea) {\n const area = this.convertArea(testArea)\n // TODO iny align\n if (\n this.attrs.x! < area.x &&\n area.x < this.attrs.x! + this.width &&\n this.attrs.y! - this.attrs.font.size < area.y &&\n area.y < this.attrs.y! - this.attrs.font.size + this.height\n ) {\n return true\n }\n return super.isInArea(testArea)\n }\n\n setupContext(context: CanvasRenderingContext2D) {\n this.context = context\n context.set('font', this.font)\n context.set('fillStyle', this.attrs.fillStyle)\n context.set('textAlign', this.attrs.textAlign)\n context.set('textBaseline', this.attrs.textBaseline)\n }\n\n getLines() {\n return this.attrs.text.toString().split('\\n')\n }\n\n renderText() {\n let { y } = this.attrs // + @attrs.padding.top\n for (const line of this.getLines()) {\n this.context.fillText(line, this.attrs.x! + this.attrs.padding.left, y!)\n y! += this.attrs.lineHeight\n }\n }\n\n renderBackground() {\n if (!this.attrs.background) {\n return\n }\n\n const { width } = this\n const { height } = this\n const rawHight = height - this.attrs.padding.top - this.attrs.padding.bottom\n const { x } = this.attrs\n let y = this.attrs.y! - height\n\n if (this.attrs.textBaseline === 'middle') {\n y = this.attrs.y! - rawHight / 2 - this.attrs.padding.top - 1\n } else if (this.attrs.textBaseline === 'alphabetic') {\n y = this.attrs.y! - this.attrs.lineHeight\n }\n\n this.context.beginPath()\n this.context.set('fillStyle', this.attrs.background)\n this.context.rect(x!, y, width, height)\n this.context.fill()\n this.context.set('fillStyle', this.attrs.fillStyle)\n this.renderBorder()\n this.context.closePath()\n }\n\n renderBorder() {\n const { lineWidth = 0, strokeStyle, border } = this.attrs\n const borderWidth = border?.width ?? 0\n\n if (lineWidth || this.attrs.strokeStyle || borderWidth > 0) {\n this.context.set('strokeStyle', strokeStyle ?? border?.color ?? '')\n this.context.set('lineWidth', Math.max(lineWidth, borderWidth))\n this.context.stroke()\n }\n }\n\n private convertArea(area: PaneArea) {\n const { ChartSettings } = this.getChartLayoutSettings()\n return {\n x: this.model.scale.x(area.x) + this.model.chart().leftOffset + ChartSettings.left.width,\n y: this.model.scale.y(area.y) + ChartSettings.top.height,\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x! += this.model.scale.x(x) + 1\n this.attrs.y! += this.model.scale.y(y) - this.model.scale.y(0)\n }\n\n getHeight() {\n return this.height\n }\n}\n\nText.initClass()\n\nexport default Text\n","import { PaneArea, ResizeByThumbFuncProps, ThumbType } from '../../types/shared'\nimport { getOffsetFromLineWidth } from '../controllers/renderUtils'\nimport PaneModel from '../models/pane'\n\ntype Area = PaneArea\ntype ResizeFunc = (props: ResizeByThumbFuncProps) => void\ntype ScaleFunc = () => number\n\nclass Thumb {\n type: ThumbType\n lastX = 0\n lastY = 0\n fx: ScaleFunc\n fy: ScaleFunc\n resize: ResizeFunc\n model: PaneModel\n\n constructor(type: ThumbType, fx: ScaleFunc, fy: ScaleFunc, resize: ResizeFunc, model: PaneModel) {\n this.type = type\n this.fx = fx\n this.fy = fy\n this.resize = resize\n this.model = model\n }\n\n render(context: CanvasRenderingContext2D) {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n context.set('fillStyle', ThumbSettings.color)\n context.set('strokeStyle', ThumbSettings.borderColor)\n context.set('lineWidth', ThumbSettings.borderWidth)\n const x = ~~this.x()\n const y = ~~this.y()\n const thumbWidth = this.getThumbWidth()\n const offset = getOffsetFromLineWidth(ThumbSettings.borderWidth)\n context.beginPath()\n context.rect(x + offset, y + offset, thumbWidth, thumbWidth)\n context.fill()\n context.stroke()\n }\n\n startEditing(area: Area) {\n this.lastX = area.x\n return (this.lastY = area.y)\n }\n\n moveTo(area: Area) {\n const difX = area.x - this.lastX\n const difY = area.y - this.lastY\n this.resize({ type: this.type, difX, difY, area })\n this.lastX = area.x\n this.lastY = area.y\n }\n\n isInArea(area: Area) {\n const width = this.model.scale.x.invert(this.getThumbWidth())\n const height = this.model.scale.y.invert(0) - this.model.scale.y.invert(this.getThumbWidth())\n // +- width/2 because we have coordinates of a center\n if (\n this.fx() + width / 2 >= area.x &&\n this.fx() - width / 2 <= area.x &&\n this.fy() + height / 2 > area.y &&\n this.fy() - height / 2 < area.y\n ) {\n return true\n }\n return false\n }\n\n getThumbWidth() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return ThumbSettings.size + ThumbSettings.borderWidth * 2\n }\n\n x() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return this.model.scale.x(this.fx()) - ThumbSettings.size / 2\n }\n\n y() {\n const { ThumbSettings } = this.model.getChartLayoutSettings()\n return this.model.scale.y(this.fy()) - ThumbSettings.size / 2\n }\n}\n\nexport default Thumb\n","import { PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Thumb from './thumb'\n\nexport interface ITriangleAttrs {\n x1: number\n x2: number\n x3: number\n y1: number\n y2: number\n y3: number\n fill: string\n border: string\n}\n\nclass Triangle extends Element {\n static type = CanvasElementType.triangle\n\n declare scaled: Pick\n name = 'Triangle'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'a',\n () => this.attrs.x1,\n () => this.attrs.y1,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.x2,\n () => this.attrs.y2,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.x3,\n () => this.attrs.y3,\n this.resize,\n this.model\n ),\n ]\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return { fill: ElementSettings.defaultFill, border: ElementSettings.Colors.border } as Partial\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2', 'x3'], y: ['y1', 'y2', 'y3'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { x1, x2, x3, y1, y2, y3 } = this.scaled\n const roundedXY = getRoundedObject({ x1, x2, x3, y1, y2, y3 })\n\n context.set('fillStyle', this.attrs.fill)\n\n const offset = this.getShouldRenderThumbs() ? getOffsetFromLineWidth(1) : 0\n\n context.translate(offset, offset)\n context.beginPath()\n context.moveTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.lineTo(roundedXY.x3, roundedXY.y3)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.fill()\n context.translate(offset * -1, offset * -1)\n\n if (this.getShouldRenderThumbs()) {\n context.set('strokeStyle', this.attrs.border)\n context.stroke()\n this.renderThumbs(context)\n }\n }\n\n moveBy(x: number, y: number) {\n this.attrs.x1 += x\n this.attrs.y1 += y\n this.attrs.x2 += x\n this.attrs.y2 += y\n this.attrs.x3 += x\n this.attrs.y3 += y\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n switch (type) {\n case 'a':\n this.attrs.x1 += difX\n this.attrs.y1 += difY\n break\n case 'b':\n this.attrs.x2 += difX\n this.attrs.y2 += difY\n break\n case 'c':\n this.attrs.x3 += difX\n this.attrs.y3 += difY\n break\n default:\n break\n }\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n const polygon = [1, 2, 3].map((i) => ({\n x: this.scaled[`x${i}` as 'x1' | 'x2' | 'x3'],\n y: this.scaled[`y${i}` as 'y1' | 'y2' | 'y3'],\n }))\n if (math.pointInPolygon(area.scaled, polygon)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nTriangle.prototype.modalConfig = {\n inputs: [{ type: 'background', name: 'fill' }],\n}\n\nexport default Triangle\n","import { RequireByKey, ResizeByThumbFuncProps } from '../../types/shared'\nimport { CanvasElementType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport ScaledLine, { IScaledLineAttrs } from './scaled_line'\n\nclass VerticalLine extends ScaledLine {\n static type = CanvasElementType.verticalLine\n\n name = 'Vertical line'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.renderContent = this.renderContent.bind(this)\n\n this.attrs.x2 = this.attrs.x1\n this._thumbs = [this._thumbs[0]]\n }\n\n getBoundingPointKeys = () => ({ x: ['x1', 'x2'], y: ['y1', 'y2'] })\n\n renderContent(context: CanvasRenderingContext2D) {\n const domain = this.model.scale.y.domain()\n this.attrs.y1 = domain[0]\n this.attrs.y2 = domain[1]\n this._thumbs[0].fy = () => (this.attrs.y1 + this.attrs.y2) / 2\n super.renderContent(context)\n }\n\n moveBy(x: number) {\n return (this.attrs.x1 = this.attrs.x2 += x)\n }\n\n resize({ difX }: RequireByKey) {\n return this.moveBy(difX)\n }\n}\n\nexport default VerticalLine\n","import { DrawingBorder, PaneArea, ResizeByThumbWithTypeAndDifs } from '../../types/shared'\nimport { CanvasElementType, TextBaseline } from '../constants/common'\nimport { getOffsetFromLineWidth, getRoundedObject } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport PaneModel from '../models/pane'\nimport Element from './element'\nimport Text, { ITextAttrs } from './text'\nimport Thumb from './thumb'\n\nexport interface IXABCDPositionAttrs {\n xx: number\n xy: number\n ax: number\n ay: number\n bx: number\n by: number\n cx: number\n cy: number\n dx: number\n dy: number\n}\n\ntype xPoints = 'xx' | 'ax' | 'bx' | 'cx' | 'dx'\ntype yPoints = 'xy' | 'ay' | 'by' | 'cy' | 'dy'\n\nexport interface IXABCDAttrs extends IXABCDPositionAttrs {\n fill: string\n border: DrawingBorder\n lineWidth: number\n}\n\nclass XABCD extends Element {\n static type = CanvasElementType.xabcd\n\n name = 'XABCD pattern'\n\n declare scaled: Pick\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n\n this.resize = this.resize.bind(this)\n\n this._thumbs = [\n new Thumb(\n 'x',\n () => this.attrs.xx,\n () => this.attrs.xy,\n this.resize,\n this.model\n ),\n new Thumb(\n 'a',\n () => this.attrs.ax,\n () => this.attrs.ay,\n this.resize,\n this.model\n ),\n new Thumb(\n 'b',\n () => this.attrs.bx,\n () => this.attrs.by,\n this.resize,\n this.model\n ),\n new Thumb(\n 'c',\n () => this.attrs.cx,\n () => this.attrs.cy,\n this.resize,\n this.model\n ),\n new Thumb(\n 'd',\n () => this.attrs.dx,\n () => this.attrs.dy,\n this.resize,\n this.model\n ),\n ]\n if (this.attrs.lineWidth == null) {\n this.attrs.lineWidth = 1\n }\n this.scale(this.getBoundingPointKeys())\n }\n\n getDefaults() {\n const { ElementSettings } = this.getChartLayoutSettings()\n return {\n fill: ElementSettings.defaultFill,\n border: {\n width: 1,\n color: ElementSettings.Colors.border,\n },\n } as Partial\n }\n\n getBoundingPointKeys = () => ({\n x: ['xx', 'ax', 'bx', 'cx', 'dx'],\n y: ['xy', 'ay', 'by', 'cy', 'dy'],\n })\n\n renderContent(context: CanvasRenderingContext2D) {\n const { xx, xy, ax, ay, bx, by, cx, cy, dx, dy } = this.scaled\n const roundedXY = getRoundedObject({ xx, xy, ax, ay, bx, by, cx, cy, dx, dy })\n\n context.set('fillStyle', this.attrs.fill)\n context.set('lineWidth', this.attrs.border.width)\n context.set('strokeStyle', this.attrs.border.color)\n\n const offset = getOffsetFromLineWidth(this.attrs.border.width)\n context.translate(offset, offset)\n\n context.beginPath()\n context.moveTo(roundedXY.xx, roundedXY.xy)\n context.lineTo(roundedXY.ax, roundedXY.ay)\n context.lineTo(roundedXY.bx, roundedXY.by)\n context.lineTo(roundedXY.xx, roundedXY.xy)\n context.fill()\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n context.beginPath()\n context.moveTo(roundedXY.bx, roundedXY.by)\n context.lineTo(roundedXY.cx, roundedXY.cy)\n context.lineTo(roundedXY.dx, roundedXY.dy)\n context.lineTo(roundedXY.bx, roundedXY.by)\n context.fill()\n if ((this.attrs.border != null ? this.attrs.border.width : undefined) !== 0) {\n context.stroke()\n }\n\n context.beginPath()\n context.moveTo(roundedXY.ax, roundedXY.ay)\n context.lineTo(roundedXY.cx, roundedXY.cy)\n context.moveTo(roundedXY.xx, roundedXY.xy)\n context.lineTo(roundedXY.dx, roundedXY.dy)\n context.stroke()\n\n const text = new Text(\n {\n font: { size: 8, style: 'bold' },\n lineHeight: 8,\n padding: {\n top: 2,\n right: 2,\n bottom: 2,\n left: 2,\n },\n textBaseline: TextBaseline.middle,\n // @ts-expect-error - TODO - textAlign doesnt have `middle` value\n textAlign: 'middle',\n fillStyle: '#ffffff',\n background: this.attrs.fill || '#000000',\n },\n this.model\n )\n\n for (const t of Array.from('xabcd')) {\n text\n .set({\n text: t.toUpperCase(),\n x: roundedXY[(t + 'x') as xPoints] - 6,\n y: roundedXY[(t + 'y') as yPoints] + 12,\n } as Partial)\n .render(context)\n }\n\n const retLabel = (y1: string, y2: string, y3: string) => {\n const len = Math.abs(this.attrs[(y1 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints])\n const ret = Math.abs(this.attrs[(y3 + 'y') as yPoints] - this.attrs[(y2 + 'y') as yPoints]) / len\n const x = (roundedXY[(y1 + 'x') as xPoints] + roundedXY[(y3 + 'x') as xPoints]) / 2\n const y = (roundedXY[(y1 + 'y') as yPoints] + roundedXY[(y3 + 'y') as yPoints]) / 2\n return text\n .set({\n text: ret.toFixed(3),\n x,\n y,\n })\n .render(context)\n }\n\n retLabel('x', 'a', 'b')\n retLabel('a', 'b', 'c')\n retLabel('b', 'c', 'd')\n retLabel('x', 'a', 'd')\n\n if (this.getShouldRenderThumbs()) {\n this.renderThumbs(context)\n }\n context.translate(offset * -1, offset * -1)\n }\n\n moveBy(x: number, y: number) {\n for (const t of Array.from('xabcd')) {\n this.attrs[(t + 'x') as xPoints] += x\n this.attrs[(t + 'y') as yPoints] += y\n }\n }\n\n resize({ type, difX, difY }: ResizeByThumbWithTypeAndDifs) {\n this.attrs[(type + 'x') as xPoints] += difX\n return (this.attrs[(type + 'y') as yPoints] += difY)\n }\n\n isInArea(area: PaneArea) {\n if (super.isDrawingElementLockedOrInvisible()) return false\n let t\n const xab = (() => {\n const result = []\n for (t of Array.from('xab')) {\n result.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\n }\n return result\n })()\n const bcd = (() => {\n const result1 = []\n for (t of Array.from('bcd')) {\n result1.push({ x: this.scaled[(t + 'x') as xPoints], y: this.scaled[(t + 'y') as yPoints] })\n }\n return result1\n })()\n if (math.pointInPolygon(area.scaled, xab) || math.pointInPolygon(area.scaled, bcd)) {\n return true\n }\n return super.isInArea(area)\n }\n}\n\nXABCD.prototype.modalConfig = {\n inputs: [\n { type: 'background', name: 'fill' },\n { type: 'border', name: 'border', min: 1 },\n ],\n}\n\nexport default XABCD\n","import { getContextWithCache } from '../lib/shims'\nimport Utils from '../utils'\nimport { captureException, getIsSSr } from '../utils/helpers'\n\nclass Cache {\n constructor() {\n this.canvas = getIsSSr() ? null : document.createElement('canvas')\n }\n\n set(callback, width, height) {\n this.callback = callback\n this.width = width\n this.height = height\n this.rendered = false\n }\n\n render(context, x, y) {\n if (x == null) {\n x = 0\n }\n if (y == null) {\n y = 0\n }\n if (!this.rendered) {\n this.refresh()\n }\n if (this.width < 1 || this.height < 1) {\n return\n }\n\n try {\n if (this.ratio >= 1 && this.canvas) {\n context.drawImage(\n this.canvas,\n 0,\n 0,\n ~~(this.width * this.ratio),\n ~~(this.height * this.ratio),\n x,\n y,\n this.width,\n this.height\n )\n } else {\n context.save()\n context.translate(x, y)\n this.callback(context)\n context.restore()\n }\n } catch (e) {\n captureException(\n e,\n this.canvas\n ? {\n extra: {\n width: this.width,\n height: this.height,\n ratio: this.ratio,\n cWidth: this.canvas.width,\n cHeight: this.canvas.height,\n sWidth: window.screen.width,\n sHeight: window.screen.height,\n },\n }\n : {}\n )\n }\n }\n\n refresh() {\n if (getIsSSr()) {\n return\n }\n this.canvas.width = this.width\n this.canvas.height = this.height\n this.context = getContextWithCache(this.canvas)\n this.ratio = Utils.getScaleRatio()\n Utils.setSizeOnCanvasElement({ canvasElement: this.canvas, width: this.width, height: this.height })\n this.context.scale(this.ratio, this.ratio)\n\n this.callback(this.context)\n this.rendered = true\n }\n}\n\nexport default Cache\n","import { ObjectHash, Theme } from '../../../types/shared'\nimport { TextAlign, TextBaseline } from '../../constants/common'\nimport { IChartThemeColors, IElementThemeColors, IIndicatorThemeColors } from '../constants'\n\nexport enum OHLCType {\n singleLine = 'singleLine',\n dateOnly = 'dateOnly',\n timeOnly = 'timeOnly',\n}\n\nexport interface IMargin {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ninterface IPadding {\n top?: number\n right?: number\n bottom?: number\n left?: number\n}\n\ninterface IGenericText {\n margin: IMargin\n font: IFont\n}\n\ninterface IFont {\n size?: number\n style?: string\n weight?: string\n family?: string\n lineHeight?: number\n padding?: IPadding\n baseline?: TextBaseline\n textAlign?: TextAlign\n}\n\ninterface ISettingsGeneralBase {\n Colors: IChartThemeColors\n}\n\nexport interface ISettingsCenterBase {\n barWidth: number\n barMargin: number\n border: number\n volumeHeight?: number\n}\n\ninterface ISettingsTopBase {\n height: number\n}\n\ninterface ISettingsBottomBase {\n height: number\n}\n\ninterface ISettingsLeftBase {\n width: number\n}\n\ninterface ISettingsRightBase {\n width: number\n}\n\nexport interface ISettings {\n ChartSettings: IChartSettings\n IndicatorSettings: IIndicatorSettings\n MarketSentimentSettings: IMarketSentimentChartSettings\n ColorsSettings: Array\n ThumbSettings: IThumbSettings\n ElementSettings: IElementSettings\n}\n\nexport interface IChartSettings {\n general: IChartGeneral\n center: ISettingsCenterBase\n top: IChartTop\n bottom: IChartBottom\n left: IChartLeft\n right: IChartRight\n}\n\ninterface IChartGeneral {\n settingsHeight: number\n tickerTimeframeChangeHeight: number\n Colors: IChartThemeColors & ObjectHash\n}\n\ninterface IChartTop extends ISettingsTopBase {\n baseline: TextBaseline\n ticker: IGenericText\n ohlc: IOHLC\n change: IGenericText\n}\n\ninterface IOHLC extends IGenericText {\n type?: OHLCType\n}\n\ninterface IChartBottom extends ISettingsBottomBase {\n baseline: TextBaseline\n axis: IGenericText\n}\n\ninterface IChartLeft extends ISettingsLeftBase {\n overlayLabel: IOverlayLabel\n timeframe: IGenericText\n volumeAxis: IGenericText\n}\n\ninterface IOverlayLabel extends IGenericText {\n labelSpacing: number\n}\n\ninterface IChartRight extends ISettingsRightBase {\n axis: IGenericText\n}\n\ninterface IIndicatorSettings {\n general: IIndicatorGeneral\n center: ISettingsCenterBase\n top: ISettingsTopBase\n bottom: ISettingsBottomBase\n left: IIndicatorLeft\n right: IIndicatorRight\n}\n\ninterface IIndicatorRight extends ISettingsRightBase {\n axis: IGenericText\n}\n\ninterface IIndicatorLeft extends ISettingsLeftBase {\n indicatorLabel: IIndicatorLabel\n}\n\ninterface IIndicatorLabel extends IGenericText {\n labelSpacing: number\n}\n\ninterface IIndicatorGeneral {\n Colors: IIndicatorThemeColors\n height: number\n}\n\ninterface IMarketSentimentChartSettings {\n general: ISettingsGeneralBase\n center: ISettingsCenterBase\n top: ISettingsTopBase\n bottom: ISettingsBottomBase\n left: ISettingsLeftBase\n right: ISettingsRightBase\n}\n\ninterface IThumbSettings {\n size: number\n touchSize: number\n color: string\n borderWidth: number\n borderColor: string\n}\n\ninterface IElementSettings {\n Colors: IElementThemeColors\n defaultFill: string\n defaultTransparentFill: string\n}\n","export enum ChartMinWidthBreakpoints {\n xs = 0,\n s = 480,\n m = 768,\n l = 1024,\n}\n\nexport function getChartBreakpoints(chartWidthInPx: number) {\n return {\n isXs: chartWidthInPx >= ChartMinWidthBreakpoints.xs,\n isS: chartWidthInPx >= ChartMinWidthBreakpoints.s,\n isM: chartWidthInPx >= ChartMinWidthBreakpoints.m,\n isL: chartWidthInPx >= ChartMinWidthBreakpoints.l,\n }\n}\n","import * as d3 from 'd3'\nimport merge from 'lodash.merge'\n\nimport {\n ChartConfigChartPaneElement,\n CustomSpineEvents,\n Instrument,\n Maybe,\n RequireByKey,\n Theme,\n} from '../../types/shared'\nimport Cache from '../canvas/cache'\nimport Element from '../canvas/element'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport {\n CHART_MARGIN,\n ChartElementType,\n FONT_SIZE,\n IndicatorType,\n IntradayTimeframeInterval,\n LINE_HEIGHT,\n MONTHS,\n OFFSET,\n PADDING,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TIMEFRAMES_WITH_PRE_MARKET,\n TextAlign,\n TextBaseline,\n getTimeframeLabel,\n} from '../constants/common'\nimport {\n getIsSmallIndexChart,\n getPercentageFromValue,\n getTranslate,\n getValueFromPercentage,\n} from '../controllers/renderUtils'\nimport Chart from '../models/chart'\nimport { getColorOverwrites } from '../models/chart_settings'\nimport { ISettings, OHLCType } from '../models/chart_settings/interfaces'\nimport { darkerWickColors, thinBarColorsOverride } from '../models/constants'\nimport mouseModel from '../models/mouse'\nimport PaneModel, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Overlay from '../overlays/overlay'\nimport { overlaysByType } from '../overlays/overlays'\nimport utils, { dateFromDateString, isRedesignedPage, numberToStringWithUnitsSuffix } from '../utils'\nimport {\n ITickerChange,\n getBarWidthWithMargin,\n getBarWidthWithMarginByParts,\n getChangeColor,\n getShouldUseDarkerWickColors,\n getTickerChange,\n getTickerChangeFromCloseValues,\n getVirtualTimeframeTradedDates,\n renderCross,\n round,\n unmountCanvas,\n} from '../utils/chart'\nimport { convertColorToHEX, getHEXWithSpecificAplha, getHSVAFromColor, stringifyHSVAColor } from '../utils/colors'\nimport { setElementCursor } from '../utils/cursor'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getChartBreakpoints } from './utils'\n\nexport interface BaseChartAttrs {\n overlays: Required['overlays']\n}\n\ntype OhlcLineElements = Array<{ text: string; color: string } | 'space'>\n\ninterface LastOHLCAttrs {\n text: string\n x: number\n y: number\n width: number\n textBaseline: TextBaseline\n textAlign: TextAlign\n}\n\ninterface IRenderOHLCParameters {\n context: CanvasRenderingContext2D\n date: Maybe\n open?: Maybe\n high?: Maybe\n low?: Maybe\n close?: Maybe\n volume?: Maybe\n afterHour?: string\n isSmallIndexChart?: boolean\n isNewestOHLC?: boolean\n directRender?: boolean\n time?: string\n changePercentage?: Maybe\n}\n\ninterface XAxisLabel {\n x: number\n text: string\n textWidth: number\n hasPriority?: boolean\n allowedOverflow?: number\n}\n\nconst getDateString = ({ date, timeframe }: { date: Date; timeframe: TIMEFRAME }) => {\n let dateString = ''\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n switch (timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n case TIMEFRAME.i10:\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n const t =\n (((date.getHours() + 11) % 12) + 1).toString().padLeft('00') +\n ':' +\n date.getMinutes().toString().padLeft('00') +\n (date.getHours() < 12 ? 'AM' : 'PM')\n dateString = `${MONTHS[month]} ${day} ${t}`\n break\n case TIMEFRAME.d:\n case TIMEFRAME.w:\n dateString = `${MONTHS[month]} ${day}`\n break\n case TIMEFRAME.m:\n dateString = `${MONTHS[month]} ${year}`\n break\n default:\n break\n }\n\n return dateString\n}\n\nconst getIsOverlapping = ({\n x,\n textWidth,\n renderedLabelRanges,\n}: {\n x: number\n textWidth: number\n renderedLabelRanges: Array<{ from: number; to: number }>\n}) =>\n renderedLabelRanges.some(({ from, to }) => {\n const minX = x - textWidth / 2\n const maxX = x + textWidth / 2\n return (from < maxX && maxX < to) || (from < minX && minX < to)\n })\n\nconst SMALL_INDEX_CHART_LABEL_BUFFER = 15\n\nconst gray300 = tailwindColors.gray[300]\n\nclass BaseChart extends Element {\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\n return this.model.width - ChartSettings.left.width - ChartSettings.right.width\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const { ChartSettings } = this.getChartLayoutSettings() as ISettings\n return this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\n },\n })\n }\n\n static getNumOfBarsBuffer({ overlays }: RequireByKey) {\n return Math.max(0, ...overlays.map((overlay) => overlaysByType[overlay.type].getNumOfBarsBuffer(overlay)))\n }\n\n static label = 'Chart'\n static iconName = ''\n\n paneModel: PaneModel\n model: Chart\n data: Quote\n specificChartFunctionality: SpecificChartFunctionality\n tickerWidth = 0\n changeWidth = 0\n lastOhlc: Array> = []\n overlays: Overlay[] = []\n isLargeChart?: boolean\n shouldRenderVolume = true\n afterChange: {\n x: number\n y: number\n width: number\n } | null = null\n\n declare setupAxisTimeFrame: string\n declare volumeFY: d3.ScaleLinear\n declare tickerText: Text\n declare baseCache: Cache\n declare leftOffset: number\n declare context: CanvasRenderingContext2D\n declare width: number\n declare height: number\n declare isMobile: boolean\n\n constructor(values: Partial, paneModel: PaneModel) {\n super(values, paneModel)\n\n this.paneModel = paneModel\n this.model = this.paneModel.chart()\n this.data = this.model.quote()\n const chartLayoutModel = this.model.chart_layout()\n this.specificChartFunctionality = chartLayoutModel.specificChartFunctionality\n this.isLargeChart = chartLayoutModel.isLargeChart\n this.isMobile = utils.isMobile(true)\n\n this.overlays = []\n if (values.overlays) {\n for (const overlayDefinition of values.overlays) {\n // overlayDefinition.color coming from DB is always string however overlays\n // internaly didn't use format as in db (type, color, period) but rather\n // more overlay specific parameters eg. (BB: topColor, bottomColor, etc.)\n // thus overlayDefinition.color might be undefined\n // approach could be reworked in https://github.com/finvizhq/charts/issues/770\n // but for now (!overlayDefinition.color) check solve issue as well\n const overlay = overlaysByType[overlayDefinition.type].fromObject(\n {\n ...overlayDefinition,\n color:\n !overlayDefinition.color || overlayDefinition.color.includes('|')\n ? ''\n : convertColorToHEX(overlayDefinition.color),\n },\n this.paneModel\n )\n this.addOverlay(overlay)\n }\n delete values.overlays\n }\n\n this.renderYAxis = this.renderYAxis.bind(this)\n this.renderText = this.renderText.bind(this)\n this.renderCrossText = this.renderCrossText.bind(this)\n this.setupCache = this.setupCache.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n\n // this.paneModel.bind('update', this.setupAxis.bind(this))\n this.paneModel.bind('update', this.setupCache)\n this.paneModel.bind('change', this.trigger.bind(this, 'change'))\n this.model = this.paneModel.chart()\n // this.model.bind('change', this.setupAxis.bind(this))\n this.model.bind('change', this.setupCache)\n this.model.bind('change', this.trigger.bind(this, 'change'))\n this.model.bind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\n this.model.bind('destroy', () => {\n this.model.unbind('change', this.setupCache)\n this.model.unbind(CustomSpineEvents.IndicatorsChange, this.handleIndicatorsChange.bind(this))\n mouseModel.unbind('change', mouseModelChangeHandler)\n unmountCanvas(this.baseCache.canvas)\n })\n mouseModel.bind('change', mouseModelChangeHandler)\n\n this.model.chart_layout().bind('theme', this.setupCache)\n this.model.chart_layout().bind('update', this.updateShouldRenderVolume.bind(this))\n\n this.setupCache()\n }\n\n renderChart() {\n throw Error('Implement renderChart')\n }\n\n render(context: CanvasRenderingContext2D) {\n this.data = this.model.quote()\n this.leftOffset = this.model.leftOffset\n this.context = context\n\n if (this.data.close.length === 0) {\n this.renderChartNotAvailable()\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\n return\n }\n\n this.context.save()\n this.clip()\n this.renderVolume()\n this.renderChart()\n this.renderOverlays()\n this.renderPrevClose()\n this.renderFadeExtendedHours()\n this.context.restore()\n if (!this.getIsRedesignedChart()) this.renderTicker(context)\n }\n\n renderGrid(context: CanvasRenderingContext2D) {\n this.data = this.model.quote()\n this.leftOffset = this.model.leftOffset\n this.context = context\n // text, xAxis, volumeAxis\n this.renderXAxis()\n this.baseCache.render(context)\n }\n\n renderTicker(context: CanvasRenderingContext2D) {\n if (this.tickerText) {\n const { ChartSettings } = this.getChartLayoutSettings()\n context.translate(ChartSettings.left.width, 0)\n this.tickerText.render(context)\n\n if (getIsSmallIndexChart(this.specificChartFunctionality) && this.data.ticker === 'RUSSELL 2000') {\n const { Colors } = ChartSettings.general\n new Text(\n {\n text: 'ETF',\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top! + FONT_SIZE.XXS + OFFSET.XXS,\n font: { size: FONT_SIZE.XXS },\n fillStyle: Colors.text,\n textBaseline: ChartSettings.top.baseline,\n },\n this.paneModel\n ).render(context)\n }\n\n context.translate(-ChartSettings.left.width, 0)\n }\n }\n\n renderTimeframe(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const quote = this.model.quote()\n const y = (this.height - this.volumeFY.range()[1] - 4) / 2\n\n return new Text(\n {\n text: quote.instrument === Instrument.Group ? 'YEAR PERFORMANCE %' : getTimeframeLabel(quote.timeframe),\n x: ChartSettings.left.timeframe.margin.left,\n y: ChartSettings.top.height + y + (ChartSettings.left.timeframe.margin.top ?? 0),\n angle: -90,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.timeframe.font),\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n context.save()\n context.translate(ChartSettings.left.width, 0)\n\n if (!getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.tickerText = new Text(\n {\n text: this.data.name || this.data.ticker,\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.ticker.font),\n textBaseline: ChartSettings.top.baseline,\n fillStyle: Colors.text,\n },\n this.paneModel\n )\n } else {\n this.tickerText = new Text(\n {\n text: this.data.name || this.data.ticker,\n x: ChartSettings.top.ticker.margin.left,\n y: ChartSettings.top.ticker.margin.top,\n font: { size: FONT_SIZE.L, style: 'bold' },\n fillStyle: Colors.text,\n },\n this.paneModel\n )\n }\n this.tickerWidth = this.tickerText.measure(context)\n\n // render watermark on backend chart\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n new Text(\n {\n text: '© finviz.com',\n x: this.width + ChartSettings.right.width - 2,\n y: 1,\n font: { size: FONT_SIZE.XS },\n textAlign: TextAlign.right,\n textBaseline: TextBaseline.top,\n fillStyle: 'rgb(136, 193, 233)',\n },\n this.paneModel\n ).render(context)\n }\n\n if (!this.getIsRedesignedChart()) {\n this.renderChange({ context })\n if (!this.lastOhlc[0]) {\n this.getOHLC({ context, directRender: false })\n }\n this.getOHLC({ context })\n }\n\n context.restore()\n if (!this.getIsRedesignedChart() && !getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderTimeframe(context)\n }\n }\n\n getOHLC({\n context,\n directRender = true,\n data,\n date,\n dateString = null,\n changePercentage = null,\n }: {\n context: CanvasRenderingContext2D\n directRender?: boolean\n data?: {\n open?: string\n high?: string\n low?: string\n close?: string\n volume?: string\n }\n date?: Date\n dateString?: string | null\n changePercentage?: ITickerChange | null\n }) {\n if (!this.data.lastDate) return\n\n // modulo \"parsing\" is 100% faster than with str.slice()\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${this.data.lastDate % 100}` // YYYYMMDD / 20211118 => Nov 18\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderOHLC({\n context,\n date: lastDate,\n isSmallIndexChart: true,\n isNewestOHLC: true,\n directRender,\n })\n } else if (data && date) {\n this.renderOHLC({\n context,\n date: getDateString({ date, timeframe: this.data.timeframe }),\n open: data.open,\n high: data.high,\n low: data.low,\n close: data.close,\n volume: numberToStringWithUnitsSuffix(Number(data.volume)),\n directRender,\n changePercentage,\n })\n } else if (dateString !== null) {\n this.renderOHLC({\n context,\n date: dateString,\n open: null,\n high: null,\n low: null,\n close: null,\n volume: null,\n directRender,\n })\n } else {\n this.renderOHLC({\n context,\n date: lastDate,\n afterHour:\n Number.isFinite(this.data.afterClose) && this.data.afterClose !== this.data.lastClose\n ? this.roundOhlc(this.data.afterClose)\n : undefined,\n volume: numberToStringWithUnitsSuffix(this.data.lastVolume),\n isNewestOHLC: true,\n time: utils.dateFromUnixTimestamp(this.data.date.last()!).toLocaleTimeString('en-US', {\n hour: '2-digit',\n minute: '2-digit',\n }),\n directRender,\n ...this.getRoundedLastData(),\n })\n }\n }\n\n getRoundedLastData() {\n return {\n open: this.roundOhlc(this.data.lastOpen),\n high: this.roundOhlc(this.data.lastHigh),\n low: this.roundOhlc(this.data.lastLow),\n close: this.roundOhlc(this.data.lastClose),\n }\n }\n\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\n if (!this.getIsRedesignedChart()) {\n this.renderOverlaysLabelsQuotePage(context)\n } else if (this.data.close.length !== 0) {\n this.renderOverlaysLabelsChartsPage(context)\n }\n }\n\n renderOverlaysLabelsQuotePage(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const text = new Text(\n {\n x: ChartSettings.left.overlayLabel.margin.left,\n y: ChartSettings.top.height + ChartSettings.left.overlayLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.left.overlayLabel.font),\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n for (const overlay of this.overlays) {\n if (!overlay.isRenderedOverlaysLabel()) {\n continue\n }\n text\n .set({\n text: overlay.toString(),\n y: text.get('y')! + ChartSettings.left.overlayLabel.labelSpacing,\n fillStyle: overlay.getLabelColor(),\n })\n .render(context)\n }\n }\n\n getYAxisLeftMargin() {\n if (this.data.instrument === Instrument.Crypto && this.data.lastClose <= 0.001) {\n return 3\n }\n return 8\n }\n\n getYAxisLastCloseLabel({ lastClose, firstVisibleClose }: { lastClose: number; firstVisibleClose?: number | null }) {\n if (typeof firstVisibleClose === 'number' && this.model.scale === ScaleType.Percentage) {\n return `${this.round(getPercentageFromValue({ number: lastClose, base: firstVisibleClose }), 2)}%`\n }\n return this.round(lastClose)\n }\n\n renderYAxis(\n context: CanvasRenderingContext2D,\n { lastClose }: RequireByKey, 'lastClose'> = this.data,\n renderLabels = true\n ) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const contentHeight = this.paneModel.height - ChartSettings.top.height - ChartSettings.bottom.height\n let y, lineTicks, textTicks, lastCloseLabel\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\n translate.do()\n const tickCount = Math.floor(this.paneModel.height / 35)\n const minMax = this.getMinMax()\n const { firstVisibleClose } = minMax\n let stepPrice = 0\n let placesAxis\n\n switch (this.model.scale) {\n case ScaleType.Percentage: {\n if (!firstVisibleClose) return\n\n const scaleRange = this.paneModel.scaleRange\n const { min, max } = scaleRange || minMax\n\n this.model.updateAttribute('firstBarClose', firstVisibleClose)\n\n const minPerc = getPercentageFromValue({ number: min, base: firstVisibleClose })\n const maxPerc = getPercentageFromValue({ number: max, base: firstVisibleClose })\n\n const percScale = d3.scaleLinear().range([0, contentHeight]).domain([maxPerc, minPerc]).nice(10)\n textTicks = percScale.ticks(Math.min(tickCount, 9))\n lineTicks = textTicks.map((tick) => getValueFromPercentage({ number: tick, base: firstVisibleClose }))\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\n break\n }\n case ScaleType.Logarithmic: {\n if (!firstVisibleClose) return\n\n const scaleRange = this.paneModel.scaleRange\n const { min, max } = scaleRange || minMax\n lineTicks = [Math.floor(min)]\n const pixelGap = 30\n\n const negativeScale = []\n if (min < 0) {\n let previousNegativeTick = Math.min(0, max)\n while (this.paneModel.scale.y(previousNegativeTick) + pixelGap < this.paneModel.scale.y(min)) {\n const tick = this.paneModel.scale.y.invert(this.paneModel.scale.y(previousNegativeTick) + pixelGap)\n const range = d3.nice(-previousNegativeTick, -tick, 2)\n previousNegativeTick = -range[range.length - 1]\n negativeScale.unshift(previousNegativeTick)\n }\n }\n\n const positiveScale = []\n if (max > 0) {\n positiveScale.push(Math.max(this.paneModel.scale.y.invert(this.paneModel.scale.y(min) + pixelGap), 0))\n }\n while (this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap > 0) {\n const tick = this.paneModel.scale.y.invert(\n this.paneModel.scale.y(positiveScale[positiveScale.length - 1]) - pixelGap\n )\n const range = d3.nice(positiveScale[positiveScale.length - 1], tick, 2)\n positiveScale.push(range[range.length - 1])\n }\n lineTicks = [...negativeScale, ...positiveScale]\n textTicks = lineTicks\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\n break\n }\n default:\n // default to linear scale type\n lineTicks = this.paneModel.scale.y.ticks(Math.min(tickCount, 9))\n textTicks = lineTicks\n lastCloseLabel = this.getYAxisLastCloseLabel({ lastClose })\n }\n\n if (textTicks.length >= 2) {\n stepPrice = Math.abs(textTicks[1] - textTicks[0])\n }\n if (stepPrice > 10 || getIsSmallIndexChart(this.specificChartFunctionality)) {\n placesAxis = 0\n }\n\n const getYLineText = (val: number, places?: number) => {\n switch (this.model.scale) {\n case ScaleType.Percentage:\n return `${val}%`\n default:\n return this.round(val, places)\n }\n }\n\n const yTickText = new Text(\n {\n x: this.width + this.getYAxisLeftMargin() + ChartSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n )\n\n let yTickLine = this.getYLine()\n const resetYTicksStyles = () => {\n yTickText.set({\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n })\n yTickLine = this.getYLine()\n }\n for (let i = 0; i < lineTicks.length; i++) {\n y = Math.round(this.fy(lineTicks[i]))\n if (y < 0 || y > contentHeight) continue\n if (y === contentHeight) y -= 1 // due pixel perfect rendering of lines, last line is moved outside of \"chart area\" because of 0.5px translate, to compensate for this we subtract 1px\n yTickLine.set({ y1: y, y2: y })\n yTickText.set({\n text: getYLineText(textTicks[i], placesAxis),\n y,\n })\n if (this.model.scale === ScaleType.Percentage && textTicks[i] === 0) {\n yTickLine.set({ strokeStyle: Colors.text })\n yTickText.set({\n font: { weight: 'bold', size: yTickText.attrs.font.size },\n fillStyle: Colors.percentageZeroLineText,\n })\n yTickLine.render(context)\n yTickText.render(context)\n resetYTicksStyles()\n } else {\n yTickLine.render(context)\n yTickText.render(context)\n }\n }\n translate.undo()\n\n if (renderLabels) {\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: lastCloseLabel })\n // if (typeof this.data.afterClose === 'number') {\n // this.renderYAxisLabel({\n // context,\n // yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\n // mainLabelValue: lastClose,\n // secondaryLabelValue: this.data.afterClose,\n // }),\n // label: this.getYAxisLastCloseLabel({ lastClose: this.data.afterClose, firstVisibleClose }),\n // background: this.getSecondaryLabelBackgroundColor(),\n // })\n // }\n }\n }\n\n getSecondaryLabelBackgroundColor() {\n return stringifyHSVAColor(\n {\n ...getHSVAFromColor(this.getChartLayoutSettings().ChartSettings.general.Colors.currentBackground),\n s: 0.3,\n },\n 'hex'\n )\n }\n\n getYAxisSecondaryLabelYCoordinate({\n mainLabelValue,\n secondaryLabelValue,\n }: {\n mainLabelValue: number\n secondaryLabelValue: number\n }) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { lineHeight } = ChartSettings.right.axis.font\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\n\n const direction = Math.sign(mainLabelValue - secondaryLabelValue) || 1\n const offset = (lineHeight ?? LINE_HEIGHT.S) + (padding.top ?? PADDING.XXS) + (padding.bottom ?? PADDING.XXS)\n const mainLabelValuePosition = Math.round(this.fy(mainLabelValue))\n const secondaryLabelValuePosition = Math.round(this.fy(secondaryLabelValue))\n const offsetedY = mainLabelValuePosition + offset * direction\n\n return Math.abs(secondaryLabelValuePosition - mainLabelValuePosition) > offset\n ? secondaryLabelValuePosition\n : offsetedY\n }\n\n renderYAxisLabel({\n context,\n yCoordinate,\n label,\n background,\n }: {\n context: CanvasRenderingContext2D\n yCoordinate: number\n label: string\n background?: string\n }) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({ context, xOffset: ChartSettings.left.width, yOffset: ChartSettings.top.height })\n const { Colors } = ChartSettings.general\n const { size, lineHeight } = ChartSettings.right.axis.font\n const padding = Text.getMergedPropsWithDefaults('padding', ChartSettings.right.axis.font.padding)\n\n translate.do()\n new Text(\n {\n text: label,\n x: this.width + this.getYAxisLeftMargin() - padding.left + ChartSettings.right.axis.margin.left!,\n y: yCoordinate,\n font: Text.getMergedPropsWithDefaults('font', { size, style: 'bold' }),\n lineHeight,\n padding,\n textBaseline: TextBaseline.middle,\n fillStyle:\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen ? 'black' : Colors.currentText,\n background: background || Colors.currentBackground,\n },\n this.paneModel\n ).render(context)\n translate.undo()\n }\n\n renderXAxis() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n this.context.save()\n if (\n this.data.getDrawDays() !== 1 &&\n !getIsSmallIndexChart(this.specificChartFunctionality) &&\n this.data.instrument !== Instrument.MarketSentiment\n ) {\n this.clip(true)\n }\n this.context.translate(ChartSettings.left.width, ChartSettings.top.height)\n const text = new Text(\n {\n y: this.height + ChartSettings.bottom.axis.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.bottom.axis.font.size }),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.top,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n switch (this.data.timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n if (this.data.instrument === Instrument.Stock) {\n if (\n this.type === ChartElementType.LineChart &&\n this.specificChartFunctionality === SpecificChartFunctionality.offScreen &&\n this.data.timeframe === 'i5'\n ) {\n this.render15MinXAxis(text)\n } else {\n this.renderIntradayXAxis(text)\n }\n } else {\n this.renderIntradayXAxisFutures(text)\n }\n break\n case TIMEFRAME.i10:\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n this.renderIntradayXAxis(text)\n } else {\n this.render15MinXAxis(text)\n }\n break\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n this.render15MinXAxis(text)\n break\n case TIMEFRAME.d:\n this.renderDailyXAxis(text)\n break\n case TIMEFRAME.w:\n this.renderWeeklyXAxis(text)\n break\n case TIMEFRAME.m:\n this.renderMonthlyXAxis(text)\n break\n default:\n break\n }\n this.context.restore()\n }\n\n isXPointVisible(x: number, buffer = 0) {\n return x >= 0 - buffer && x <= this.width + buffer\n }\n\n renderXAxisLabels({\n labels,\n textRenderer,\n allowedOverflow = 0,\n }: {\n labels: Omit[]\n textRenderer: Text\n allowedOverflow?: number\n }) {\n const sortedLabels: XAxisLabel[] = []\n const renderedLabelRanges: Array<{ from: number; to: number }> = []\n labels.reverse().forEach((label) => {\n textRenderer.set({ text: label.text })\n const textWidth = Math.floor(textRenderer.measure(this.context))\n const newLabel = { ...label, textWidth }\n if (label.hasPriority) {\n sortedLabels.unshift(newLabel)\n } else {\n sortedLabels.push(newLabel)\n }\n })\n\n sortedLabels.forEach(({ x, text, textWidth }) => {\n if (!this.isXPointVisible(x, allowedOverflow)) {\n return\n }\n const halfOfTextWidth = textWidth / 2\n const overflowLeft = x - halfOfTextWidth + allowedOverflow\n const overflowRight = this.width - (x + halfOfTextWidth) + allowedOverflow\n let labelX = x\n if (overflowLeft < 0) {\n labelX = Math.round(x - overflowLeft)\n } else if (overflowRight < 0) {\n labelX = Math.round(x + overflowRight)\n }\n if (getIsOverlapping({ x: labelX, textWidth, renderedLabelRanges })) {\n return\n }\n renderedLabelRanges.push({\n from: labelX - halfOfTextWidth - OFFSET.M,\n to: labelX + halfOfTextWidth + OFFSET.M,\n })\n textRenderer.set({ text, x: labelX })\n textRenderer.render(this.context)\n })\n }\n\n renderIntradayXAxis(text: Text) {\n const interval = IntradayTimeframeInterval[this.data.timeframe as keyof typeof IntradayTimeframeInterval]\n const marketStartHour = ~~(this.data.marketStartMinutes / 60)\n let marketEndHour = 15 + Math.ceil(this.data.aftermarketLengthMinutes / 60)\n const labels = []\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n marketEndHour = 16\n }\n\n const xLine = this.getXLine()\n const barWidth = getBarWidthWithMargin({\n zoomFactor: this.model.zoomFactor,\n chartLayout: this.model.chart_layout(),\n })\n\n const dayToOffset = this.data.getDayToOffset()\n const isSmallIndexChart = getIsSmallIndexChart(this.specificChartFunctionality)\n const allowedOverflow = isSmallIndexChart ? SMALL_INDEX_CHART_LABEL_BUFFER : 0\n for (const day in dayToOffset) {\n const dayIndex = dayToOffset[day]\n const date = dateFromDateString(day)\n\n for (let i = marketStartHour; i <= marketEndHour; i++) {\n let x =\n ((i * 60 - this.data.marketStartMinutes) / interval) * barWidth +\n dayIndex * (this.data.drawMinutesPerDay / interval) * barWidth +\n this.leftOffset\n if (!this.isXPointVisible(x, allowedOverflow)) {\n continue\n }\n let roundedX = Math.round(x)\n\n if (i === marketStartHour) {\n if (isSmallIndexChart) {\n roundedX = Math.round(x - 3 + (30 / interval) * barWidth)\n // ~9:30AM\n xLine\n .set({\n x1: roundedX,\n x2: roundedX,\n })\n .render(this.context)\n continue\n }\n if (this.data.premarketLengthMinutes === 0) {\n // If there is no premarket, day starts at 9:30 AM\n x += (30 / interval) * barWidth\n }\n roundedX = Math.round(x)\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\n labels.push({\n hasPriority: true,\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n x: roundedX,\n })\n } else {\n xLine.set({ x1: roundedX, x2: roundedX }).render(this.context)\n labels.push({\n text: ((i + 11) % 12) + 1 + (i < 12 ? 'AM' : 'PM'),\n x: roundedX,\n })\n }\n }\n }\n this.renderXAxisLabels({ labels, textRenderer: text, allowedOverflow })\n }\n\n renderIntradayXAxisFutures(textRenderer: Text) {\n let lastDay = ''\n let lastHours = NaN\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\n const day = date.getDate() + '-' + date.getMonth()\n const hours = date.getHours()\n const x = Math.round(this.fx(i) + this.leftOffset)\n\n if (day !== lastDay) {\n lastDay = day\n lastHours = hours\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n x,\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n })\n } else if (hours % 2 === 0 && hours !== lastHours) {\n lastHours = hours\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({ x, text: ((hours + 11) % 12) + 1 + (hours < 12 ? 'AM' : 'PM') })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n render15MinXAxis(textRenderer: Text) {\n let lastDay = ''\n let x = 0\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = utils.dateFromUnixTimestamp(this.data.date[i])\n const day = date.getDate() + '-' + date.getMonth()\n if (day !== lastDay) {\n lastDay = day\n if (this.data.instrument === Instrument.Stock) {\n const barAtMinute = date.getMinutes() + date.getHours() * 60\n const indexOffset = (barAtMinute - this.data.marketStartMinutes) / this.data.interval\n x = Math.round(this.paneModel.scale.x(this.data.barIndex[i] - indexOffset) + this.leftOffset)\n } else {\n x = Math.round(this.fx(i) + this.leftOffset)\n }\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n text: MONTHS[date.getMonth()] + ' ' + date.getDate().toString().padLeft('00'),\n x,\n })\n }\n }\n\n // Offscreen only - if lastDate !== lastBarDate add tick\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n const lastDate = `${MONTHS[(~~(this.data.lastDate / 100) % 100) - 1]} ${(this.data.lastDate % 100)\n .toString()\n .padLeft('00')}` // YYYYMMDD / 20211118 => Nov 18\n\n if (labels.length > 0 && labels[labels.length - 1].text !== lastDate) {\n const barsInDay = this.data.getBarsInDay()!\n const barWidth = getBarWidthWithMargin({\n zoomFactor: this.model.zoomFactor,\n chartLayout: this.model.chart_layout(),\n })\n const dayWidth = barsInDay * barWidth\n x += dayWidth\n labels.push({\n text: lastDate,\n x,\n })\n xLine.set({ x1: x, x2: x }).render(this.context)\n }\n }\n\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderDailyXAxis(textRenderer: Text) {\n let lastMonth = ''\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n hasPriority: date.getMonth() === 0,\n text: date.getMonth() === 0 ? date.getFullYear().toString() : MONTHS[date.getMonth()],\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderWeeklyXAxis(textRenderer: Text) {\n let lastMonth = ''\n\n const labels = []\n const xLine = this.getXLine()\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n if (date.getMonth() % 3 === 0) {\n xLine.set({ x1: x, x2: x }).render(this.context)\n } else {\n new Line(\n {\n x1: x,\n x2: x,\n y1: 0,\n y2: this.height,\n strokeStyle: Colors.gridSecondary,\n dashLength: 3,\n },\n this.paneModel\n ).render(this.context)\n }\n const isYearLabel = date.getMonth() === 0\n labels.push({\n text: isYearLabel ? date.getFullYear().toString().substring(2) : MONTHS[date.getMonth()][0],\n hasPriority: isYearLabel,\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n renderMonthlyXAxis(textRenderer: Text) {\n let lastYear = null\n\n const labels = []\n const xLine = this.getXLine()\n for (let i = 0; i < this.data.date.length; i++) {\n const date = new Date(this.data.date[i] * 1000)\n const year = date.getFullYear()\n const isJanuary = date.getMonth() === 0\n if (year !== lastYear && (labels.length !== 0 || isJanuary)) {\n lastYear = year\n const x = Math.round(this.fx(i) + this.leftOffset)\n if (!this.isXPointVisible(x)) {\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n labels.push({\n text: date.getFullYear().toString(),\n x,\n })\n }\n }\n this.renderXAxisLabels({ labels, textRenderer })\n }\n\n handleIndicatorsChange() {\n this.updateShouldRenderVolume()\n this.setupCache()\n this.trigger('change')\n }\n\n updateShouldRenderVolume() {\n this.shouldRenderVolume = !this.model.chart_layout().getIsIndicatorPresent(IndicatorType.Vol)\n }\n\n getVolumeTicks(count: number, maxHeight: number, fontHeight: number): number[] {\n const maxCount = 5\n const minCount = 1\n if (count > maxCount) {\n count = maxCount\n }\n const ticks = this.volumeFY.ticks(count).filter((tick) => tick !== 0)\n if (count <= minCount) {\n return [ticks[ticks.length - 1]]\n }\n // ticks are rendered on middle line so we have +- 1/2 of font size above and below range[min,max]\n // so we already have +-1 fontsize space, but in some cases that wouldn't be enough so we need to scale\n // dynamically, we add 3px of space per tick gap\n if (ticks.length * fontHeight + (ticks.length - 1) * 3 > maxHeight) {\n return this.getVolumeTicks(count - 1, maxHeight, fontHeight)\n }\n return ticks\n }\n\n renderVolumeAxis(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (getIsSmallIndexChart(this.specificChartFunctionality)) {\n context.save()\n const relativeVolume = Math.max(0, Math.min(2, this.data.relativeVolume))\n\n const x = 20\n const fy = (y: number) => ChartSettings.top.height + this.height - this.height * (0.5 * y)\n const height = this.height * (0.5 * relativeVolume)\n\n const label = new Text(\n {\n x: 15,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n for (let i = 0.5; i <= 2; i += 0.5) {\n const y = Math.round(fy(i))\n label\n .set({\n text: i.toFixed(1),\n y: y,\n })\n .render(context)\n\n context.set('strokeStyle', 'rgb(130, 130, 130)')\n context.beginPath()\n context.setLineDash([2, 3])\n context.translate(0, 0.5)\n context.moveTo(x, y)\n context.lineTo(x + 7, y)\n context.translate(0, -0.5)\n context.stroke()\n }\n\n context.set('fillStyle', 'rgba(0, 135, 255, 0.58)')\n context.set('lineWidth', 1)\n context.set('strokeStyle', Colors.grid)\n context.setLineDash([])\n\n context.fillRect(x, Math.round(ChartSettings.top.height + this.height - height), 7, Math.round(height))\n context.translate(0.5, 0.5)\n context.strokeRect(x, ChartSettings.top.height, 7, this.height)\n context.translate(-0.5, -0.5)\n\n new Text(\n {\n text: 'RELATIVE\\nVOLUME',\n x: 33,\n y: ChartSettings.top.height + this.height + 6,\n font: { size: FONT_SIZE.XXS },\n lineHeight: LINE_HEIGHT.XS,\n fillStyle: Colors.text,\n textBaseline: TextBaseline.top,\n textAlign: TextAlign.right,\n },\n this.paneModel\n ).render(context)\n context.restore()\n return\n }\n const rangeMax = this.volumeFY.range()[1]\n const volumeAxisFontSize = ChartSettings.left.volumeAxis.font.size!\n const tickCount = Math.floor(rangeMax / volumeAxisFontSize)\n const ticks = this.getVolumeTicks(tickCount, rangeMax, volumeAxisFontSize)\n const format = this.volumeFY.tickFormat(4, 's')\n const text = new Text(\n {\n x: ChartSettings.left.volumeAxis.margin.left,\n font: Text.getMergedPropsWithDefaults('font', { size: ChartSettings.left.volumeAxis.font.size }),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n ticks.forEach((tick) =>\n text\n .set({\n text: format(tick).replace(/G/, 'B'), // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\n y: ChartSettings.top.height + this.height - this.volumeFY(tick),\n })\n .render(context)\n )\n }\n\n renderVolume() {\n if (!this.shouldRenderVolume) return\n\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n // Return if the domain bounds are equal, this would put any value in the middle\n const [domainFrom, domainTo] = this.volumeFY.domain()\n if (this.setupAxisTimeFrame !== this.data.timeframe || domainFrom === domainTo) {\n return\n }\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height + this.height - 59,\n })\n translate.do()\n const halfBarWidth = this.getHalfBarWidth()\n const barWidthWithoutMargin = this.getBarWithoutMarginWidth()\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i, x) => {\n // Skip render if the value is <= 0\n if (this.data.volume[i] <= 0) {\n return\n }\n\n this.context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\n const y = Math.round(this.volumeFY(this.data.volume[i]))\n this.context.fillRect(x - halfBarWidth, 60, barWidthWithoutMargin, -y)\n },\n })\n translate.undo()\n }\n\n renderOverlays() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n for (const overlay of this.overlays) {\n overlay.renderContent(this.context)\n }\n translate.undo()\n }\n\n renderCross(context: CanvasRenderingContext2D) {\n const isRendered = renderCross({\n context,\n mouseModel,\n paneModel: this.paneModel,\n contentWidth: this.width,\n contentHeight: this.height,\n quote: this.data,\n getRoundDecimalPlaces: (price) => this.getPlacesLastClose(price),\n onRenderCrossText: !this.getIsRedesignedChart() ? this.renderCrossText : undefined,\n })\n if (this.getIsRedesignedChart()) {\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.paneModel))\n }\n\n if (isRendered !== undefined) {\n setElementCursor({\n elementId: this.model.chart_layout().getHTMLElementId(),\n cursor: isRendered ? 'crosshair' : 'default',\n conditionalCursor: 'grabbing',\n })\n }\n }\n\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\n const n = this.data.getDataByBarIndex(key, crossIndex)\n if (n !== null) {\n return shouldReturnRoundedString ? this.roundOhlc(n) : `${n}`\n }\n }\n\n getCrossIndexChange(crossIndex: number) {\n const crossDataIndex = this.data.getDataIndexByBarIndex(crossIndex)\n const crossClose = this.data.close[crossDataIndex] ?? null\n const previousClose = this.data.close[crossDataIndex - 1] ?? null\n if (crossClose !== null && previousClose !== null) {\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\n }\n\n return null\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings } = this.getChartLayoutSettings()\n context.save()\n context.translate(ChartSettings.left.width, 0)\n\n if (this.getIsRedesignedChart()) {\n this.renderOverlaysLabels(context)\n if (Number.isNaN(crossIndex)) {\n this.getOHLC({ context })\n context.restore()\n return\n }\n }\n\n const dateByBarIndex = this.data.getDataByBarIndex('date', crossIndex)\n const date = dateByBarIndex ? utils.dateFromUnixTimestamp(dateByBarIndex) : null\n\n if (date === null) {\n const virtualTradedDates =\n this.data.date.length > 0\n ? getVirtualTimeframeTradedDates({\n dateStart: this.data.date[0],\n dateEnd: this.data.date[this.data.date.length - 1],\n quote: this.data,\n })\n : []\n this.getOHLC({\n context,\n dateString: virtualTradedDates[crossIndex]\n ? getDateString({\n date: utils.dateFromUnixTimestamp(virtualTradedDates[crossIndex]),\n timeframe: this.data.timeframe,\n })\n : null,\n })\n context.restore()\n return\n }\n\n this.getOHLC({\n context,\n date,\n data: {\n open: this.getDataByCrossIndex(crossIndex, 'open'),\n high: this.getDataByCrossIndex(crossIndex, 'high'),\n low: this.getDataByCrossIndex(crossIndex, 'low'),\n close: this.getDataByCrossIndex(crossIndex, 'close'),\n volume: this.getDataByCrossIndex(crossIndex, 'volume', false),\n },\n changePercentage: this.getCrossIndexChange(crossIndex),\n })\n\n context.restore()\n }\n\n renderChange({ context }: { context: CanvasRenderingContext2D }) {\n const CHANGE_SPACER = 10\n const { ChartSettings } = this.getChartLayoutSettings()\n const { ticker, change, ohlc } = ChartSettings.top\n const { tickerChange, tickerAfterChange } = getTickerChange({ data: this.data })\n\n if (!tickerChange) {\n return\n }\n\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\n const isGroupInstrument = this.data.instrument === Instrument.Group\n const changeText = new Text(\n {\n text: isOffscreen && isGroupInstrument ? tickerChange.percentString : tickerChange.string,\n x: !getIsSmallIndexChart(this.specificChartFunctionality)\n ? this.width - ChartSettings.top.change.margin.right!\n : this.width,\n y: ChartSettings.top.change.margin.top,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\n textAlign: TextAlign.right,\n textBaseline: ChartSettings.top.baseline,\n fillStyle: getChangeColor({ change: tickerChange.points, ChartSettings }),\n },\n this.paneModel\n )\n this.changeWidth = changeText.measure(context)\n changeText.render(context)\n\n if (isOffscreen && (!this.isLargeChart || isGroupInstrument)) {\n return\n }\n if (tickerAfterChange) {\n const afterChangeText = new Text(\n {\n text: tickerAfterChange?.string,\n font: Text.getMergedPropsWithDefaults('font', ChartSettings.top.change.font),\n textAlign: TextAlign.right,\n textBaseline: ChartSettings.top.baseline,\n fillStyle: getChangeColor({ change: tickerAfterChange.points, ChartSettings }),\n },\n this.paneModel\n )\n const afterChangeTextWidth = afterChangeText.measure(context)\n const oneLineAHChangeWidth = this.changeWidth + CHANGE_SPACER + afterChangeTextWidth\n\n if (\n ChartSettings.left.width + this.tickerWidth + ticker.margin.left! + OFFSET.S <\n ChartSettings.left.width + this.width - oneLineAHChangeWidth - change.margin.right!\n ) {\n afterChangeText\n .set({\n x: this.width - ChartSettings.top.change.margin.right! - this.changeWidth - CHANGE_SPACER,\n y: ChartSettings.top.change.margin.top,\n })\n .render(context)\n this.afterChange = null\n this.changeWidth = oneLineAHChangeWidth\n } else if (\n this.lastOhlc[0] &&\n ChartSettings.left.width +\n this.tickerWidth +\n ticker.margin.left! +\n this.lastOhlc[0].width! +\n ohlc.margin.left! +\n ohlc.margin.right! <\n ChartSettings.left.width + this.width - afterChangeTextWidth - change.margin.right!\n ) {\n afterChangeText\n .set({\n x: this.width - ChartSettings.top.change.margin.right!,\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\n })\n .render(context)\n this.changeWidth = Math.max(this.changeWidth, afterChangeTextWidth)\n this.afterChange = {\n x: this.width - ChartSettings.top.change.margin.right!,\n y: ChartSettings.top.change.margin.top! - ChartSettings.top.change.font.size! - OFFSET.S,\n width: afterChangeTextWidth,\n }\n }\n }\n }\n\n renderOHLC(parameters: IRenderOHLCParameters) {\n if (!this.getIsRedesignedChart()) {\n this.renderOHLCQuotePage(parameters)\n } else {\n this.renderOHLCChartsPage(parameters)\n }\n }\n\n renderOHLCChartsPage({ context, date, open, high, low, close, volume, changePercentage }: IRenderOHLCParameters) {\n const chartBreakpoints = getChartBreakpoints(this.width)\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n const OhlcText = new Text(\n {\n font: { size: FONT_SIZE.S },\n lineHeight: 18,\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\n },\n this.paneModel\n )\n\n const dateElements = date ? [{ text: date, color: gray300 }] : []\n const trendColor = (open ?? 0) > (close ?? 0) ? tailwindColors.red[400] : tailwindColors.green[400]\n const oElements = open\n ? [\n { text: 'O', color: gray300 },\n { text: open, color: trendColor },\n ]\n : []\n const hElements = high\n ? [\n { text: 'H', color: gray300 },\n { text: high, color: trendColor },\n ]\n : []\n const lElements = low\n ? [\n { text: 'L', color: gray300 },\n { text: low, color: trendColor },\n ]\n : []\n const cElements = close\n ? [\n { text: 'C', color: gray300 },\n { text: close, color: trendColor },\n ]\n : []\n const volElements = volume\n ? [\n { text: 'Vol', color: gray300 },\n { text: volume, color: trendColor },\n ]\n : []\n const changeElements = changePercentage != null ? [{ text: changePercentage.string, color: trendColor }] : []\n\n const lines: OhlcLineElements[] = []\n\n const getFlatLineArrayWithSpaces = (lineElements: OhlcLineElements[]) =>\n lineElements.flatMap((elements, index) =>\n index > 0 ? ([...(elements.length > 0 ? ['space'] : []), ...elements] as OhlcLineElements) : elements\n )\n if (chartBreakpoints.isM) {\n lines.push(\n getFlatLineArrayWithSpaces([\n dateElements,\n oElements,\n hElements,\n lElements,\n cElements,\n volElements,\n changeElements,\n ])\n )\n } else if (chartBreakpoints.isS) {\n lines.push(getFlatLineArrayWithSpaces([dateElements, changeElements]))\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements, volElements]))\n } else {\n lines.push(getFlatLineArrayWithSpaces([dateElements, volElements, changeElements]))\n lines.push(getFlatLineArrayWithSpaces([oElements, hElements, lElements, cElements]))\n }\n\n const startX = OFFSET.M - ChartSettings.left.width\n let x = startX\n let y = OFFSET.M + OhlcText.attrs.lineHeight / 2\n\n lines.forEach((line) => {\n x = startX\n line.forEach((lineElement, index, lineElements) => {\n const padding = { left: 1, right: 1, top: 0, bottom: 0 }\n const { text = '', color = undefined } = lineElement === 'space' ? {} : lineElement\n if (index === 0) {\n padding.left = 5\n } else if (index === lineElements.length - 1) {\n padding.right = 5\n } else if (lineElement === 'space') {\n padding.left = 7\n padding.right = 7\n if (!chartBreakpoints.isS) {\n padding.left = 5\n padding.right = 5\n }\n }\n OhlcText.set({ text, fillStyle: color, x, y, padding })\n OhlcText.render(context)\n x += OhlcText.width\n })\n y += OhlcText.attrs.lineHeight\n })\n }\n\n renderOverlaysLabelsChartsPage(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const chartBreakpoints = getChartBreakpoints(this.width)\n const LabelsText = new Text(\n {\n font: { size: FONT_SIZE.S },\n lineHeight: 18,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(ChartSettings.general.Colors.canvasFill, 0.8),\n // this function gets (indirectly) called from renderCrossText which is already \"translateX\" by ChartSettings.left.width\n x: OFFSET.M - ChartSettings.left.width,\n padding: { left: PADDING.S, right: PADDING.S, top: 0, bottom: 0 },\n },\n this.paneModel\n )\n\n let numberOfNewOhlcLines = 2\n if (chartBreakpoints.isM) {\n numberOfNewOhlcLines = 1\n } else if (chartBreakpoints.isS) {\n numberOfNewOhlcLines = 2\n }\n\n // We assume lineheight is the same as OHLC text\n const { lineHeight } = LabelsText.attrs\n let y = lineHeight * numberOfNewOhlcLines + lineHeight / 2 + OFFSET.M\n\n for (const overlay of this.overlays) {\n if (!overlay.isRenderedOverlaysLabel()) {\n continue\n }\n LabelsText.set({\n text: overlay.toString(),\n y,\n fillStyle: overlay.getLabelColor(),\n }).render(context)\n y += lineHeight\n }\n }\n\n renderOHLCQuotePage({\n context,\n date,\n open,\n high,\n low,\n close,\n volume,\n afterHour,\n isSmallIndexChart = false,\n isNewestOHLC = false,\n time,\n directRender = false,\n changePercentage,\n }: IRenderOHLCParameters) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { ohlc } = ChartSettings.top\n const isOffscreen = this.specificChartFunctionality === SpecificChartFunctionality.offScreen\n const isGroupInstrument = this.data.instrument === Instrument.Group\n if (isOffscreen && isGroupInstrument) {\n ohlc.type = OHLCType.dateOnly\n } else if (isOffscreen && this.data.instrument !== Instrument.Stock && time) {\n ohlc.type = OHLCType.timeOnly\n }\n\n const lineTopY = ohlc.type ? ohlc.margin.top : ohlc.margin.top! - ChartSettings.top.ticker.font.size!\n const OHLCFontSize = ohlc.font.size!\n const centerXOffset =\n this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n (this.width -\n (this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n this.changeWidth +\n (isSmallIndexChart ? 0 : ChartSettings.top.change.margin.right!))) / // smallIndexChart don't have change.margin.right\n 2\n const leftXOffset = this.tickerWidth + ChartSettings.top.ticker.margin.left! + ohlc.margin.left!\n const hasOhlc = ![open, high, low, close, volume].some((ohlcString) => !ohlcString)\n const OHLC = hasOhlc\n ? {\n date: [date ?? ''],\n singleLine: [\n `${date} O:${open} H:${high} L:${low} C:${close}${\n afterHour ? ` AH:${afterHour}` : ''\n } Vol:${volume} `,\n /*\n * this is needed because of the way we render ohlc text down below in renderOHLCToCanvas\n * undefined is used instead of null because TS had some issues with `null` even if it is filtered out\n * */\n changePercentage ? changePercentage.string : undefined,\n ].filter((value) => value !== undefined),\n }\n : {\n date: [date ?? ''],\n singleLine: [`${date ?? ''}`],\n }\n\n const OHLC_TEXT = new Text(\n {\n font: { size: OHLCFontSize },\n },\n this.paneModel\n )\n\n const getOHLCType = () => {\n if (!isSmallIndexChart) {\n return OHLCType.singleLine\n }\n return OHLCType.dateOnly\n }\n\n const getOHLCSettings = () => {\n switch (ohlc.type || getOHLCType()) {\n case OHLCType.singleLine:\n return {\n text: OHLC.singleLine,\n x: [leftXOffset, leftXOffset],\n y: [ohlc.margin.top],\n textAlign: TextAlign.left,\n textBaseline: [TextBaseline.alphabetic],\n }\n case OHLCType.dateOnly:\n if (isOffscreen && isGroupInstrument) {\n const text = `${OHLC.date} Volume: ${volume}`\n const textWidth = OHLC_TEXT.set({ text }).measure(context)\n return {\n text: [text],\n x: [\n this.width - ChartSettings.top.change.margin.right! - this.changeWidth - textWidth - CHART_MARGIN.XXL,\n ],\n y: [ohlc.margin.top],\n textAlign: TextAlign.center,\n textBaseline: [TextBaseline.alphabetic],\n }\n } else if (isSmallIndexChart) {\n return {\n text: OHLC.date,\n x: [centerXOffset],\n y: [ohlc.margin.top],\n textAlign: TextAlign.center,\n textBaseline: [TextBaseline.alphabetic],\n }\n } else {\n const isEnoughSpace =\n this.width -\n (this.tickerWidth +\n ChartSettings.top.ticker.margin.left! +\n ohlc.margin.left! +\n ohlc.margin.right! +\n this.changeWidth +\n ChartSettings.top.change.margin.right!) >\n OHLC_TEXT.set({ text: OHLC.date[0] }).measure(context)\n const alignTop = !isEnoughSpace || ohlc.font.baseline === TextBaseline.top\n return {\n text: OHLC.date,\n x: [leftXOffset],\n y: alignTop ? [lineTopY] : [ohlc.margin.top],\n textAlign: TextAlign.left,\n textBaseline: alignTop ? [TextBaseline.top] : [TextBaseline.alphabetic],\n }\n }\n case OHLCType.timeOnly:\n return {\n text: [time],\n x: [centerXOffset - OHLC_TEXT.set({ text: time }).measure(context) / 2],\n y: [lineTopY],\n textAlign: TextAlign.center,\n textBaseline: [ohlc.font.baseline],\n }\n default:\n return\n }\n }\n\n if (!isNewestOHLC) {\n context.fillStyle = Colors.canvasFill\n this.lastOhlc.forEach((line) => {\n const x = (line.textAlign === TextAlign.left ? line.x : line.x! - line.width! / 2)!\n const y = (line.textBaseline === TextBaseline.top ? line.y : line.y! - OHLCFontSize)!\n context.fillRect(\n x - PADDING.XXS,\n y - PADDING.XXS,\n PADDING.XXS + line.width! + PADDING.XXS,\n PADDING.XXS + OHLCFontSize + PADDING.XXS\n )\n })\n\n if (this.afterChange) {\n context.fillRect(\n this.afterChange.x - this.afterChange.width - PADDING.XXS,\n this.afterChange.y - ChartSettings.top.change.font.size! - PADDING.XXS,\n PADDING.XXS + this.afterChange.width + PADDING.XXS,\n PADDING.XXS + ChartSettings.top.change.font.size! + PADDING.XS\n )\n }\n } else {\n this.lastOhlc = []\n }\n\n const ohlcSettings = getOHLCSettings()\n\n const renderOHLCToCanvas = ({\n ohlcSet,\n render = true,\n }: {\n ohlcSet?: {\n text: (string | undefined)[]\n x: number[]\n y: (number | undefined)[]\n textAlign: TextAlign\n textBaseline: (TextBaseline | undefined)[]\n }\n render?: boolean\n }) => {\n const isSingleLineWithChange = (ohlc.type || getOHLCType()) === OHLCType.singleLine && changePercentage\n ohlcSet?.text.forEach((line: string | undefined, index: number) => {\n let i = index\n let leftOffset = 0\n let fillStyle = Colors.text\n let text = line\n if (index > 0 && isSingleLineWithChange) {\n i -= 1\n leftOffset = OHLC_TEXT.measure(context)\n text = line\n\n fillStyle = getChangeColor({ change: changePercentage.points, ChartSettings })\n }\n const options = {\n text,\n x: ohlcSet.x[i] + leftOffset,\n y: ohlcSet.y[i],\n textBaseline: ohlc.font.baseline ? ohlc.font.baseline : ohlcSet.textBaseline[i],\n textAlign: ohlc.font.textAlign ? ohlc.font.textAlign : ohlcSet.textAlign,\n fillStyle,\n }\n OHLC_TEXT.set(options)\n if (isNewestOHLC) {\n this.lastOhlc[i] = { width: OHLC_TEXT.measure(context), ...options }\n }\n if (render) {\n OHLC_TEXT.render(context)\n }\n })\n }\n renderOHLCToCanvas({ ohlcSet: ohlcSettings, render: directRender })\n\n return {\n ohlcSettings,\n renderOHLCToCanvas,\n }\n }\n\n // only for stocks on i1/i3/i5 and one day view\n renderFadeExtendedHours() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const period = this.model.quote().timeframe\n if (this.data.instrument !== Instrument.Stock) {\n return\n }\n if (![TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5].includes(period)) {\n return\n }\n\n const interval = parseInt(period.substring(1), 10)\n const dayToOffset = this.data.getDayToOffset()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const halfBarWidth = this.getHalfBarWidth()\n for (const day in dayToOffset) {\n // todo aftermarket\n const dayIndex = dayToOffset[day]\n let n0 = (this.data.drawMinutesPerDay / interval) * dayIndex\n let n1 = this.data.premarketLengthMinutes / interval + n0 // bars in 90mins from 8am to 9:30am\n let x0 = this.paneModel.scale.x(n0) - halfBarWidth\n let width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\n this.context.set('fillStyle', Colors.premarketFade)\n this.context.fillRect(x0, 0, width, this.height + 1)\n\n if (this.data.aftermarketLengthMinutes > 0) {\n n0 =\n (this.data.drawMinutesPerDay / interval) * dayIndex +\n (this.data.drawMinutesPerDay - this.data.aftermarketLengthMinutes) / interval\n n1 = this.data.aftermarketLengthMinutes / interval + n0 // bars in 90mins from 4pm to 5:30pm\n x0 = this.paneModel.scale.x(n0) - halfBarWidth\n width = this.paneModel.scale.x(n1) - this.paneModel.scale.x(n0)\n\n this.context.set('fillStyle', Colors.aftermarketFade)\n this.context.fillRect(x0, 0, width, this.height + 1)\n }\n }\n translate.undo()\n }\n\n shouldShowPrevClose() {\n const quote = this.model.quote()\n const isStock = quote.instrument === Instrument.Stock\n const isIntradayWithPreMarket = TIMEFRAMES_WITH_PRE_MARKET.includes(quote.timeframe)\n const isIndexChart = this.specificChartFunctionality === SpecificChartFunctionality.smallIndex\n\n return isStock && (isIntradayWithPreMarket || isIndexChart)\n }\n\n renderPrevClose() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (!this.shouldShowPrevClose()) {\n return\n }\n const translate = getTranslate({\n context: this.context,\n xOffset: ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n\n const y = Math.round(this.fy(this.model.quote().prevClose))\n new Line(\n {\n x1: 0,\n x2: this.width,\n y1: y,\n y2: y,\n strokeStyle: Colors.prevClose,\n dashLength: 3,\n },\n this.paneModel\n ).render(this.context)\n translate.undo()\n }\n\n renderChartNotAvailable() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const x = ~~((ChartSettings.left.width + ChartSettings.right.width + this.width) / 2)\n const y = ~~((ChartSettings.top.height + ChartSettings.bottom.height + this.height) / 2)\n new Text(\n {\n text: 'Chart not available',\n x,\n y,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: Colors.text,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n ).render(this.context)\n }\n\n // private\n setupCache() {\n const { ChartSettings } = this.getChartLayoutSettings()\n /*\n * Don't create new Cache instances, because Safari takes too long to free up memory\n * leading to canvas.getContext returning null. https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n *\n * To further improve performance, cache.set shouldn't be called when unnecessary,\n * because setupCache is called for many model updates. The same applies for indicators/indicator.js.\n */\n this.baseCache = this.baseCache || new Cache()\n\n this.baseCache.set(\n (context: CanvasRenderingContext2D) => {\n if (this.data.close.length === 0) {\n this.renderText(context)\n return\n }\n this.renderYAxis(context)\n this.renderText(context)\n if (!this.getIsMobileChartPage() && this.shouldRenderVolume) {\n this.renderVolumeAxis(context)\n }\n if (!this.getIsRedesignedChart()) {\n this.renderOverlaysLabels(context)\n }\n },\n this.width + ChartSettings.left.width + ChartSettings.right.width,\n this.height + ChartSettings.top.height + ChartSettings.bottom.height\n )\n }\n\n // called by controllers/pane on recountScale\n setupAxis(fx: ScaleAxis) {\n this.data = this.model.quote()\n const { volumeHeight } = this.getChartLayoutSettings().ChartSettings.center\n\n if (typeof fx !== 'function') {\n return\n }\n\n const halfBarWidth = this.getHalfBarWidth()\n\n const volumes = []\n for (let i = 0; i < this.data.volume.length; i++) {\n const x = fx(this.data.barIndex[i]) - halfBarWidth\n if (x + this.model.leftOffset < 0 || x + this.model.leftOffset > this.width) {\n // margin?\n continue\n }\n volumes.push(this.data.volume[i])\n }\n\n const max = utils.max(volumes) ?? 0\n const rangeMax = volumeHeight || 60\n this.volumeFY = d3.scaleLinear().range([0, rangeMax]).domain([0, max]).nice(4)\n this.setupAxisTimeFrame = this.data.timeframe\n }\n\n // private\n clip(addMarginBottom?: boolean) {\n const { ChartSettings } = this.getChartLayoutSettings()\n if (addMarginBottom == null) {\n addMarginBottom = false\n }\n this.context.beginPath()\n let marginBottom = 0\n if (addMarginBottom) {\n marginBottom = ChartSettings.bottom.height\n }\n this.context.rect(ChartSettings.left.width, ChartSettings.top.height, this.width, this.height + marginBottom)\n this.context.clip()\n }\n\n addOverlay(overlay: Overlay) {\n overlay.chart = this\n this.overlays.push(overlay)\n return this.trigger('change')\n }\n\n setOverlays(overlays: Overlay[]) {\n this.overlays = overlays\n return this.trigger('change')\n }\n\n removeOverlay(overlay: Overlay) {\n for (let index = 0; index < this.overlays.length; index++) {\n const el = this.overlays[index]\n if (el === overlay) {\n this.attrs.overlays.splice(index, 1)\n this.overlays.splice(index, 1)\n this.trigger('change')\n break\n }\n }\n }\n\n getMinMax(): { min: number; max: number; firstVisibleClose?: number | null } {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n let firstVisibleClose = null\n const data = (this.data = this.model.quote())\n\n for (let i = 0; i < data.open.length; i++) {\n const center = this.fx(i)\n if (center + this.model.leftOffset < 0 || center + this.model.leftOffset > this.width) {\n // margin?\n continue\n }\n if (firstVisibleClose === null) {\n firstVisibleClose = data.close[i]\n }\n min = Math.min(min, data.low[i])\n max = Math.max(max, data.high[i])\n }\n\n if (min === Number.MAX_VALUE && max === Number.MIN_VALUE) {\n for (\n let start = Math.max(data.open.length - 10, 0), i = start, end1 = data.open.length, asc1 = start <= end1;\n asc1 ? i < end1 : i > end1;\n asc1 ? i++ : i--\n ) {\n min = Math.min(min, data.low[i])\n max = Math.max(max, data.high[i])\n }\n }\n\n if (this.shouldShowPrevClose() && data.prevClose !== null) {\n min = Math.min(min, data.prevClose)\n max = Math.max(max, data.prevClose)\n }\n\n if (this.specificChartFunctionality === SpecificChartFunctionality.offScreen && !this.model.dateRange) {\n min = Math.min(min, data.lastClose)\n max = Math.max(max, data.lastClose)\n }\n return { min, max, firstVisibleClose }\n }\n\n moveBy() {}\n\n isInArea() {\n return false\n }\n\n fx = (x: number) => this.paneModel.scale.x(this.data.barIndex[x])\n\n fy = (y: number) => this.paneModel.scale.y(y)\n\n round(n: number, overridePlaces?: number) {\n return round({ data: this.data, num: n, overridePlaces: overridePlaces ?? this.getPlacesLastClose() })\n }\n\n roundOhlc(n: number) {\n const placesLastClose = this.getPlacesLastClose()\n return round({\n data: this.data,\n num: n,\n overridePlaces: placesLastClose ? Math.max(placesLastClose, 2) : undefined,\n })\n }\n\n toObject() {\n const overlays = this.overlays.map((overlay) => overlay.toObject())\n return merge({}, this.attrs, { type: this.type, overlays })\n }\n\n toConfig() {\n const overlays = this.overlays.map((overlay) => overlay.toConfig())\n return merge({}, this.attrs, { type: this.type, overlays })\n }\n\n getBarWithoutMarginWidth() {\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n chartLayout: this.model.chart_layout(),\n zoomFactor: this.model.zoomFactor,\n })\n return barFillWidth + barBorderWidth * 2\n }\n\n getHalfBarWidth() {\n return ~~Math.max(1, this.getBarWithoutMarginWidth() / 2)\n }\n\n getPlacesLastClose(price?: number) {\n const { lastClose, instrument } = this.data\n const priceAbs = price && Math.abs(price)\n if (lastClose >= 100000) {\n return 0\n } else if (lastClose >= 10000) {\n return 1\n } else if (instrument === Instrument.Stock && (priceAbs ?? lastClose) < 1) {\n return 4\n } else if (lastClose === undefined) {\n // if lastClose is not defined we'll always display 2 decimpal places, e.g. backtests, screener stats\n return 2\n }\n\n return undefined\n }\n\n hasOverlay(type: string) {\n return this.overlays.some((x) => x.type === 'overlays/' + type)\n }\n\n getXLine() {\n return new Line(\n {\n y1: 0,\n y2: this.height,\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\n dashLength: 3,\n },\n this.paneModel\n )\n }\n\n getYLine() {\n return new Line(\n {\n x1: 0,\n x2: this.width,\n strokeStyle: this.getChartLayoutSettings().ChartSettings.general.Colors.grid,\n dashLength: 3,\n },\n this.paneModel\n )\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart_layout())\n }\n\n getIsMobileChartPage() {\n return (\n this.isMobile && this.model.chart_layout().specificChartFunctionality === SpecificChartFunctionality.chartPage\n )\n }\n\n getCandleLikeChartsRenderingColors() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { theme, specificChartFunctionality } = this.model.chart_layout()\n let colors = Colors\n const overwrittenColors = getColorOverwrites({\n colors,\n theme,\n })\n const overwrittenColorKeys = Object.keys(overwrittenColors)\n const hasOverwrittenCandleColor = ['borderUp', 'wickUp', 'borderDown', 'wickDown', 'trendUp', 'trendDown'].some(\n (colorKey) => overwrittenColorKeys.includes(colorKey)\n )\n\n const shouldUseDarkerColors =\n theme === Theme.light &&\n getShouldUseDarkerWickColors({\n specificChartFunctionality: specificChartFunctionality,\n totalBarWidth: ChartSettings.center.barWidth + ChartSettings.center.border * 2,\n })\n\n if (shouldUseDarkerColors && !hasOverwrittenCandleColor) {\n colors = { ...colors, ...darkerWickColors }\n }\n const isNodeChartWithThinBars =\n specificChartFunctionality === SpecificChartFunctionality.offScreen && ChartSettings.center.border === 0\n if (isNodeChartWithThinBars && !hasOverwrittenCandleColor) {\n colors = { ...colors, ...thinBarColorsOverride, ...overwrittenColors }\n }\n\n return colors\n }\n\n getIsRedesignedChart() {\n return this.specificChartFunctionality === SpecificChartFunctionality.chartPage || isRedesignedPage(this)\n }\n}\n\nBaseChart.initClass()\n\nexport default BaseChart\n","import { RendererChartBarProps } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport utils from '../utils'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getIsSSr } from '../utils/helpers'\nimport Chart from './base_chart'\n\nconst WICK_WIDTH = 1\n\nclass CandleStick extends Chart {\n static type = ChartElementType.CandleStick\n static label = 'Candle'\n static iconName = 'candleBarBasic'\n\n getRenderChartBarProps({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) {\n const { trendDown, trendUp, borderDown, borderUp, wickDown, wickUp } = chartSettingsColors\n const open = this.data.open[index]\n const close = this.data.close[index]\n const trendColor = close < open ? trendDown : trendUp\n const wickColor = close < open ? wickDown : wickUp\n return {\n open,\n close,\n high: this.data.high[index],\n low: this.data.low[index],\n barFillColor: trendColor,\n borderColor: close < open ? borderDown : borderUp,\n wickColor: hasFillAndBorder ? wickColor : trendColor,\n }\n }\n\n renderChart() {\n if (this.setupAxisTimeFrame !== this.data.timeframe) {\n return\n }\n const { ChartSettings } = this.getChartLayoutSettings()\n const Colors = this.getCandleLikeChartsRenderingColors()\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n chartLayout: this.model.chart_layout(),\n zoomFactor: this.model.zoomFactor,\n })\n const shouldRenderFillAndBorder =\n barFillWidth + barBorderWidth * 2 >= 2 &&\n !(this.type === ChartElementType.HollowCandleStick && barBorderWidth === 0)\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n const translateForWick = getTranslate({\n context: this.context,\n xOffset: WICK_WIDTH / 2,\n yOffset: 0,\n })\n\n translate.do()\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, center: number) => {\n const { open, close, high, low, wickColor, borderColor, barFillColor } = this.getRenderChartBarProps({\n index: i,\n chartSettingsColors: Colors,\n hasFillAndBorder: shouldRenderFillAndBorder,\n })\n\n const candleBodyHigh = Math.round(this.fy(utils.max(open, close)))\n const candleBodyLow = Math.round(this.fy(utils.min(open, close)))\n const candleWickHigh = Math.round(this.fy(high))\n const candleWickLow = Math.round(this.fy(low))\n\n const candleBodyHeight = candleBodyLow - candleBodyHigh\n const candleBodyLeftX = center - Math.floor(barBorderWidth + barFillWidth / 2)\n const halfBorderWidth = barBorderWidth / 2\n\n // TODO: revisit for better approach, this solve issue with candlesticks\n // with even width are shifted 1px to the left and thus first candle is vertically sliced\n if (getIsSSr() && candleBodyLeftX + this.leftOffset < 0) {\n return\n }\n\n const isBodyHeightGreaterOrEqualBorders = candleBodyHeight >= barBorderWidth * 2\n const isWickLineCandleLessThanOnePixel = !shouldRenderFillAndBorder && candleWickLow - candleWickHigh < 1\n\n translateForWick.do()\n this.context.set('strokeStyle', wickColor)\n this.context.beginPath()\n this.context.moveTo(center, candleWickHigh)\n if (shouldRenderFillAndBorder) {\n this.context.lineTo(center, candleBodyHigh)\n this.context.moveTo(\n center,\n candleBodyHigh + (isBodyHeightGreaterOrEqualBorders ? candleBodyHeight : WICK_WIDTH)\n )\n }\n this.context.lineTo(center, isWickLineCandleLessThanOnePixel ? candleWickHigh + 1 : candleWickLow)\n this.context.stroke()\n translateForWick.undo()\n\n if (shouldRenderFillAndBorder) {\n const hasBorder = barBorderWidth > 0\n if (hasBorder) {\n this.context.set('strokeStyle', borderColor)\n if (isBodyHeightGreaterOrEqualBorders) {\n this.context.set('lineWidth', barBorderWidth)\n this.context.strokeRect(\n candleBodyLeftX + halfBorderWidth,\n candleBodyHigh + halfBorderWidth,\n barFillWidth + 2 * halfBorderWidth,\n candleBodyHeight - 2 * halfBorderWidth\n )\n this.context.set('lineWidth', WICK_WIDTH)\n } else {\n this.context.beginPath()\n this.context.moveTo(candleBodyLeftX, candleBodyHigh + WICK_WIDTH / 2)\n this.context.lineTo(candleBodyLeftX + barFillWidth + 2 * barBorderWidth, candleBodyHigh + WICK_WIDTH / 2)\n this.context.stroke()\n }\n }\n\n const fillHeight = candleBodyHeight - 2 * barBorderWidth\n const hasFill = fillHeight > 0\n if (hasFill || !hasBorder) {\n this.context.set('fillStyle', hasFill ? barFillColor : borderColor)\n this.context.fillRect(\n candleBodyLeftX + barBorderWidth,\n candleBodyHigh + barBorderWidth,\n barFillWidth,\n hasFill ? fillHeight : WICK_WIDTH\n )\n }\n }\n },\n })\n translate.undo()\n }\n\n toString() {\n return `Candle stick ${this.data.ticker}`\n }\n}\n\nexport default CandleStick\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport CandleStick from './candle_stick'\n\nclass HollowCandleStick extends CandleStick {\n static type = ChartElementType.HollowCandleStick\n static label = 'Hollow Candle'\n static iconName = 'candleBarHollow'\n\n static getNumOfBarsBuffer(element: RequireByKey) {\n return Math.max(1, super.getNumOfBarsBuffer(element))\n }\n\n getRenderChartBarProps({ index, chartSettingsColors }: RendererChartBarProps) {\n const open = this.data.open[index]\n const close = this.data.close[index]\n const isHollow = close > open\n const generalTrendColor =\n close > this.data.close[index - 1] ? chartSettingsColors.ohlcTrendUp : chartSettingsColors.ohlcTrendDown\n const trendColor = index === 0 ? chartSettingsColors.zeroChange : generalTrendColor\n return {\n open,\n close,\n high: this.data.high[index],\n low: this.data.low[index],\n // hollow candles have transparend bodies that's why rgba is here\n barFillColor: isHollow ? 'rgba(0, 0, 0, 0)' : trendColor,\n borderColor: trendColor,\n wickColor: trendColor,\n }\n }\n\n toString() {\n return `Hollow Candle stick ${this.data.ticker}`\n }\n}\n\nexport default HollowCandleStick\n","import { ChartConfigChartPaneElement, RendererChartBarProps, RequireByKey } from '../../types/shared'\nimport { ChartElementType, ScaleType } from '../constants/common'\nimport Quote from '../models/quote'\nimport { getTickerChangeFromCloseValues } from '../utils/chart'\nimport CandleStick from './candle_stick'\n\ntype OhlcKeys = 'high' | 'low' | 'open' | 'close'\n\nclass HeikinAshi extends CandleStick {\n static type = ChartElementType.HeikinAshi\n static label = 'Heikin Ashi'\n static iconName = 'candleBarHeikinAshi'\n\n static getNumOfBarsBuffer(element: RequireByKey) {\n return Math.max(1, super.getNumOfBarsBuffer(element))\n }\n\n getRenderChartBarProps = ({ index, chartSettingsColors, hasFillAndBorder }: RendererChartBarProps) => {\n const haData = this.data.getHeikinAshiData()\n\n const open = haData.open[index]\n const close = haData.close[index]\n const trendColor = close < open ? chartSettingsColors.trendDown : chartSettingsColors.trendUp\n const wickColor = close < open ? chartSettingsColors.wickDown : chartSettingsColors.wickUp\n return {\n open,\n close,\n high: Math.max(this.data.high[index], open, close),\n low: Math.min(open, close, this.data.low[index]),\n barFillColor: trendColor,\n borderColor: close < open ? chartSettingsColors.borderDown : chartSettingsColors.borderUp,\n wickColor: hasFillAndBorder ? wickColor : trendColor,\n }\n }\n\n getLastValues = () => {\n const Colors = this.getCandleLikeChartsRenderingColors()\n const {\n open: lastOpen,\n close: lastClose,\n high: lastHigh,\n low: lastLow,\n } = this.getRenderChartBarProps({\n index: this.data.date.length - 1,\n chartSettingsColors: Colors,\n })\n\n return { lastOpen, lastClose, lastHigh, lastLow }\n }\n\n getRoundedLastData() {\n const lastOhlc = this.getLastValues()\n return {\n open: this.roundOhlc(lastOhlc.lastOpen),\n high: this.roundOhlc(lastOhlc.lastHigh),\n low: this.roundOhlc(lastOhlc.lastLow),\n close: this.roundOhlc(lastOhlc.lastClose),\n }\n }\n\n renderYAxis = (context: CanvasRenderingContext2D) => {\n const { lastClose } = this.getLastValues()\n super.renderYAxis(context, { lastClose }, false)\n\n const { firstVisibleClose } = this.getMinMax()\n if (this.model.scale === ScaleType.Percentage && !firstVisibleClose) return\n\n const originalLatestClose = this.data.close[this.data.close.length - 1]\n const heikinLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose, firstVisibleClose })\n const originalLatestCloseLabel = this.getYAxisLastCloseLabel({ lastClose: originalLatestClose, firstVisibleClose })\n\n this.renderYAxisLabel({ context, yCoordinate: Math.round(this.fy(lastClose)), label: heikinLatestCloseLabel })\n\n if (heikinLatestCloseLabel === originalLatestCloseLabel) return\n\n this.renderYAxisLabel({\n context,\n yCoordinate: this.getYAxisSecondaryLabelYCoordinate({\n mainLabelValue: lastClose,\n secondaryLabelValue: originalLatestClose,\n }),\n label: originalLatestCloseLabel,\n background: this.getSecondaryLabelBackgroundColor(),\n })\n }\n\n getDataByCrossIndex(crossIndex: number, key: keyof Quote, shouldReturnRoundedString = true) {\n const Colors = this.getCandleLikeChartsRenderingColors()\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\n if (barIndex > -1) {\n let value = null\n if (['high', 'low', 'open', 'close'].includes(key)) {\n const data = this.getRenderChartBarProps({ index: barIndex, chartSettingsColors: Colors })\n value = data[key as OhlcKeys]\n }\n value = value === null ? this.data.getDataByBarIndex(key, crossIndex) : value\n if (value !== null) {\n return shouldReturnRoundedString ? this.roundOhlc(value) : `${value}`\n }\n }\n }\n\n getCrossIndexChange(crossIndex: number) {\n const barIndex = this.data.getDataIndexByBarIndex(crossIndex)\n const haData = this.data.getHeikinAshiData()\n const crossClose = haData.close[barIndex] ?? null\n const previousClose = haData.close[barIndex - 1] ?? null\n if (crossClose !== null && previousClose !== null) {\n return getTickerChangeFromCloseValues({ data: this.data, anchorClose: crossClose, prevClose: previousClose })\n }\n\n return null\n }\n\n toString() {\n return `HA Candle stick ${this.data.ticker}`\n }\n}\n\nexport default HeikinAshi\n","import { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Chart from './base_chart'\n\nclass LineChart extends Chart {\n static type = ChartElementType.LineChart\n static label = 'Line'\n static iconName = 'lineChartType'\n\n renderChart() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let first: number | undefined, last: number | undefined\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n this.context.beginPath()\n this.context.set('lineWidth', 1)\n this.context.set('strokeStyle', Colors.line)\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n const y = Math.round(this.fy(this.data.close[i]))\n this.context.lineTo(x, y)\n last = x\n if (first === undefined) {\n first = x\n }\n },\n })\n if (first !== undefined && last !== undefined) {\n this.context.stroke()\n this.context.set('fillStyle', Colors.background)\n this.context.lineTo(last!, this.height)\n this.context.lineTo(first!, this.height)\n this.context.fill()\n }\n\n translate.undo()\n }\n\n toString() {\n return `Line chart ${this.data.ticker}`\n }\n}\n\nexport default LineChart\n","import Text from '../canvas/text'\nimport { ChartElementType, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport { isRedesignEnabled } from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\nconst interval = 3\nconst domainMin = -1\nconst domainMax = 1\nconst red = 'rgba(200, 0, 0, 0.392)'\nconst redLine = 'rgb(120, 0, 0)'\nconst green = 'rgba(0, 180, 0, 0.392)'\nconst greenLine = 'rgb(0, 100, 0)'\n\nclass MarketSentiment extends Chart {\n static type = ChartElementType.MarketSentiment\n\n static initClass() {\n Object.defineProperty(this.prototype, 'width', {\n get() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n return this.model.width - MarketSentimentSettings.left.width - MarketSentimentSettings.right.width\n },\n })\n\n Object.defineProperty(this.prototype, 'height', {\n get() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n return this.paneModel.height - MarketSentimentSettings.top.height - MarketSentimentSettings.bottom.height\n },\n })\n }\n\n declare _data: number[]\n declare _dataLastIndex: number | null\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n this.renderYAxis = this.renderYAxis.bind(this)\n this.setupCache = this.setupCache.bind(this)\n }\n\n setupCache() {\n super.setupCache()\n if (!this.data) {\n return\n }\n const arr: number[] = []\n this.data.close.forEach((sum, i) => {\n arr[i] = sum / this.data.volume[i]\n })\n this._data = arr\n\n let lastIndex = null\n for (let i = this.data.volume.length - 1; i >= 0; i--) {\n if (this.data.volume[i] !== 0) {\n lastIndex = i\n break\n }\n }\n this._dataLastIndex =\n lastIndex === null\n ? null\n : Math.min(lastIndex, Math.round((this.data.drawMinutesPerDay - this.data.marketStartMinutes) / interval))\n }\n\n renderChart() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + MarketSentimentSettings.left.width + 0.5,\n yOffset: MarketSentimentSettings.top.height + 0.5,\n })\n translate.do()\n this.renderLineBullBear(this.context, this._data, 0, 0, 0)\n translate.undo()\n }\n\n renderLineBullBear(\n context: CanvasRenderingContext2D,\n array: number[],\n from: number,\n oversold: number,\n overbought: number\n ) {\n if (this._dataLastIndex === null) {\n return\n }\n const isRedesign = isRedesignEnabled()\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n const domain = [domainMax, domainMin]\n\n context.save()\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(domain[1]),\n this.fx(this._dataLastIndex),\n Math.round(this.fy(oversold) - this.fy(domain[1])) - 0.5\n )\n context.clip()\n context.set('fillStyle', red)\n context.set('strokeStyle', isRedesign ? Colors.marketDown : redLine)\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(domain[0])))\n for (let i = from; i < this.data.close.length; i++) {\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\n }\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[0])))\n context.fill()\n context.stroke()\n context.restore()\n\n context.save()\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(domain[0]),\n this.fx(this._dataLastIndex),\n Math.round(this.fy(overbought)) - 0.5\n )\n context.clip()\n context.set('fillStyle', green)\n context.set('strokeStyle', isRedesign ? Colors.marketUp : greenLine)\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(domain[1])))\n for (let i = from; i < this.data.close.length; i++) {\n context.lineTo(this.fx(i), Math.round(this.fy(array[i])))\n }\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(domain[1])))\n context.fill()\n context.stroke()\n context.restore()\n }\n\n renderXAxis() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n const { Colors } = MarketSentimentSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + MarketSentimentSettings.left.width,\n yOffset: MarketSentimentSettings.top.height,\n })\n translate.do()\n\n const xLine = this.getXLine()\n const text = new Text(\n {\n y: this.height + 12,\n font: { size: 7 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.bottom,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n let x\n\n x = this.fx(0)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10) + 2 /* remove overflow */\n text.set({ text: '10AM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 20)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 40)\n text.set({ text: '12PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 60)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 80)\n text.set({ text: '2PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 100)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n x = this.fx(10 + 120 - 1)\n text.set({ text: '4PM', x }).render(this.context)\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n translate.undo()\n }\n\n renderText() {}\n\n renderCrossText() {}\n\n renderOverlaysLabels() {}\n\n _compute() {\n return { min: domainMin, max: domainMax }\n }\n\n computeVisibleMinMax() {\n return this._compute()\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { MarketSentimentSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const isRedesign = isRedesignEnabled()\n const translate = getTranslate({\n context: this.context,\n xOffset: MarketSentimentSettings.left.width,\n yOffset: MarketSentimentSettings.top.height,\n })\n translate.do()\n\n const yLine = this.getYLine()\n for (const tick of [domainMin, 0, domainMax]) {\n const y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n }\n\n const text = new Text(\n {\n x: this.width + 27,\n font: { size: 8 },\n textBaseline: TextBaseline.middle,\n textAlign: TextAlign.right,\n },\n this.paneModel\n )\n\n const fillUp = isRedesign ? Colors.marketUp : greenLine\n const fillDown = isRedesign ? Colors.marketDown : redLine\n const last = this._data[this._dataLastIndex!]\n const percent = this._dataLastIndex !== null ? Math.floor(last * 50 + 50) : 50\n text.set({ y: this.fy(0) - 5, fillStyle: fillUp, text: `${percent}%` }).render(context)\n text.set({ y: this.fy(0) + 7, fillStyle: fillDown, text: `${100 - percent}%` }).render(context)\n\n translate.undo()\n }\n\n clip() {\n const { MarketSentimentSettings } = this.getChartLayoutSettings()\n this.context.beginPath()\n this.context.rect(MarketSentimentSettings.left.width, MarketSentimentSettings.top.height, this.width, this.height)\n this.context.clip()\n }\n\n getMinMax() {\n return this._compute()\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n toString() {\n return `Market sentiment chart`\n }\n}\nMarketSentiment.initClass()\n\nexport default MarketSentiment\n","import { ObjectHash } from '../../types/shared'\nimport Text from '../canvas/text'\nimport { ChartElementType, FONT_SIZE, LINE_HEIGHT, PADDING, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport utils from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\ninterface MultiLineChartAttrs extends BaseChartAttrs {\n tickers: string[]\n label?: string\n min?: number\n max?: number\n}\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nclass MultiLineChart extends Chart {\n static type = ChartElementType.MultiLineChart\n tickersDimensions: number[] = []\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n }\n\n renderChart() {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n\n this.context.set('lineWidth', 1)\n\n const quotes: ObjectHash = {}\n for (const quote of this.getQuotes()) {\n quotes[quote.ticker] = quote\n }\n\n for (let index = this.attrs.tickers.length - 1; index >= 0; index--) {\n const ticker = this.attrs.tickers[index]\n const quote = quotes[ticker]\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n this.context.beginPath()\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const x = this.fx(i)\n if (x + this.leftOffset < -10 || x + this.leftOffset > this.model.width + 10) {\n // margin?\n continue\n }\n const y = Math.round(this.fy(quote.close[i]))\n this.context.lineTo(x, y)\n }\n this.context.stroke()\n }\n\n translate.undo()\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const text = this.attrs.label || ''\n const y = (this.height - 4) / 2\n new Text(\n {\n text,\n x: 28,\n y: ChartSettings.top.height + y,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n return this.renderCrossText(context, this.data.close.length - 1)\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const maxTickerLength = utils.max(this.attrs.tickers.map((t) => t.length))\n\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n const isLastDate = crossIndex === this.data.close.length - 1\n\n new Text(\n {\n text: `${months[month]} ${day} ${year} `,\n x: ChartSettings.left.width + (maxTickerLength > 15 ? 200 : 132),\n y: 30,\n font: { size: 8 },\n fillStyle: Colors.text,\n background: Colors.canvasFill,\n },\n this.paneModel\n ).render(context)\n\n const quotes: ObjectHash = {}\n for (const quote of this.getQuotes()) {\n quotes[quote.ticker] = quote\n }\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const y = PADDING.S + (PADDING.S + LINE_HEIGHT.M) * index\n if (this.tickersDimensions[index]) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n ChartSettings.left.width - PADDING.XXXS,\n y - PADDING.XXXS,\n PADDING.XXXS + this.tickersDimensions[index] + PADDING.XXXS,\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\n )\n }\n const ticker = this.attrs.tickers[index]\n const closeValue = quotes[ticker].close[crossIndex]\n const text = new Text(\n {\n text: `${ticker} ${typeof closeValue === 'number' ? closeValue.toFixed(2) : NaN} `,\n x: ChartSettings.left.width,\n y,\n font: { size: FONT_SIZE.M, style: 'bold' },\n lineHeight: LINE_HEIGHT.M,\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n if (isLastDate) {\n this.tickersDimensions[index] = text.measure(context)\n }\n text.render(context)\n }\n }\n\n computeVisibleMinMax(...arrays: Array) {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const { leftOffset } = this.model\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return { min, max }\n }\n\n getMinMax() {\n const quotes = this.getQuotes()\n let { min, max } = this.computeVisibleMinMax(...quotes.map((q) => q.close))\n if (typeof this.attrs.min !== 'undefined') {\n min = this.attrs.min\n }\n if (typeof this.attrs.max !== 'undefined') {\n max = this.attrs.max\n }\n return { min, max }\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n getQuotes() {\n return Quote.select(\n (q: Quote) =>\n this.attrs.tickers.includes(q.ticker) &&\n q.timeframe === this.data?.timeframe &&\n this.model.chart_layout().isIdeaId(q.ideaID)\n )\n }\n\n toString() {\n return `Line chart ${this.data.ticker}`\n }\n}\n\nexport default MultiLineChart\n","import { ChartElementType } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Chart from './base_chart'\n\nclass OHLCChart extends Chart {\n static type = ChartElementType.OhlcChart\n static label = 'OHLC'\n static iconName = 'ohlcChartType'\n\n renderChart() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n\n const barWithoutMarginWidth = this.getBarWithoutMarginWidth()\n\n let lineWidth = 1\n if (barWithoutMarginWidth >= 40) {\n lineWidth = 4\n } else if (barWithoutMarginWidth >= 30) {\n lineWidth = 3\n } else if (barWithoutMarginWidth >= 15) {\n lineWidth = 2\n }\n const lineThickness = lineWidth / 2\n const handleLengthFromWick = Math.round(barWithoutMarginWidth / 2 - lineThickness)\n const lineOffset = lineWidth % 2 === 0 ? 0 : 0.5\n this.context.set('lineWidth', lineWidth)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.paneModel.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n const barX = ~~(x + 1) + lineOffset // move 1px to right so cursor don't cover bar of ohlc-chart & round for pixel perfect render on zoom\n\n this.context.beginPath()\n this.context.set(\n 'strokeStyle',\n this.data.close[i] < this.data.open[i] ? Colors.ohlcTrendDown : Colors.ohlcTrendUp\n )\n\n this.context.moveTo(barX, Math.round(this.fy(this.data.high[i])))\n this.context.lineTo(barX, Math.round(this.fy(this.data.low[i])))\n\n if (handleLengthFromWick >= 1) {\n const open = Math.round(this.fy(this.data.open[i]))\n this.context.moveTo(barX + lineThickness, open + lineOffset) // move to right edge of wick\n this.context.lineTo(barX - lineThickness - handleLengthFromWick, open + lineOffset) // draw line to the left\n\n const close = Math.round(this.fy(this.data.close[i]))\n this.context.moveTo(barX - lineThickness, close + lineOffset) // move to left edge of wick\n this.context.lineTo(barX + lineThickness + handleLengthFromWick, close + lineOffset) // draw line to the right\n }\n\n this.context.stroke()\n },\n })\n\n translate.undo()\n }\n\n toString() {\n return `OHLC ${this.data.ticker}`\n }\n}\n\nexport default OHLCChart\n","import * as d3 from 'd3'\n\nimport { ObjectHash } from '../../types/shared'\nimport Text from '../canvas/text'\nimport { ChartElementType, FONT_SIZE, MARGIN, OFFSET, PADDING, TextAlign, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport utils from '../utils'\nimport Chart, { BaseChartAttrs } from './base_chart'\n\nconst months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\ninterface PerfChartAttrs extends BaseChartAttrs {\n tickers: string[]\n label?: string\n fromDate: string\n toDate: string\n min?: number\n max?: number\n}\n\nclass PerfChart extends Chart {\n static type = ChartElementType.PerfChart\n\n overlayLabelWidth: ObjectHash\n perf: ObjectHash = {}\n\n constructor(values: Partial, model: Pane) {\n super(values, model)\n this.renderText = this.renderText.bind(this)\n this.renderOverlaysLabels = this.renderOverlaysLabels.bind(this)\n this.renderYAxis = this.renderYAxis.bind(this)\n this.overlayLabelWidth = {}\n }\n\n renderChart() {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width + 0.5,\n yOffset: ChartSettings.top.height + 0.5,\n })\n translate.do()\n\n this.context.beginPath()\n this.context.set('lineWidth', 1)\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n if ((this.perf[ticker] != null ? this.perf[ticker].length : 0) > 0) {\n this.context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n this.context.beginPath()\n for (let i = 0, end = this.data.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n this.context.lineTo(this.fx(i), Math.round(this.fy(this.perf[ticker][i])))\n }\n this.context.stroke()\n }\n }\n\n translate.undo()\n }\n\n renderText(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const period = (() => {\n switch (this.model.quote().timeframe) {\n case 'd':\n return 'DAILY'\n case 'w':\n return 'WEEKLY'\n case 'm':\n return 'MONTHLY'\n default:\n return\n }\n })()\n const y = (this.height - 4) / 2\n new Text(\n {\n text: period,\n x: 28,\n y: ChartSettings.top.height + y,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.paneModel\n ).render(context)\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const date = utils.dateFromUnixTimestamp(this.data.getDataByBarIndex('date', crossIndex) ?? 0)\n let dateString = ''\n const month = date.getMonth() // 20141126\n const year = date.getFullYear()\n const day = date.getDate()\n switch (this.data.timeframe) {\n case 'd':\n case 'w':\n dateString = `${months[month]} ${day}`\n break\n case 'm':\n dateString = `${months[month]} ${year}`\n break\n default:\n return\n }\n\n let shouldRenderDate = false\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n const tickerData = this.perf[ticker]\n if (tickerData?.length) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n ChartSettings.left.width - PADDING.XXXS,\n OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index - PADDING.XXXS,\n PADDING.XXXS + this.overlayLabelWidth[ticker] + PADDING.XXXS,\n PADDING.XXXS + FONT_SIZE.M + PADDING.XXXS\n )\n const hasData = Number.isFinite(tickerData[crossIndex])\n const percentageText = hasData ? `${tickerData[crossIndex].toFixed(2)}%` : ''\n shouldRenderDate = shouldRenderDate || hasData\n new Text(\n {\n text: `${ticker} ${percentageText}`,\n x: ChartSettings.left.width,\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n ).render(context)\n }\n }\n\n if (shouldRenderDate) {\n new Text(\n {\n text: `${dateString} `,\n x: ChartSettings.left.width + 132,\n y: 30,\n font: { size: 8 },\n fillStyle: Colors.text,\n background: Colors.canvasFill,\n },\n this.paneModel\n ).render(context)\n }\n }\n\n renderOverlaysLabels(context: CanvasRenderingContext2D) {\n super.renderOverlaysLabels(context)\n const { ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n\n for (let index = 0; index < this.attrs.tickers.length; index++) {\n const ticker = this.attrs.tickers[index]\n const tickerData = this.perf[ticker]\n if (tickerData?.length) {\n const lastCrossIndex = this.perf[ticker].length - 1\n const hasData = Number.isFinite(tickerData[lastCrossIndex])\n const percentageText = hasData ? `${tickerData[lastCrossIndex].toFixed(2)}%` : ''\n const text = new Text(\n {\n text: `${ticker} ${percentageText}`,\n x: ChartSettings.left.width,\n y: OFFSET.M + (FONT_SIZE.M + MARGIN.XS) * index,\n font: { size: FONT_SIZE.M, style: 'bold' },\n fillStyle: ColorsSettings[index % ColorsSettings.length],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.paneModel\n )\n this.overlayLabelWidth = { ...this.overlayLabelWidth, [ticker]: text.measure(context) }\n text.render(context)\n }\n }\n }\n\n _compute() {\n this.perf = {}\n const quotes = this.getQuotes()\n\n const fromDate = new Date(this.attrs.fromDate + ' 00:00')\n const toDate = new Date(this.attrs.toDate + ' 23:59')\n const filteredQuotes = []\n for (const quote of quotes) {\n const closes = []\n for (let i = 0, end = quote.close.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const date = utils.dateFromUnixTimestamp(quote.date[i])\n if (fromDate <= date && date <= toDate) {\n closes.push(quote.close[i])\n }\n }\n filteredQuotes.push({ ticker: quote.ticker, close: closes })\n }\n\n const daysCount = d3.max(filteredQuotes, (q) => q.close.length) ?? 0\n for (const quote of filteredQuotes) {\n this.perf[quote.ticker] = []\n const first = quote.close[0]\n let offset = 0\n if (daysCount > quote.close.length) {\n offset = daysCount - quote.close.length\n for (let i = 0, end1 = offset, asc1 = end1 >= 0; asc1 ? i < end1 : i > end1; asc1 ? i++ : i--) {\n this.perf[quote.ticker][i] = NaN\n }\n }\n for (let i = 0, end2 = quote.close.length, asc2 = end2 >= 0; asc2 ? i < end2 : i > end2; asc2 ? i++ : i--) {\n this.perf[quote.ticker][offset + i] = (quote.close[i] * 100) / first - 100\n }\n }\n const { min, max } = this.computeVisibleMinMax(...Object.keys(this.perf).map((x) => this.perf[x]))\n return { min, max }\n }\n\n // TODO refactor into ?utils\n computeVisibleMinMax(...arrays: Array) {\n let min = Number.MAX_VALUE\n let max = Number.MIN_VALUE\n\n const { leftOffset } = this.model\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return { min, max }\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const ticks = this.paneModel.scale.y.ticks(10)\n const yLine = this.getYLine()\n const text = new Text(\n {\n x: this.width + 8,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.paneModel\n )\n for (const tick of ticks) {\n const y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n text.set({ text: tick.toFixed(2), y }).render(context)\n }\n translate.undo()\n }\n\n renderXAxis() {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context: this.context,\n xOffset: this.leftOffset + ChartSettings.left.width,\n yOffset: ChartSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n y: this.height + 18,\n font: { size: 8 },\n fillStyle: Colors.text,\n textBaseline: TextBaseline.bottom,\n textAlign: TextAlign.center,\n },\n this.paneModel\n )\n const textWidth = text.set({ text: '2020' }).measure(this.context)\n\n let date = new Date(this.data.date[0] * 1000)\n let lastMonth = date.getMonth() + '-' + date.getFullYear()\n\n let monthsInData = 0\n this.data.date.forEach((d, index) => {\n if (index < 1) {\n return\n }\n\n const date = new Date(d * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n monthsInData++\n }\n lastMonth = month\n })\n\n const availableTickSpots = ~~(this.width / textWidth)\n const monthsToAvail = monthsInData / availableTickSpots\n let renderMonth\n if (monthsToAvail <= 1) {\n renderMonth = () => true\n } else if (monthsToAvail <= 2) {\n renderMonth = (x: number) => x % 2 === 0\n } else if (monthsToAvail <= 3) {\n renderMonth = (x: number) => x % 3 === 0\n } else if (monthsToAvail <= 4) {\n renderMonth = (x: number) => x % 4 === 0\n } else if (monthsToAvail <= 6) {\n renderMonth = (x: number) => x % 6 === 0\n } else {\n renderMonth = (x: number) => x === 0\n }\n\n date = new Date(this.data.date[0] * 1000)\n lastMonth = date.getMonth() + '-' + date.getFullYear()\n\n const xLine = this.getXLine()\n\n for (let i = 0; i < this.data.date.length; i++) {\n date = new Date(this.data.date[i] * 1000)\n const month = date.getMonth() + '-' + date.getFullYear()\n if (month !== lastMonth) {\n lastMonth = month\n const x = this.fx(i)\n if (x + this.leftOffset < -15 || x + this.leftOffset > this.width + 15) {\n // margin?\n continue\n }\n xLine.set({ x1: x, x2: x }).render(this.context)\n\n if (!renderMonth(date.getMonth())) {\n continue\n }\n\n text\n .set({\n text: date.getMonth() === 0 ? date.getFullYear().toString() : months[date.getMonth()],\n x: x,\n })\n .render(this.context)\n }\n }\n\n translate.undo()\n }\n\n getMinMax() {\n return this._compute()\n }\n\n renderVolumeAxis() {}\n\n renderVolume() {}\n\n getQuotes() {\n return Quote.select(\n (q: Quote) =>\n this.attrs.tickers.includes(q.ticker) &&\n q.timeframe === this.data?.timeframe &&\n this.model.chart_layout().isIdeaId(q.ideaID)\n )\n }\n\n toString() {\n return `Perf chart ${this.data.ticker}`\n }\n}\n\nexport default PerfChart\n","import { ChartElementType } from '../constants/common'\nimport candleStick from './candle_stick'\nimport hollowCandleStick from './candle_stick_hollow'\nimport heikinAshi from './heikin_ashi'\nimport lineChart from './line_chart'\nimport marketSentiment from './market_sentiment'\nimport multiLineCharts from './multi_line_chart'\nimport ohlcChart from './ohlc_chart'\nimport perfChart from './perf_chart'\n\nexport const chartsByType = Object.freeze({\n [ChartElementType.CandleStick]: candleStick,\n [ChartElementType.HeikinAshi]: heikinAshi,\n [ChartElementType.HollowCandleStick]: hollowCandleStick,\n [ChartElementType.LineChart]: lineChart,\n [ChartElementType.MarketSentiment]: marketSentiment,\n [ChartElementType.MultiLineChart]: multiLineCharts,\n [ChartElementType.OhlcChart]: ohlcChart,\n [ChartElementType.PerfChart]: perfChart,\n})\n","export const FONT_SIZE = {\n XXS: 5,\n XS: 7,\n S: 8,\n M: 10,\n L: 11,\n XXL: 18,\n XXXL: 23,\n}\nexport const LINE_HEIGHT = {\n XS: 7,\n S: 8,\n M: 10,\n}\nexport const PADDING = {\n XXXS: 1,\n XXS: 2,\n XS: 3,\n S: 5,\n}\nexport const MARGIN = {\n XS: 4,\n}\nexport const CHART_MARGIN = {\n S: 15,\n M: 30,\n L: 35,\n XL: 38,\n XXL: 48,\n}\nexport const SETTINGS_HEIGHT = 44\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\nexport const OFFSET = {\n XXS: 2,\n XS: 4,\n S: 6,\n M: 8,\n XXL: 20,\n}\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n\nexport enum ChartEditorEnum {\n publish = 'publish',\n tools = 'tools',\n ideas = 'ideas',\n settings = 'settings',\n timeframe = 'timeframe',\n}\n\nexport enum LayoutType {\n '1h1v' = '1h1v',\n '1h2v' = '1h2v',\n '1h3v' = '1h3v',\n '2h1v' = '2h1v',\n '2h2v' = '2h2v',\n '3h1v' = '3h1v',\n '3h2v' = '3h2v',\n '1l2r' = '1l2r',\n '1t2b' = '1t2b',\n}\n\nexport enum CanvasElementType {\n element = 'canvas/element',\n arrow = 'canvas/arrow',\n brushV1 = 'canvas/brush/brush_v1',\n curve = 'canvas/curve',\n ellipse = 'canvas/ellipse',\n fibonacciRetracements = 'canvas/fibonacci_retracements',\n horizontalLine = 'canvas/horizontal_line',\n line = 'canvas/line',\n measure = 'canvas/measure',\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\n polygon = 'canvas/polygon',\n position = 'canvas/position',\n rectangle = 'canvas/rectangle',\n rotatedRectangle = 'canvas/rotated_rectangle',\n scaledLine = 'canvas/scaled_line',\n scaledText = 'canvas/scaled_text',\n symbol = 'canvas/symbol',\n text = 'canvas/text',\n triangle = 'canvas/triangle',\n verticalLine = 'canvas/vertical_line',\n xabcd = 'canvas/xabcd',\n calloutV1 = 'canvas/callout/callout_v1',\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\n}\n\nexport enum ChartElementType {\n CandleStick = 'charts/candle_stick',\n HeikinAshi = 'charts/heikin_ashi',\n HollowCandleStick = 'charts/candle_stick_hollow',\n LineChart = 'charts/line_chart',\n OhlcChart = 'charts/ohlc_chart',\n MarketSentiment = 'charts/market_sentiment',\n MultiLineChart = 'charts/multi_line_chart',\n PerfChart = 'charts/perf_chart',\n}\n\nexport enum IndicatorType {\n Indicator = 'indicators/indicator',\n None = 'indicators/none',\n Adx = 'indicators/adx',\n Aro = 'indicators/aro',\n Aroosc = 'indicators/aroosc',\n Atr = 'indicators/atr',\n Cci = 'indicators/cci',\n Cot = 'indicators/cot',\n Fi = 'indicators/fi',\n Macd = 'indicators/macd',\n Mfi = 'indicators/mfi',\n Obv = 'indicators/obv',\n Perf = 'indicators/perf',\n Rmi = 'indicators/rmi',\n Roc = 'indicators/roc',\n Rsi = 'indicators/rsi',\n Rvol = 'indicators/rvol',\n Rwi = 'indicators/rwi',\n Stofa = 'indicators/stofa',\n Stofu = 'indicators/stofu',\n Stosl = 'indicators/stosl',\n Trix = 'indicators/trix',\n Ult = 'indicators/ult',\n Vol = 'indicators/vol',\n Wr = 'indicators/wr',\n}\n\nexport enum OverlayType {\n Overlay = 'overlays/overlay',\n None = 'overlays/none',\n Bb = 'overlays/bb',\n Dch = 'overlays/dch',\n Ema = 'overlays/ema',\n Ema2 = 'overlays/ema2',\n Hilo = 'overlays/hilo',\n Hline = 'overlays/hline',\n Ic = 'overlays/ic',\n Icf = 'overlays/icf',\n Kch = 'overlays/kch',\n Patterns = 'overlays/patterns',\n Sar = 'overlays/sar',\n Sma = 'overlays/sma',\n Sma2 = 'overlays/sma2',\n Str = 'overlays/str',\n Vp = 'overlays/vp',\n Vwap = 'overlays/vwap',\n}\n\nexport enum ChartEventDbType {\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n Earnings = 'chartEvent/earnings',\n}\n\nexport enum ChartEventType {\n ChartEvent = 'chartEvent/chartEvent',\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n Earnings = 'chartEvent/earnings',\n}\n\nexport enum ChartEventBadgeType {\n Dividends = 'chartEvent/dividends',\n Split = 'chartEvent/split',\n EarningsPositive = 'chartEvent/earnings',\n EarningsNegative = 'chartEvent/earningsNegative',\n EarningsNeutral = 'chartEvent/earningsNeutral',\n EarningsFuture = 'chartEvent/earningsFuture',\n}\n\nexport const ChartEventLabels: Record = {\n [ChartEventBadgeType.Dividends]: 'Dividends',\n [ChartEventBadgeType.Split]: 'Split',\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\n}\n\ninterface LayoutRule {\n columns: number\n rows: number\n count: number\n gridAreas?: string[]\n}\n\nexport const LAYOUTS: Record = {\n '1h1v': { columns: 1, rows: 1, count: 1 },\n '1h2v': { columns: 1, rows: 2, count: 2 },\n '1h3v': { columns: 1, rows: 3, count: 3 },\n '2h1v': { columns: 2, rows: 1, count: 2 },\n '2h2v': { columns: 2, rows: 2, count: 4 },\n '3h1v': { columns: 3, rows: 1, count: 3 },\n '3h2v': { columns: 3, rows: 2, count: 6 },\n '1l2r': {\n columns: 2,\n rows: 2,\n count: 3,\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\n },\n '1t2b': {\n columns: 2,\n rows: 2,\n count: 3,\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\n },\n}\n\nexport const SORT_DIRECTION = {\n ASC: 'ASC',\n DESC: 'DESC',\n}\n\nexport const ICON_SIZE = {\n L: 32,\n}\n\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\nexport enum TIMEFRAME {\n i1 = 'i1',\n i2 = 'i2',\n i3 = 'i3',\n i5 = 'i5',\n i10 = 'i10',\n i15 = 'i15',\n i30 = 'i30',\n h = 'h',\n h2 = 'h2',\n h4 = 'h4',\n d = 'd',\n w = 'w',\n m = 'm',\n}\n\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\n\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\n\nexport const IntradayTimeframeInterval = {\n [TIMEFRAME.i1]: 1,\n [TIMEFRAME.i2]: 2,\n [TIMEFRAME.i3]: 3,\n [TIMEFRAME.i5]: 5,\n [TIMEFRAME.i10]: 10,\n [TIMEFRAME.i15]: 15,\n [TIMEFRAME.i30]: 30,\n [TIMEFRAME.h]: 60,\n [TIMEFRAME.h2]: 120,\n [TIMEFRAME.h4]: 240,\n}\n\nexport enum DateRangeType {\n d1 = 'd1',\n d5 = 'd5',\n m1 = 'm1',\n m3 = 'm3',\n m6 = 'm6',\n ytd = 'ytd',\n y1 = 'y1',\n y2 = 'y2',\n y5 = 'y5',\n max = 'max',\n}\n\nexport const TIMEFRAME_SECONDS = {\n [TIMEFRAME.i1]: 60,\n [TIMEFRAME.i2]: 120,\n [TIMEFRAME.i3]: 180,\n [TIMEFRAME.i5]: 300,\n [TIMEFRAME.i10]: 600,\n [TIMEFRAME.i15]: 900,\n [TIMEFRAME.i30]: 1800,\n [TIMEFRAME.h]: 3600,\n [TIMEFRAME.h2]: 7200,\n [TIMEFRAME.h4]: 14400,\n [TIMEFRAME.d]: 86400,\n [TIMEFRAME.w]: 604800,\n [TIMEFRAME.m]: 2592000,\n}\n\nexport const CRYPTOS = {\n BTCUSD: 'BTCUSD',\n LTCUSD: 'LTCUSD',\n ETHUSD: 'ETHUSD',\n XRPUSD: 'XRPUSD',\n BCHUSD: 'BCHUSD',\n BTCEUR: 'BTCEUR',\n LTCEUR: 'LTCEUR',\n ETHEUR: 'ETHEUR',\n XRPEUR: 'XRPEUR',\n BCHEUR: 'BCHEUR',\n LTCBTC: 'LTCBTC',\n ETHBTC: 'ETHBTC',\n XRPBTC: 'XRPBTC',\n BCHBTC: 'BCHBTC',\n}\n\nexport enum SpecificChartFunctionality {\n default = 'default',\n quotePage = 'quotePage',\n quotePerf = 'quotePerf',\n chartPage = 'chartPage',\n smallIndex = 'smallIndex',\n offScreen = 'offScreen',\n forexPage = 'forexPage',\n futuresPage = 'futuresPage',\n cryptoPage = 'cryptoPage',\n}\n\nexport enum TextAlign {\n left = 'left',\n right = 'right',\n center = 'center',\n start = 'start',\n end = 'end',\n}\n\nexport enum TextBaseline {\n top = 'top',\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\n middle = 'middle',\n alphabetic = 'alphabetic',\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\n bottom = 'bottom',\n}\n\nexport enum ScaleType {\n Linear = 'linear',\n Percentage = 'percentage',\n Logarithmic = 'logarithmic',\n}\n\nexport enum QuotePollingIntervalInMs {\n Default = 3000,\n Free = 180000,\n Elite = 3000,\n EliteStocksReduced = 60000,\n}\n\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\n\nexport const ScaleLabel = {\n [ScaleType.Linear]: 'Linear',\n [ScaleType.Percentage]: 'Percentage',\n [ScaleType.Logarithmic]: 'Logarithmic',\n}\n\nexport const PANE_HEIGHT_DEFAULT = {\n chart: 400,\n indicator: 120,\n}\n\nexport const INDICATOR_LABEL_HEIGHT = 24\n\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\n\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\n\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\n\nexport const getTimeframeLabel = (timeframe: string) => {\n switch (timeframe) {\n case TIMEFRAME.i1:\n return '1 MIN'\n case TIMEFRAME.i2:\n return '2 MIN'\n case TIMEFRAME.i3:\n return '3 MIN'\n case TIMEFRAME.i5:\n return '5 MIN'\n case TIMEFRAME.i10:\n return '10 MIN'\n case TIMEFRAME.i15:\n return '15 MIN'\n case TIMEFRAME.i30:\n return '30 MIN'\n case TIMEFRAME.h:\n return '1 HR'\n case TIMEFRAME.h2:\n return '2 HR'\n case TIMEFRAME.h4:\n return '4 HR'\n case TIMEFRAME.d:\n return 'DAILY'\n case TIMEFRAME.w:\n return 'WEEKLY'\n case TIMEFRAME.m:\n return 'MONTHLY'\n default:\n return ''\n }\n}\n\nexport type ChartsPageQueryParams = {\n p: string\n t: string\n l: string\n r?: string\n i?: string\n sidebar?: string\n}\n\nexport type QuotePageQueryParams = {\n p?: string\n t: string\n r?: string\n i?: string\n ty?: QuotePageQueryChartTypes\n}\n\nexport enum QuotePageQueryChartTypes {\n l = 'l',\n c = 'c',\n cs = 'cs',\n hc = 'hc',\n ha = 'ha',\n o = 'o',\n p = 'p',\n}\n\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\n\nexport enum MacroTimeframe {\n // seconds = 'seconds',\n minutes = 'minutes',\n hours = 'hours',\n days = 'days',\n weeks = 'weeks',\n months = 'months',\n}\n\nexport const MicroMacroTimeframe = {\n [TIMEFRAME.i1]: {\n micro: 1,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i2]: {\n micro: 2,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i3]: {\n micro: 3,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i5]: {\n micro: 5,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i10]: {\n micro: 10,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i15]: {\n micro: 15,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.i30]: {\n micro: 30,\n macro: MacroTimeframe.minutes,\n },\n [TIMEFRAME.h]: {\n micro: 1,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.h2]: {\n micro: 2,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.h4]: {\n micro: 4,\n macro: MacroTimeframe.hours,\n },\n [TIMEFRAME.d]: {\n micro: 1,\n macro: MacroTimeframe.days,\n },\n [TIMEFRAME.w]: {\n micro: 1,\n macro: MacroTimeframe.weeks,\n },\n [TIMEFRAME.m]: {\n micro: 1,\n macro: MacroTimeframe.months,\n },\n}\n\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\n (prev, curr) => ({\n ...prev,\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\n : [MicroMacroTimeframe[curr].micro],\n }),\n {} as { [key in MacroTimeframe]: number[] }\n)\n\ntype IRange = {\n from?: number\n to?: number\n}\n\nexport type IVisibility = {\n [key in MacroTimeframe]?: IRange\n}\n\nexport enum SetVisibilityTo {\n currentAndAbove,\n currentAndBelow,\n currentOnly,\n all,\n}\n\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\n\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\n","import React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { Instrument } from '../../../types/shared'\nimport {\n Notification,\n Paragraph,\n generatePathForTimeframeDateRange,\n getDateRangeGroupsWithHref,\n timeframeUtm,\n useNotification,\n} from '../../components'\nimport { SpecificChartFunctionality, TIMEFRAME, TimeframeAndIntradayType } from '../../constants/common'\nimport Chart from '../../models/chart'\nimport Quote from '../../models/quote'\nimport { dateFromUnixTimestamp } from '../../utils'\nimport { getChartStartEndDates, getVisibleBarsNumber } from '../renderUtils'\nimport { useChartsPathLocation } from './use-charts-path-location'\nimport { getTimeframeGroupsWithHref } from './utils'\n\ninterface IPathForTimeframeDateRangeProps {\n timeframe: TimeframeAndIntradayType\n dateRange?: string | null\n ticker?: string\n}\n\nexport interface IDateRange {\n value: string\n timeframe: TIMEFRAME\n}\n\nexport function useChartModelCustomDateRangeValues({\n chartModel,\n isPremium,\n}: {\n chartModel: Chart | null\n isPremium: boolean\n}) {\n const notificationContext = useNotification()\n const location = useLocation()\n const [isFetching, setIsFetching] = React.useState(false)\n const chartLayoutModel = chartModel?.chart_layout() || null\n const chartIndex = chartLayoutModel?.getAllCharts().findIndex((chart) => chartModel!.eql(chart)) ?? -1\n const { getChartsToPath } = useChartsPathLocation({ chartLayoutModel, chartIndex })\n const specificChartFunctionality = chartLayoutModel?.specificChartFunctionality ?? SpecificChartFunctionality.default\n\n const anchorDate = React.useMemo(() => {\n if (!chartModel) return new Date()\n const quote = chartModel.quote()\n return dateFromUnixTimestamp(quote.date[quote.date.length - 1])\n }, [chartModel])\n\n const generateChartLayoutRouterPath = React.useCallback(\n ({ ticker, timeframe, dateRange }: IPathForTimeframeDateRangeProps) => {\n if (specificChartFunctionality === SpecificChartFunctionality.chartPage) {\n return getChartsToPath({\n ticker: ticker,\n timeframe: timeframe as TIMEFRAME,\n dateRange: dateRange,\n })\n }\n\n return generatePathForTimeframeDateRange({\n isPremium,\n pathname: location.pathname,\n timeframe: timeframe,\n dateRange: dateRange,\n utmCampaign: timeframeUtm[specificChartFunctionality],\n })\n },\n [getChartsToPath, isPremium, specificChartFunctionality, location.pathname]\n )\n\n const timeframeGroupsWithHref = (isPremium: boolean) =>\n getTimeframeGroupsWithHref({\n isPremium,\n generatePath: (timeFrame) => generateChartLayoutRouterPath({ timeframe: timeFrame.value, dateRange: null }),\n })\n\n const dateRangeGroupsWithHref = ({\n isPremium,\n customRange,\n instrument,\n }: {\n isPremium: boolean\n customRange?: string\n instrument: Instrument\n }) =>\n getDateRangeGroupsWithHref({\n isPremium,\n customRange,\n instrument,\n generatePath: (dateRange: { timeframe?: TIMEFRAME; value: string }) =>\n generateChartLayoutRouterPath({ timeframe: dateRange.timeframe!, dateRange: dateRange.value }),\n })\n\n const handleCustomDateRangeValidation = async (dateRangeState: { value: string | null; timeframe: TIMEFRAME }) => {\n if (dateRangeState.value !== null) {\n const { timeframe, ticker, instrument, premarket, aftermarket } = chartModel?.quote() || {}\n const patterns = !!chartModel?.getHasPatterns()\n if (!anchorDate || !instrument || !ticker || !timeframe || !dateRangeState.value) return false\n setIsFetching(true)\n const quote = await Quote.get({\n ticker,\n instrument,\n timeframe: dateRangeState.timeframe,\n options: {\n premarket,\n aftermarket,\n patterns,\n cachePredicate: (quote) => quote.ideaID === undefined,\n fetchNewDataOnCachedQuote: true,\n },\n })\n setIsFetching(false)\n\n const { numOfVisibleBars } = getVisibleBarsNumber({\n ...getChartStartEndDates({ dateRange: dateRangeState.value, quote }),\n quote,\n dateRange: dateRangeState.value,\n })\n if (numOfVisibleBars === 0) {\n notificationContext.show(\n \n \n There are no data for the selected date range. Try selecting different dates.\n \n \n )\n\n return false\n }\n }\n return true\n }\n\n return {\n anchorDate,\n generateChartLayoutRouterPath,\n timeframeGroupsWithHref,\n dateRangeGroupsWithHref,\n isFetching,\n handleCustomDateRangeValidation,\n }\n}\n","import * as React from 'react'\nimport { useLocation } from 'react-router-dom'\n\nimport { ChartsPageQueryParams, LAYOUTS, LayoutType, TIMEFRAME } from '../../constants/common'\nimport { useModelState } from '../../model-hooks/use-model-state'\nimport { ChartSyncablePart } from '../../models/chart/contstants'\nimport ChartLayout from '../../models/chart_layout'\nimport { getIsMobilePortrait } from '../../utils'\nimport { decodeQueryString, encodeQueryString } from '../../utils/query_string'\n\nexport function useChartsPathLocation({\n chartLayoutModel: unwatchedChartLayoutModel,\n chartIndex = -1,\n}: {\n chartLayoutModel: ChartLayout | null\n chartIndex?: number\n}) {\n const location = useLocation()\n const chartLayoutModel = useModelState(unwatchedChartLayoutModel, {\n watchProperties: ['syncChartParts'],\n })\n const hasSyncedTimeframe = React.useMemo(\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Timeframe),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chartLayoutModel?.syncChartParts]\n )\n const hasSyncedTicker = React.useMemo(\n () => !!chartLayoutModel?.getIsChartPartInSync(ChartSyncablePart.Ticker),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [chartLayoutModel?.syncChartParts]\n )\n\n const getChartsToPath = React.useCallback(\n ({\n ticker,\n timeframe,\n dateRange,\n layout,\n }: {\n timeframe?: TIMEFRAME\n dateRange?: string | null\n ticker?: string\n layout?: LayoutType\n }) => {\n if (!chartLayoutModel) {\n return {\n pathname: location.pathname,\n search: '',\n }\n }\n\n const decodedSearch = decodeQueryString(location.search)\n const { count } = LAYOUTS[(layout ?? chartLayoutModel.layout) as LayoutType]\n const urlTickers = decodedSearch.t?.split(',') ?? []\n const urlTimeframes = decodedSearch.p?.split(',') ?? []\n const urlDateRanges = decodedSearch.r?.split(',')\n\n const chartsArrayPlaceholder = Array.from({ length: count })\n const tickers = chartsArrayPlaceholder\n .map((_, index) => {\n const currentTicker = urlTickers[index] ?? urlTickers[urlTickers.length - 1]\n return (chartIndex === index || hasSyncedTicker) && ticker ? ticker : currentTicker\n })\n .join(',')\n const timeframes = chartsArrayPlaceholder\n .map((_, index) => {\n const currentTimeframe = urlTimeframes[index] ?? urlTimeframes[urlTimeframes.length - 1]\n return (chartIndex === index || hasSyncedTimeframe) && timeframe ? timeframe : currentTimeframe\n })\n .join(',')\n const ranges = chartsArrayPlaceholder\n .map((_, index) => {\n const currentDaterange = urlDateRanges\n ? urlDateRanges[index] ?? urlDateRanges[urlDateRanges.length - 1]\n : undefined\n return (chartIndex === index || hasSyncedTimeframe) && dateRange !== undefined ? dateRange : currentDaterange\n })\n .join(',')\n\n return {\n pathname: location.pathname,\n search: `?${encodeQueryString({\n t: tickers,\n p: timeframes,\n r: ranges.split(',').some(Boolean) ? ranges : undefined,\n l: layout ?? chartLayoutModel.layout,\n sidebar: getIsMobilePortrait() ? undefined : decodedSearch.sidebar,\n })}`,\n }\n },\n [chartLayoutModel, chartIndex, location, hasSyncedTicker, hasSyncedTimeframe]\n )\n\n return { getChartsToPath }\n}\n","import { type To } from 'react-router-dom'\n\nimport { getTimeframeGroups } from '../../components'\nimport { TimeframeAndIntradayType } from '../../constants/common'\n\ninterface ITimeFrame {\n value: TimeframeAndIntradayType\n label: string\n labelShort: string\n labelPageTitle?: string\n}\n\ninterface ITimeframeGroup {\n label: string\n timeframes: ITimeFrame[]\n}\n\nexport function getTimeframeGroupsWithHref({\n isPremium,\n generatePath,\n}: {\n isPremium: boolean\n generatePath: (timeframe: ITimeFrame) => To\n}) {\n return getTimeframeGroups(isPremium).map((timeFrameGroup: ITimeframeGroup) => ({\n label: timeFrameGroup.label,\n timeframes: timeFrameGroup.timeframes.map((timeFrame) => ({\n ...timeFrame,\n href: generatePath(timeFrame),\n })),\n }))\n}\n\nexport enum QuoteNodeChartTypes {\n candlesticksimple = 'candlesticksimple',\n candlestick = 'candlestick',\n line = 'line',\n ohlc = 'ohlc',\n heikinashi = 'heikinashi',\n hollowcandlestick = 'hollowcandlestick',\n}\n\nexport enum QuoteUrlChartTypes {\n cs = 'cs',\n c = 'c',\n l = 'l',\n o = 'o',\n ha = 'ha',\n hc = 'hc',\n}\n\nexport const QuoteShortToLongType = {\n [QuoteUrlChartTypes.cs]: QuoteNodeChartTypes.candlesticksimple,\n [QuoteUrlChartTypes.c]: QuoteNodeChartTypes.candlestick,\n [QuoteUrlChartTypes.l]: QuoteNodeChartTypes.line,\n [QuoteUrlChartTypes.o]: QuoteNodeChartTypes.ohlc,\n [QuoteUrlChartTypes.ha]: QuoteNodeChartTypes.heikinashi,\n [QuoteUrlChartTypes.hc]: QuoteNodeChartTypes.hollowcandlestick,\n} as const\n\nexport const QuoteLongToShortType = {\n [QuoteNodeChartTypes.candlesticksimple]: QuoteUrlChartTypes.cs,\n [QuoteNodeChartTypes.candlestick]: QuoteUrlChartTypes.c,\n [QuoteNodeChartTypes.line]: QuoteUrlChartTypes.l,\n [QuoteNodeChartTypes.ohlc]: QuoteUrlChartTypes.o,\n [QuoteNodeChartTypes.heikinashi]: QuoteUrlChartTypes.ha,\n [QuoteNodeChartTypes.hollowcandlestick]: QuoteUrlChartTypes.hc,\n} as const\n\nexport const DEFAULT_TYPES = [\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle' },\n { iconName: 'lineChartType', value: QuoteNodeChartTypes.line, label: 'Line' },\n { iconName: 'ohlcChartType', value: QuoteNodeChartTypes.ohlc, label: 'OHLC' },\n { iconName: 'candleBarHollow', value: QuoteNodeChartTypes.hollowcandlestick, label: 'Hollow Candle' },\n { iconName: 'candleBarHeikinAshi', value: QuoteNodeChartTypes.heikinashi, label: 'Heikin Ashi' },\n]\n\nexport const FREE_TYPES_QUOTE = [\n { iconName: 'candleBarBasic', value: 'candlesticksimple', label: 'Candle - simple' },\n { iconName: 'candleBarBasic', value: QuoteNodeChartTypes.candlestick, label: 'Candle - advanced' },\n // Filter out the candle from DEFAULT_TYPES, we’re naming it differently\n ...DEFAULT_TYPES.filter((type) => type.value !== QuoteNodeChartTypes.candlestick),\n]\n\nexport const FREE_TYPES_QUOTE_VALUES = ['candlesticksimple', 'candlestick', 'line']\n\nexport type TypeBaseOption = {\n label: string\n value: QuoteNodeChartTypes\n iconName: string\n href?: string\n}\n","export const chartEventsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"chart-events\" */ './module-entry'),\n cacheKey: 'chart-events',\n}\n","export const chartSettingsAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"chart-settings\" */ './module-entry'),\n cacheKey: 'chart-settings',\n}\n\nexport const useChartLayoutGlobalModelAsyncModule = {\n importFn: () =>\n import(/* webpackChunkName: \"use-chart-layout-global-model\" */ './useChartLayoutGlobalModel/module-entry'),\n cacheKey: 'use-chart-layout-global-model',\n}\n\nexport const preventClosingUnsavedChangesAsyncModule = {\n importFn: () =>\n import(/* webpackChunkName: \"prevent-closing-unsaved-changes\" */ './PreventClosingUnsavedChanges/module-entry'),\n cacheKey: 'prevent-closing-unsaved-changes',\n}\n","import * as dateFns from 'date-fns'\n\nimport { getChartStartEndDates } from '../controllers/renderUtils'\nimport Quote from '../models/quote'\n\n// **************START**************\n// Functions from here until END have to be in sync with\n// Finviz-Website: components/timeframe-bar/custom-date-range-utils.ts\n// *********************************\n\nexport enum CustomDateRangePrefixEnum {\n Range = 'range',\n Prev = 'prev',\n}\n\nexport const CUSTOM_DATE_RANGE = 'custom'\nexport const DATE_RANGE_PREFIX_DELMITER = '_'\nconst CUSTOM_DATE_RANGE_DELIMITER = 'x'\nconst CUSTOM_PREV_RANGE_DELIMITER = '-'\n\nexport function getParsedDateRange(dateRange: string) {\n return dateRange.split(DATE_RANGE_PREFIX_DELMITER)\n}\n\nexport function parseCustomDateRangeUrlParam({ dateRange, anchorDate }: { dateRange: string; anchorDate: Date }) {\n const [dateRangePrefix, dateRangeValue] = getParsedDateRange(dateRange)\n\n if (dateRangePrefix === CustomDateRangePrefixEnum.Range) {\n const [dateFromString, dateToString] = dateRangeValue.replace(/-/g, '/').split(CUSTOM_DATE_RANGE_DELIMITER)\n const dateFrom = dateFromString ? new Date(dateFromString) : null\n const dateTo = dateToString ? new Date(dateToString) : null\n return {\n start: dateFrom && !Number.isNaN(dateFrom.getTime()) ? dateFrom : null,\n end: dateTo && !Number.isNaN(dateTo.getTime()) ? dateFns.endOfDay(dateTo) : null,\n }\n }\n\n if (dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\n const [years, months, days] = dateRangeValue.split(CUSTOM_PREV_RANGE_DELIMITER).map(Number)\n\n if ([years, months, days].some(Number.isNaN)) {\n return { start: null, end: null }\n }\n\n return {\n start: dateFns.startOfDay(dateFns.sub(anchorDate, { years, months, days: days - 1 })),\n end: anchorDate,\n }\n }\n\n return { start: null, end: anchorDate }\n}\n\n// **************END**************\n// Functions below don't need to be\n// in sync with Website repository\n// *******************************\n\nexport function getParsedDateRangeMetaData({ dateRange, quote }: { dateRange: string; quote: Quote }) {\n const parsedRange = getChartStartEndDates({ dateRange, quote })\n const [dateRangePrefix] = getParsedDateRange(dateRange)\n\n let startQuoteDate: Date | null = null\n let endQuoteDate: Date | null = null\n let numOfDaysToRender: number | null = null\n\n if (parsedRange.start && dateRangePrefix === CustomDateRangePrefixEnum.Prev) {\n const daysInQuote = quote.getDaysInQuote()\n const reversedDaysInQuote = [...daysInQuote].reverse()\n const startQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.start!.getTime())\n const endQuoteDayIndex = reversedDaysInQuote.findIndex((date) => date.getTime() <= parsedRange.end!.getTime())\n startQuoteDate = reversedDaysInQuote[startQuoteDayIndex] ?? null\n endQuoteDate = reversedDaysInQuote[endQuoteDayIndex] ?? null\n numOfDaysToRender = quote.interval <= 5 ? startQuoteDayIndex - endQuoteDayIndex + 1 : null\n }\n\n return {\n start: parsedRange.start,\n end: parsedRange.end,\n startQuoteDate,\n endQuoteDate,\n numOfDaysToRender,\n numOfBarsToRender: (numOfDaysToRender ?? 0) * (quote.getBarsInDay() ?? 0) || undefined,\n renderDateStart: parsedRange.start && dateFns.startOfDay(parsedRange.start),\n renderDateEnd: parsedRange.end && dateFns.endOfDay(parsedRange.end),\n }\n}\n","import * as d3 from 'd3'\nimport * as dateFns from 'date-fns'\n\nimport { Instrument, ObjectHash } from '../../types/shared'\nimport {\n CHART_MARGIN,\n DateRangeType,\n PREMARKET_AFTERMARKET_HOURS,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../constants/common'\nimport Chart from '../models/chart'\nimport ChartEventElement from '../models/chart-event-element'\nimport ChartLayout from '../models/chart_layout'\nimport { ISettings } from '../models/chart_settings/interfaces'\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\nimport Element from '../models/element'\nimport Pane, { ScaleAxis } from '../models/pane'\nimport Quote from '../models/quote'\nimport Utils from '../utils'\nimport utils, { convertLocalToNyTime, dateFromUnixTimestamp, isRedesignedPage } from '../utils'\nimport { getBarWidthWithMargin, getZoomFactorForBarsToDisplay } from '../utils/chart'\nimport {\n DATE_RANGE_PREFIX_DELMITER,\n getParsedDateRangeMetaData,\n parseCustomDateRangeUrlParam,\n} from '../utils/chart-date-range-utils'\n\ninterface VisibleBarNumberProps {\n start: Date | null\n end: Date\n quote: Quote\n dateRange: string\n}\n\ninterface ChartZoomAndLeftOffsetProps extends Omit {\n chartVisibleWidth: number\n numOfBarsToRender?: number\n chartModel: Chart\n}\n\ninterface ChartStartEndDatesProps {\n dateRange: string\n quote: Quote\n}\n\nexport const getVisibleBarsNumber = ({ start, end, quote, dateRange }: VisibleBarNumberProps) => {\n const startInSec = start ? start.getTime() / 1000 : 0\n const endInSec = end.getTime() / 1000\n const isQuoteDateInRange = (quoteDate: number) => quoteDate >= startInSec && quoteDate <= endInSec\n const lastQuoteDateIndex = quote.date.length - 1\n let lastVisibleBarIndex = lastQuoteDateIndex\n let numOfVisibleBars = 0\n if (\n [DateRangeType.d1, DateRangeType.d5].includes(dateRange as DateRangeType) &&\n quote.instrument === Instrument.Stock\n ) {\n numOfVisibleBars = quote.drawMinutesPerDay\n } else {\n let firstVisibleBarIndex = -1\n lastVisibleBarIndex = -1\n quote.date.forEach((quoteDate, index) => {\n if (isQuoteDateInRange(quoteDate)) {\n if (firstVisibleBarIndex === -1) {\n firstVisibleBarIndex = index\n }\n lastVisibleBarIndex = index\n }\n })\n numOfVisibleBars = lastVisibleBarIndex - firstVisibleBarIndex + 1\n\n if (firstVisibleBarIndex === -1 && lastVisibleBarIndex === -1) {\n return { numOfVisibleBars: 0, numOfBarsOffset: 0 }\n }\n }\n\n return { numOfVisibleBars, numOfBarsOffset: lastQuoteDateIndex - lastVisibleBarIndex }\n}\n\nexport const getChartZoomAndLeftOffset = ({\n chartVisibleWidth,\n start,\n end,\n quote,\n chartModel,\n numOfBarsToRender,\n}: ChartZoomAndLeftOffsetProps) => {\n const { numOfVisibleBars, numOfBarsOffset } = getVisibleBarsNumber({\n start,\n end,\n quote,\n dateRange: chartModel.dateRange,\n })\n if (numOfVisibleBars === 0) {\n return { zoomFactor: chartModel.zoomFactor, leftOffset: chartModel.leftOffset }\n }\n\n const chartLayout = chartModel.chart_layout()\n const zoomFactor = getZoomFactorForBarsToDisplay({\n chartLayout,\n chartVisibleWidth,\n numOfVisibleBars: numOfBarsToRender ?? numOfVisibleBars,\n })\n const barWidth = getBarWidthWithMargin({ chartLayout, zoomFactor })\n const leftOffset =\n getLeftOffset({\n quote,\n chartModel,\n config: {},\n barWidth,\n numberOfBarsToDraw: numOfBarsToRender,\n }) +\n numOfBarsOffset * barWidth\n return { zoomFactor, leftOffset }\n}\n\nexport const getChartStartEndDates = ({ dateRange, quote }: ChartStartEndDatesProps) => {\n const daysInQuote = quote.getDaysInQuote()\n const lastDate = dateFromUnixTimestamp(quote.date[quote.date.length - 1])\n\n if (dateRange.includes(DATE_RANGE_PREFIX_DELMITER)) {\n const range = parseCustomDateRangeUrlParam({ dateRange, anchorDate: lastDate })\n const end = convertLocalToNyTime(\n range.end && range.end.getTime() <= lastDate.getTime() ? range.end : lastDate,\n false\n )\n return {\n start: range.start && convertLocalToNyTime(range.start, false),\n end,\n }\n }\n\n let start\n // No condition is needed here, but this would be dateRangePrefix === DateRangePrefixEnum.Enum\n switch (dateRange) {\n case DateRangeType.d1:\n lastDate.setHours(23, 59, 59, 999)\n start = daysInQuote.length === 0 ? lastDate : daysInQuote[daysInQuote.length - 1]\n break\n case DateRangeType.d5:\n lastDate.setHours(23, 59, 59, 999)\n const startDateIndex = daysInQuote.length === 0 ? -1 : Math.max(daysInQuote.length - 5, 0)\n start = startDateIndex === -1 ? lastDate : daysInQuote[startDateIndex]\n break\n case DateRangeType.m1:\n start = dateFns.subMonths(lastDate, 1)\n break\n case DateRangeType.m3:\n start = dateFns.subMonths(lastDate, 3)\n break\n case DateRangeType.m6:\n start = dateFns.subMonths(lastDate, 6)\n break\n case DateRangeType.ytd:\n start = dateFns.startOfYear(lastDate)\n break\n case DateRangeType.y1:\n start = dateFns.subYears(lastDate, 1)\n break\n case DateRangeType.y2:\n start = dateFns.subYears(lastDate, 2)\n break\n case DateRangeType.y5:\n start = dateFns.subYears(lastDate, 5)\n break\n case DateRangeType.max:\n default:\n start = null\n break\n }\n\n return { start: start && convertLocalToNyTime(start, false), end: convertLocalToNyTime(lastDate, false) }\n}\n\ninterface GetLeftOffsetProps {\n quote: Quote\n chartModel: Chart\n config?: { stretch?: boolean }\n barWidth?: number\n barIndex?: number\n numberOfBarsToDraw?: number\n shouldAlignDaysToLeftApplied?: boolean\n}\n\nexport const getMinMaxLeftOffset = ({\n newLeftOffset,\n chartModel,\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\n barIndex,\n}: {\n newLeftOffset: number\n chartModel: Chart\n barWidth?: number\n barIndex: number\n}) => {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\n const numOfBarsInView = Math.floor(width / barWidth)\n const fx = (index: number) => index * barWidth\n return ~~Utils.min(barWidth / 2, Utils.max(newLeftOffset, width - fx(barIndex + numOfBarsInView)))\n}\n\nexport function getFullChartWidth({\n hasAftermarket,\n hasPremarket,\n timeframeMinutes,\n barWidthWithMargin,\n}: {\n hasPremarket: boolean\n hasAftermarket: boolean\n timeframeMinutes: number\n barWidthWithMargin: number\n}) {\n const premarketHoursLength = hasPremarket ? PREMARKET_AFTERMARKET_HOURS : 0\n const aftermarketHoursLength = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS : 0\n const marketMinutesLength = (6.5 + premarketHoursLength + aftermarketHoursLength) * 60\n // CHART_MARGIN.L as left offset + CHART_MARGIN.XXL as right offset\n return CHART_MARGIN.L + CHART_MARGIN.XXL + (marketMinutesLength / timeframeMinutes) * barWidthWithMargin\n}\n\nexport function getIntradayChartConfig({\n timeframeMinutes,\n barWidthWithMargin,\n hasPremarket,\n hasAftermarket,\n maxWidth,\n}: {\n hasPremarket: boolean\n hasAftermarket: boolean\n timeframeMinutes: number\n barWidthWithMargin: number\n maxWidth: number\n}) {\n const fullChartWidth = getFullChartWidth({ hasPremarket, hasAftermarket, barWidthWithMargin, timeframeMinutes })\n const offsetChartAfter = 16 // Int from 0-23 , if last quote date is >= this constant `offsetInPx` is applied (chart is moved to the left)\n const cropChartMinutesLength = PREMARKET_AFTERMARKET_HOURS * 60\n const offsetInPx = (cropChartMinutesLength / timeframeMinutes) * barWidthWithMargin\n const chartWidthWithOffset = fullChartWidth - offsetInPx\n const shouldCropChart =\n hasAftermarket && hasPremarket && maxWidth >= chartWidthWithOffset && maxWidth < fullChartWidth\n\n return {\n fullChartWidth,\n offsetInPx: shouldCropChart ? offsetInPx : 0,\n chartWidthWithOffset: shouldCropChart ? fullChartWidth - offsetInPx : fullChartWidth,\n offsetChartAfter,\n }\n}\n\nexport const getLeftOffset = ({\n quote,\n chartModel,\n config,\n barWidth = getBarWidthWithMargin({ zoomFactor: chartModel.zoomFactor, chartLayout: chartModel.chart_layout() }),\n barIndex = getBarIndex(quote),\n numberOfBarsToDraw,\n shouldAlignDaysToLeftApplied = true,\n}: GetLeftOffsetProps) => {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const width = chartModel.width - ChartSettings.left.width - ChartSettings.right.width\n const specificChartFunctionality = chartModel.chart_layout().specificChartFunctionality\n if (config?.stretch) {\n return 0\n }\n if (getIsSmallIndexChart(specificChartFunctionality)) {\n return barWidth\n }\n const fx = (index: number) => index * barWidth\n let leftOffset = width - fx(barIndex) - Math.round(barWidth / 2)\n leftOffset = Math.round(Utils.min(barWidth / 2, Utils.max(leftOffset, width - fx(barIndex + 45))))\n if (\n shouldAlignDaysToLeftApplied &&\n shouldAlignDaysToLeft({\n quote,\n numberOfBarsToDraw,\n specificChartFunctionality,\n dateRange: chartModel.dateRange,\n })\n ) {\n let drawDaysInOneChart = 1\n if (numberOfBarsToDraw) {\n drawDaysInOneChart = Math.ceil(numberOfBarsToDraw / quote.getBarsInDay()!)\n } else if (quote.interval === 10 || chartModel.dateRange === DateRangeType.d5) {\n drawDaysInOneChart = 5\n } else if (quote.interval === 15) {\n drawDaysInOneChart = 6\n } else if (quote.interval === 30) {\n drawDaysInOneChart = 12\n } else if (quote.interval === 60) {\n drawDaysInOneChart = 22\n } else if (quote.interval === 120) {\n drawDaysInOneChart = 39\n } else if (quote.interval === 240) {\n drawDaysInOneChart = 78\n } else if (quote.interval > 240) {\n drawDaysInOneChart = (quote.interval / 30) * 10\n }\n const { offsetInPx, offsetChartAfter } = getIntradayChartConfig({\n hasPremarket: quote.premarket,\n hasAftermarket: quote.aftermarket,\n barWidthWithMargin: barWidth,\n timeframeMinutes: quote.interval,\n maxWidth: chartModel.width,\n })\n const drawDaysWidth = drawDaysInOneChart * quote.getBarsInDay()! * barWidth - offsetInPx\n\n // +1 is a buffer as it often happens drawDaysWidth is wider than width by tiny amount (< 1/10000 of px)\n if (drawDaysWidth <= width + 1) {\n const lastQuoteDate = quote.date.last() ? utils.dateFromUnixTimestamp(quote.date.last()!) : null\n // Align start of day to left if we have enough space to show all bars in day\n const barsToOffset = (Object.keys(quote.getDayToOffset()).length - drawDaysInOneChart) * quote.getBarsInDay()!\n const offsetChartInPx = (lastQuoteDate?.getHours() ?? 0) >= offsetChartAfter ? offsetInPx : 0\n leftOffset = Math.round(-fx(barsToOffset) + barWidth / 2) - offsetChartInPx\n }\n }\n // getMinMaxLeftOffset move left offset to keep at least one bar in view what isn't desired for offscreen charts\n if (specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n return leftOffset\n }\n return getMinMaxLeftOffset({\n newLeftOffset: leftOffset,\n chartModel,\n barWidth,\n barIndex,\n })\n}\n\nexport const getBarIndex = (quote: Quote) => quote?.getBarIndex(quote.open?.length ? quote.open.length - 1 : 0) || 0\n\nexport const getIsSmallIndexChart = (specificChartFunctionality: SpecificChartFunctionality) =>\n specificChartFunctionality === SpecificChartFunctionality.smallIndex\n\ninterface ShouldAlignDaysToLeftProps {\n quote: Quote\n numberOfBarsToDraw?: number\n specificChartFunctionality: SpecificChartFunctionality\n dateRange: DateRangeType | null\n}\n\n/**\n * Evaluate if days should be aligned to the left\n * @param {object} object.quote - Quote model\n * @param {string} object.specificChartFunctionality - SpecificChartFunctionality enum\n * @returns {boolean} boolean\n * */\nexport const shouldAlignDaysToLeft = ({\n quote,\n dateRange,\n numberOfBarsToDraw,\n specificChartFunctionality,\n}: ShouldAlignDaysToLeftProps) => {\n const isStockIntraday = quote.isIntraday && quote.instrument === Instrument.Stock\n // We don't want this to affect /charts page, only if intraday daterange is applied\n const isQuoteOrOffscreen = [SpecificChartFunctionality.quotePage, SpecificChartFunctionality.offScreen].includes(\n specificChartFunctionality\n )\n const isChartPage = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isChartsInradayDateRange =\n isChartPage && !!dateRange && [DateRangeType.d1, DateRangeType.d5].includes(dateRange)\n const isChartPageWithFixedBars = isChartPage && numberOfBarsToDraw\n return isStockIntraday && (isQuoteOrOffscreen || isChartsInradayDateRange || isChartPageWithFixedBars)\n}\n\ninterface ClipProps {\n canvasCtx: RenderingContext2DType\n width: number\n height: number\n Settings: ISettings['ChartSettings'] | ISettings['IndicatorSettings']\n}\n// pane canvasCtx clip\nexport const clip = ({ canvasCtx, width, height, Settings }: ClipProps) => {\n const contentWidth = width - Settings.left.width - Settings.right.width\n const contentHeight = height - Settings.top.height - Settings.bottom.height\n canvasCtx.beginPath()\n canvasCtx.rect(Settings.left.width, Settings.top.height, contentWidth, contentHeight)\n canvasCtx.clip()\n}\n\nexport const getSettings = (paneModel: Pane) => {\n const { ChartSettings, IndicatorSettings } = paneModel.chart().getChartLayoutSettings()\n for (const element of paneModel.elements().all()) {\n if (element.isIndicator()) {\n return IndicatorSettings\n }\n }\n return ChartSettings\n}\n\ninterface RecountScaleProps {\n chartModel: Chart\n paneModel: Pane\n}\n\ntype ScaledFn = Partial & (d3.ScaleLinear | d3.ScaleSymLog)\n\nconst getShouldOffsetChartDomain = (elementModel: Element | ChartEventElement) => {\n const quote = elementModel.pane().chart().quote()\n\n return quote.chartEvents.length > 0 && ![TIMEFRAME.w, TIMEFRAME.m].includes(quote.timeframe)\n}\n\nexport const recountScale = ({ chartModel, paneModel }: RecountScaleProps) => {\n const { ChartSettings, IndicatorSettings, MarketSentimentSettings } = chartModel.getChartLayoutSettings()\n const chartLayout = chartModel.chart_layout()\n const barWidthWithMargin = getBarWidthWithMargin({ chartLayout, zoomFactor: chartModel.zoomFactor })\n for (const elementModel of [...paneModel.getAllElements(), ...paneModel.getAllChartEvents(false)]) {\n const el = elementModel.instance\n const isChart = elementModel.isChart()\n if (isChart || elementModel.isIndicator()) {\n let fx: ScaledFn, Settings: ISettings['MarketSentimentSettings' | 'ChartSettings' | 'IndicatorSettings'], width\n const scaleType = isChart ? chartModel.scale : ScaleType.Linear\n if (isChart) {\n Settings = chartModel.instrument === Instrument.MarketSentiment ? MarketSentimentSettings : ChartSettings\n } else {\n Settings = IndicatorSettings as ISettings['IndicatorSettings']\n }\n const contentHeight = paneModel.height - Settings.top.height - Settings.bottom.height\n\n if (chartModel.stretch) {\n width = chartModel.width - Settings.left.width - Settings.right.width\n fx = d3\n .scaleLinear()\n .range([0, width])\n .domain([0, Math.max(0, chartModel.quote().close.length - 1)]) as ScaledFn\n } else {\n fx = ((index: number) => index * barWidthWithMargin) as ScaledFn\n fx.invert = (x: number) => x / barWidthWithMargin\n fx.width = function (w) {\n return this.invert(w) - this.invert(0)\n }\n }\n paneModel.updateAttribute('scale', { x: fx }) // some elements need fx to count getMinMax\n\n const { min, max } = paneModel.scaleRange || el.getMinMax!()\n let fy\n\n const handleDomainOffset = (currentScale: ScaledFn, scaleCreator: any) => {\n if (isChart && getShouldOffsetChartDomain(elementModel)) {\n const protectedHeightPx = contentHeight - CHART_EVENT_BADGE_SIZE\n const minPx = currentScale(min)\n const domain = currentScale.domain()\n if (minPx > protectedHeightPx) {\n const tempScale = scaleCreator().range([0, protectedHeightPx]).domain([max, min])\n const extendedMin = tempScale.invert(contentHeight)\n currentScale.domain([domain[0], extendedMin])\n }\n }\n }\n\n switch (scaleType) {\n case ScaleType.Logarithmic:\n fy = d3.scaleSymlog().range([0, contentHeight]).domain([max, min]) as ScaledFn\n handleDomainOffset(fy, d3.scaleSymlog)\n break\n default:\n fy = d3.scaleLinear().range([0, contentHeight]).domain([max, min]) as ScaledFn\n if (!paneModel.scaleRange) {\n fy = fy.nice(10)\n handleDomainOffset(fy, d3.scaleLinear)\n }\n break\n }\n fy.height = function (h: number) {\n return this.invert(h) - this.invert(0)\n }\n paneModel.updateAttribute('scale', {\n x: fx,\n y: fy,\n })\n\n if (isChart) {\n el.setupAxis!(fx as ScaleAxis)\n }\n break\n }\n }\n}\n\n// general, only when blurry ends won't be visible or didn't matter\nexport const getOffsetFromLineWidth = (lineWidth: number) => (lineWidth % 2 === 0 ? 0 : 0.5)\n\ninterface IXYOffsetFromLine {\n lineWidth: number\n x1: number\n y1: number\n x2: number\n y2: number\n}\n\n// return x,y offsets for pixel perfect line rendering\nexport const getXYOffsetFromLine = ({ lineWidth, x1, y1, x2, y2 }: IXYOffsetFromLine) => {\n // don't add offset is lineWidth is even\n if (lineWidth % 2 === 0) {\n return { x: 0, y: 0 }\n }\n if (y1 === y2) {\n return { x: 0, y: 0.5 } // horizontal line\n } else if (x1 === x2) {\n return { x: 0.5, y: 0 } // vertical line\n } else {\n return { x: 0.5, y: 0.5 } // diagonal line\n }\n}\n\nexport const getRoundedObject = (obj: T): T => {\n const rounded = Object.entries(obj)\n for (let i = 0; i < rounded.length; i++) {\n rounded[i][1] = Math.round(rounded[i][1])\n }\n return Object.fromEntries(rounded) as T\n}\n\ninterface ITranslate {\n context: CanvasRenderingContext2D\n xOffset: number\n yOffset: number\n}\n\ninterface ITranslateObj {\n do: () => void\n undo: () => void\n}\n\nexport const getTranslate = ({ context, xOffset, yOffset }: ITranslate): ITranslateObj => ({\n do: () => context.translate(xOffset, yOffset),\n undo: () => context.translate(xOffset * -1, yOffset * -1),\n})\n\ninterface IPercentageScaleValue {\n number: number\n base: number\n}\n\nexport const getPercentageFromValue = ({ number, base }: IPercentageScaleValue) => ((number - base) / base) * 100\n\nexport const getValueFromPercentage = ({ number, base }: IPercentageScaleValue) => (number / 100) * base + base\n\ninterface UpdateZoomAndLeftOffsetByDateRangeProps {\n chartModel: Chart\n quote: Quote\n}\n\nexport function updateZoomAndLeftOffsetByDateRange({ chartModel, quote }: UpdateZoomAndLeftOffsetByDateRangeProps) {\n const { ChartSettings } = chartModel.getChartLayoutSettings()\n const chartVisibleWidth = chartModel.width - (ChartSettings.left.width + ChartSettings.right.width)\n\n const { start, end, numOfBarsToRender } = getParsedDateRangeMetaData({\n dateRange: chartModel.dateRange,\n quote,\n })\n\n const { zoomFactor, leftOffset } = getChartZoomAndLeftOffset({\n chartVisibleWidth,\n start,\n end,\n quote,\n numOfBarsToRender,\n chartModel: chartModel,\n })\n\n if (chartModel.zoomFactor !== zoomFactor || chartModel.leftOffset !== leftOffset) {\n chartModel.updateAttributes({ zoomFactor, leftOffset })\n }\n}\n\nexport function renderPane({\n chartLayoutModel,\n chartModel,\n paneModel,\n canvasCtx,\n shouldRenderCross = false,\n}: {\n chartLayoutModel: ChartLayout\n chartModel: Chart\n paneModel: Pane\n canvasCtx: CanvasRenderingContext2D\n shouldRenderCross?: boolean\n}) {\n if (paneModel.chart().instrument === Instrument.MarketSentiment) {\n canvasCtx.clearRect(0, 0, chartModel.width, paneModel.height)\n } else {\n canvasCtx.set('fillStyle', chartModel.getChartLayoutSettings().ChartSettings.general.Colors.canvasFill)\n canvasCtx.fillRect(0, 0, chartModel.width, paneModel.height)\n }\n const elements = paneModel.getAllElements()\n for (const { instance: elementInstance } of elements) {\n if (typeof elementInstance.renderGrid === 'function') {\n canvasCtx.save()\n elementInstance.renderGrid(canvasCtx)\n canvasCtx.restore()\n }\n }\n\n const chartEvents = paneModel.getAllChartEvents()\n const Settings = getSettings(paneModel)\n for (const { instance: elementInstance } of [...elements, ...chartEvents]) {\n const isDrawing = elementInstance.getIsDrawing()\n const isChartEvent = elementInstance.getIsChartEvent()\n\n if (isDrawing && (chartLayoutModel.isHideDrawingsActive || !elementInstance.getIsVisible())) {\n continue\n } else if ((isDrawing || isChartEvent) && !elementInstance.getIsInChartView(chartModel)) {\n continue\n }\n\n canvasCtx.save()\n if (elementInstance.renderContent != null) {\n canvasCtx.save()\n clip({\n canvasCtx,\n width: chartModel.width,\n height: paneModel.height,\n Settings,\n })\n canvasCtx.translate(paneModel.chart().leftOffset + Settings.left.width, Settings.top.height)\n elementInstance.renderContent(canvasCtx)\n canvasCtx.restore()\n if (typeof elementInstance.renderLabels === 'function') {\n elementInstance.renderLabels(canvasCtx)\n }\n } else {\n elementInstance.render(canvasCtx)\n }\n if (\n shouldRenderCross &&\n (chartLayoutModel.specificChartFunctionality === SpecificChartFunctionality.chartPage ||\n isRedesignedPage(chartLayoutModel)) &&\n elementInstance.renderCross != null\n ) {\n elementInstance.renderCross(canvasCtx)\n }\n canvasCtx.restore()\n }\n}\n","export const DEFAULT_WIDTHS = {\n min: 200,\n max: 400,\n}\n\nexport enum SidebarDirection {\n vertical,\n horizontal,\n}\n","import React from 'react'\n\nimport { DEFAULT_WIDTHS, SidebarDirection } from '../constants'\nimport { SidebarModule, SidebarModuleType } from '../modules/modules'\n\nexport type SidebarContextType = {\n isOpen: boolean\n isCloseVisible: boolean\n direction: SidebarDirection\n width?: {\n min?: number | string\n max?: number | string\n default?: { desktop?: number; mobile?: number }\n }\n activeModule: SidebarModuleType | null\n close: () => void\n onResize: () => void\n selectModule: (module?: SidebarModule) => void\n}\n\nconst DEFAULT_CONTEXT: SidebarContextType = {\n activeModule: null,\n isOpen: false,\n isCloseVisible: false,\n direction: SidebarDirection.horizontal,\n width: DEFAULT_WIDTHS,\n close: () => {},\n onResize: () => {},\n selectModule: () => {},\n}\n\nexport const SidebarContext = React.createContext(DEFAULT_CONTEXT)\nexport const useSidebarContext = () => React.useContext(SidebarContext)\n","import ChartLayout from '../../models/chart_layout'\n\nexport enum DrawingTool {\n Arrow = 'arrow',\n Brush = 'brush',\n Callout = 'callout',\n Curve = 'curve',\n ElliottWaves = 'elliott-wave',\n Ellipse = 'ellipse',\n FibonacciRetracements = 'fibonacci-retracements',\n HorizontalLine = 'horizontal-line',\n Measure = 'measure',\n Mouse = 'mouse',\n Pitchfork = 'pitchfork',\n Polygon = 'polygon',\n Position = 'position',\n Rectangle = 'rectangle',\n RotatedRectangle = 'rotated-rectangle',\n ScaledLine = 'scaled-line',\n ScaledText = 'scaled-text',\n Triangle = 'triangle',\n VerticalLine = 'vertical-line',\n Xabcd = 'xabcd',\n}\n\nexport enum DrawingActions {\n AddNote = 'add-note',\n DeleteDrawings = 'delete-drawings',\n DeleteAutoSavedDrawings = 'delete-autosaved-drawings',\n}\n\nexport enum DrawingSetting {\n PreserveDrawings = 'preserve-drawings',\n DrawingModeContinuous = 'drawing-mode-continuous',\n HideDrawings = 'hide-drawings',\n LockDrawings = 'lock-drawings',\n}\n\nexport interface IToolBarProps {\n chartLayoutModel: ChartLayout\n isSidebar?: boolean\n isHorizontal?: boolean\n isMobileOverlay?: boolean\n /**\n * Current selected tool id\n */\n activeTool: DrawingTool\n /**\n * On tool item select callback\n */\n onActiveToolChange: (activeTool: DrawingTool, trigger?: 'button' | 'select' | 'group') => void\n /**\n * On drawing actions item select callback\n */\n onDrawingActionClick?: (actionId: DrawingActions) => void\n /**\n * On drawing settings item select callback\n */\n onDrawingSettingClick?: (settingId: DrawingSetting) => void\n /**\n * On drawing end callback\n */\n onDrawingEnd?: () => void\n /**\n * Current state of drawing settings\n */\n drawingSettings: Record\n isAlternativeTheme?: boolean\n /**\n * Are tools disabled\n */\n areToolsDisabled?: boolean\n}\n\nexport interface IToolbarItemProperties {\n icon: string\n iconActive?: string\n iconAction?: string\n title: string\n titleActive?: string\n titleAction?: string\n}\n\nexport interface IToolbarDrawingTool extends IToolbarItemProperties {\n id: DrawingTool\n}\n\nexport interface IToolbarDrawingAction extends IToolbarItemProperties {\n id: DrawingActions\n}\n\nexport interface IToolbarDrawingSetting extends IToolbarItemProperties {\n id: DrawingSetting\n}\n\nexport interface IToolbarDrawingToolItem {\n defaultItem: IToolbarDrawingTool\n toolGroup?: Array\n toolGroupTitle?: string\n}\n\nexport interface IToolbarDrawingActionItem {\n defaultItem: IToolbarDrawingAction\n isDisabled?: boolean\n disabledTooltip?: string\n}\n\nexport interface IToolbarDrawingsSettingItem {\n defaultItem: IToolbarDrawingSetting\n isDisabled?: boolean\n isInAction?: boolean\n disabledTooltip?: string\n}\n","import { Instrument } from '../../types/shared'\nimport { ChartElementType } from '../constants/common'\nimport QuoteModel from '../models/quote'\n\nexport function getInstrumentLabel(instrument: Instrument) {\n switch (instrument) {\n case Instrument.Stock:\n return 'Stock'\n case Instrument.Futures:\n return 'Futures'\n case Instrument.Forex:\n return 'Forex'\n case Instrument.Crypto:\n return 'Crypto'\n case Instrument.MarketSentiment:\n return 'Market Sentiment'\n }\n}\n\nexport function getChartAlt(quoteModel: QuoteModel) {\n return `${quoteModel.name || quoteModel.ticker} - ${getInstrumentLabel(quoteModel.instrument)} Price Chart`\n}\n\nexport const getResponseChartType = (chartType: ChartElementType) => {\n switch (chartType) {\n case ChartElementType.HeikinAshi:\n return 'heikinashi'\n case ChartElementType.HollowCandleStick:\n return 'hollowcandlestick'\n case ChartElementType.LineChart:\n return 'line'\n case ChartElementType.OhlcChart:\n return 'ohlc'\n case ChartElementType.CandleStick:\n default:\n return 'candlestick'\n }\n}\n\nexport const getChartElementTypeFromResponseType = (chartResponseType: string | null) =>\n chartResponseType === null\n ? null\n : Object.values(ChartElementType).find(\n (chartType: ChartElementType) => chartResponseType === getResponseChartType(chartType)\n )\n","import utils from '../utils'\n\nclass AverageTrueRange {\n period: number\n sum: number\n count: number\n value: number\n\n constructor(period: number) {\n this.period = period\n this.sum = 0\n this.count = 0\n this.value = 0\n }\n\n add(high: number, low: number, prevClose: number) {\n const tr = utils.max([high - low, Math.abs(high - prevClose), Math.abs(low - prevClose)])\n\n if (this.count < this.period) {\n this.sum += tr\n this.value = this.sum / (this.count + 1)\n if (this.count === this.period - 1) {\n this.sum /= this.period\n }\n } else {\n this.value = (this.value * (this.period - 1) + tr) / this.period\n }\n this.count++\n }\n}\n\nexport default AverageTrueRange\n","class ExponentialMovingAverage {\n period: number\n multiplier: number\n sum: number\n count: number\n value: number\n\n constructor(period: number) {\n this.period = period\n this.multiplier = 2 / (this.period + 1)\n this.sum = 0\n this.count = 0\n this.value = 0\n }\n\n add(d: number) {\n if (this.count < this.period) {\n this.sum += d\n this.count++\n this.value = this.sum / this.count\n } else {\n this.value = d * this.multiplier + this.value * (1 - this.multiplier)\n }\n }\n}\n\nexport default ExponentialMovingAverage\n","import { PaneArea } from '../../types/shared'\nimport Element, { DefaultAttrs } from '../canvas/element'\nimport BaseChart from '../charts/base_chart'\nimport { ChartEventBadgeType, ChartEventType, TIMEFRAME } from '../constants/common'\nimport { getRoundedObject } from '../controllers/renderUtils'\nimport Chart from '../models/chart'\nimport ChartEventElement from '../models/chart-event-element'\nimport { CHART_EVENT_BADGE_SIZE } from '../models/constants'\nimport type PaneModel from '../models/pane'\nimport { ChartEventBadgeState } from '../utils/chart-events-utils'\n\ninterface ChartEventAttrs extends DefaultAttrs {\n x: number\n}\n\nfunction getChartEventState(chartEvent: ChartEvent): ChartEventBadgeState {\n if (chartEvent.isOpen) {\n return ChartEventBadgeState.selected\n }\n if (chartEvent.isHovered) {\n return ChartEventBadgeState.hover\n }\n return ChartEventBadgeState.default\n}\n\nclass ChartEvent extends Element {\n static type = ChartEventType.ChartEvent\n static label = 'ChartEvent'\n\n declare scaled: Pick\n\n declare chart: BaseChart\n\n declare model: PaneModel\n\n declare chartEventModel: ChartEventElement | undefined\n\n isOpen = false\n\n left = 0\n top = 0\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.scale(this.getBoundingPointKeys())\n }\n\n getBoundingPointKeys = () => ({ x: ['x'], y: [] })\n\n get type() {\n return (this.constructor as typeof ChartEvent).type\n }\n\n get label() {\n return (this.constructor as typeof ChartEvent).label\n }\n\n getChartEvenBadgeType(): ChartEventBadgeType {\n switch (this.type) {\n case ChartEventType.Dividends:\n return ChartEventBadgeType.Dividends\n case ChartEventType.Split:\n return ChartEventBadgeType.Split\n }\n\n return ChartEventBadgeType.EarningsNeutral\n }\n\n getChartEventModel(): ChartEventElement | undefined {\n if (!this.chartEventModel) {\n this.chartEventModel = this.model.chartEvents()?.findByAttribute('instance', this)\n }\n\n return this.chartEventModel\n }\n\n getXYPosition() {\n const { top, bottom } = this.getChartLayoutSettings().ChartSettings\n const chartEventModel = this.getChartEventModel()\n const { x } = this.scaled\n const roundedXY = getRoundedObject({ x })\n const y =\n (this.model as PaneModel).height -\n top.height -\n bottom.height -\n CHART_EVENT_BADGE_SIZE -\n (chartEventModel?.yIndex ?? 0) * CHART_EVENT_BADGE_SIZE\n\n return { x: roundedXY.x - CHART_EVENT_BADGE_SIZE / 2, y }\n }\n\n getIsVisible() {\n return ![TIMEFRAME.w, TIMEFRAME.m].includes(this.model.chart().quote()?.timeframe)\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (!this.getIsVisible() || !this.chartEventModel) return\n\n this.attrs.x = Math.round(this.attrs.x)\n const chart = this.model.chart()\n const chartLayout = chart.chart_layout()\n const { x, y } = this.getXYPosition()\n const buffer = 10 + CHART_EVENT_BADGE_SIZE\n if (x + chart.leftOffset < -buffer || x + chart.leftOffset > chart.width + buffer) {\n return\n }\n const item = this.chartEventModel.getChartEventBadgeImage({\n theme: chartLayout.theme,\n state: getChartEventState(this),\n badgeType: this.getChartEvenBadgeType(),\n })\n\n if (!item) return\n\n const { left, top } = this.getChartLayoutSettings().ChartSettings\n this.left = x + chart.leftOffset + left.width + CHART_EVENT_BADGE_SIZE / 2\n this.top = y + top.height\n context.drawImage(item, x, y, CHART_EVENT_BADGE_SIZE, CHART_EVENT_BADGE_SIZE)\n }\n\n setIsHovered(isHovered: boolean) {\n if (!this.getIsVisible()) return\n\n this.isHovered = isHovered\n this.model.updateChartEventsZIndexes()\n this.trigger('change')\n }\n\n // If isOpenOverride is undefined, the function works as toggle\n toggleIsOpen(isOpenOverride?: boolean) {\n const chartLayout = this.model.chart().chart_layout()\n const chartEventModel = this.getChartEventModel()\n\n const isCurrentEventActive = chartLayout.activeChartEvent?.elementId === chartEventModel?.elementId\n const isOpen = isOpenOverride ?? (isCurrentEventActive ? !chartEventModel?.instance.isOpen : true)\n this.isOpen = isOpen\n if (chartLayout.activeChartEvent?.instance.isOpen && !isCurrentEventActive) {\n chartLayout.activeChartEvent?.instance.toggleIsOpen(false)\n }\n if (isOpen || isCurrentEventActive) {\n chartLayout.updateAttribute('activeChartEvent', !isOpen && isCurrentEventActive ? undefined : chartEventModel)\n }\n\n this.model.updateChartEventsZIndexes()\n this.trigger('change')\n }\n\n isInArea(area: PaneArea) {\n if (!this.getIsVisible()) return false\n\n const scaledArea = area.scaled\n const { x, y } = this.getXYPosition()\n const isInArea =\n x <= scaledArea.x &&\n x + CHART_EVENT_BADGE_SIZE >= scaledArea.x &&\n y <= scaledArea.y &&\n y + CHART_EVENT_BADGE_SIZE >= scaledArea.y\n return isInArea\n }\n\n getIsInChartView(chart: Chart) {\n if (!this.getIsVisible()) return false\n\n const { x } = this.getXYPosition()\n const isInView = x + CHART_EVENT_BADGE_SIZE >= -chart.leftOffset && x <= -chart.leftOffset + chart.width\n return isInView\n }\n}\n\nexport default ChartEvent\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\nimport ChartEvent from './chart-event'\n\nclass Dividends extends ChartEvent {\n static type = ChartEventType.Dividends\n static label = ChartEventLabels[ChartEventType.Dividends]\n}\n\nexport default Dividends\n","import { ChartEventBadgeType, ChartEventLabels, ChartEventType } from '../constants/common'\nimport { IEarnings } from '../utils/chart-events-utils'\nimport ChartEvent from './chart-event'\n\nclass Earnings extends ChartEvent {\n static type = ChartEventType.Earnings\n static label = ChartEventLabels[ChartEventType.Earnings]\n\n getChartEvenBadgeType(): ChartEventBadgeType {\n const eventItem = this.getChartEventModel()?.getChartEventData() as IEarnings | undefined\n\n if (!eventItem) {\n return ChartEventBadgeType.EarningsNeutral\n }\n\n if (eventItem.epsActual === undefined || eventItem.epsEstimate === undefined) {\n const now = Date.now() / 1000\n return eventItem.dateTimestamp > now ? ChartEventBadgeType.EarningsFuture : ChartEventBadgeType.EarningsNeutral\n }\n return eventItem.epsActual - eventItem.epsEstimate < 0\n ? ChartEventBadgeType.EarningsNegative\n : ChartEventBadgeType.EarningsPositive\n }\n}\n\nexport default Earnings\n","import { ChartEventLabels, ChartEventType } from '../constants/common'\nimport ChartEvent from './chart-event'\n\nclass Split extends ChartEvent {\n static type = ChartEventType.Split\n static label = ChartEventLabels[ChartEventType.Split]\n}\n\nexport default Split\n","import { ChartEventType } from '../constants/common'\nimport chartEvent from './chart-event'\nimport dividends from './dividends'\nimport earnings from './earnings'\nimport split from './split'\n\nexport const chartEventsByType = Object.freeze({\n [ChartEventType.ChartEvent]: chartEvent,\n [ChartEventType.Dividends]: dividends,\n [ChartEventType.Split]: split,\n [ChartEventType.Earnings]: earnings,\n})\n","import { ChartConfigChartPaneElement } from '../../types/shared'\nimport { drawingToolsByType } from '../canvas/drawingTools'\nimport { chartEventsByType } from '../chart-events'\nimport { chartsByType } from '../charts/charts'\nimport { indicatorsByType } from '../indicators/indicators'\nimport { overlaysByType } from '../overlays/overlays'\n\nconst canvasElements = {\n ...overlaysByType,\n ...indicatorsByType,\n ...drawingToolsByType,\n ...chartsByType,\n ...chartEventsByType,\n}\n\nexport function getCanvasElementByType(elementType: ChartConfigChartPaneElement['type']) {\n return canvasElements[elementType]\n}\n","import { Instrument, Point } from '../../types/shared'\n\ninterface LinePoints {\n x1: number\n x2: number\n y1: number\n y2: number\n}\n\nexport enum BigNumber {\n Thousand,\n Million,\n Billion,\n Trillion,\n}\n\nexport const BIG_NUMBER_VALUES = {\n [BigNumber.Thousand]: 1e3,\n [BigNumber.Million]: 1e6,\n [BigNumber.Billion]: 1e9,\n [BigNumber.Trillion]: 1e12,\n}\n\nconst BIG_NUMBER_ZEROES = {\n [BigNumber.Thousand]: 3,\n [BigNumber.Million]: 6,\n [BigNumber.Billion]: 9,\n [BigNumber.Trillion]: 12,\n}\n\nconst BIG_NUMBER_SUFFIX = {\n [BigNumber.Thousand]: 'K',\n [BigNumber.Million]: 'M',\n [BigNumber.Billion]: 'B',\n [BigNumber.Trillion]: 'T',\n}\n\nconst math = {\n dotProduct(p1: Point, p2: Point) {\n return p1.x * p2.x + p1.y * p2.y\n },\n\n crossProduct(p1: Point, p2: Point) {\n return p1.x * p2.y - p1.y * p2.x\n },\n\n distance(p1: Point, p2: Point) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2))\n },\n\n lineEquation(line: LinePoints) {\n // ax + by + c = 0\n if (line.x1 === line.x2) {\n return {\n a: 1,\n b: 0,\n c: -line.x1,\n }\n }\n const k = (line.y2 - line.y1) / (line.x2 - line.x1)\n return {\n a: -k,\n b: 1,\n c: k * line.x1 - line.y1,\n k,\n }\n },\n\n pointInPolygon(point: Point, polygon: Point[]) {\n // http://alienryderflex.com/polygon/\n let j = polygon.length - 1\n let oddNodes = false\n for (let i = 0; i < polygon.length; i++) {\n const p = polygon[i]\n if (\n ((p.y < point.y && polygon[j].y >= point.y) || (polygon[j].y < point.y && p.y >= point.y)) &&\n (p.x <= point.x || polygon[j].x <= point.x)\n ) {\n if (p.x + ((point.y - p.y) / (polygon[j].y - p.y)) * (polygon[j].x - p.x) < point.x) {\n oddNodes = !oddNodes\n }\n }\n j = i\n }\n return oddNodes\n },\n\n distanceToLine(point: Point, line: LinePoints) {\n const { a, b, c } = this.lineEquation(line)\n const dist = Math.abs(a * point.x + b * point.y + c) / Math.sqrt(a * a + b * b)\n return dist\n },\n\n distanceToSegment(point: Point, line: LinePoints) {\n const l2 = Math.pow(line.x1 - line.x2, 2) + Math.pow(line.y1 - line.y2, 2)\n if (l2 === 0) {\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\n }\n const t = ((point.x - line.x1) * (line.x2 - line.x1) + (point.y - line.y1) * (line.y2 - line.y1)) / l2\n if (t < 0) {\n return Math.sqrt(Math.pow(point.x - line.x1, 2) + Math.pow(point.y - line.y1, 2))\n }\n if (t > 1) {\n return Math.sqrt(Math.pow(point.x - line.x2, 2) + Math.pow(point.y - line.y2, 2))\n }\n const x = line.x1 + t * (line.x2 - line.x1)\n const y = line.y1 + t * (line.y2 - line.y1)\n return Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2))\n },\n\n getInstrumentDecimalPlaces({ value, instrument }: { value: number; instrument?: Instrument }) {\n if (instrument === Instrument.Crypto && value <= 0.001) {\n return 8\n }\n\n if ((instrument !== Instrument.Stock && value <= 6) || (instrument === Instrument.Stock && value < 1)) {\n return 4\n }\n\n return 2\n },\n\n formatBigNumber(number: number, toFixed?: number, minNumber?: BigNumber) {\n const absNum = Math.abs(number)\n const getString = ({ num, suffix, zeroes }: { num: number; suffix: string; zeroes: number }) => {\n const str = num.toString()\n if (str.includes('e')) {\n const splitString = str.split('e')\n const addZeroes = Number(splitString[1]) - zeroes\n return Math.round(Number(splitString[0])).toString().padEnd(Math.max(0, addZeroes), '0') + suffix\n }\n const sign = Math.sign(num)\n const numberByZeroesCount = Math.pow(10, zeroes)\n const result = (absNum / numberByZeroesCount) * sign\n return (Number.isInteger(result) ? result : result.toFixed(toFixed !== undefined ? toFixed : 1)) + suffix\n }\n\n if (absNum >= BIG_NUMBER_VALUES[BigNumber.Trillion] || minNumber === BigNumber.Trillion) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Trillion],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Trillion],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Billion] || minNumber === BigNumber.Billion) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Billion],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Billion],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Million] || minNumber === BigNumber.Million) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Million],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Million],\n })\n } else if (absNum >= BIG_NUMBER_VALUES[BigNumber.Thousand] || minNumber === BigNumber.Thousand) {\n return getString({\n num: number,\n suffix: BIG_NUMBER_SUFFIX[BigNumber.Thousand],\n zeroes: BIG_NUMBER_ZEROES[BigNumber.Thousand],\n })\n } else {\n return toFixed !== undefined ? number.toFixed(toFixed) : number.toString()\n }\n },\n\n round({\n value,\n lastClose = 0,\n instrument,\n overridePlaces,\n }: {\n value: number\n lastClose?: number\n instrument?: Instrument\n overridePlaces?: number\n }) {\n if (Math.abs(value) >= BIG_NUMBER_VALUES[BigNumber.Million]) {\n return this.formatBigNumber(value, overridePlaces)\n }\n\n const places =\n typeof overridePlaces === 'number'\n ? overridePlaces\n : this.getInstrumentDecimalPlaces({ value: lastClose, instrument })\n\n if (places >= 8 && value < 0.000001) {\n // There was an issue with getting NaN when rounding small numbers with latter method\n return value.toFixed(places)\n }\n return Number(`${Math.round(Number(`${value}e+${places}`))}e-${places}`).toFixed(places)\n },\n\n perpendicularPointToLine({ line, distance }: { line: LinePoints; distance: number }) {\n if (distance === 0) {\n return { x: line.x2, y: line.y2 }\n }\n\n let yAxisCoeficient\n let xAxisCoeficient\n\n if (line.x1 <= line.x2 && line.y1 >= line.y2) {\n xAxisCoeficient = -1\n yAxisCoeficient = -1\n } else if (line.x1 <= line.x2 && line.y1 <= line.y2) {\n xAxisCoeficient = 1\n yAxisCoeficient = -1\n } else if (line.x1 >= line.x2 && line.y1 >= line.y2) {\n xAxisCoeficient = -1\n yAxisCoeficient = 1\n } else {\n // conditions falling to else: (line.x1 >= line.x2 && line.y1 <= line.y2)\n xAxisCoeficient = 1\n yAxisCoeficient = 1\n }\n\n const radAngle = Math.atan2(Math.abs(line.x2 - line.x1), Math.abs(line.y2 - line.y1))\n const x = line.x2 + xAxisCoeficient * (distance * Math.cos(radAngle))\n const y = line.y2 + yAxisCoeficient * (distance * Math.sin(radAngle))\n return { x, y }\n },\n\n rotatedPointCoordinates({\n rotationAxisPoint,\n angle,\n pointToRotate,\n }: {\n rotationAxisPoint: Point\n angle: number\n pointToRotate: Point\n }) {\n // return newCoordinates for pointToRotate after rotation defined by\n // angle around rotationAxisPoint\n const sin = Math.sin(angle)\n const cos = Math.cos(angle)\n const rotatedX =\n cos * (pointToRotate.x - rotationAxisPoint.x) +\n sin * (pointToRotate.y - rotationAxisPoint.y) +\n rotationAxisPoint.x\n const rotatedY =\n cos * (pointToRotate.y - rotationAxisPoint.y) -\n sin * (pointToRotate.x - rotationAxisPoint.x) +\n rotationAxisPoint.y\n return { x: rotatedX, y: rotatedY }\n },\n sharedPointLinesAngle({\n sharedPoint,\n oldLinePoint,\n newLinePoint,\n }: {\n sharedPoint: Point\n oldLinePoint: Point\n newLinePoint: Point\n }) {\n // return angle between line from sharedPoint to oldLinePoint and\n // line from sharedPoint to newLinePoint\n const numerator =\n oldLinePoint.y * (sharedPoint.x - newLinePoint.x) +\n sharedPoint.y * (newLinePoint.x - oldLinePoint.x) +\n newLinePoint.y * (oldLinePoint.x - sharedPoint.x)\n const denominator =\n (oldLinePoint.x - sharedPoint.x) * (sharedPoint.x - newLinePoint.x) +\n (oldLinePoint.y - sharedPoint.y) * (sharedPoint.y - newLinePoint.y)\n const ratio = numerator / denominator\n\n return Math.atan(ratio)\n },\n\n twoSegmentLinesIntersection(p1: Point, p2: Point, p3: Point, p4: Point) {\n // line intercept math by Paul Bourke http://paulbourke.net/geometry/pointlineplane/\n // Determine the intersection point of two line segments\n // Return FALSE if the lines don't intersect\n\n // Check if none of the lines are of length 0\n if ((p1.x === p2.x && p1.y === p2.y) || (p3.x === p4.x && p3.y === p4.y)) {\n return false\n }\n\n const denominator = (p4.y - p3.y) * (p2.x - p1.x) - (p4.x - p3.x) * (p2.y - p1.y)\n\n // Lines are parallel\n if (denominator === 0) {\n return false\n }\n\n const ua = ((p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x)) / denominator\n const ub = ((p2.x - p1.x) * (p1.y - p3.y) - (p2.y - p1.y) * (p1.x - p3.x)) / denominator\n\n // is the intersection along the segments\n if (ua < 0 || ua > 1 || ub < 0 || ub > 1) {\n return false\n }\n\n // Return a object with the x and y coordinates of the intersection\n const x = p1.x + ua * (p2.x - p1.x)\n const y = p1.y + ua * (p2.y - p1.y)\n\n return { x, y }\n },\n\n // https://stackoverflow.com/a/60368757\n checkLineIntersection(line1_p1: Point, line1_p2: Point, line2_p1: Point, line2_p2: Point) {\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\n let a, b\n const result: { x: number; y: number; onLine1: boolean; onLine2: boolean } = {\n x: 0,\n y: 0,\n onLine1: false,\n onLine2: false,\n }\n const denominator =\n (line2_p2.y - line2_p1.y) * (line1_p2.x - line1_p1.x) - (line2_p2.x - line2_p1.x) * (line1_p2.y - line1_p1.y)\n if (denominator === 0) {\n return false\n }\n\n a = line1_p1.y - line2_p1.y\n b = line1_p1.x - line2_p1.x\n const numerator1 = (line2_p2.x - line2_p1.x) * a - (line2_p2.y - line2_p1.y) * b\n const numerator2 = (line1_p2.x - line1_p1.x) * a - (line1_p2.y - line1_p1.y) * b\n a = numerator1 / denominator\n b = numerator2 / denominator\n\n // if we cast these lines infinitely in both directions, they intersect here:\n result.x = line1_p1.x + a * (line1_p2.x - line1_p1.x)\n result.y = line1_p1.y + a * (line1_p2.y - line1_p1.y)\n\n // if line1 is a segment and line2 is infinite, they intersect if:\n if (a > 0 && a < 1) {\n result.onLine1 = true\n }\n // if line2 is a segment and line1 is infinite, they intersect if:\n if (b > 0 && b < 1) {\n result.onLine2 = true\n }\n // if line1 and line2 are segments, they intersect if both of the above are true\n return result\n },\n\n // ray is considered line1, segment is considered line2\n getRayToLineSegmentIntersection(rayOrigin: Point, rayEnd: Point, segmentStart: Point, segmentEnd: Point) {\n const lineIntersection = this.checkLineIntersection(rayOrigin, rayEnd, segmentStart, segmentEnd)\n\n if (\n !lineIntersection ||\n lineIntersection.onLine1 ||\n this.dotProduct(\n this.subtractPoints(rayOrigin, lineIntersection as Point),\n this.subtractPoints(rayOrigin, rayEnd)\n ) <= 0\n )\n return false\n return { ...lineIntersection, x: Math.round(lineIntersection.x), y: Math.round(lineIntersection.y) } // sometimes edge value can have crazy precision instead of `0` something like `5.684341886080802e-14` which is basically 0.00000000000005684341886080802 we should round it\n },\n\n getMiddlePointOnLineSegment(P1: Point, P2: Point) {\n const x = (P1.x - P2.x) / 2 + P2.x\n const y = (P1.y - P2.y) / 2 + P2.y\n return { x, y }\n },\n\n normalizeVector(v: Point) {\n const length = Math.sqrt(v.x * v.x + v.y * v.y)\n return { x: v.x / length, y: v.y / length }\n },\n\n multiplyVectorByScalar(v: Point, scalar: number) {\n return { x: v.x * scalar, y: v.y * scalar }\n },\n\n addPoints(P1: Point, P2: Point) {\n return { x: P1.x + P2.x, y: P1.y + P2.y }\n },\n\n subtractPoints(P1: Point, P2: Point): Point {\n return { x: P1.x - P2.x, y: P1.y - P2.y }\n },\n}\n\nexport default math\n","import Spine from '@finviz/spine'\n\nexport const defaults = {\n enabled: false,\n collapsed: true,\n duration: false,\n timestamp: true,\n logErrors: true,\n withStackTrace: false,\n level: 'log',\n logger: console,\n filterChanges: (model, attrs) => {\n const props = Object.keys(attrs)\n return (\n model.constructor.name === 'Mouse' ||\n model.constructor.name === 'Quote' ||\n (props.length === 1 && (props[0] === 'scale' || props[0] === 'leftOffset'))\n )\n },\n errorTransformer: (error) => error,\n titleFormatter: ({ timestamp, duration }, title, time, took) => {\n const parts = ['model']\n parts.push(`%c${String(title)}`)\n if (timestamp) {\n parts.push(`%c@ ${time}`)\n }\n if (duration) {\n parts.push(`%c(in ${took.toFixed(2)} ms)`)\n }\n return parts.join(' ')\n },\n colors: {\n title: () => 'inherit',\n prevState: () => '#9E9E9E',\n action: () => '#03A9F4',\n nextState: () => '#4CAF50',\n error: () => '#F20404',\n },\n}\n\nconst repeat = (str, times) => new Array(times + 1).join(str)\nconst pad = (num, maxLength = 2) => repeat('0', maxLength - num.toString().length) + num\nconst formatTime = (time) =>\n `${pad(time.getHours())}:${pad(time.getMinutes())}:${pad(time.getSeconds())}.${pad(time.getMilliseconds(), 3)}`\n\nexport const printLogEntry = (logEntry, options = {}) => {\n const { logger, logErrors, titleFormatter, collapsed, timestamp, duration, withStackTrace, colors, level } = {\n ...defaults,\n ...options,\n }\n const { startedTime, title, prevState, data, error, nextState, took } = logEntry\n\n const formattedTime = formatTime(startedTime)\n const titleCSS = colors.title ? `color: ${colors.title(title)};` : ''\n const headerCSS = ['color: gray; font-weight: lighter;']\n headerCSS.push(titleCSS)\n if (timestamp) {\n headerCSS.push('color: gray; font-weight: lighter;')\n }\n if (duration) {\n headerCSS.push('color: gray; font-weight: lighter;')\n }\n const formattedTitle = titleFormatter(defaults, title, formattedTime, took)\n\n try {\n if (collapsed) {\n if (colors.title) {\n logger.groupCollapsed(`%c ${formattedTitle}`, ...headerCSS)\n } else {\n logger.groupCollapsed(formattedTitle)\n }\n } else if (colors.title) {\n logger.group(`%c ${formattedTitle}`, ...headerCSS)\n } else {\n logger.group(formattedTitle)\n }\n } catch (e) {\n logger.log(formattedTitle)\n }\n\n if (colors.prevState) {\n const styles = `color: ${colors.prevState(prevState)}; font-weight: bold`\n logger[level]('%c prev state', styles, prevState)\n } else {\n logger[level]('prev state', prevState)\n }\n\n if (colors.action) {\n const styles = `color: ${colors.action(data)}; font-weight: bold`\n logger[level]('%c arguments ', styles, data)\n } else {\n logger[level]('arguments ', data)\n }\n\n if (error && logErrors) {\n if (colors.error) {\n const styles = `color: ${colors.error(error, prevState)}; font-weight: bold;`\n logger['error']('%c error ', styles, error)\n } else {\n logger['error']('error ', error)\n }\n }\n\n if (colors.nextState) {\n const styles = `color: ${colors.nextState(nextState)}; font-weight: bold`\n logger[level]('%c next state', styles, nextState)\n } else {\n logger[level]('next state', nextState)\n }\n\n if (withStackTrace) {\n logger.groupCollapsed('TRACE')\n logger.trace()\n logger.groupEnd()\n }\n\n try {\n logger.groupEnd()\n } catch (e) {\n logger.log('—— log end ——')\n }\n}\n\nexport const initialize = () => {\n window['logger'] = defaults\n\n const protoModelLoad = Spine.Model.prototype.load\n Spine.Model.prototype.load = function (attrs) {\n if (defaults.enabled && !defaults.filterChanges(this, attrs)) {\n const started = Date.now()\n const logEntry = {\n title: `${this.constructor.name}[#${this.id || this.cid}]`,\n started: started,\n startedTime: new Date(started),\n prevState: this.attributes(),\n data: attrs,\n }\n\n let returnedValue\n try {\n returnedValue = protoModelLoad.apply(this, arguments)\n } catch (e) {\n logEntry.error = e\n }\n\n logEntry.nextState = this.attributes()\n logEntry.took = Date.now() - logEntry.started\n\n printLogEntry(logEntry)\n return returnedValue\n } else {\n return protoModelLoad.apply(this, arguments)\n }\n }\n}\n","import { ObjectHash } from '../../types/shared'\nimport { Theme } from '../../types/shared'\nimport ChartEvent from '../chart-events/chart-event'\nimport { ChartEventBadgeType } from '../constants/common'\nimport { chartEventsAsyncModule } from '../controllers/chart-events/async-modules'\nimport ElementModel from '../models/element'\nimport { ChartEventBadgeState, IChartEventBadgeProps } from '../utils/chart-events-utils'\nimport { importWithRetry } from '../website-shared'\nimport { CHART_EVENT_BADGE_SIZE } from './constants'\nimport Pane from './pane'\n\nconst badgeImages = {} as ObjectHash\n\ntype ChartEventBadgeCommonType = Omit & { badgeType: ChartEventBadgeType }\n\nfunction getSvgImageCacheKey(props: Pick) {\n return `${props.badgeType}-${props.theme}-${props.state}`\n}\n\nasync function fetchAndCacheChartEventBadges({ onBadgeInitLoad }: { onBadgeInitLoad: () => void }) {\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\n if (typeof window === 'undefined') {\n return\n }\n\n const { chartBadgeSvgByType } = await importWithRetry(chartEventsAsyncModule.importFn)\n\n Object.values(ChartEventBadgeState).forEach((badgeState) => {\n Object.values(ChartEventBadgeType).forEach((badgeType) => {\n Object.values(Theme).forEach((theme) => {\n const cacheKey = getSvgImageCacheKey({\n badgeType,\n state: badgeState,\n theme,\n })\n const svgHTML = chartBadgeSvgByType[badgeType]({\n state: badgeState,\n theme,\n width: CHART_EVENT_BADGE_SIZE,\n })\n const img = new Image()\n img.src = `data:image/svg+xml,${encodeURIComponent(svgHTML)}`\n img.onload = () => {\n onBadgeInitLoad()\n }\n badgeImages[cacheKey] = img\n })\n })\n })\n}\n\nclass ChartEventElement extends ElementModel {\n static initClass(paneModel: typeof Pane) {\n this.configure('ChartEventElement', 'instance', 'lastChange', 'zIndex', 'yIndex', 'elementId')\n this.belongsTo('pane', paneModel)\n }\n\n declare instance: ChartEvent\n yIndex = 0\n\n getChartEventBadgeImage(props: ChartEventBadgeCommonType) {\n const cacheKey = getSvgImageCacheKey(props)\n if (badgeImages[cacheKey]) {\n return badgeImages[cacheKey]\n }\n\n void fetchAndCacheChartEventBadges({\n onBadgeInitLoad: () => this.trigger('change', this),\n })\n }\n\n getChartEventData() {\n return this.instance.model\n .chart()\n .quote()\n ?.chartEvents?.find((stockEvent) => stockEvent.elementId === this?.elementId)\n }\n\n toObject() {\n return {\n ...super.toObject(),\n yIndex: this.yIndex,\n }\n }\n\n toConfig() {\n return {\n ...super.toConfig(),\n yIndex: this.yIndex,\n }\n }\n}\n\nexport default ChartEventElement\n","import Spine from '@finviz/spine'\n\nimport Chart from './chart'\n\nclass Indicator extends Spine.Model {\n static initClass(chartModel: typeof Chart) {\n this.configure('Indicator', 'instance')\n this.belongsTo('chart', chartModel)\n }\n\n declare chart: () => Chart\n\n // instance - todo - not sure what instance type to put here\n}\n\nexport default Indicator\n","import Spine from '@finviz/spine'\n\nimport Chart from './chart'\n\nclass Overlay extends Spine.Model {\n static initClass(chartModel: typeof Chart) {\n this.configure('Overlay', 'overlay')\n this.belongsTo('chart', chartModel)\n }\n\n declare overlay: any\n declare chart: () => Chart\n}\n\nexport default Overlay\n","/**\n * This file sets up the relationships between models and solves circular dependencies\n * This file needs to be imported in the index file so that the relationships are\n * called in time for instantiation.\n */\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport ChartLayout from './chart_layout'\nimport DrawingsInternalStore from './drawings-internal-store'\nimport Element from './element'\nimport Indicator from './indicator'\nimport Overlay from './overlay'\nimport Pane from './pane'\nimport Quote from './quote'\n\nChart.initClass(Pane, Quote, ChartLayout)\nChartLayout.initClass(Chart, DrawingsInternalStore)\nDrawingsInternalStore.initClass()\nElement.initClass(Pane)\nChartEventElement.initClass(Pane)\nIndicator.initClass(Chart)\nOverlay.initClass(Chart)\nPane.initClass(Element, ChartEventElement, Chart)\n","import 'lib/shims'\n\nimport { initialize } from './logger'\nimport './models/relationships'\n\nif (document.location.hostname === 'localhost') {\n initialize()\n}\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\n\nimport {\n ChartConfigChartPaneElement,\n CustomSpineEvents,\n IModalConfig,\n IModalConfigInput,\n ObjectHash,\n PaneArea,\n RequireByKey,\n Theme,\n} from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport {\n FONT_SIZE,\n INDICATOR_LABEL_HEIGHT,\n IndicatorType,\n OFFSET,\n PADDING,\n SpecificChartFunctionality,\n TextAlign,\n TextBaseline,\n} from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport Chart from '../models/chart'\nimport mouseModel from '../models/mouse'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport { isRedesignEnabled } from '../utils'\nimport { roundedRect } from '../utils/canvas-render'\nimport { renderCross } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getIsSSr, getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\n\nconst INDICATOR_DEFAULT_DOMAIN = (indicator: IndicatorType) => {\n switch (indicator) {\n case IndicatorType.Rvol:\n return { min: 0, max: 2 }\n case IndicatorType.Atr:\n return { min: 0, max: 10 }\n case IndicatorType.Adx:\n case IndicatorType.Aro:\n case IndicatorType.Mfi:\n case IndicatorType.Perf:\n case IndicatorType.Rmi:\n case IndicatorType.Rsi:\n case IndicatorType.Stofu:\n case IndicatorType.Ult:\n return { min: 0, max: 100 }\n case IndicatorType.Macd:\n case IndicatorType.Rwi:\n case IndicatorType.Trix:\n return { min: -1, max: 1 }\n case IndicatorType.Wr:\n return { min: -100, max: 0 }\n case IndicatorType.Aroosc:\n case IndicatorType.Roc:\n return { min: -100, max: 100 }\n case IndicatorType.Cci:\n case IndicatorType.Fi:\n return { min: -200, max: 200 }\n default:\n return { min: 0, max: 100 }\n }\n}\n\nexport interface IIndicatorIsValid {\n getIsValid(key: string): boolean | void\n}\n\nclass Indicator extends Spine.Module implements IIndicatorIsValid {\n static type = IndicatorType.Indicator\n static label = 'Indicator'\n\n static initClass() {\n Object.defineProperty(this.prototype, 'height', {\n get() {\n return this.model.height\n },\n })\n Object.defineProperty(this.prototype, 'contentHeight', {\n get() {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n return this.height - IndicatorSettings.top.height - IndicatorSettings.bottom.height\n },\n })\n }\n\n static fromObject(values: ObjectHash, model: Pane) {\n const indicator = new this(values, model)\n indicator.set(values)\n return indicator\n }\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt\n }\n\n declare data: Quote\n declare min: number\n declare max: number\n declare contentHeight: number\n declare height: number\n\n attrs: Attrs\n model: Pane\n labelWidth = 0\n fetchedAt = -1\n leftOffset = 0\n width = 0\n contentWidth = 0\n lastValue: number | null = null\n shouldUpdate = true\n tickers: string | null = null\n period?: string | number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.attrs = attrs\n this.model = model\n this.data = this.model.chart().quote()\n\n this.renderYAxis = this.renderYAxis.bind(this)\n this.renderCrossText = this.renderCrossText.bind(this)\n\n this.model.chart().bind('update', this.trigger.bind(this, 'change'))\n this.model.bind('update change', this.trigger.bind(this, 'change'))\n const mouseModelChangeHandler = this.trigger.bind(this, 'change', 'cross')\n this.model.bind('destroy', () => {\n mouseModel.unbind('change', mouseModelChangeHandler)\n })\n mouseModel.bind('change', mouseModelChangeHandler)\n\n this.model.chart().chart_layout().bind('theme', this.setupCache.bind(this))\n }\n\n get type() {\n return (this.constructor as typeof Indicator).type\n }\n\n get label() {\n return (this.constructor as typeof Indicator).label\n }\n\n render(context: CanvasRenderingContext2D) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n this.data = this.model.chart().quote()\n this.leftOffset = this.model.chart().leftOffset\n this.width = this.model.chart().width\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\n\n this.compute()\n\n this.setupCache()\n\n this.renderYAxis(context)\n\n context.save()\n this.clip(context)\n this.renderXAxis(context)\n const translate = getTranslate({\n context,\n xOffset: this.leftOffset + IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n this.renderIndicator(context)\n translate.undo()\n context.restore()\n\n if (!this.getIsChartPageSpecificFunctionality()) {\n this.renderLabel(context)\n }\n }\n\n isComputeNecessary() {\n // if quote was updated (this.fetchedAt !== this.data.fetchedAt)\n // or indicator setting was changed via modal (this.shouldUpdate)\n // allow compute and update variables to prevent another unless\n // those variables change again\n if (this.fetchedAt !== this.data.fetchedAt || this.shouldUpdate) {\n this.fetchedAt = this.data.fetchedAt\n this.shouldUpdate = false\n return true\n }\n return false\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let y\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const ticks = this.model.scale.y.ticks(10)\n const tickTextStep = Math.abs(ticks[2] - ticks[0])\n const yLine = new Line(\n {\n x1: 0,\n x2: this.contentWidth,\n strokeStyle: Colors.grid,\n dashLength: 3,\n },\n this.model\n )\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n fillStyle: Colors.text,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n for (let index = 0; index < ticks.length; index++) {\n const tick = ticks[index]\n y = Math.round(this.fy(tick))\n yLine.set({ y1: y, y2: y }).render(context)\n if (index % 2 === 0) {\n text.set({ text: this.formatAxis(tick, tickTextStep), y }).render(context)\n }\n }\n\n const minY = 0\n const maxY = this.contentHeight\n const valueY = this.lastValue === null ? 0 : Math.round(this.fy(this.lastValue))\n if (this.lastValue != null && valueY >= minY && valueY <= maxY) {\n new Text(\n {\n text: math.formatBigNumber(this.lastValue, 2),\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n y: valueY,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n background: Colors.indicatorCurrentBackground,\n },\n this.model\n ).render(context)\n }\n\n translate.undo()\n }\n\n renderXAxis(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const xLine = new Line(\n {\n x1: 0,\n x2: 0,\n y1: 0,\n y2: this.contentHeight,\n strokeStyle: Colors.grid,\n dashLength: 3,\n },\n this.model\n )\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n for (let tick = 0, end = this.data.date.length; tick < end; tick += 10) {\n const x = Math.round(this.fx(tick) + this.leftOffset)\n if (x < -15 || x > this.width + 15) {\n // margin?\n continue\n }\n xLine.set({ x1: x, x2: x }).render(context)\n }\n translate.undo()\n }\n\n renderLabel(context: CanvasRenderingContext2D) {\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderLabelChartsPage(context)\n } else {\n this.renderLabelQuotePage(context)\n }\n }\n\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const label = new Text(\n {\n text: this.toString(),\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y: IndicatorSettings.left.indicatorLabel.margin.top,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n )\n this.labelWidth = label.measure(context)\n return label.render(context)\n }\n\n renderLabelChartsPage(context: CanvasRenderingContext2D): { x: number; y: number; labelWidth: number } | void {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const { theme, specificChartFunctionality } = this.model.chart().chart_layout()\n const isDarkMode = theme === Theme.dark\n const x =\n specificChartFunctionality === SpecificChartFunctionality.quotePage\n ? OFFSET.S\n : IndicatorSettings.left.indicatorLabel.margin.left!\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\n const label = new Text(\n {\n text: this.toString(),\n x: x * 2,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n this.labelWidth = label.measure(context) + IndicatorSettings.left.indicatorLabel.margin.left! * 2\n label.set({ y: y + (INDICATOR_LABEL_HEIGHT - label.attrs.lineHeight / 2) })\n roundedRect({\n ctx: context,\n x,\n y,\n height: INDICATOR_LABEL_HEIGHT,\n width: this.labelWidth,\n radius: 6,\n color: `${tailwindColors.gray[isDarkMode ? 700 : 50]}cc`,\n })\n label.render(context)\n\n return { x, y, labelWidth: this.labelWidth }\n }\n\n renderCross(context: CanvasRenderingContext2D) {\n renderCross({\n context,\n mouseModel,\n paneModel: this.model,\n quote: this.data,\n contentWidth: this.contentWidth,\n contentHeight: this.contentHeight,\n isIndicator: true,\n isPerfIndicator: this.type === IndicatorType.Perf,\n onRenderCrossText: !this.getIsChartPageSpecificFunctionality() ? this.renderCrossText : undefined,\n })\n\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderCrossText(context, mouseModel.getCrossIndexForPane(this.model))\n }\n }\n\n renderCrossText(context: CanvasRenderingContext2D, crossIndex: number) {\n this.data = this.model.chart().quote()\n const index = Number.isNaN(crossIndex) ? this.data.close.length - 1 : crossIndex\n if (this.getIsChartPageSpecificFunctionality()) {\n this.renderLabelChartsPage(context)\n\n this.renderCrossTextChartsPage(context, index)\n } else {\n this.renderCrossTextQuotePage(context, index)\n }\n }\n\n renderCrossTextChartsPage(_: CanvasRenderingContext2D, __: number) {}\n\n renderCrossTextQuotePage(_: CanvasRenderingContext2D, __: number) {}\n\n renderOversoldOverbought(\n context: CanvasRenderingContext2D,\n array: number[],\n from: number,\n oversold: number,\n zero: number,\n overbought: number,\n drawLines?: boolean\n ) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n if (this.data.close.length === 0) return\n\n if (drawLines == null) {\n drawLines = true\n }\n\n context.save()\n\n let clipHeight = Math.round(this.fy(oversold) - this.fy(this.model.scale.y.domain()[1]))\n if (clipHeight <= 0 || getIsSSr()) {\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(this.model.scale.y.domain()[1]) + 1, // compensation to addition of 1 in clip function\n this.contentWidth,\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\n )\n }\n context.clip()\n context.set('fillStyle', '#87ceef')\n\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(this.model.scale.y.domain()[0])))\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: from,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(array[i])))\n },\n })\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[0])))\n context.fill()\n context.restore()\n if (drawLines) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(oversold)),\n y2: Math.round(this.fy(oversold)),\n strokeStyle: '#69c1ea',\n },\n this.model\n ).render(context)\n }\n\n if (drawLines) {\n this.renderZeroLine(context, zero)\n }\n\n context.save()\n clipHeight = Math.round(this.fy(overbought))\n if (clipHeight >= 0 || getIsSSr()) {\n context.beginPath()\n context.rect(\n -this.leftOffset,\n this.fy(this.model.scale.y.domain()[0]),\n this.contentWidth,\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\n )\n }\n\n context.clip()\n context.set('fillStyle', '#dc9fe5')\n context.beginPath()\n context.moveTo(this.fx(0), Math.round(this.fy(this.model.scale.y.domain()[1])))\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(array[i])))\n },\n })\n context.lineTo(this.fx(this.data.close.length - 1), Math.round(this.fy(this.model.scale.y.domain()[1]) + 1))\n context.fill()\n context.restore()\n if (drawLines) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(overbought)),\n y2: Math.round(this.fy(overbought)),\n strokeStyle: '#d386df',\n },\n this.model\n ).render(context)\n }\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.set('fillStyle', '#dc9fe5')\n\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(Math.round(x), Math.round(this.fy(array[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderZeroLine(context: CanvasRenderingContext2D, zero: number) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(zero)),\n y2: Math.round(this.fy(zero)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n }\n\n setupCache() {}\n\n clip(context: CanvasRenderingContext2D) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n context.beginPath()\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\n return context.clip()\n }\n\n formatAxis(value: number, tickStep?: number) {\n if (tickStep !== undefined && 10 > tickStep) {\n return value.toFixed(2)\n }\n return value.toString()\n }\n\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\n\n fy = (y: number) => this.model.scale.y(y)\n\n set(values: Partial) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n this.shouldUpdate = true\n for (const key in values) {\n if (key !== 'type') {\n // @ts-expect-error - values keys don't have to always match variables on the instance\n this[key] = values[key]\n }\n }\n this.width = this.model.chart().width\n this.contentWidth = this.width - IndicatorSettings.left.width - IndicatorSettings.right.width\n\n const newAttrs = this.getModalConfig()\n .inputs.map(({ value }) => value.toString())\n .join(',')\n if (newAttrs) this.attrs = { ...this.attrs, period: newAttrs }\n\n this.model.trigger(CustomSpineEvents.ManualChange)\n }\n\n parsePeriodInt(values: Partial) {\n if (typeof values.period === 'string') {\n this.period = Number.parseInt(values.period, 10)\n this.model.trigger(CustomSpineEvents.ManualChange)\n }\n }\n\n setModel(model: Pane) {\n return (this.model = model)\n }\n\n isInArea(area: PaneArea) {\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const x = IndicatorSettings.left.indicatorLabel.margin.left!\n const y = IndicatorSettings.left.indicatorLabel.margin.top!\n let width = OFFSET.M * 2 + this.labelWidth\n let height = OFFSET.S * 2 + FONT_SIZE.M\n\n if (this.getIsChartPageSpecificFunctionality()) {\n width = this.labelWidth\n height = INDICATOR_LABEL_HEIGHT\n }\n\n if (x < area.cursorX && area.cursorX < width + x && y < area.cursorY && area.cursorY < height + y) {\n return true\n }\n return false\n }\n\n getIsInChartView(_: Chart) {\n return true\n }\n\n moveBy() {}\n\n thumbsAreInArea() {\n return false\n }\n\n computeVisibleMinMax(...arrays: number[][]) {\n let min = Number.MAX_VALUE\n let max = -Number.MAX_VALUE\n\n const { leftOffset } = this.model.chart()\n for (const arr of arrays) {\n for (let i = 0, end = arr.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.width) {\n // margin?\n continue\n }\n\n if (min > arr[i]) {\n min = arr[i]\n }\n if (max < arr[i]) {\n max = arr[i]\n }\n }\n }\n\n return min !== max ? { min, max } : this.getDomainDefaults(this.type)\n }\n\n getModalConfig(): IModalConfig {\n return {\n title: '',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n getDomainDefaults = (indicatorType: IndicatorType) => INDICATOR_DEFAULT_DOMAIN(indicatorType)\n\n getMinMax() {\n this.data = this.model.chart().quote()\n this.compute()\n return { min: this.min, max: this.max }\n }\n\n toObject() {\n return merge({}, this.attrs, { type: this.type, tickers: this.tickers })\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return {\n type: this.type,\n period: this.getModalConfig()\n .inputs.map((input: IModalConfigInput) => input.value.toString())\n .join(','),\n }\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.model.chart().chart_layout())\n }\n\n renderIndicator(_: CanvasRenderingContext2D) {\n throw Error('Implement renderIndicator method')\n }\n\n getIsValid(_: string): boolean | undefined {\n throw Error('Implement')\n }\n\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\n }\n\n getIsChartPageSpecificFunctionality() {\n const { specificChartFunctionality } = this.model.chart().chart_layout()\n const isCharts = specificChartFunctionality === SpecificChartFunctionality.chartPage\n const isRedesignedFuturesForexCrypto =\n isRedesignEnabled() &&\n [\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n SpecificChartFunctionality.quotePage,\n ].includes(specificChartFunctionality)\n\n return isCharts || isRedesignedFuturesForexCrypto\n }\n\n getIsDrawing() {\n return false\n }\n\n getIsChartEvent() {\n return false\n }\n\n compute() {\n throw Error('Implement compute method')\n }\n}\n\nIndicator.initClass()\n\nexport default Indicator\n","export function roundedRect({\n ctx,\n x,\n y,\n width,\n height,\n radius,\n color,\n}: {\n ctx: CanvasRenderingContext2D\n x: number\n y: number\n width: number\n height: number\n radius: number\n color: string\n}) {\n ctx.translate(0.5, 0.5)\n ctx.set('strokeStyle', color)\n ctx.set('fillStyle', color)\n ctx.beginPath()\n ctx.moveTo(x, y + radius)\n ctx.lineTo(x, y + height - radius)\n ctx.arcTo(x, y + height, x + radius, y + height, radius)\n ctx.lineTo(x + width - radius, y + height)\n ctx.arcTo(x + width, y + height, x + width, y + height - radius, radius)\n ctx.lineTo(x + width, y + radius)\n ctx.arcTo(x + width, y, x + width - radius, y, radius)\n ctx.lineTo(x + radius, y)\n ctx.arcTo(x, y, x, y + radius, radius)\n ctx.stroke()\n ctx.fill()\n ctx.translate(-0.5, -0.5)\n}\n","import { IndicatorType } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ADX extends Indicator {\n static type = IndicatorType.Adx\n static label = 'ADX'\n\n declare period: number\n pdi: number[] = []\n mdi: number[] = []\n adx: number[] = []\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n let adx, amdm, apdm, mdi, pdi\n this.pdi = []\n this.mdi = []\n this.adx = []\n let atr = (apdm = amdm = adx = 0)\n for (let i = this.period; i < this.data.close.length; i++) {\n const deltaHigh = this.data.high[i] - this.data.high[i - 1]\n const deltaLow = this.data.low[i - 1] - this.data.low[i]\n\n let pdm = 0\n if (deltaHigh > 0 && deltaHigh > deltaLow) {\n pdm = deltaHigh\n }\n\n let mdm = 0\n if (deltaLow > 0 && deltaLow > deltaHigh) {\n mdm = deltaLow\n }\n\n const tr = utils.max([\n this.data.high[i] - this.data.low[i],\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\n ])\n\n atr = (atr * (this.period - 1) + tr) / this.period\n apdm = (apdm * (this.period - 1) + pdm) / this.period\n amdm = (amdm * (this.period - 1) + mdm) / this.period\n\n pdi = atr > 0 ? (apdm * 100) / atr : 0\n mdi = atr > 0 ? (amdm * 100) / atr : 0\n const di = Math.abs(pdi - mdi)\n const dx = pdi + mdi > 0 ? (di * 100) / (pdi + mdi) : 0\n adx = (adx * (this.period - 1) + dx) / this.period\n\n this.pdi[i] = pdi\n this.mdi[i] = mdi\n this.adx[i] = adx\n }\n this.lastValue = this.adx.last() ?? null\n }\n const { min, max } =\n this.pdi.length > 0 || this.mdi.length > 0 || this.adx.length > 0\n ? this.computeVisibleMinMax(this.pdi, this.mdi, this.adx)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', '#2eb12e')\n context.beginPath()\n\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.pdi[i])))\n },\n })\n\n context.stroke()\n\n context.set('strokeStyle', '#d43737')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.mdi[i])))\n },\n })\n context.stroke()\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.beginPath()\n\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.adx[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ADX ${this.period}`\n }\n}\n\nexport default ADX\n","import Text from '../canvas/text'\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nconst COLORS = {\n aroonUp: '#00a000',\n aroonDown: '#c80000',\n}\n\nclass Aroon extends Indicator {\n static type = IndicatorType.Aro\n static label = 'Aroon'\n\n aroonUp: number[] = []\n aroonDown: number[] = []\n declare period: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n }\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.aroonUp = []\n this.aroonDown = []\n\n const startAt = this.period - 1\n for (let i = startAt; i < this.data.close.length; i++) {\n const highPeriod = this.data.high.slice(i - startAt, i + 1)\n const highestInPeriod = Math.max(...highPeriod)\n const periodSinceHigh = this.period - (highPeriod.indexOf(highestInPeriod) + 1)\n this.aroonUp[i] = 100 * ((this.period - periodSinceHigh) / this.period)\n\n const lowPeriod = this.data.low.slice(i - startAt, i + 1)\n const lowestInPeriod = Math.min(...lowPeriod)\n const periodSinceLow = this.period - (lowPeriod.indexOf(lowestInPeriod) + 1)\n this.aroonDown[i] = 100 * ((this.period - periodSinceLow) / this.period)\n }\n\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', COLORS.aroonDown)\n context.beginPath()\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.aroonDown[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', COLORS.aroonUp)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.aroonUp[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n },\n this.model\n )\n const textLabels = []\n if (this.aroonDown.length > 0) {\n textLabels.push({\n text: this.aroonDown.last()!.toFixed(2),\n y: Math.round(this.fy(this.aroonDown.last()!)),\n background: COLORS.aroonDown,\n })\n }\n if (this.aroonUp.length > 0) {\n textLabels.push({\n text: this.aroonUp.last()!.toFixed(2),\n y: Math.round(this.fy(this.aroonUp.last()!)),\n background: COLORS.aroonUp,\n })\n }\n\n const minY = 0\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 25,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Aroon ${this.period}`\n }\n}\n\nexport default Aroon\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass AroonOscillator extends Indicator {\n static type = IndicatorType.Aroosc\n static label = 'Aroon Oscillator'\n\n oscillator: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.oscillator = []\n\n const startAt = this.period - 1\n for (let i = startAt; i < this.data.close.length; i++) {\n const highPeriod = this.data.high.slice(i - startAt, i + 1)\n const highestInPeriod = Math.max(...highPeriod)\n const periodSinceHigh = this.period - highPeriod.indexOf(highestInPeriod)\n const aroonUp = 100 * ((this.period - periodSinceHigh) / this.period)\n\n const lowPeriod = this.data.low.slice(i - startAt, i + 1)\n const lowestInPeriod = Math.min(...lowPeriod)\n const periodSinceLow = this.period - lowPeriod.indexOf(lowestInPeriod)\n const aroonDown = 100 * ((this.period - periodSinceLow) / this.period)\n\n this.oscillator[i] = aroonUp - aroonDown\n }\n\n this.lastValue = this.oscillator.last() ?? null\n }\n\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.oscillator, this.period, 0, 0, 0, false)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 25,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Aroon Oscillator ${this.period}`\n }\n}\n\nexport default AroonOscillator\n","import { IndicatorType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ATR extends Indicator {\n static type = IndicatorType.Atr\n static label = 'Average True Range'\n\n atr: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.atr = []\n const atr = new AverageTrueRange(this.period)\n for (let i = 0; i < this.data.close.length; i++) {\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\n this.atr[i] = atr.value\n }\n\n this.lastValue = this.atr.last() ?? null\n }\n const { min, max } = this.atr.length > 0 ? this.computeVisibleMinMax(this.atr) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.atr[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ATR ${this.period}`\n }\n}\n\nexport default ATR\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nconst constant = 0.015\nclass CommodityChannelIndex extends Indicator {\n static type = IndicatorType.Cci\n static label = 'Commodity Channel Index'\n\n cci: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n let smaCount\n const tp = []\n this.cci = []\n let smaSum = (smaCount = 0)\n for (let i = 0; i < this.data.close.length; i++) {\n let devCount\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n tp[i] = typicalPrice\n\n smaSum += typicalPrice\n smaCount++\n if (smaCount > this.period) {\n smaSum -= tp[i - this.period]\n smaCount--\n }\n const sma = smaSum / smaCount\n\n if (i < this.period - 1) {\n continue\n }\n\n let devSum = (devCount = 0)\n for (let j = i - this.period + 1; j <= i; j++) {\n devSum += Math.abs(tp[j] - sma)\n devCount++\n }\n\n const dev = devSum / devCount\n this.cci[i] = 0\n if (dev > 0) {\n this.cci[i] = (typicalPrice - sma) / (constant * dev)\n }\n }\n\n this.lastValue = this.cci.last() ?? null\n }\n\n const { min, max } = this.cci.length > 0 ? this.computeVisibleMinMax(this.cci) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.cci, this.period, -100, 0, 100)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 20,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `CCI ${this.period}`\n }\n}\n\nexport default CommodityChannelIndex\n","import * as d3 from 'd3'\n\nimport { ObjectHash, Theme } from '../../types/shared'\nimport Text from '../canvas/text'\nimport tailwindColors from '../constants/colors'\nimport { INDICATOR_LABEL_HEIGHT, IndicatorType, TextAlign, TextBaseline } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nexport interface ICOT {\n code: string\n name: string\n units: string\n commercialHedgers: number[]\n largeTraders: number[]\n smallTraders: number[]\n}\n\ninterface Attrs {\n period: string\n code: string\n}\n\ntype ColorsKeys = keyof Pick\n\nclass COT extends Indicator {\n static type = IndicatorType.Cot\n static label = 'COT'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n declare colors: ObjectHash\n\n compute() {\n if (!this.isComputeNecessary() || !this.data.COTs) return\n const cotQuoteCode = Object.keys(this.data.COTs)[0]\n if (!this.attrs.code && cotQuoteCode) {\n this.attrs.code = cotQuoteCode\n }\n const cot = this.data.COTs[this.attrs.code]\n const [min, max] = utils.minMax(cot.commercialHedgers, cot.largeTraders, cot.smallTraders)\n this.max = Math.max(Math.abs(max), Math.abs(min))\n this.min = -this.max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (!this.data.COTs) return\n context.translate(0.5, 0.5)\n for (const key in this.colors) {\n context.set('strokeStyle', this.colors[key as ColorsKeys])\n context.beginPath()\n const data = this.data.COTs[this.attrs.code][key as ColorsKeys]\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(data[i])))\n },\n })\n context.stroke()\n }\n context.translate(-0.5, -0.5)\n }\n\n renderLabel(context: CanvasRenderingContext2D) {\n if (!this.data.COTs) return\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const name = new Text(\n {\n text: this.toString(),\n x: 8,\n y: 16,\n font: { size: 10, style: 'bold' },\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n )\n name.render(context)\n\n new Text(\n {\n text: this.data.COTs[this.attrs.code].units as string,\n x: 38 + name.measure(),\n y: 16,\n font: { size: 8 },\n fillStyle: Colors.text,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n ).render(context)\n\n this.renderAdditionalLabels(context)\n }\n\n renderLabelChartsPage(context: CanvasRenderingContext2D) {\n const { x, y, labelWidth } = super.renderLabelChartsPage(context) as { x: number; y: number; labelWidth: number }\n\n const { IndicatorSettings } = this.getChartLayoutSettings()\n const isDarkMode = this.model.chart().chart_layout().theme === Theme.dark\n const secondarylabelX = labelWidth + x * 2\n const fontSettings = IndicatorSettings.left.indicatorLabel.font\n const scaleCoefficient = 0.7\n\n const secondarylabel = new Text(\n {\n text: this.data.COTs[this.attrs.code].units as string,\n x: secondarylabelX + x,\n font: Text.getMergedPropsWithDefaults('font', {\n ...fontSettings,\n size: fontSettings.size ? fontSettings.size * scaleCoefficient : undefined,\n style: 'normal',\n }),\n fillStyle: tailwindColors.gray[isDarkMode ? 50 : 900],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n },\n this.model\n )\n secondarylabel.set({\n y: y + (INDICATOR_LABEL_HEIGHT * scaleCoefficient - (secondarylabel.attrs.lineHeight * scaleCoefficient) / 2),\n })\n secondarylabel.render(context)\n\n this.renderAdditionalLabels(context)\n }\n\n renderAdditionalLabels(context: CanvasRenderingContext2D) {\n const { ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n\n new Text(\n {\n text: 'COT',\n x: 23,\n y: IndicatorSettings.top.height + (IndicatorSettings.bottom.height + this.contentHeight) / 2,\n angle: -90,\n font: { size: 10, weight: '900', family: 'Lato, sans-serif' },\n fillStyle: Colors.textSecondary,\n textAlign: TextAlign.center,\n textBaseline: TextBaseline.alphabetic,\n },\n this.model\n ).render(context)\n\n const text = new Text(\n {\n text: 'Commercial Hedgers',\n x: IndicatorSettings.left.width,\n y: IndicatorSettings.top.height + this.contentHeight + IndicatorSettings.bottom.height - 1, // allign to very bottom of indicator with 1 pixel bottom padding\n font: { size: 8, style: 'bold' },\n fillStyle: this.colors.commercialHedgers,\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.bottom,\n },\n this.model\n )\n text.render(context)\n\n let x = text.get('x')! + 8 + text.measure()\n text.set({ text: 'Large Traders', x, fillStyle: this.colors.largeTraders })\n text.render(context)\n\n x += 8 + text.measure()\n text.set({ text: 'Small Traders', x, fillStyle: this.colors.smallTraders })\n text.render(context)\n }\n\n formatAxis(value: number) {\n // https://github.com/d3/d3-format/blob/master/README.md#locale_formatPrefix\n const scaleY = this.model.scale.y as unknown as d3.ScaleLinear\n return scaleY.tickFormat(4, 's')(value).replace(/G/, 'B')\n }\n\n getModalConfig() {\n return {\n title: 'COT',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return this.data?.COTs ? (this.data.COTs[this.attrs.code].name as string) : undefined\n }\n\n toConfig(): T['attrs'] & { type: T['type'] } {\n return {\n type: this.type,\n code: this.attrs.code,\n }\n }\n}\n\nCOT.prototype.colors = {\n commercialHedgers: '#10cc10',\n largeTraders: '#cc1010',\n smallTraders: '#1010cc',\n}\n\nexport default COT\n","import { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ForceIndex extends Indicator {\n static type = IndicatorType.Fi\n static label = 'Force Index'\n\n fi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.fi = []\n const ema = new EMA(this.period)\n for (let i = 1; i < this.data.close.length; i++) {\n ema.add(((this.data.close[i] - this.data.close[i - 1]) * this.data.volume[i]) / 1000000)\n this.fi[i] = ema.value\n }\n this.lastValue = this.fi.last() ?? null\n }\n const { min, max } = this.fi.length > 0 ? this.computeVisibleMinMax(this.fi) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.fi, 1, 0, 0, 0, false)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 13,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `FORCE ${this.period}`\n }\n}\n\nexport default ForceIndex\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n fastPeriod: number\n slowPeriod: number\n signalPeriod: number\n}\n\nclass MACD extends Indicator {\n static type = IndicatorType.Macd\n static label = 'MACD'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(period)\n return Math.max(fastPeriod, slowPeriod, signalPeriod)\n }\n\n macd: number[] = []\n signal: number[] = []\n histogram: number[] = []\n declare fastPeriod: number\n declare slowPeriod: number\n declare signalPeriod: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [fastPeriod = 0, slowPeriod = 0, signalPeriod = 0] = getParsedIntegersFromPeriodString(this.attrs.period)\n super.set({ ...values, fastPeriod, slowPeriod, signalPeriod })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.macd = []\n this.signal = []\n this.histogram = []\n const ema1 = new EMA(this.fastPeriod)\n const ema2 = new EMA(this.slowPeriod)\n const ema3 = new EMA(this.signalPeriod)\n\n for (let i = 0; i < this.data.close.length; i++) {\n ema1.add(this.data.close[i])\n ema2.add(this.data.close[i])\n const macd = ema1.value - ema2.value\n ema3.add(macd)\n const signal = ema3.value\n\n this.macd[i] = macd\n this.signal[i] = signal\n this.histogram[i] = macd - signal\n }\n\n this.lastValue = this.macd.last() ?? null\n }\n const { min, max } =\n this.macd.length > 0 || this.signal.length > 0 || this.histogram.length > 0\n ? this.computeVisibleMinMax(this.macd, this.signal, this.histogram)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n if (this.data.close.length === 0) return\n const y = Math.round(this.fy(0))\n const w = ChartSettings.center.barWidth + ChartSettings.center.border * 2\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n }\n\n context.set('fillStyle', '#79c3e8')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.rect(x - ~~(ChartSettings.center.barWidth / 2), y, w, Math.round(this.fy(this.histogram[i]) - y))\n },\n })\n context.fill()\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.beginPath()\n\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.macd[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.signalLine)\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.signal[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const fastPeriod = {\n type: 'number',\n label: 'Period',\n name: 'fastPeriod',\n value: this.fastPeriod ?? 12,\n required: true,\n min: 1,\n max: 999999,\n }\n const slowPeriod = {\n type: 'number',\n label: 'Slow',\n name: 'slowPeriod',\n value: this.slowPeriod ?? 26,\n required: true,\n min: 1,\n max: 999999,\n }\n const signalPeriod = {\n type: 'number',\n label: 'Signal',\n name: 'signalPeriod',\n value: this.signalPeriod ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [fastPeriod, slowPeriod, signalPeriod],\n inputsErrorMessages: {\n fastPeriod: `${fastPeriod.label} must be a whole number between ${fastPeriod.min} and ${fastPeriod.max}`,\n slowPeriod: `${slowPeriod.label} must be a whole number between ${slowPeriod.min} and ${slowPeriod.max}`,\n signalPeriod: `${signalPeriod.label} must be a whole number between ${signalPeriod.min} and ${signalPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'fastPeriod':\n case 'slowPeriod':\n case 'signalPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `MACD ${this.fastPeriod},${this.slowPeriod},${this.signalPeriod}`\n }\n}\n\nexport default MACD\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass MFI extends Indicator {\n static type = IndicatorType.Mfi\n static label = 'Money Flow Index'\n\n mfi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n let negativeMoneyFlow\n const mf = []\n this.mfi = []\n let prevTypicalPrice = (this.data.close[0] + this.data.low[0] + this.data.high[0]) / 3\n let positiveMoneyFlow = (negativeMoneyFlow = 0)\n for (let i = 1; i < this.data.close.length; i++) {\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n const moneyFlow = typicalPrice * this.data.volume[i]\n\n if (typicalPrice > prevTypicalPrice) {\n positiveMoneyFlow += moneyFlow\n mf[i] = moneyFlow\n } else if (typicalPrice < prevTypicalPrice) {\n negativeMoneyFlow += moneyFlow\n mf[i] = -moneyFlow\n }\n\n if (i > this.period) {\n const oldMF = mf[i - this.period]\n if (oldMF > 0) {\n positiveMoneyFlow -= oldMF\n } else if (oldMF < 0) {\n negativeMoneyFlow += oldMF\n }\n\n if (positiveMoneyFlow + negativeMoneyFlow > 0) {\n this.mfi[i] = (positiveMoneyFlow * 100) / (positiveMoneyFlow + negativeMoneyFlow)\n } else {\n this.mfi[i] = 50\n }\n }\n\n prevTypicalPrice = typicalPrice\n }\n\n this.lastValue = this.mfi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.mfi, this.period, 20, 50, 80)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `MFI ${this.period}`\n }\n}\n\nexport default MFI\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\nclass None extends Indicator {\n static type = IndicatorType.None\n static label = 'None'\n\n compute() {}\n\n renderIndicator() {}\n\n toString() {\n return ''\n }\n}\n\nexport default None\n","import { IndicatorType } from '../constants/common'\nimport math from '../helpers/math'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nclass OBV extends Indicator {\n static type = IndicatorType.Obv\n static label = 'On-Balance Volume'\n\n obv: number[] = []\n\n compute() {\n if (this.isComputeNecessary()) {\n this.obv = [0]\n\n for (let i = 1; i < this.data.volume.length; i++) {\n let currentObv = this.obv[i - 1]\n if (this.data.close[i] > this.data.close[i - 1]) {\n currentObv += this.data.volume[i]\n } else if (this.data.close[i] < this.data.close[i - 1]) {\n currentObv -= this.data.volume[i]\n }\n\n this.obv[i] = currentObv\n }\n\n this.lastValue = this.obv.last() ?? null\n }\n const { min, max } = this.obv.length > 0 ? this.computeVisibleMinMax(this.obv) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.obv[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n formatAxis(value: number) {\n return math.formatBigNumber(value, 2)\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return 'OBV'\n }\n}\n\nexport default OBV\n","import * as d3 from 'd3'\n\nimport { ObjectHash } from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport {\n INDICATOR_LABEL_HEIGHT,\n IndicatorType,\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n OFFSET,\n PADDING,\n TextAlign,\n TextBaseline,\n} from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport Quote from '../models/quote'\nimport { getSanitizedTicker } from '../utils'\nimport { getInstrument } from '../utils/chart'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n tickers?: string\n}\n\nconst DEFAULT_TICKERS = 'SPY,QQQ'\n\nclass PricePerformance extends Indicator {\n static type = IndicatorType.Perf\n static label = 'Price Performance %'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n timeframe: string\n tickers = ''\n ready = false\n firstFetchCalled = false\n first: ObjectHash = {}\n perf: ObjectHash = {}\n quotes: ObjectHash = {}\n indicatorLabelWidth: ObjectHash = {}\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n\n this.timeframe = this.model.chart().timeframe\n this.fy = d3.scaleLinear().range([0, this.contentHeight])\n if (this.attrs.period && !this.tickers) {\n this.tickers = this.attrs.period\n }\n }\n\n async compute() {\n const tickers = this.getTickers()\n const chartLayoutModel = this.model.chart().chart_layout()\n const chartUuid = chartLayoutModel.uuid\n const hasCachedData = this.getTickersAndTimeframe().every(\n ({ ticker, instrument, timeframe }) =>\n Quote.select(\n (q: Quote) =>\n q.ticker === ticker &&\n q.instrument === instrument &&\n q.timeframe === timeframe &&\n chartLayoutModel.isIdeaId(q.ideaID) &&\n chartUuid === q.chartUuid &&\n !q.isFetching\n ).length > 0\n )\n\n if (this.timeframe !== this.model.chart().quote().timeframe || (!this.ready && !this.firstFetchCalled)) {\n this.timeframe = this.model.chart().quote().timeframe\n this.firstFetchCalled = true\n\n if (!hasCachedData) {\n const data = await Quote.getAll(this.getTickersAndTimeframe())\n if (data) {\n this._compute(tickers, data)\n this.trigger('change')\n }\n } else {\n this.ready = true\n this.compute()\n }\n } else if (this.ready) {\n const data: ObjectHash = {}\n for (const ticker of tickers) {\n data[ticker] = Quote.select(\n (q: Quote) =>\n q.ticker === ticker &&\n q.timeframe === this.timeframe &&\n chartUuid === q.chartUuid &&\n chartLayoutModel.isIdeaId(q.ideaID)\n )[0]\n }\n this._compute(tickers, data)\n }\n }\n\n _compute(tickers: string[], data: ObjectHash) {\n const { leftOffset } = this.model.chart()\n let firstBarTime = null\n let lastBarTime = null\n for (let i = 0; i < this.data.close.length; i++) {\n const center = this.fx(i)\n if (center + leftOffset < 0 || center + leftOffset > this.contentWidth) {\n // margin?\n continue\n }\n\n // Rendering one extra bar out of viewport ensures continuity of line, if there are missing data on intraday the indicator may have gaps\n if (firstBarTime === null) {\n firstBarTime = this.data.date[i]\n }\n\n lastBarTime = this.data.date[i]\n }\n\n data[this.data.ticker] = this.data\n this.quotes = data\n this.perf = {}\n const dateToIndex = this.data.getDateToIndex()\n for (const ticker of [this.data.ticker, ...tickers]) {\n this.perf[ticker] = []\n const d = data[ticker]\n if (!d) {\n continue\n }\n let first = null\n let index = -1\n for (let i = 0; i < d.close.length; i++) {\n const date = d.date[i]\n if (date < firstBarTime! || date > lastBarTime!) {\n continue\n }\n\n index = dateToIndex[date]\n if (index === undefined || index === null) {\n continue\n }\n\n if (first === null) {\n first = d.close[i]\n this.first[ticker] = first\n if (index > 0) {\n this.perf[ticker][index - 1] = (d.close[i] * 100) / first - 100\n }\n }\n\n this.perf[ticker][index] = (d.close[i] * 100) / first - 100\n }\n\n if (index < this.data.date.length - 1 && first !== null) {\n this.perf[ticker][index + 1] = this.perf[ticker][index]\n }\n }\n\n const perfArrays = Object.keys(this.perf).map((x) => this.perf[x])\n const { min, max } = perfArrays.some((array) => array.length > 0)\n ? this.computeVisibleMinMax(...perfArrays)\n : this.getDomainDefaults(this.type)\n\n this.min = min\n this.max = max\n\n const fy = d3\n .scaleLinear()\n .range([0, this.contentHeight])\n .domain([this.model.scaleRange?.max ?? this.max, this.model.scaleRange?.min ?? this.min])\n if (!this.model.scaleRange) {\n fy.nice(10)\n }\n // @ts-expect-error - TODO scale.y types dont match\n this.model.scale.y = this.fy = fy\n this.ready = true\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (!this.ready) {\n return\n }\n const { ColorsSettings, IndicatorSettings } = this.getChartLayoutSettings()\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n\n context.translate(0.5, 0.5)\n const iterable = this.getTickers()\n for (let index = 0; index < iterable.length; index++) {\n const ticker = iterable[index]\n if (this.perf[ticker].length > 0) {\n context.set('strokeStyle', ColorsSettings[index % ColorsSettings.length])\n context.beginPath()\n for (let i = 0; i < this.perf[ticker].length; i++) {\n const y = Math.round(this.fy(this.perf[ticker][i]))\n context.lineTo(this.fx(i), y)\n }\n context.stroke()\n }\n }\n\n context.set('strokeStyle', IndicatorSettings.general.Colors.line)\n context.beginPath()\n for (let i = 0; i < this.perf[this.data.ticker].length; i++) {\n const y = Math.round(this.fy(this.perf[this.data.ticker][i]))\n if (!isNaN(y)) {\n context.lineTo(this.fx(i), y)\n }\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderCrossTextQuotePage(context: CanvasRenderingContext2D, crossIndex: number) {\n if (!context || !crossIndex) {\n return\n }\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const tickers = [this.data.ticker, ...this.getTickers()]\n tickers.forEach((key, index) => {\n const crossIndexTickerTimeStamp = this.quotes?.[this.data.ticker]?.getDataByBarIndex('date', crossIndex)\n const tickerDateToIndex = crossIndexTickerTimeStamp\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\n : null\n const tickerPerformance = tickerDateToIndex\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\n : null\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\n context.fillStyle = Colors.canvasFill\n context.fillRect(\n IndicatorSettings.left.indicatorLabel.margin.left! - PADDING.XXXS,\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top! -\n PADDING.XXXS,\n PADDING.XXXS + this.indicatorLabelWidth[key] + PADDING.XXXS,\n PADDING.XXXS + IndicatorSettings.left.indicatorLabel.font.size! + PADDING.XXXS\n )\n new Text(\n {\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y:\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n ).render(context)\n }\n })\n }\n\n renderCrossTextChartsPage(context: CanvasRenderingContext2D, crossIndex: number) {\n if (!context || !crossIndex) {\n return\n }\n\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n let isVertical = true\n const labelBottom = IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\n const tickers = [this.data.ticker, ...this.getTickers()]\n const tickerText = new Text(\n {\n font: Text.getMergedPropsWithDefaults('font', {\n ...IndicatorSettings.left.indicatorLabel.font,\n style: 'normal',\n }),\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.middle,\n background: getHEXWithSpecificAplha(Colors.canvasFill, 0.8),\n padding: { top: 0, bottom: 0, left: 5, right: 5 },\n },\n this.model\n )\n let x = IndicatorSettings.left.indicatorLabel.margin.left!\n let y =\n IndicatorSettings.left.indicatorLabel.margin.top! + (2 * INDICATOR_LABEL_HEIGHT - tickerText.attrs.lineHeight) / 2\n\n const maxHeight = tickerText.attrs.lineHeight * tickers.length\n\n const canFitItemsVertically = maxHeight + labelBottom <= this.height\n if (this.width <= MOBILE_VIEW_BREAKPOINT_WIDTH || !canFitItemsVertically) {\n isVertical = false\n x += x + this.labelWidth\n } else {\n y += IndicatorSettings.left.indicatorLabel.margin.top! + INDICATOR_LABEL_HEIGHT\n }\n\n const tickerQuote = this.quotes?.[this.data.ticker]\n const maxCrossIndex = Math.min(crossIndex, (tickerQuote?.close.length ?? Infinity) - 1)\n tickers.forEach((key, index) => {\n const crossIndexTickerTimeStamp = tickerQuote?.getDataByBarIndex('date', maxCrossIndex)\n const tickerDateToIndex = crossIndexTickerTimeStamp\n ? this.quotes?.[key]?.getDateToIndex()?.[crossIndexTickerTimeStamp]\n : null\n const tickerPerformance = tickerDateToIndex\n ? (this.quotes?.[key]?.close?.[tickerDateToIndex] * 100) / this.first[key] - 100\n : null\n if (tickerPerformance !== null && !isNaN(tickerPerformance)) {\n tickerText.set({\n x,\n y,\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n text: `${key} ${tickerPerformance.toFixed(2)}%`,\n })\n const tickerTextWidth =\n tickerText.measure(context) + tickerText.attrs.padding.left + tickerText.attrs.padding.right\n if (\n !isVertical &&\n this.width - IndicatorSettings.left.indicatorLabel.margin.left! - IndicatorSettings.right.width! <=\n x + tickerTextWidth\n ) {\n x = 2 * IndicatorSettings.left.indicatorLabel.margin.left! + this.labelWidth\n y += tickerText.attrs.lineHeight\n tickerText.set({ x, y })\n }\n tickerText.render(context)\n\n if (isVertical) {\n y += tickerText.attrs.lineHeight\n } else {\n x += tickerTextWidth\n }\n }\n })\n }\n\n renderXAxis(context: CanvasRenderingContext2D) {\n if (!this.ready) {\n return\n }\n return super.renderXAxis(context)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n let ticker\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings, ColorsSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (!this.ready) {\n return\n }\n if (this.perf[this.data.ticker].length === 0) {\n return\n }\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const { lineHeight, padding, size } = IndicatorSettings.right.axis.font\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - padding!.left! + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', { size }),\n lineHeight,\n padding: {\n left: padding!.left!,\n right: padding!.right!,\n top: padding!.top!,\n bottom: padding!.bottom!,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.crossText,\n },\n this.model\n )\n const iterable = this.getTickers()\n const textLabels = []\n for (let index = 0; index < iterable.length; index++) {\n ticker = iterable[index]\n if (this.perf[ticker].length > 0) {\n textLabels.push({\n text: this.perf[ticker].last().toFixed(2) + '%',\n y: Math.round(this.fy(this.perf[ticker].last())),\n background: ColorsSettings[index % ColorsSettings.length],\n })\n }\n }\n textLabels.push({\n text: this.perf[this.data.ticker].last().toFixed(2) + '%',\n y: Math.round(this.fy(this.perf[this.data.ticker].last())),\n background: Colors.performanceIndicatorLabel,\n })\n\n const minY = 0\n const maxY = this.contentHeight\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n renderLabelQuotePage(context: CanvasRenderingContext2D) {\n super.renderLabelQuotePage(context)\n const { ColorsSettings, ChartSettings, IndicatorSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n if (this.ready) {\n const tickers = this.getTickers()\n const tickerPerformance = [\n { [this.data.ticker]: this.perf[this.data.ticker][this.perf[this.data.ticker].length - 1] },\n ...tickers.map((ticker) => ({ [ticker]: this.perf[ticker][this.perf[ticker].length - 1] })),\n ].reduce((prev, current) => ({ ...prev, ...current }), {})\n Object.keys(tickerPerformance).forEach((key, index) => {\n if (tickerPerformance[key]) {\n const text = new Text(\n {\n text: `${key} ${tickerPerformance[key].toFixed(2)}%`,\n x: IndicatorSettings.left.indicatorLabel.margin.left,\n y:\n (IndicatorSettings.left.indicatorLabel.font.lineHeight! +\n IndicatorSettings.left.indicatorLabel.labelSpacing) *\n (index + 1) +\n IndicatorSettings.left.indicatorLabel.margin.top!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.left.indicatorLabel.font),\n fillStyle:\n index === 0 ? Colors.performanceIndicatorLabel : ColorsSettings[index - (1 % ColorsSettings.length)],\n textAlign: TextAlign.left,\n textBaseline: TextBaseline.top,\n },\n this.model\n )\n this.indicatorLabelWidth = { ...this.indicatorLabelWidth, [key]: text.measure(context) }\n text.render(context)\n }\n })\n }\n }\n\n getTickers() {\n return this.tickers\n .split(',')\n .map((ticker) => ticker)\n .filter((x) => x)\n }\n\n getTickersAndTimeframe() {\n const { timeframe } = this.model.chart().quote()\n return this.getTickers().map((ticker) => ({\n ticker,\n instrument: getInstrument(ticker),\n timeframe,\n }))\n }\n\n set(values: Partial) {\n this.ready = false\n this.firstFetchCalled = false\n super.set({ ...values, tickers: values.period || (values.tickers ? getSanitizedTicker(values.tickers, true) : '') })\n this.tickers = (this.tickers || '').toUpperCase()\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [\n {\n type: 'text',\n label: 'Tickers',\n name: 'tickers',\n value: !!this.tickers ? this.tickers : DEFAULT_TICKERS,\n required: true,\n },\n ],\n inputsErrorMessages: {\n tickers: 'At least one ticker has to be provided',\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'tickers':\n return this[key].length > 0\n default:\n return false\n }\n }\n\n toString() {\n return this.getIsChartPageSpecificFunctionality() ? 'PERF %' : `PERF% ${this.tickers}`\n }\n}\n\nexport default PricePerformance\n","import { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: number | string\n momentum: number\n}\n\nclass RMI extends Indicator {\n static type = IndicatorType.Rmi\n static label = 'Relative Momentum Index'\n\n rmi: number[] = []\n declare momentum: number\n declare period: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, momentum = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, momentum })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.rmi = []\n let count = 0\n let sumu = 0\n let sumd = 0\n let u: number, d: number, ad: number, au: number\n for (let i = this.momentum; i < this.data.close.length; i++) {\n u = d = 0\n if (this.data.close[i] > this.data.close[i - this.momentum]) {\n u = this.data.close[i] - this.data.close[i - this.momentum]\n }\n if (this.data.close[i] < this.data.close[i - this.momentum]) {\n d = this.data.close[i - this.momentum] - this.data.close[i]\n }\n\n if (count < this.period) {\n sumu += u\n sumd += d\n count++\n au = sumu / count\n ad = sumd / count\n } else {\n au = (au! * (this.period - 1) + u) / this.period\n ad = (ad! * (this.period - 1) + d) / this.period\n }\n\n const rs = ad > 0 ? au / ad : 1\n this.rmi[i] = 100 - 100 * (1 / (1 + rs))\n }\n\n this.lastValue = this.rmi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.rmi, this.momentum, 30, 50, 70)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 20,\n required: true,\n min: 1,\n max: 999999,\n }\n const momentum = {\n type: 'number',\n label: 'Momentum',\n name: 'momentum',\n value: this.momentum ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, momentum],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n momentum: `${momentum.label} must be a whole number between ${momentum.min} and ${momentum.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'momentum':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RMI ${this.period},${this.momentum}`\n }\n}\n\nexport default RMI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass ROC extends Indicator {\n static type = IndicatorType.Roc\n static label = 'Rate of Change %'\n\n roc: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.roc = []\n for (let i = this.period; i < this.data.close.length; i++) {\n this.roc[i] = ((this.data.close[i] - this.data.close[i - this.period]) / this.data.close[i - this.period]) * 100\n }\n\n this.lastValue = this.roc.last() ?? null\n }\n const { min, max } = this.roc.length > 0 ? this.computeVisibleMinMax(this.roc) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.roc[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 12,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ROC ${this.period}`\n }\n}\n\nexport default ROC\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass RSI extends Indicator {\n static type = IndicatorType.Rsi\n static label = 'Relative Strength Index'\n\n rsi: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.rsi = []\n let count = 0\n let sumu = 0\n let sumd = 0\n let u: number, d: number, ad: number, au: number\n for (let i = 1; i < this.data.close.length; i++) {\n u = d = 0\n if (this.data.close[i] > this.data.close[i - 1]) {\n u = this.data.close[i] - this.data.close[i - 1]\n }\n if (this.data.close[i] < this.data.close[i - 1]) {\n d = this.data.close[i - 1] - this.data.close[i]\n }\n\n if (count < this.period) {\n sumu += u\n sumd += d\n count++\n au = sumu / count\n ad = sumd / count\n } else {\n au = (au! * (this.period - 1) + u) / this.period\n ad = (ad! * (this.period - 1) + d) / this.period\n }\n\n const rs = ad > 0 ? au / ad : 1\n this.rsi[i] = 100 - 100 * (1 / (1 + rs))\n }\n\n this.lastValue = this.rsi.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.rsi, 1, 30, 50, 70)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RSI ${this.period}`\n }\n}\n\nexport default RSI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: number | string\n baseLine: number\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 50,\n BaseLine: 1.0,\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const baseLine = parseFloat(values[1]) || DEFAULT_PARAMETERS.BaseLine\n\n return [period, baseLine]\n}\n\nclass RelativeVolume extends Indicator {\n static type = IndicatorType.Rvol\n static label = 'Relative Volume'\n\n rvol: number[] = []\n declare period: number\n declare baseLine: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, baseLine = 0] = parsePeriod(values.period)\n super.set({ ...values, period, baseLine })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.rvol = []\n\n let sum = 0\n for (let i = 0; i < this.period; i++) {\n sum += this.data.volume[i]\n }\n for (let i = this.period; i < this.data.volume.length; i++) {\n sum = sum - this.data.volume[i - this.period] + this.data.volume[i]\n this.rvol[i] = this.data.volume[i] / (sum / this.period)\n }\n\n this.lastValue = this.rvol.last() ?? null\n }\n\n const { min, max } =\n this.rvol.length > 0\n ? this.computeVisibleMinMax([...this.rvol, this.baseLine])\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const chartModel = this.model.chart()\n const { zoomFactor } = chartModel\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period + 1,\n drawBarCallback: (i, x) => {\n if (this.rvol[i] === undefined) return\n\n const baseLine = Math.round(this.fy(this.baseLine))\n const y = Math.round(this.fy(this.rvol[i]))\n\n context.fillStyle = this.rvol[i] < this.baseLine ? Colors.volumeTrendDown : Colors.volumeTrendUp\n context.fillRect(x - halfBarWidth, baseLine, barWidthWithoutMargin, y - baseLine)\n },\n })\n\n const baseLineY = this.fy(this.baseLine)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(baseLineY),\n y2: Math.round(baseLineY),\n strokeStyle: getHEXWithSpecificAplha(Colors.zeroChange, 0.5),\n },\n this.model\n ).render(context)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const baseLine = {\n type: 'number',\n label: 'Baseline',\n name: 'baseLine',\n value: this.baseLine ?? DEFAULT_PARAMETERS.BaseLine,\n required: true,\n step: 0.1,\n allowDecimal: true,\n min: 0,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, baseLine],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n baseLine: `${baseLine.label} must be a number between ${baseLine.min} and ${baseLine.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'baseLine':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n default:\n return false\n }\n }\n\n toString() {\n return `RVOL ${this.period}, ${this.baseLine}, SMA`\n }\n}\n\nexport default RelativeVolume\n","import Text from '../canvas/text'\nimport { IndicatorType, OFFSET, PADDING, TextBaseline } from '../constants/common'\nimport { getTranslate } from '../controllers/renderUtils'\nimport Pane from '../models/pane'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass RWI extends Indicator {\n static type = IndicatorType.Rwi\n static label = 'Random Walk Index'\n\n tr: number[] = []\n atr: number[] = []\n rwiHi: number[] = []\n rwiLo: number[] = []\n declare period: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.renderYAxis = this.renderYAxis.bind(this)\n }\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.tr = []\n this.atr = []\n this.rwiHi = []\n this.rwiLo = []\n let atr = 0\n\n for (let i = 0; i < this.data.close.length; i++) {\n const tr = utils.max([\n this.data.high[i] - this.data.low[i],\n Math.abs(this.data.high[i] - this.data.close[i - 1]),\n Math.abs(this.data.low[i] - this.data.close[i - 1]),\n ])\n this.tr[i] = tr\n\n if (i < this.period) {\n atr += tr\n this.atr[i] = atr / (i + 1)\n if (i === this.period - 1) {\n atr /= this.period\n }\n } else {\n this.atr[i] = (this.atr[i - 1] * (this.period - 1) + tr) / this.period\n }\n }\n\n for (let i = this.period + 2; i < this.data.close.length; i++) {\n const h = this.data.high[i]\n const l = this.data.low[i]\n let trSum = this.tr[i - 1] + this.tr[i - 2]\n let count = 2\n let atrWeight = (trSum / count) * Math.sqrt(count)\n let maxHi = atrWeight > 0 ? (h - this.data.low[i - 1]) / atrWeight : -1\n let maxLo = atrWeight > 0 ? (this.data.high[i - 1] - l) / atrWeight : -1\n for (let j = i - 1; j > i - this.period + 1; j--) {\n trSum += this.tr[j - 2]\n count++\n atrWeight = (trSum / count) * Math.sqrt(count)\n if (atrWeight === 0) {\n continue\n }\n\n const hi = (h - this.data.low[j - 1]) / atrWeight\n if (hi > maxHi) {\n maxHi = hi\n }\n\n const lo = (this.data.high[j - 1] - l) / atrWeight\n if (lo > maxLo) {\n maxLo = lo\n }\n }\n this.rwiHi[i] = maxHi\n this.rwiLo[i] = maxLo\n }\n }\n const { min, max } =\n this.rwiHi.length > 0 || this.rwiLo.length > 0\n ? this.computeVisibleMinMax(this.rwiHi, this.rwiLo)\n : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n\n context.translate(0.5, 0.5)\n context.set('strokeStyle', '#c80000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.rwiLo[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', '#00a000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i: number, x: number) => {\n context.lineTo(x, Math.round(this.fy(this.rwiHi[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n renderYAxis(context: CanvasRenderingContext2D) {\n super.renderYAxis(context)\n const { IndicatorSettings, ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const translate = getTranslate({\n context,\n xOffset: IndicatorSettings.left.width,\n yOffset: IndicatorSettings.top.height,\n })\n translate.do()\n const text = new Text(\n {\n x: this.contentWidth + OFFSET.M - PADDING.XXS + IndicatorSettings.right.axis.margin.left!,\n font: Text.getMergedPropsWithDefaults('font', IndicatorSettings.right.axis.font),\n lineHeight: IndicatorSettings.right.axis.font.lineHeight,\n padding: {\n top: IndicatorSettings.right.axis.font?.padding?.top ?? PADDING.XXS,\n right: IndicatorSettings.right.axis.font?.padding?.right ?? PADDING.XXS,\n bottom: IndicatorSettings.right.axis.font?.padding?.bottom ?? PADDING.XXS,\n left: IndicatorSettings.right.axis.font?.padding?.left ?? PADDING.XXS,\n },\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.indicatorCurrentText,\n },\n this.model\n )\n const textLabels = []\n if (this.rwiLo.length > 0) {\n textLabels.push({\n text: this.rwiLo.last()!.toFixed(2),\n y: Math.round(this.fy(this.rwiLo.last()!)),\n background: '#c80000',\n })\n }\n if (this.rwiHi.length > 0) {\n textLabels.push({\n text: this.rwiHi.last()!.toFixed(2),\n y: Math.round(this.fy(this.rwiHi.last()!)),\n background: '#00a000',\n })\n }\n\n const minY = 0\n const maxY = this.height - IndicatorSettings.bottom.height - IndicatorSettings.top.height\n textLabels.forEach((labelSetting) => {\n if (labelSetting.y >= minY && labelSetting.y <= maxY) {\n text.set(labelSetting).render(context)\n }\n })\n\n translate.undo()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `RWI ${this.period}`\n }\n}\n\nexport default RWI\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass Stochastics extends Indicator {\n static type = IndicatorType.Stofu\n static label = 'Stochastics FULL'\n\n k: number[] = []\n k1: number[] = []\n d: number[] = []\n declare kPeriod: number\n declare period: number\n declare dPeriod: number\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, kPeriod = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n const period = Math.min(this.period, this.data.close.length - 1)\n let dCount, dSum, k\n this.k1 = []\n this.k = []\n this.d = []\n let kSum = (dSum = 0)\n let kCount = (dCount = 0)\n for (let i = 0; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n let lowestLow = this.data.low[i]\n\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n k = ((this.data.close[i] - lowestLow) / (highestHigh - lowestLow)) * 100\n if (highestHigh === lowestLow) {\n k = 100\n }\n this.k1[i] = k\n if (this.kPeriod > 1) {\n kSum += k\n kCount++\n if (kCount > this.kPeriod) {\n kSum -= this.k1[i - this.kPeriod]\n kCount--\n }\n k = kSum / kCount\n }\n\n dSum += k\n dCount++\n if (dCount > this.dPeriod) {\n dSum -= this.k[i - this.dPeriod]\n dCount--\n }\n\n const d = dSum / dCount\n this.k[i] = k\n this.d[i] = d\n }\n\n this.lastValue = this.k.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n if (this.data.close.length === 0) return\n\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(50)),\n y2: Math.round(this.fy(50)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(20)),\n y2: Math.round(this.fy(20)),\n strokeStyle: '#69c1ea',\n },\n this.model\n ).render(context)\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(80)),\n y2: Math.round(this.fy(80)),\n strokeStyle: '#d386df',\n },\n this.model\n ).render(context)\n\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n const drawInVisibleAreaProps = {\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n fromIndexOffset: this.period,\n }\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.k[i])))\n },\n })\n context.stroke()\n\n context.set('strokeStyle', '#c80000')\n context.beginPath()\n drawInVisibleArea({\n ...drawInVisibleAreaProps,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.d[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const kPeriod = {\n type: 'number',\n label: 'K Period',\n name: 'kPeriod',\n value: this.kPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, kPeriod, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n kPeriod: `${kPeriod.label} must be a whole number between ${kPeriod.min} and ${kPeriod.max}`,\n } as {\n period: string\n dPeriod: string\n kPeriod?: string\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n case 'kPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics FULL ${this.period},${this.kPeriod},${this.dPeriod}`\n }\n}\n\nexport default Stochastics\n","import { IndicatorType } from '../constants/common'\nimport Pane from '../models/pane'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Stochastics from './stofu'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass StochasticsFast extends Stochastics {\n static type = IndicatorType.Stofa\n static label = 'Stochastics FAST'\n\n declare kPeriod: number\n declare period: number\n declare dPeriod: number\n\n constructor(attrs: Attrs, model: Pane) {\n super(attrs, model)\n this.kPeriod = 1\n }\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod: 1 })\n } else {\n super.set(values)\n }\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics FAST ${this.period},${this.dPeriod}`\n }\n}\n\nexport default StochasticsFast\n","import { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Stochastics from './stofu'\n\ninterface Attrs {\n period: string | number\n dPeriod: number\n kPeriod: number\n}\n\nclass StochasticsSlow extends Stochastics {\n static type = IndicatorType.Stosl\n static label = 'Stochastics SLOW'\n\n kPeriod = 3\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period = 0, dPeriod = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period, dPeriod, kPeriod: 3 })\n } else {\n super.set(values)\n }\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const dPeriod = {\n type: 'number',\n label: 'D Period',\n name: 'dPeriod',\n value: this.dPeriod ?? 3,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period, dPeriod],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n dPeriod: `${dPeriod.label} must be a whole number between ${dPeriod.min} and ${dPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n case 'dPeriod':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `Stochastics SLOW ${this.period},${this.dPeriod}`\n }\n}\n\nexport default StochasticsSlow\n","import Line from '../canvas/line'\nimport { IndicatorType } from '../constants/common'\nimport EMA from '../helpers/ema'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass Trix extends Indicator {\n static type = IndicatorType.Trix\n static label = 'TRIX'\n\n trix: number[] = []\n declare period: number\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.trix = []\n const ema1 = new EMA(this.period)\n const ema2 = new EMA(this.period)\n const ema3 = new EMA(this.period)\n let prev = 0\n\n for (let i = 0; i < this.data.close.length; i++) {\n ema1.add(this.data.close[i])\n ema2.add(ema1.value)\n ema3.add(ema2.value)\n if (prev > 0) {\n this.trix[i] = (ema3.value * 100) / prev - 100\n }\n prev = ema3.value\n }\n this.lastValue = this.trix.last() ?? null\n }\n const { min, max } = this.trix.length > 0 ? this.computeVisibleMinMax(this.trix) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n new Line(\n {\n x1: -this.leftOffset,\n x2: -this.leftOffset + this.contentWidth,\n y1: Math.round(this.fy(0)),\n y2: Math.round(this.fy(0)),\n strokeStyle: '#ff8787',\n dashLength: 3,\n },\n this.model\n ).render(context)\n context.set('strokeStyle', this.getChartLayoutSettings().IndicatorSettings.general.Colors.line)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i: number, x: number) => {\n if (this.trix[i]) context.lineTo(x, ~~this.fy(this.trix[i]))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 9,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `TRIX ${this.period}`\n }\n}\n\nexport default Trix\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { IndicatorType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n period1: number\n period2: number\n period3: number\n}\n\nclass UltimateOscillator extends Indicator {\n static type = IndicatorType.Ult\n static label = 'Ultimate Oscillator'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(period)\n return Math.max(period1, period2, period3)\n }\n\n declare period1: number\n declare period2: number\n declare period3: number\n ult: number[] = []\n tr: number[] = []\n bp: number[] = []\n\n set(values: Partial) {\n if (typeof values.period === 'string') {\n const [period1 = 0, period2 = 0, period3 = 0] = getParsedIntegersFromPeriodString(values.period)\n super.set({ ...values, period1, period2, period3 })\n } else {\n super.set(values)\n }\n }\n\n compute() {\n if (!this.isComputeNecessary()) return\n\n this.ult = []\n let bpSum2, bpSum3, count2, count3, trSum2, trSum3\n const tr = []\n const bp = []\n let bpSum1 = (bpSum2 = bpSum3 = 0)\n let trSum1 = (trSum2 = trSum3 = 0)\n let count1 = (count2 = count3 = 0)\n let avg2, avg3\n for (let i = 1; i < this.data.close.length; i++) {\n bp[i] = this.data.close[i] - Math.min(this.data.low[i], this.data.close[i - 1])\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])\n\n bpSum1 += bp[i]\n trSum1 += tr[i]\n count1++\n if (count1 > this.period1) {\n bpSum1 -= bp[i - this.period1]\n trSum1 -= tr[i - this.period1]\n }\n\n bpSum2 += bp[i]\n trSum2 += tr[i]\n count2++\n if (count2 > this.period2) {\n bpSum2 -= bp[i - this.period2]\n trSum2 -= tr[i - this.period2]\n }\n\n bpSum3 += bp[i]\n trSum3 += tr[i]\n count3++\n if (count3 > this.period3) {\n bpSum3 -= bp[i - this.period3]\n trSum3 -= tr[i - this.period3]\n }\n\n let avg1 = (avg2 = avg3 = 0)\n if (trSum1 > 0) {\n avg1 = bpSum1 / trSum1\n }\n if (trSum2 > 0) {\n avg2 = bpSum2 / trSum2\n }\n if (trSum3 > 0) {\n avg3 = bpSum3 / trSum3\n }\n\n this.ult[i] = (100 * (4 * avg1 + 2 * avg2 + avg3)) / 7\n }\n\n this.lastValue = this.ult.last() ?? null\n const { min, max } = this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.ult, 1, 30, 50, 70)\n }\n\n getModalConfig() {\n const period1 = {\n type: 'number',\n label: 'Period 1',\n name: 'period1',\n value: this.period1 ?? 7,\n required: true,\n min: 1,\n max: 999999,\n }\n const period2 = {\n type: 'number',\n label: 'Period 2',\n name: 'period2',\n value: this.period2 ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n const period3 = {\n type: 'number',\n label: 'Period 3',\n name: 'period3',\n value: this.period3 ?? 28,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period1, period2, period3],\n inputsErrorMessages: {\n period1: `${period1.label} must be a whole number between ${period1.min} and ${period1.max}`,\n period2: `${period2.label} must be a whole number between ${period2.min} and ${period2.max}`,\n period3: `${period3.label} must be a whole number between ${period3.min} and ${period3.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period1':\n case 'period2':\n case 'period3':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `ULT ${this.period1},${this.period2},${this.period3}`\n }\n}\n\nexport default UltimateOscillator\n","import { IndicatorType } from '../constants/common'\nimport math from '../helpers/math'\nimport { getBarWidthWithMarginByParts } from '../utils/chart'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Indicator from './indicator'\n\nclass Volume extends Indicator {\n static type = IndicatorType.Vol\n static label = 'Volume'\n\n compute() {\n const { min, max } =\n this.data.volume.length > 0 ? this.computeVisibleMinMax(this.data.volume) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n this.lastValue = this.data.volume.last() ?? null\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const chartModel = this.model.chart()\n const { zoomFactor } = chartModel\n const { barFillWidth, barBorderWidth } = getBarWidthWithMarginByParts({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const barWidthWithoutMargin = barFillWidth + barBorderWidth * 2\n const halfBarWidth = ~~Math.max(1, barWidthWithoutMargin / 2)\n\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset: this.leftOffset,\n width: this.width,\n drawBarCallback: (i, x) => {\n context.fillStyle = this.data.close[i] < this.data.open[i] ? Colors.volumeTrendDown : Colors.volumeTrendUp\n const y = Math.round(this.fy(this.data.volume[i]))\n context.fillRect(x - halfBarWidth, y, barWidthWithoutMargin, context.canvas.height - y)\n },\n })\n }\n\n formatAxis(value: number) {\n return math.formatBigNumber(value, 2)\n }\n\n getModalConfig() {\n return {\n title: this.label,\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toString() {\n return `Volume`\n }\n}\n\nexport default Volume\n","import { IndicatorType } from '../constants/common'\nimport Indicator from './indicator'\n\ninterface Attrs {\n period: string\n}\n\nclass WilliamsR extends Indicator {\n static type = IndicatorType.Wr\n static label = 'Williams %R'\n\n declare period: number\n r: number[] = []\n\n set(values: Partial) {\n super.set(values)\n this.parsePeriodInt(values)\n }\n\n compute() {\n if (this.isComputeNecessary()) {\n this.r = []\n for (let i = this.period; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n let lowestLow = this.data.low[i]\n for (let j = i - this.period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n this.r[i] = 0\n if (highestHigh - lowestLow > 0) {\n this.r[i] = ((highestHigh - this.data.close[i]) / (highestHigh - lowestLow)) * -100\n }\n }\n\n this.lastValue = this.r.last() ?? null\n }\n const { min, max } = this.r.length > 0 ? this.computeVisibleMinMax(this.r) : this.getDomainDefaults(this.type)\n this.min = min\n this.max = max\n }\n\n renderIndicator(context: CanvasRenderingContext2D) {\n this.renderOversoldOverbought(context, this.r, this.period, -80, -50, -20)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.period ?? 14,\n required: true,\n min: 1,\n max: 999999,\n }\n\n return {\n title: this.label,\n inputs: [period],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n default:\n return false\n }\n }\n\n toString() {\n return `W%R ${this.period}`\n }\n}\n\nexport default WilliamsR\n","import { IndicatorType } from '../constants/common'\nimport adx from './adx'\nimport aro from './aro'\nimport aroosc from './aroosc'\nimport atr from './atr'\nimport cci from './cci'\nimport cot from './cot'\nimport fi from './fi'\nimport indicator from './indicator'\nimport macd from './macd'\nimport mfi from './mfi'\nimport none from './none'\nimport obv from './obv'\nimport perf from './perf'\nimport rmi from './rmi'\nimport roc from './roc'\nimport rsi from './rsi'\nimport rvol from './rvol'\nimport rwi from './rwi'\nimport stofa from './stofa'\nimport stofu from './stofu'\nimport stosl from './stosl'\nimport trix from './trix'\nimport ult from './ult'\nimport vol from './vol'\nimport wr from './wr'\n\n// TODO check if this doesn't break saved charts\nexport const indicatorsByType = Object.freeze({\n [IndicatorType.Indicator]: indicator,\n [IndicatorType.None]: none,\n [IndicatorType.Adx]: adx,\n [IndicatorType.Aro]: aro,\n [IndicatorType.Aroosc]: aroosc,\n [IndicatorType.Atr]: atr,\n [IndicatorType.Cci]: cci,\n [IndicatorType.Cot]: cot,\n [IndicatorType.Fi]: fi,\n [IndicatorType.Macd]: macd,\n [IndicatorType.Mfi]: mfi,\n [IndicatorType.Obv]: obv,\n [IndicatorType.Perf]: perf,\n [IndicatorType.Rmi]: rmi,\n [IndicatorType.Roc]: roc,\n [IndicatorType.Rsi]: rsi,\n [IndicatorType.Rvol]: rvol,\n [IndicatorType.Rwi]: rwi,\n [IndicatorType.Stofa]: stofa,\n [IndicatorType.Stofu]: stofu,\n [IndicatorType.Stosl]: stosl,\n [IndicatorType.Trix]: trix,\n [IndicatorType.Ult]: ult,\n [IndicatorType.Vol]: vol,\n [IndicatorType.Wr]: wr,\n})\n\nexport const indicatorsWithoutPeriod = Object.freeze([IndicatorType.Obv, IndicatorType.Vol])\n","import Spine from '@finviz/spine'\n\n// eslint-disable-next-line no-extend-native\nArray.prototype.last = function () {\n return this[this.length - 1]\n}\n\n// eslint-disable-next-line no-extend-native\nString.prototype.padLeft = function (paddingValue) {\n return String(paddingValue + this).slice(-paddingValue.length)\n}\n\n// eslint-disable-next-line no-extend-native\nString.prototype.startsWith = function (str) {\n return this.indexOf(str) === 0\n}\n\ninterface CallbackCacheItem {\n newCb: (...args: any[]) => any\n origCb: (...args: any[]) => any\n}\n\nconst _callbackCache: CallbackCacheItem[] = []\nSpine.Collection.prototype.bind = function (ev, callback) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this\n const cb = (record: Spine.Model, ...rest: any[]) => {\n if (record[that.fkey as keyof Spine.Model] === that.record.id) {\n return callback(record, ...rest)\n }\n }\n _callbackCache.push({ newCb: cb, origCb: callback })\n this.model.bind(ev, cb)\n return this\n}\n\nSpine.Collection.prototype.unbind = function (ev, callback) {\n let cb\n for (const item of _callbackCache) {\n if (item.origCb === callback) {\n cb = item.newCb\n break\n }\n }\n return this.model.unbind(ev, cb)\n}\n\nSpine.Model.findIndex = function (element) {\n const iterable = this.all()\n for (let index = 0; index < iterable.length; index++) {\n const el = iterable[index]\n if (element.eql(el)) {\n return index\n }\n }\n}\n\nexport function getContextWithCache(canvas: HTMLCanvasElement | null): CanvasRenderingContext2D | null {\n if (!canvas) {\n return null\n }\n\n const context = canvas.getContext('2d')\n if (!context) {\n window.Sentry?.captureMessage('Context unavailable')\n return null\n }\n\n context._cache = {}\n\n const _restore = CanvasRenderingContext2D.prototype.restore\n context.restore = function () {\n this._cache = {}\n return _restore.apply(this)\n }\n\n context.set = function (key, value) {\n if (this._cache[key] !== value) {\n this[key] = value\n this._cache[key] = value\n }\n }\n\n return context\n}\n","import Spine from '@finviz/spine'\nimport * as React from 'react'\n\nimport { DefaultSpineEvents } from '../../types/shared'\nimport ElementModule from '../canvas/element'\nimport IndicatorModule from '../indicators/indicator'\nimport { useForceUpdate } from '../utils/force-update'\nimport { getJSONReplacerFunc } from '../utils/helpers'\n\ninterface UseModelStateOptions {\n watchProperties?: T extends null ? never[] : Array\n listenOnEvents?: string[]\n}\n\nconst getIsSpineObject = (value: any) =>\n [Spine.Model, Spine.Module, Spine.Collection].some((spineObject) => value instanceof spineObject)\n\nconst getWatchedPropValue = (\n watchedProp: Model[keyof Model] | ElementModule | IndicatorModule | undefined,\n model: Model | null\n) => {\n if (typeof watchedProp === 'function') {\n const value = watchedProp.call(model)\n\n if (value && !getIsSpineObject(value)) {\n throw Error('Watched prop should have a primitive value or a spine object')\n }\n\n if (typeof value?.all === 'function') {\n return value.all()\n }\n\n return value\n }\n\n if (typeof watchedProp === 'object') {\n const hasToObject = !!watchedProp && 'toObject' in watchedProp\n return JSON.stringify(hasToObject ? watchedProp.toObject() : watchedProp, getJSONReplacerFunc())\n }\n\n return watchedProp\n}\n\nconst getWatchedProps = (model: Model | null, props?: Array) =>\n props?.reduce(\n (acc, propKey) => ({\n ...acc,\n [propKey]: getWatchedPropValue(model?.[propKey], model),\n }),\n {} as Partial\n )\n\nconst getAreWatchedPropsEqual = (\n currentValue: Value,\n previousValue: Value\n) => {\n if (currentValue instanceof Spine.Model) {\n return currentValue.eql(previousValue)\n }\n\n return currentValue === previousValue\n}\n\nconst DEFAULT_SPINE_EVENTS = Object.values(DefaultSpineEvents)\n\nexport function useModelState(\n model: Model,\n options: UseModelStateOptions = {}\n) {\n const { watchProperties = [], listenOnEvents = DEFAULT_SPINE_EVENTS } = options\n const stringifiedOptions = JSON.stringify(options)\n const { forceUpdate } = useForceUpdate()\n const watchedPropertiesRef = React.useRef(getWatchedProps(model, watchProperties))\n\n React.useEffect(() => {\n const handleModelChange = () => {\n const hasChange = watchProperties.some((propKey) => {\n const currentValue = getWatchedPropValue(model?.[propKey], model)\n const previousValue = watchedPropertiesRef.current?.[propKey]\n\n if (Array.isArray(currentValue)) {\n return (\n !Array.isArray(previousValue) ||\n currentValue.length !== previousValue.length ||\n currentValue.some((record, index) => !getAreWatchedPropsEqual(record, previousValue[index]))\n )\n }\n\n return !getAreWatchedPropsEqual(currentValue, previousValue)\n })\n\n if (hasChange) {\n watchedPropertiesRef.current = getWatchedProps(model, watchProperties)\n forceUpdate()\n }\n }\n\n const spineEvents = listenOnEvents.join(' ')\n\n model?.bind(spineEvents, handleModelChange)\n\n forceUpdate()\n\n return () => {\n model?.unbind(spineEvents, handleModelChange)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [model?.cid, stringifiedOptions, forceUpdate])\n\n return model\n}\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport {\n ChartConfigChartPane,\n CustomSpineEvents,\n Instrument,\n ObjectHash,\n TodoObjectHashAnyType,\n} from '../../types/shared'\nimport BaseChart from '../charts/base_chart'\nimport PerfChart from '../charts/perf_chart'\nimport {\n DateRangeType,\n IndicatorType,\n QuotePollingIntervalInMs,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n} from '../constants/common'\nimport { getCanvasElementByType } from '../helpers/get-canvas-element-by-type'\nimport COT from '../indicators/cot'\nimport PricePerformance from '../indicators/perf'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Utils from '../utils'\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\nimport ChartEventElement from './chart-event-element'\nimport { ChartPartToAttrsSyncMap, ChartSyncablePart } from './chart/contstants'\nimport ChartLayout from './chart_layout'\nimport Pane from './pane'\nimport Quote from './quote'\n\nclass Chart extends Spine.Model {\n static initClass(paneModel: typeof Pane, quoteModel: typeof Quote, chartLayoutModel: typeof ChartLayout) {\n this.configure(\n 'Chart',\n 'width',\n 'height',\n 'timeframe',\n 'dateRange',\n 'scale',\n 'leftOffset',\n 'ticker',\n 'instrument',\n 'fx',\n 'fy',\n 'zoomFactor',\n 'refreshData',\n 'stretch',\n 'isHideDrawingsActive',\n 'isScrolled',\n 'firstBarClose',\n 'premarket',\n 'aftermarket',\n 'hasChartEvents'\n )\n this.hasMany('panes', paneModel)\n this.belongsTo('quote', quoteModel)\n this.belongsTo('chart_layout', chartLayoutModel)\n }\n\n declare stretch: boolean\n declare chart_layout_id: string\n declare chart_layout: () => ChartLayout\n declare quote_id: string\n declare quote: () => Quote\n declare panes: () => Collection\n declare refreshData: boolean | number\n declare dateRange: DateRangeType\n declare width: number\n declare height: number\n declare timeframe: TIMEFRAME\n declare leftOffset: number\n declare ticker: string\n declare instrument: Instrument\n declare fx: (x: number) => number\n declare fy: (x: number) => number\n declare zoomFactor: number\n declare isHideDrawingsActive: boolean\n declare isScrolled: boolean\n declare scale: ScaleType\n declare firstBarClose: number\n declare premarket: boolean\n declare aftermarket: boolean\n declare hasChartEvents: boolean\n\n getChartPane() {\n return this.panes()\n .all()\n .find((pane: Pane) =>\n pane\n .elements()\n .all()\n .some((el) => el.isChart())\n )\n }\n\n getChartElement() {\n for (const pane of this.panes().all()) {\n for (const el of pane.elements().all()) {\n if (el.isChart()) {\n return el\n }\n }\n }\n }\n\n getChartType() {\n return this.getChartElement()?.instance.type\n }\n\n getRefreshInterval() {\n let defaultRefreshInterval: number | null = null\n if (typeof this.refreshData === 'number') {\n defaultRefreshInterval = this.refreshData\n } else if (this.refreshData === true) {\n defaultRefreshInterval = QuotePollingIntervalInMs.Default\n }\n\n const isStock = this.instrument === Instrument.Stock\n const isPremium = window.FinvizSettings.hasUserPremium\n let customRefreshInterval = QuotePollingIntervalInMs.Elite\n if (!isPremium) {\n customRefreshInterval = QuotePollingIntervalInMs.Free\n } else if (isStock && !Utils.isStockFastRefreshAvailable()) {\n customRefreshInterval = QuotePollingIntervalInMs.EliteStocksReduced\n }\n\n return defaultRefreshInterval && Math.max(defaultRefreshInterval, customRefreshInterval)\n }\n\n toObject() {\n const panes = this.panes()\n .all()\n .map((pane) => pane.toObject())\n return {\n width: this.width,\n dateRange: this.dateRange,\n height: this.height,\n timeframe: this.timeframe,\n scale: this.scale,\n leftOffset: this.leftOffset,\n ticker: this.ticker,\n instrument: this.instrument,\n zoomFactor: this.zoomFactor,\n refreshData: this.refreshData,\n stretch: this.stretch,\n chartId: this.cid,\n panes,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isScrolled: this.isScrolled,\n premarket: this.premarket,\n aftermarket: this.aftermarket,\n hasChartEvents: this.hasChartEvents,\n }\n }\n\n toConfig(omitKeys = [] as string[]) {\n const panes = this.panes()\n .all()\n .map((pane) => pane.toConfig(omitKeys))\n return omit(\n {\n width: this.width,\n height: this.height,\n timeframe: this.timeframe,\n scale: this.scale,\n leftOffset: this.leftOffset,\n ticker: this.ticker,\n instrument: this.instrument,\n zoomFactor: this.zoomFactor,\n refreshData: this.refreshData,\n stretch: this.stretch,\n chartId: this.cid,\n panes,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isScrolled: this.isScrolled,\n premarket: this.premarket,\n aftermarket: this.aftermarket,\n hasChartEvents: this.hasChartEvents,\n },\n omitKeys\n )\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.panes()\n .all()\n .forEach((pane) => {\n pane.destroyCascade()\n })\n return this.destroy(options)\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.chart_layout())\n }\n\n getIsDisabled() {\n return this.quote()?.close.length === 0\n }\n\n getIsScrollable() {\n return this.chart_layout().scrollable\n }\n\n getAllPanes() {\n return this.panes().all()\n }\n\n getAllValidPanes() {\n const cotKeys = Object.keys(this.quote().COTs ?? {})\n return this.getAllPanes().filter((pane) => {\n const mainElement = pane.mainElement()\n if (mainElement?.instance.type === IndicatorType.Cot) {\n // Type of mainElement is `Element` but it can be an indicator too\n return cotKeys.includes((mainElement.instance as unknown as COT).attrs.code)\n }\n return true\n })\n }\n\n getAllElements() {\n return this.getAllPanes().flatMap((pane) => pane.getAllElements())\n }\n\n getAllQuotes(): Quote[] {\n const perfQuotes = this.getAllElements()\n .filter(({ instance }) => instance.type === IndicatorType.Perf)\n .flatMap(({ instance }) => Object.values((instance as unknown as PricePerformance).quotes))\n\n let quotePerfTickers: Quote[] = []\n if (this.chart_layout().specificChartFunctionality === SpecificChartFunctionality.quotePerf) {\n const perfChart = this.getChartElement()?.instance as PerfChart | undefined\n if (perfChart) {\n quotePerfTickers = Quote.select(\n (q: Quote) => perfChart.attrs.tickers.includes(q.ticker) && [TIMEFRAME.d, TIMEFRAME.m].includes(q.timeframe)\n )\n }\n }\n\n return [...perfQuotes, ...quotePerfTickers, this.quote()].filter(\n (quote, index, quotes) => quote && quotes.findIndex((q) => q?.id === quote.id) === index\n )\n }\n\n createPaneCascade(paneProperties: ChartConfigChartPane) {\n const paneModel = this.panes().create(paneProperties)\n\n paneProperties.elements?.forEach(({ zIndex, elementId, ...element }) => {\n const instance = getCanvasElementByType(element.type).fromObject(element, paneModel)\n paneModel.elements().create({ instance, zIndex, elementId })\n paneModel.chart().trigger(CustomSpineEvents.IndicatorsChange)\n })\n\n const chartOrIndicator = paneModel.getChartOrIndicatorElement()\n if (paneModel.mainElement()?.elementId !== chartOrIndicator?.elementId) {\n paneModel.updateAttributes({ mainElement: chartOrIndicator })\n }\n\n return paneModel\n }\n\n updateAttributesAndSync(value: T) {\n const attrsInSync = Object.entries(ChartPartToAttrsSyncMap)\n .filter(([key]) => this.getIsChartPartInSync(key as unknown as ChartSyncablePart))\n .flatMap(([_, modelAttr]) => modelAttr)\n this.updateAttributes(value)\n\n if (attrsInSync.length > 0) {\n this.chart_layout()\n .getAllCharts()\n .forEach((chartModel) => {\n if (this.eql(chartModel)) {\n return\n }\n const newAttrs: ObjectHash = {}\n attrsInSync.forEach((modelAttr) => {\n if (value.hasOwnProperty(modelAttr)) {\n newAttrs[modelAttr] = value[modelAttr]\n }\n })\n chartModel.updateAttributes(newAttrs)\n })\n }\n }\n\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\n this.chart_layout().setSyncChartParts(chartParts, isInSync)\n }\n\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\n return this.chart_layout().getIsChartPartInSync(chartPart)\n }\n\n getHasPatterns() {\n return this.getAllElements().some((element) => {\n if ('hasOverlay' in element.instance) {\n return (element.instance as BaseChart).hasOverlay?.('patterns')\n }\n\n return false\n })\n }\n\n getQuoteRawTicker(): string | null {\n return this.quote()?.getRawTicker() ?? null\n }\n\n setChartEvents(chartEvents?: Array, shouldClear = false) {\n const chartPane = this.getChartPane()\n if (!chartPane) {\n return\n }\n const allChartEvents = chartPane.chartEvents().all()\n if (shouldClear) {\n allChartEvents.forEach((chartEvent) => chartEvent.destroyCascade())\n }\n\n const events = shouldClear\n ? chartEvents\n : chartEvents?.filter((chartEvent) => !allChartEvents.some(({ elementId }) => chartEvent.elementId === elementId))\n\n events?.forEach(({ elementId, eventType, dateTimestamp }) => {\n const newChartEvent = chartPane.chartEvents().create({\n instance: getCanvasElementByType(eventType).fromObject({ positionTimestamps: { x: dateTimestamp } }, chartPane),\n elementId,\n })\n newChartEvent.instance.updateScales()\n })\n\n chartPane.updateChartEventsZIndexes()\n }\n}\n\nexport default Chart\n","/*\n * it converts it to numbered index and it causes problems later on\n * the reason it's not just numbered enum is that it when used in const below\n * */\nexport enum ChartSyncablePart {\n Crosshair = 'crosshair',\n Ticker = 'ticker',\n Timeframe = 'timeframe',\n}\n\nexport const ChartPartToAttrsSyncMap = {\n [ChartSyncablePart.Ticker]: ['ticker'],\n [ChartSyncablePart.Timeframe]: ['timeframe', 'dateRange'],\n}\n\nexport const ChartSyncableParts = [\n { value: ChartSyncablePart.Ticker, label: 'Ticker' },\n { value: ChartSyncablePart.Timeframe, label: 'Timeframe' },\n { value: ChartSyncablePart.Crosshair, label: 'Crosshair' },\n]\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport { IIdea, RootChartConfigObject, Theme, TodoObjectHashAnyType } from '../../types/shared'\nimport { ChartEditorEnum, IndicatorType, LayoutType, SpecificChartFunctionality } from '../constants/common'\nimport Indicator from '../indicators/indicator'\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport { ChartSyncablePart } from './chart/contstants'\nimport { ISettings } from './chart_settings/interfaces'\nimport DrawingsInternalStore from './drawings-internal-store'\nimport Pane from './pane'\nimport { QuoteFetchType } from './quote/constants'\n\nclass ChartLayout extends Spine.Model {\n static initClass(chartModel: typeof Chart, drawingsInternalStoreModel: typeof DrawingsInternalStore) {\n this.configure(\n 'ChartLayout',\n 'layout',\n 'activeChart',\n 'activePane',\n 'activeChartEvent',\n 'width',\n 'height',\n 'editable',\n 'canChangeTicker',\n 'scrollable',\n 'initialScrollable',\n 'cross',\n 'editors',\n 'theme',\n 'settings',\n 'isWheelZoomEnabled',\n 'specificChartFunctionality',\n 'isLargeChart',\n 'isHideDrawingsActive',\n 'isPreserveDrawingsActive',\n 'isLockDrawingsActive',\n 'isDrawingModeContinuousActive',\n 'uuid',\n 'isTouchCrossActive',\n 'defaultZoomFactor',\n 'syncChartParts',\n 'isInit',\n 'idea'\n )\n this.hasMany('charts', chartModel)\n this.belongsTo('drawingsInternalStore', drawingsInternalStoreModel)\n }\n\n declare layout: LayoutType\n declare activeChart: Chart\n declare activePane?: Pane\n declare activeChartEvent?: ChartEventElement\n declare width: number\n declare height: number\n declare editable: boolean\n declare canChangeTicker: boolean\n declare scrollable: boolean\n declare readonly initialScrollable: boolean\n declare cross: boolean\n declare editors: ChartEditorEnum[]\n declare theme: Theme\n declare settings: ISettings\n declare isWheelZoomEnabled: boolean\n declare specificChartFunctionality: SpecificChartFunctionality\n declare isLargeChart?: boolean\n declare charts: () => Collection\n declare isHideDrawingsActive: boolean\n declare isPreserveDrawingsActive: boolean\n declare isLockDrawingsActive: boolean\n declare isDrawingModeContinuousActive: boolean\n declare uuid: string\n declare isTouchCrossActive?: boolean\n declare defaultZoomFactor: number\n declare syncChartParts: ChartSyncablePart[]\n declare idea?: IIdea\n declare isInit?: boolean\n declare drawingsInternalStore: () => DrawingsInternalStore\n\n getPaneWithSelection() {\n for (const pane of this.getAllPanes()) {\n if (pane.selection) {\n return pane\n }\n }\n }\n\n toObject() {\n const charts = this.getAllCharts().map((chart) => chart.toObject())\n return {\n layout: this.layout,\n width: this.width,\n height: this.height,\n charts,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\n }\n }\n\n toConfig = RootChartConfigObject>(omitKeys = [] as string[]): T {\n const charts = this.getAllCharts().map((chart) => chart.toConfig(omitKeys))\n return JSON.parse(\n JSON.stringify(\n omit(\n {\n ...this.settings.ChartSettings.center,\n layout: this.layout,\n width: this.width,\n height: this.height,\n charts,\n isHideDrawingsActive: this.isHideDrawingsActive,\n isPreserveDrawingsActive: this.isPreserveDrawingsActive,\n colors: this.settings.ChartSettings.general.Colors,\n specificChartFunctionality: this.specificChartFunctionality,\n editors: this.editors,\n editable: this.editable,\n scrollable: this.scrollable,\n theme: this.theme,\n newCharts: /\\bcharts\\b/.test(window.location.pathname),\n },\n omitKeys\n )\n )\n )\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.getAllCharts().forEach((chart) => {\n chart.destroyCascade()\n })\n return this.destroy(options)\n }\n\n getAllCharts() {\n return this.charts().all()\n }\n\n getAllPanes() {\n return this.getAllCharts().flatMap((chart) => chart.getAllPanes())\n }\n\n getAllElements() {\n return this.getAllCharts().flatMap((chart) => chart.getAllElements())\n }\n\n setSyncChartParts(chartParts: ChartSyncablePart | ChartSyncablePart[], isInSync: boolean) {\n const chartPartsToSync = Array.isArray(chartParts) ? chartParts : [chartParts]\n\n const newSyncedChartParts = this.syncChartParts?.filter((chartPart) => !chartPartsToSync.includes(chartPart)) ?? []\n\n if (isInSync) {\n newSyncedChartParts.push(...chartPartsToSync)\n }\n\n this.updateAttributes({ syncChartParts: newSyncedChartParts })\n }\n\n getIsChartPartInSync(chartPart: ChartSyncablePart) {\n return !!this.syncChartParts?.includes(chartPart)\n }\n\n getIsIndicatorPresent(type: IndicatorType) {\n return !!this.charts()\n .first()\n ?.getAllElements()\n .some((element) => element.isIndicator() && (element.instance as unknown as Indicator).type === type)\n }\n\n getHTMLElementId() {\n return `chart-layout-${this.id}`\n }\n\n exitIdea() {\n this.updateAttribute('idea', undefined)\n this.getAllCharts().forEach((chart) => {\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\n chart.getAllQuotes().forEach((quote) => {\n if (quote.ideaID) {\n quote.updateAttributes({ ideaID: undefined })\n quote.fetchData({ fetchType: QuoteFetchType.Refetch })\n }\n })\n\n chart.updateAttributes({ refreshData: true })\n })\n }\n\n isIdeaId(id: number | null = null) {\n return (this.idea?.id ?? null) === id\n }\n}\n\nexport default ChartLayout\n","import { ObjectHash, Theme } from '../../../types/shared'\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\n\nfunction normalizeHexAlpha(hexString = '') {\n const hexValue = hexString.replace('#', '')\n if (hexValue.length === 6) {\n return `${hexString}FF`\n }\n return hexString\n}\n\nexport const getColorOverwrites = ({\n theme,\n colors,\n}: {\n theme: Theme\n colors: ObjectHash, Theme>\n}) => {\n const customColors = colors[theme]\n const customColorKeys = Object.keys(customColors) as Array>\n const defaultColors = theme === Theme.light ? chartLightTheme : chartDarkTheme\n\n return customColorKeys.reduce((acc, colorKey) => {\n const isDefaultOverWritten =\n normalizeHexAlpha(customColors[colorKey]).toLowerCase() !==\n normalizeHexAlpha(defaultColors[colorKey]).toLowerCase()\n\n return isDefaultOverWritten\n ? {\n ...acc,\n [colorKey]: customColors[colorKey],\n }\n : acc\n }, {})\n}\n","import tailwindColors from '../constants/colors'\nimport { getHEXWithSpecificAplha } from '../utils/colors'\n\nexport interface IChartThemeColors {\n aftermarketFade: string\n background: string\n borderDown: string\n borderUp: string\n canvasFill: string\n cross: string\n crossText: string\n crossTextBackground: string\n currentBackground: string\n currentText: string\n grid: string\n gridSecondary: string\n indicatorCurrentBackground: string\n indicatorCurrentText: string\n line: string\n marketDown: string\n marketUp: string\n negativeChange: string\n ohlcTrendDown: string\n ohlcTrendUp: string\n overlayTransparentBackground: string\n percentageZeroLineText: string\n performanceIndicatorLabel: string\n positiveChange: string\n premarketFade: string\n prevClose: string\n text: string\n textSecondary: string\n trendDown: string\n trendUp: string\n volumeTrendDown: string\n volumeTrendUp: string\n wickDown: string\n wickUp: string\n zeroChange: string\n}\n\nexport interface IIndicatorThemeColors {\n line: string\n signalLine: string\n}\n\nexport interface IElementThemeColors {\n line: string\n border: string\n textWithoutBackground: string\n}\n\ninterface IDarkerWickColors {\n borderUp: string\n wickUp: string\n borderDown: string\n wickDown: string\n}\n\nexport const chartLightTheme: IChartThemeColors = {\n aftermarketFade: '#FFFFFF99',\n background: '#008CFF0E',\n borderDown: '#000000FF',\n borderUp: '#000000FF',\n canvasFill: '#FFFFFFFF',\n cross: '#0000004C',\n crossText: '#fff',\n crossTextBackground: '#111',\n currentBackground: tailwindColors.brightYellow[100],\n currentText: tailwindColors.gray[800],\n grid: '#D2D2D2FF',\n gridSecondary: '#ECECEC',\n indicatorCurrentBackground: tailwindColors.gray[600],\n indicatorCurrentText: '#fff',\n line: '#1E6DC0FF',\n marketDown: tailwindColors.red[500],\n marketUp: tailwindColors.green[500],\n negativeChange: '#C80000FF',\n ohlcTrendDown: '#E54040FF',\n ohlcTrendUp: '#40A140FF',\n overlayTransparentBackground: getHEXWithSpecificAplha('#C9CCD6', 0.25),\n percentageZeroLineText: '#111',\n performanceIndicatorLabel: '#646464',\n positiveChange: '#009600FF',\n premarketFade: '#FFFFFF99',\n prevClose: '#C80000FF',\n text: '#828282',\n textSecondary: '#dedede',\n trendDown: '#FF0000FF',\n trendUp: '#00FF00FF',\n volumeTrendDown: '#ffc0c0',\n volumeTrendUp: '#a8e0a8',\n wickDown: '#000000FF',\n wickUp: '#000000FF',\n zeroChange: '#000',\n}\n\nexport const chartDarkTheme: IChartThemeColors = {\n aftermarketFade: '#4C526133',\n background: '#1E6DC019',\n borderDown: '#F63538FF',\n borderUp: '#30CC5AFF',\n canvasFill: tailwindColors.gray[800],\n cross: '#404553',\n crossText: '#fff',\n crossTextBackground: '#111',\n currentBackground: tailwindColors.yellow[200],\n currentText: tailwindColors.gray[700],\n grid: '#363A46FF',\n gridSecondary: '#2C303A',\n indicatorCurrentBackground: tailwindColors.gray[500],\n indicatorCurrentText: '#fff',\n line: '#1E6DC0FF',\n marketDown: tailwindColors.red[300],\n marketUp: tailwindColors.green[300],\n negativeChange: tailwindColors.red[400],\n ohlcTrendDown: '#E54040FF',\n ohlcTrendUp: '#40A140FF',\n overlayTransparentBackground: getHEXWithSpecificAplha('#0C0E13', 0.35),\n percentageZeroLineText: '#fff',\n performanceIndicatorLabel: '#646464',\n positiveChange: tailwindColors.green[400],\n premarketFade: '#4C526133',\n prevClose: '#C80000FF',\n text: '#929cb3',\n textSecondary: '#929CB399',\n trendDown: '#F63538FF',\n trendUp: '#30CC5AFF',\n volumeTrendDown: '#F635387F',\n volumeTrendUp: '#30CC5A7F',\n wickDown: '#F63538FF',\n wickUp: '#30CC5AFF',\n zeroChange: '#929cb3',\n}\n\nexport const darkerWickColors: IDarkerWickColors = {\n borderUp: '#006400FF',\n wickUp: '#006400',\n borderDown: '#6E0000FF',\n wickDown: '#6E0000FF',\n}\n\nexport const indicatorLightTheme: IIndicatorThemeColors = {\n line: '#000000',\n signalLine: tailwindColors.red[400],\n}\n\nexport const indicatorDarkTheme: IIndicatorThemeColors = {\n line: '#D07933',\n signalLine: tailwindColors.red[400],\n}\n\nexport const elementLightTheme: IElementThemeColors = {\n line: '#000000',\n border: '#000000',\n textWithoutBackground: '#000000',\n}\n\nexport const elementDarkTheme: IElementThemeColors = {\n line: '#5faaf4',\n border: '#5192D1',\n textWithoutBackground: '#929cb3',\n}\nexport const generalColors: Array = [\n '#1f77b4',\n '#ff7f0e',\n '#2ca02c',\n '#d62728',\n '#9467bd',\n '#8c564b',\n '#e377c2',\n '#7f7f7f',\n '#bcbd22',\n '#17becf',\n]\n\n// node chart with thin bars color override\nexport const thinBarColorsOverride = {\n trendUp: '#00b400',\n trendDown: '#b40000',\n}\n\nexport enum AutoSaveState {\n Off,\n Saved,\n Unsaved,\n Saving,\n}\n\nexport const CHART_EVENT_BADGE_SIZE = 24\n","import Spine from '@finviz/spine'\n\nimport { AutoSaveElement } from '../controllers/autosave/constants'\nimport { getUuid } from '../utils/helpers'\nimport { HLC, initHlc } from '../utils/hlc'\nimport { AutoSaveState } from './constants'\n\ninterface DrawingsInternalStateAttrs {\n elements: AutoSaveElement[]\n latestRemoteUpdateTimestamp: HLC\n latestLocalUpdateTimestamp: HLC\n instanceUUID: string\n autoSaveState: AutoSaveState\n}\n\nclass DrawingsInternalStore extends Spine.Model {\n static initClass() {\n this.configure(\n 'DrawingsInternalState',\n 'elements',\n 'latestRemoteUpdateTimestamp',\n 'latestLocalUpdateTimestamp',\n 'autoSaveState',\n 'instanceUUID'\n )\n }\n\n elements: AutoSaveElement[]\n latestRemoteUpdateTimestamp: HLC\n latestLocalUpdateTimestamp: HLC\n instanceUUID: string\n autoSaveState: AutoSaveState\n\n constructor(attrs: Partial = {}) {\n super(attrs)\n\n this.elements = attrs.elements ?? []\n this.instanceUUID = attrs.instanceUUID ?? getUuid()\n this.latestLocalUpdateTimestamp = attrs.latestLocalUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\n this.latestRemoteUpdateTimestamp = attrs.latestRemoteUpdateTimestamp ?? initHlc(this.instanceUUID, 0)\n this.autoSaveState = attrs.autoSaveState ?? AutoSaveState.Off\n }\n\n setAutoSaveState = (newAutoSaveState: AutoSaveState) => {\n if (this.autoSaveState !== newAutoSaveState) {\n this.updateAttributes({ autoSaveState: newAutoSaveState })\n }\n }\n}\n\nexport default DrawingsInternalStore\n","import Spine from '@finviz/spine'\nimport merge from 'lodash.merge'\n\nimport { TodoObjectHashAnyType } from '../../types/shared'\nimport { drawingToolsByType } from '../canvas/drawingTools'\nimport CanvasElement from '../canvas/element'\nimport { CanvasElementType } from '../constants/common'\nimport { getIsSSr, getUuid } from '../utils/helpers'\nimport Pane from './pane'\nimport { changeElementZIndexes } from './utils'\n\nclass Element extends Spine.Model {\n static initClass(paneModel: typeof Pane) {\n this.configure('Element', 'instance', 'lastChange', 'zIndex', 'elementId')\n this.belongsTo('pane', paneModel)\n }\n\n declare instance: CanvasElement\n declare pane_id: string\n declare destroyed: true | undefined\n declare pane: () => Pane\n lastChange: number | null = null\n elementId: string | null = null\n zIndex = -1\n\n generateUuid = getIsSSr() ? undefined : getUuid\n\n constructor(...args: any[]) {\n super(...args)\n const elementAttrs = args[0]\n this.elementId = elementAttrs?.elementId ?? this.generateUuid?.()\n this.one('create', () => {\n this.updateAttributes({\n zIndex: elementAttrs?.zIndex ?? this.pane().getElementZIndexRange().max + 1,\n })\n })\n }\n\n replace(instance: CanvasElement) {\n const oldInstance = this.instance\n this.updateAttribute('instance', instance)\n this.trigger('replace', this, oldInstance)\n }\n\n makeClone() {\n const { instance, pane_id } = this\n const { attrs } = instance\n const { scale } = instance.model\n const clonedObj = merge({ pane_id }, attrs)\n const cloned = drawingToolsByType[instance.type as CanvasElementType].fromObject(clonedObj, instance.model)\n const { ThumbSettings } = this.pane().getChartLayoutSettings()\n const offset = ThumbSettings.size + ThumbSettings.borderWidth * 2\n cloned.moveBy(scale.x.invert(offset), scale.y.invert(offset) - scale.y.invert(0))\n cloned.cachePointPositionTimestamp()\n Element.create({ instance: cloned, pane_id })\n this.trigger('makeClone', this, cloned)\n }\n\n moveToZIndex(zIndex: number) {\n const currentZIndex = this.zIndex\n const directionCoef = zIndex > currentZIndex ? 1 : -1\n\n if (this.isChart() || this.isIndicator()) {\n if (this.zIndex !== 0) {\n this.updateAttributes({ zIndex: 0 })\n }\n this.pane()\n .getAllElements()\n .filter((element) => {\n const shouldMove = directionCoef === 1 ? element.zIndex <= zIndex : element.zIndex >= zIndex\n return shouldMove && element.isDrawing()\n })\n .forEach((element) => element.moveToZIndex(directionCoef * -1))\n\n return\n }\n\n const newZIndex = zIndex === 0 ? directionCoef : zIndex // 0 is protected value for chart/indicator element\n const { min, max } = this.pane().getElementZIndexRange()\n if (\n currentZIndex === newZIndex ||\n (currentZIndex === min && directionCoef === -1) ||\n (currentZIndex === max && directionCoef === 1)\n ) {\n return\n }\n const { elementsBelowZero, elementsAboveZero } = this.pane().getBelowAboveZeroElements()\n\n changeElementZIndexes({\n elementsArray: elementsBelowZero,\n addElement: newZIndex < 0 ? this : undefined,\n oldZIndex: currentZIndex,\n newZIndex,\n isBelowZero: true,\n })\n\n changeElementZIndexes({\n elementsArray: elementsAboveZero,\n addElement: newZIndex > 0 ? this : undefined,\n oldZIndex: currentZIndex,\n newZIndex,\n })\n }\n\n bringToFront() {\n this.moveToZIndex(this.pane().getElementZIndexRange().max + 1)\n }\n\n sendToBack() {\n this.moveToZIndex(this.pane().getElementZIndexRange().min - 1)\n }\n\n bringForward() {\n this.moveToZIndex(this.zIndex + 1)\n }\n\n sendBackward() {\n this.moveToZIndex(this.zIndex - 1)\n }\n\n isChart() {\n return !!this.instance?.type.startsWith('charts/')\n }\n\n isIndicator() {\n return !!this.instance?.type.startsWith('indicators/')\n }\n\n isOverlay() {\n return !!this.instance?.type.startsWith('overlays/')\n }\n\n isDrawing() {\n return !!this.instance?.type.startsWith('canvas/')\n }\n\n isChartEvent() {\n return !!this.instance?.type.startsWith('chartEvent/')\n }\n\n isMouseDown() {\n return !!this.instance?.isMouseDown\n }\n\n hasOngoingInteraction() {\n return this.isMouseDown() || this.instance.isEditInProgress\n }\n\n toObject() {\n return {\n ...this.instance.toObject(),\n elementId: this.elementId,\n zIndex: this.zIndex,\n }\n }\n\n toConfig() {\n return {\n ...this.instance.toConfig(),\n elementId: this.elementId,\n zIndex: this.zIndex,\n }\n }\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n return this.destroy(options)\n }\n\n refreshElementId() {\n this.updateAttribute('elementId', this.generateUuid?.())\n }\n}\n\nexport default Element\n","import endOfDay from 'date-fns/endOfDay'\nimport lastDayOfMonth from 'date-fns/lastDayOfMonth'\nimport lastDayOfWeek from 'date-fns/lastDayOfWeek'\nimport setDate from 'date-fns/set'\n\nimport { TIMEFRAME, TIMEFRAMES_WITH_PRE_MARKET } from '../../constants/common'\nimport { convertLocalToNyTime, dateFromUnixTimestamp } from '../../utils'\nimport Chart from '../chart'\n\nconst MARKET_START = { hours: 9, minutes: 30 }\nconst END_OF_DAY = { hours: 23, minutes: 59 }\n\nfunction getIsDateBeforeMarketStart(date: Date) {\n const hours = date.getHours()\n const minutes = date.getMinutes()\n return hours < MARKET_START.hours || (hours === MARKET_START.hours && minutes < MARKET_START.minutes)\n}\n\nexport function roundTimeForSyncedPane({\n sourceChart,\n targetChart,\n timestamp,\n}: {\n sourceChart: Chart\n targetChart: Chart\n timestamp: number\n}) {\n let dateToReturn = dateFromUnixTimestamp(timestamp)\n const sourceChartHasPremarket =\n sourceChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(sourceChart.timeframe)\n const targetChartHasPremarket =\n targetChart.quote().premarket && TIMEFRAMES_WITH_PRE_MARKET.includes(targetChart.timeframe)\n\n if ([TIMEFRAME.d, TIMEFRAME.w, TIMEFRAME.m].includes(sourceChart.timeframe)) {\n dateToReturn = setDate(dateToReturn, MARKET_START)\n }\n\n if (targetChart.timeframe === TIMEFRAME.m) {\n dateToReturn = setDate(lastDayOfMonth(dateToReturn), END_OF_DAY)\n } else if (targetChart.timeframe === TIMEFRAME.w) {\n dateToReturn = setDate(lastDayOfWeek(dateToReturn, { weekStartsOn: 1 }), END_OF_DAY)\n } else if (targetChart.timeframe === TIMEFRAME.d && targetChart.quote().instrument !== 'stock') {\n dateToReturn = endOfDay(dateToReturn)\n }\n\n if (sourceChartHasPremarket && !targetChartHasPremarket && targetChart.quote().instrument === 'stock') {\n dateToReturn = getIsDateBeforeMarketStart(dateToReturn) ? setDate(dateToReturn, MARKET_START) : dateToReturn\n }\n\n return ~~(convertLocalToNyTime(dateToReturn, false).getTime() / 1000)\n}\n","import Spine from '@finviz/spine'\n\nimport { ChartSyncablePart } from '../chart/contstants'\nimport Pane from '../pane'\nimport { roundTimeForSyncedPane } from './mouse-utils'\n\nexport class Mouse extends Spine.Model {\n static initClass() {\n this.configure('Mouse', 'position')\n this.belongsTo('pane', Pane)\n }\n\n declare position: { x: number; y: number } | undefined\n declare pane: () => Pane | null\n\n getIsCrossSyncOn = () => !!this.pane()?.chart().getIsChartPartInSync(ChartSyncablePart.Crosshair)\n\n getIsMouseInChartOfPane = (pane: Pane) => !!this.pane()?.chart().eql(pane.chart())\n\n getShouldRenderCrossInPane = (pane: Pane) => this.getIsCrossSyncOn() || this.getIsMouseInChartOfPane(pane)\n\n getCrossIndexForPane = (pane: Pane) => {\n if (this.position) {\n if (this.getIsMouseInChartOfPane(pane)) {\n return Math.round(this.position.x)\n }\n const paneOfMouse = this.pane()\n if (this.getIsCrossSyncOn() && paneOfMouse) {\n const mouseInChart = paneOfMouse.chart()\n const currentPaneChart = pane.chart()\n const mousePositionTimestamp = mouseInChart.quote().getTimestampFomPositionX(Math.round(this.position.x))\n const currentPanePositionX = currentPaneChart.quote().getPositionXFromTimestamp(\n roundTimeForSyncedPane({\n sourceChart: mouseInChart,\n targetChart: currentPaneChart,\n timestamp: mousePositionTimestamp,\n })\n )\n return Math.floor(currentPanePositionX)\n }\n }\n\n return Number.NaN\n }\n\n getPriceForPane = (pane: Pane) => {\n const positionY = this.position?.y ?? null\n\n if (this.pane()?.eql(pane)) {\n return positionY\n }\n\n if (this.getIsCrossSyncOn() && this.pane()) {\n const mousePaneIndex = this.pane()?.getIndexInChart()\n const currentPaneIndex = pane.getIndexInChart()\n return mousePaneIndex === currentPaneIndex ? positionY : null\n }\n\n return null\n }\n}\n\n/**\n * Mouse is a singleton, so `initClass` must be called before we create the instance\n * otherwise it wouldn’t work\n */\nMouse.initClass()\n\nconst mouse = Mouse.create()\nmouse.save()\n\nexport default mouse as Mouse\n","import Spine, { Collection } from '@finviz/spine'\nimport omit from 'lodash.omit'\n\nimport { Position, TodoObjectHashAnyType } from '../../types/shared'\nimport CanvasElement from '../canvas/element'\nimport { ChartEventBadgeType, PANE_HEIGHT_DEFAULT } from '../constants/common'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Chart from './chart'\nimport ChartEventElement from './chart-event-element'\nimport Element from './element'\nimport { rebuildElementZIndexes } from './utils'\n\nexport interface ScaleAxis {\n (index: number): number\n invert: (x: number) => number\n domain: () => [currentDomainMax: number, currentDomainMin: number]\n width: (x: number) => number\n height: (y: number) => number\n ticks: (y: number) => number[]\n}\n\nconst CHART_EVENT_BADGE_TYPE_ORDER = [\n ChartEventBadgeType.Split,\n ChartEventBadgeType.Dividends,\n ChartEventBadgeType.EarningsPositive,\n ChartEventBadgeType.EarningsNegative,\n ChartEventBadgeType.EarningsNeutral,\n ChartEventBadgeType.EarningsFuture,\n]\n\nclass Pane extends Spine.Model {\n static initClass(\n elementModel: typeof Element,\n chartEventElementModel: typeof ChartEventElement,\n chartModel: typeof Chart\n ) {\n this.configure('Pane', 'height', 'scale', 'scaleRange', 'instance', 'selection')\n this.hasMany('elements', elementModel)\n this.hasMany('chartEvents', chartEventElementModel)\n this.belongsTo('mainElement', elementModel)\n this.belongsTo('chart', chartModel)\n }\n\n declare id: string\n declare chart_id: string\n declare height: number\n declare scale: {\n x: ScaleAxis\n y: ScaleAxis\n }\n\n declare instance: any\n declare chart: () => Chart\n declare mainElement: () => T | null\n declare elements: () => Collection\n declare chartEvents: () => Collection\n selection: CanvasElement | null = null\n scaleRange: { min: number; max: number } | null = null\n\n destroyCascade(options?: TodoObjectHashAnyType) {\n this.elements()\n .all()\n .forEach((element) => {\n element.destroyCascade()\n })\n return this.destroy(options)\n }\n\n toObject() {\n const elements = this.elements()\n .all()\n .map((el) => el.toObject())\n return {\n height: this.height,\n scale: this.scale,\n scaleRange: this.scaleRange,\n elements,\n }\n }\n\n toConfig(omitKeys = [] as string[]) {\n const elements = this.elements()\n .all()\n .map((el) => el.toConfig())\n return omit(\n {\n height: this.height,\n scaleRange: this.scaleRange,\n elements,\n },\n omitKeys\n )\n }\n\n move(direction: Position) {\n const chartPanes = this.chart().getAllPanes()\n const chartPane = chartPanes.find((pane) => !pane.getIsIndicatorPane())\n const targetPane = chartPanes.find((pane) => this.eql(pane))\n\n if (!chartPane || !targetPane) return\n\n const currentChartPaneRecords = Pane.records.filter((pane) => pane.chart_id === targetPane.chart_id)\n const ohterChartPaneRecords = Pane.records.filter((pane) => pane.chart_id !== targetPane.chart_id)\n\n const targetRecordIndex = currentChartPaneRecords.findIndex((record) => record.id === targetPane.id)\n const arrayWithoutTargetRecord = currentChartPaneRecords.filter((_, index) => index !== targetRecordIndex)\n const chartRecordIndex = arrayWithoutTargetRecord.findIndex((record) => record.id === chartPane.id)\n\n const panesAbove = arrayWithoutTargetRecord.slice(0, chartRecordIndex)\n const panesBelow = arrayWithoutTargetRecord.slice(chartRecordIndex + 1)\n if (direction === Position.Above) {\n panesAbove.push(currentChartPaneRecords[targetRecordIndex])\n panesAbove.sort((a, b) => a.getNumericId() - b.getNumericId())\n }\n if (direction === Position.Below) {\n panesBelow.push(currentChartPaneRecords[targetRecordIndex])\n panesBelow.sort((a, b) => a.getNumericId() - b.getNumericId())\n }\n\n Pane.records = ohterChartPaneRecords.concat([\n ...panesAbove,\n arrayWithoutTargetRecord[chartRecordIndex],\n ...panesBelow,\n ])\n this.chart().trigger('change', this.chart())\n }\n\n getChartLayoutSettings() {\n return getChartLayoutSettings(this.chart().chart_layout())\n }\n\n getAllElements() {\n return this.elements()\n .all()\n .sort((a, b) => a.zIndex - b.zIndex)\n }\n\n getAllChartEvents(isSorted = true) {\n const chartEvents = [...this.chartEvents().all()]\n return isSorted ? chartEvents.sort((a, b) => a.zIndex - b.zIndex) : chartEvents\n }\n\n getChartOrIndicatorElement() {\n return this.getAllElements().find((el) => el.isChart() || el.isIndicator()) ?? null\n }\n\n getIsIndicatorPane() {\n return !!this.mainElement()?.isIndicator()\n }\n\n getIsChartPane() {\n return !!this.mainElement()?.isChart()\n }\n\n resetHeight() {\n if (this.getIsIndicatorPane()) {\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.indicator)\n }\n if (this.getIsChartPane()) {\n this.updateAttribute('height', PANE_HEIGHT_DEFAULT.chart)\n }\n }\n\n getIndexInChart() {\n return this.chart()\n .getAllPanes()\n .findIndex((chartPane) => chartPane.eql(this))\n }\n\n getElementZIndexRange() {\n let max = -1\n let min = 1\n this.getAllElements().forEach((el) => {\n if (el.zIndex > max) {\n max = el.zIndex\n }\n if (el.zIndex < min) {\n min = el.zIndex\n }\n })\n return { min, max }\n }\n\n getBelowAboveZeroElements() {\n const allPaneElements = this.getAllElements()\n const elementsBelowZero: Element[] = []\n const elementsAboveZero: Element[] = []\n allPaneElements.forEach((el) => {\n if (el.zIndex < 0) {\n elementsBelowZero.push(el)\n }\n if (el.zIndex > 0) {\n elementsAboveZero.push(el)\n }\n })\n\n return { elementsBelowZero, elementsAboveZero }\n }\n\n normalizeZIndexes() {\n const { elementsBelowZero, elementsAboveZero } = this.getBelowAboveZeroElements()\n rebuildElementZIndexes({ elementsArray: elementsBelowZero, isBelowZero: true })\n rebuildElementZIndexes({ elementsArray: elementsAboveZero, isBelowZero: false })\n }\n\n getQuoteRawTicker() {\n return this.chart().getQuoteRawTicker()\n }\n\n getNumericId() {\n return Number(this.id.replace('c-', ''))\n }\n\n updateChartEventsZIndexes() {\n if (!this.scale || !this.scale.hasOwnProperty('x')) {\n return\n }\n\n const chartEvents = this.getAllChartEvents(false).sort(\n (a, b) => a.instance.attrs.positionTimestamps!.x - b.instance.attrs.positionTimestamps!.x\n )\n const hoveredChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isHovered)\n const openedChartEvent = chartEvents.find((chartEvent) => chartEvent.instance.isOpen)\n\n const hoveredTypeChartEventElements: ChartEventElement[] = []\n const openedTypeChartEventElements: ChartEventElement[] = []\n const nonActiveChartEventElements: ChartEventElement[] = []\n\n chartEvents.forEach((chartEvent, index) => {\n const chartEventsOnSameXPoint = chartEvents.filter(\n (chartEvent_B, i) =>\n i < index && Math.round(chartEvent.instance.attrs.x) === Math.round(chartEvent_B!.instance.attrs.x)\n )\n chartEvent.updateAttributes({ yIndex: chartEventsOnSameXPoint.length })\n const isHovered = chartEvent.instance === hoveredChartEvent?.instance\n const isOpened = chartEvent.instance === openedChartEvent?.instance\n const isHoveredType = chartEvent.instance.type === hoveredChartEvent?.instance.type\n const isOpenType = chartEvent.instance.type === openedChartEvent?.instance.type\n if (!isHovered || !isOpened) {\n if (isHoveredType) {\n hoveredTypeChartEventElements.push(chartEvent)\n } else if (isOpenType) {\n openedTypeChartEventElements.push(chartEvent)\n } else {\n nonActiveChartEventElements.push(chartEvent)\n }\n }\n })\n\n nonActiveChartEventElements.sort(\n (a, b) =>\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(a.instance.getChartEvenBadgeType()) -\n CHART_EVENT_BADGE_TYPE_ORDER.indexOf(b.instance.getChartEvenBadgeType())\n )\n\n const chartEventElements = [\n ...nonActiveChartEventElements,\n ...openedTypeChartEventElements,\n openedChartEvent,\n ...hoveredTypeChartEventElements,\n hoveredChartEvent,\n ].filter(Boolean)\n chartEventElements.forEach((chartEvent, index) => {\n chartEvent!.updateAttributes({ zIndex: index })\n })\n }\n}\n\nexport default Pane\n","import { ObjectHash, RequireByKey } from '../../types/shared'\n\ninterface HeikinAshiData {\n HAOpen: number[]\n HAClose: number[]\n}\n\ninterface QuoteValues {\n cachedAt: null | number\n dayToOffset: ObjectHash[]\n dateToIndex: ObjectHash[]\n heikinAshiData?: HeikinAshiData\n daysInQuote: Date[]\n}\n\ninterface QuoteCacheFunctionProps {\n cid: string\n key: keyof QuoteValues\n fetchedAt: number\n value: any\n}\n\nconst quoteCache = {} as ObjectHash\n\nexport function getCachedQuote({\n cid,\n key,\n fetchedAt,\n}: RequireByKey>, 'cid'>) {\n const quote = quoteCache[cid]\n if (quote?.cachedAt === fetchedAt && key) {\n return quote[key]\n } else if (!key) {\n return quote\n }\n return null\n}\n\nexport function setCachedQuote({\n cid,\n key,\n value,\n fetchedAt,\n}: Pick) {\n quoteCache[cid] = {\n ...(quoteCache[cid]?.cachedAt === fetchedAt ? quoteCache[cid] : {}),\n [key]: value,\n cachedAt: fetchedAt,\n } as QuoteValues\n}\n\nexport function deleteCachedQuote({ cid }: Pick) {\n delete quoteCache[cid]\n}\n","import Spine from '@finviz/spine'\nimport { isSameMonth, isSameWeek } from 'date-fns'\nimport queryString from 'query-string'\n\nimport { Instrument, ObjectHash, TodoObjectHashAnyType } from '../../types/shared'\nimport { ChartEventDbType, ChartEventType, IntradayTimeframeInterval, TIMEFRAME } from '../constants/common'\nimport type { ICOT } from '../indicators/cot'\nimport { dateFromUnixTimestamp, dateStringFromDate } from '../utils'\nimport { getIsAbortError } from '../utils/abort_controller'\nimport { getPositionXFromTimestamp, getTimestampFromPositionX } from '../utils/chart'\nimport { IDividends, IEarnings, ISplit } from '../utils/chart-events-utils'\nimport fetchApi, { NotFoundError } from '../utils/fetch_api'\nimport { getIsSSr } from '../utils/helpers'\nimport { QuoteFetchType, QuoteFetchTypeUrlOption, QuoteUrlOptions } from './quote/constants'\nimport { deleteCachedQuote, getCachedQuote, setCachedQuote } from './quoteCache'\nimport { getRawTickerForInstrument } from './utils'\n\nconst quoteRefreshChecksBeforeFullRefresh = 15\n\ntype TodoPattern = TodoObjectHashAnyType\n\nexport interface TickerTimeframesProps {\n ticker: string\n instrument: string\n timeframe: string\n}\n\ninterface QuoteFetchOptions {\n aftermarket?: boolean\n premarket?: boolean\n patterns?: boolean\n events?: boolean\n maxBars?: number\n}\n\ninterface QuoteInternalOptions {\n cachePredicate?: (quote: Quote) => boolean\n fetchNewDataOnCachedQuote?: boolean\n}\n\ninterface UrlOptions extends QuoteFetchOptions {\n ticker: string\n instrument: string\n timeframe: string\n}\n\ntype ChartEventDataRaw = Omit & { eventType: ChartEventDbType }\n\ninterface DataResponse {\n COTs: COTData\n name: string\n ticker: string\n instrument: string\n interval: number\n timeframe: string\n open: number[]\n high: number[]\n low: number[]\n close: number[]\n date: number[]\n volume: number[]\n lastOpen: number\n lastHigh: number\n lastLow: number\n lastClose: number\n lastDate: number\n lastTime: string | null\n lastVolume: number\n dataId: string\n prevClose: number\n afterClose: number\n afterChange: number\n afterTime: string | null\n drawMinutesPerDay: number\n marketStartMinutes: number\n premarketLengthMinutes: number\n aftermarketLengthMinutes: number\n aftermarket: boolean\n premarket: boolean\n hasPatterns: boolean\n patterns: Array\n patternsMinRange: number\n patternsMaxRange: number\n relativeVolume: number\n isIntraday: boolean\n noNewData?: boolean\n chartEvents?: ChartEventDataRaw[]\n}\n\ninterface COTData {\n [code: string]: ICOT\n}\n\nconst emptyQuote = {\n open: [],\n high: [],\n low: [],\n close: [],\n volume: [],\n date: [],\n fetchedAt: -1,\n numberOfRefreshChecks: 0,\n isFetching: false,\n is404: false,\n COTs: undefined,\n name: undefined,\n drawMinutesPerDay: undefined,\n marketStartMinutes: undefined,\n premarketLengthMinutes: undefined,\n aftermarketLengthMinutes: undefined,\n patterns: [],\n patternsMinRange: undefined,\n patternsMaxRange: undefined,\n relativeVolume: undefined,\n lastOpen: undefined,\n lastHigh: undefined,\n lastLow: undefined,\n lastClose: undefined,\n lastVolume: undefined,\n dataId: undefined,\n lastDate: undefined,\n prevClose: undefined,\n afterClose: undefined,\n afterChange: undefined,\n chartEvents: [],\n}\n\ninterface ICacheAvailabilityCheckFunctionsArguments {\n quote: Quote\n options?: QuoteFetchOptions & QuoteInternalOptions\n}\n\nconst doesQuoteAndOptionsMatch = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\n !quote.premarket === !options?.premarket &&\n !quote.aftermarket === !options?.aftermarket &&\n !quote.hasPatterns === !options?.patterns &&\n // if options.events is false we can reuse quote with events\n (!options?.events || !!quote.events)\n\nconst doesQuoteAndFetchParamsMatch = ({\n quote,\n ticker,\n instrument,\n timeframe,\n}: {\n quote: Quote\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n}) => quote.ticker === ticker && quote.instrument === instrument && quote.timeframe === timeframe\n\n// either we don't care about matching uuid at all, or they have to match\nconst isSameOrNoChartUuid = ({ quote, uuid }: { quote: Quote; uuid?: string }) => !uuid || quote.chartUuid === uuid\n\nconst isCacheAllowed = ({ quote, options }: ICacheAvailabilityCheckFunctionsArguments) =>\n !options?.cachePredicate || options.cachePredicate(quote)\n\nconst isNotEmptyQuote = (quote: Quote) => quote.fetchedAt !== -1 || quote.isFetching\n\nexport type QuoteGetParams = {\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n options?: QuoteFetchOptions & QuoteInternalOptions\n abortController?: null | AbortController\n fetchFunc?: any\n shouldUseCache?: boolean\n chartUuid?: string\n}\n\nfunction getChartEventsWithId({ ticker, chartEvents }: { ticker: string; chartEvents?: ChartEventDataRaw[] }) {\n return (\n chartEvents?.map((item) => {\n let eventType: ChartEventType\n switch (item.eventType) {\n case ChartEventDbType.Dividends:\n eventType = ChartEventType.Dividends\n break\n case ChartEventDbType.Split:\n eventType = ChartEventType.Split\n break\n case ChartEventDbType.Earnings:\n eventType = ChartEventType.Earnings\n break\n }\n return {\n ...item,\n elementId: `${ticker.toLowerCase()}-${item.eventType}-${item.dateTimestamp}`,\n eventType,\n }\n }) ?? []\n )\n}\n\nclass Quote extends Spine.Model {\n static initClass() {\n this.configure(\n 'Quote',\n 'ticker',\n 'name',\n 'instrument',\n 'timeframe',\n 'open',\n 'high',\n 'low',\n 'close',\n 'date',\n 'volume',\n 'lastOpen',\n 'lastHigh',\n 'lastLow',\n 'lastClose',\n 'lastDate',\n 'lastVolume',\n 'lastTime',\n 'dataId',\n 'prevClose',\n 'COTs',\n 'chartEvents',\n 'afterClose',\n 'afterChange',\n 'afterTime',\n 'drawMinutesPerDay',\n 'marketStartMinutes',\n 'premarketLengthMinutes',\n 'aftermarketLengthMinutes',\n 'aftermarket',\n 'premarket',\n 'events',\n 'hasPatterns',\n 'patterns',\n 'patternsMinRange',\n 'patternsMaxRange',\n 'relativeVolume',\n 'fetchedAt',\n 'isIntraday',\n 'interval',\n 'drawDays',\n 'barIndex',\n 'barToDataIndex',\n 'fetchingPromise',\n 'isFetching',\n 'wasFetchAborted',\n 'chartUuid',\n 'numberOfRefreshChecks',\n 'maxBars',\n 'ideaID',\n 'is404'\n )\n }\n\n static async get({\n ticker: tickerRaw,\n instrument,\n timeframe,\n options,\n abortController,\n fetchFunc,\n shouldUseCache = true,\n chartUuid,\n }: QuoteGetParams): Promise {\n const ticker = tickerRaw.replace('@', '')\n const [quote] = shouldUseCache\n ? Quote.select(\n (q) =>\n doesQuoteAndFetchParamsMatch({ quote: q, ticker, instrument, timeframe }) &&\n isSameOrNoChartUuid({ quote: q, uuid: chartUuid }) &&\n isNotEmptyQuote(q) &&\n isCacheAllowed({ quote: q, options }) &&\n (q.instrument !== Instrument.Stock ||\n Number.isInteger(q.ideaID) ||\n doesQuoteAndOptionsMatch({ quote: q, options }))\n )\n : []\n\n if (quote) {\n if (quote.isFetching) {\n await quote.getResolvedFetchingPromise()\n } else if (options?.fetchNewDataOnCachedQuote) {\n await quote.fetchData({ fetchType: QuoteFetchType.NewerData, abortController, fetchFunc })\n }\n return quote\n }\n\n const newQuote = Quote.create({\n ...emptyQuote,\n ticker,\n timeframe,\n instrument,\n chartUuid,\n maxBars: options?.maxBars,\n premarket: !!options?.premarket,\n aftermarket: !!options?.aftermarket,\n hasPatterns: !!options?.patterns,\n events: !!options?.events,\n })\n\n await newQuote.fetchData({ fetchType: QuoteFetchType.Refetch, abortController, fetchFunc })\n\n return newQuote\n }\n\n static async getAll(tickersAndTimeframes: Array<{ ticker: string; instrument: Instrument; timeframe: TIMEFRAME }>) {\n // TODO: fetch in 1 request\n if (tickersAndTimeframes.length === 0) {\n return {}\n }\n\n try {\n await Promise.all(\n tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\n this.get({ ticker: ticker, instrument, timeframe })\n )\n )\n const data = tickersAndTimeframes.reduce(\n (accumulator, currentValue) => ({\n ...accumulator,\n [currentValue.ticker]: Quote.select(\n (q: Quote) =>\n q.ticker === currentValue.ticker &&\n q.instrument === currentValue.instrument &&\n q.timeframe === currentValue.timeframe\n )[0],\n }),\n {}\n )\n return data\n } catch (err) {\n // TODO: handle somehow\n }\n }\n\n declare ticker: string\n declare name: string\n declare instrument: Instrument\n declare interval: number\n declare timeframe: TIMEFRAME\n declare open: number[]\n declare high: number[]\n declare low: number[]\n declare close: number[]\n declare date: number[]\n declare volume: number[]\n declare lastOpen: number\n declare lastHigh: number\n declare lastLow: number\n declare lastClose: number\n declare lastDate: number\n declare lastVolume: number\n declare dataId: string\n declare prevClose: number\n declare COTs: COTData\n declare afterClose: number\n declare afterChange: number\n declare drawMinutesPerDay: number\n declare marketStartMinutes: number\n declare premarketLengthMinutes: number\n declare aftermarketLengthMinutes: number\n declare hasPatterns: boolean\n declare patterns: Array\n declare patternsMinRange: number\n declare patternsMaxRange: number\n declare relativeVolume: number\n declare isIntraday: boolean\n declare drawDays?: number\n declare barIndex: number[]\n /**\n * Array of length the same as number of bars\n *\n * If there's a gap and a bar index has no corresponding data index,\n * the last data index is used (or 0 if there's no last data index)\n *\n * @type {number[]}\n */\n declare barToDataIndex: number[]\n declare chartUuid?: string\n declare aftermarket: boolean\n declare premarket: boolean\n declare fetchedAt: number\n declare numberOfRefreshChecks: number\n declare isFetching: boolean\n declare fetchingPromise?: Promise\n declare wasFetchAborted: boolean\n declare maxBars?: number\n declare ideaID?: number\n declare is404?: boolean\n declare chartEvents: Array\n declare events?: boolean\n\n async fetchRequest({\n abortController,\n fetchFunc,\n options = { type: QuoteFetchTypeUrlOption.New },\n }: {\n abortController?: null | AbortController\n fetchFunc?: any\n options?: QuoteUrlOptions\n }) {\n let data: DataResponse | null = null\n let is404 = false\n let wasFetchAborted = false\n\n const fetchingPromise = fetchApi({\n location: this.getUrl(options),\n throwOnStatusCodes: [404],\n abortController,\n fetchFunc,\n })\n\n this.updateAttributes({\n isFetching: true,\n fetchingPromise,\n })\n\n try {\n data = await fetchingPromise\n } catch (err) {\n if (getIsAbortError(err as Error)) {\n wasFetchAborted = true\n } else if (process.env.IS_E2E_TESTING) {\n throw new Error('Quote fetch error', { cause: err })\n }\n is404 = err instanceof NotFoundError\n // Ignore network/notfound errors\n }\n\n const shouldUseEmptyQuote = !data && !wasFetchAborted && options.type === QuoteFetchTypeUrlOption.New\n\n if (process.env.IS_E2E_TESTING && shouldUseEmptyQuote) {\n throw new Error('Quote fetch new fail', { cause: { options, is404, wasFetchAborted, data } })\n }\n\n this.updateAttributes({\n ...(shouldUseEmptyQuote ? emptyQuote : {}),\n is404,\n wasFetchAborted,\n isFetching: false,\n })\n\n return data\n }\n\n async isPossibleToFetchSequentialData({\n abortController,\n fetchFunc,\n }: {\n abortController?: null | AbortController\n fetchFunc?: any\n } = {}) {\n const data = await this.fetchRequest({ abortController, fetchFunc })\n if (data && data.date.length > 0 && this.date.length > 0) {\n return this.date[this.date.length - 1] >= data.date[0]\n }\n return false\n }\n\n async fetchData({\n fetchType,\n abortController,\n fetchFunc,\n }: {\n fetchType: QuoteFetchType\n abortController?: null | AbortController\n fetchFunc?: any\n }) {\n let options: QuoteUrlOptions\n if (fetchType === QuoteFetchType.Refetch) {\n options = { type: QuoteFetchTypeUrlOption.New }\n } else if (fetchType === QuoteFetchType.NewerData) {\n options = { type: QuoteFetchTypeUrlOption.Newer }\n if ((this.numberOfRefreshChecks ?? 0) < quoteRefreshChecksBeforeFullRefresh) {\n options.dataId = this.dataId\n }\n } else {\n return\n }\n if (this.instrument === Instrument.Stock) {\n options.events = this.events == null ? true : this.events\n }\n\n const data = await this.fetchRequest({ abortController, fetchFunc, options })\n\n if (!data || data.noNewData === true) {\n this.updateAttributes({\n numberOfRefreshChecks: (this.numberOfRefreshChecks ?? 0) + 1,\n })\n return\n }\n if (this.timeframe !== data.timeframe || this.ticker.toLowerCase() !== data.ticker?.toLowerCase()) {\n return\n }\n\n const newQuoteData = {\n COTs: data.COTs,\n name: data.name,\n open: data.open,\n high: data.high,\n low: data.low,\n close: data.close,\n volume: data.volume,\n date: data.date,\n drawMinutesPerDay: data.drawMinutesPerDay,\n marketStartMinutes: data.marketStartMinutes,\n premarketLengthMinutes: data.premarketLengthMinutes,\n aftermarketLengthMinutes: data.aftermarketLengthMinutes,\n patterns: data.patterns ?? [],\n patternsMinRange: data.patternsMinRange,\n patternsMaxRange: data.patternsMaxRange,\n relativeVolume: data.relativeVolume,\n lastOpen: data.lastOpen,\n lastHigh: data.lastHigh,\n lastLow: data.lastLow,\n lastClose: data.lastClose,\n lastVolume: data.lastVolume,\n dataId: data.dataId,\n lastDate: data.lastDate,\n lastTime: data.lastTime,\n prevClose: data.prevClose,\n afterClose: data.afterClose,\n afterChange: data.afterChange,\n afterTime: data.afterTime,\n numberOfRefreshChecks: 0,\n chartEvents: data.chartEvents ?? [],\n fetchedAt: Date.now(),\n }\n\n if (\n !(\n fetchType === QuoteFetchType.Refetch ||\n [Instrument.Futures, Instrument.Forex, Instrument.Crypto].includes(this.instrument)\n )\n ) {\n /*\n * Merges current and new data taking date as index\n */\n let AIndex = 0\n let BIndex = 0\n let mergeIndex = -1\n while (AIndex < this.date.length || BIndex < data.date.length) {\n const ADate = this.date[AIndex]\n const BDate = data.date[BIndex]\n if (BDate === undefined) {\n break\n } else if (ADate === BDate) {\n // Same date, update OHLCV\n this.open[AIndex] = data.open[BIndex]\n this.high[AIndex] = data.high[BIndex]\n this.low[AIndex] = data.low[BIndex]\n this.close[AIndex] = data.close[BIndex]\n this.volume[AIndex] = data.volume[BIndex]\n AIndex++\n BIndex++\n } else if (ADate > BDate || ADate === undefined) {\n // New bar for a date not yet in our dataset\n // If weekly or monthly timeframe & wasn't merged on AIndex\n if (mergeIndex === -1 && [TIMEFRAME.w, TIMEFRAME.m].includes(this.timeframe)) {\n const prevAIndex = AIndex - 1\n const prevDate = dateFromUnixTimestamp(this.date[prevAIndex])\n const newDate = dateFromUnixTimestamp(data.date[BIndex])\n // If merge bar for weekly is sameWeek or for monthly is sameMonth perform merge on AIndex\n if (\n (TIMEFRAME.w === this.timeframe && isSameWeek(prevDate, newDate, { weekStartsOn: 1 })) ||\n (TIMEFRAME.m === this.timeframe && isSameMonth(prevDate, newDate))\n ) {\n this.date[prevAIndex] = data.date[BIndex]\n this.open[prevAIndex] = data.open[BIndex]\n this.high[prevAIndex] = data.high[BIndex]\n this.low[prevAIndex] = data.low[BIndex]\n this.close[prevAIndex] = data.close[BIndex]\n this.volume[prevAIndex] = data.volume[BIndex]\n mergeIndex = prevAIndex\n // Incrementing BIndex only because we're mergin arrays on AIndex\n BIndex++\n continue\n }\n }\n this.date.splice(AIndex, 0, data.date[BIndex])\n this.open.splice(AIndex, 0, data.open[BIndex])\n this.high.splice(AIndex, 0, data.high[BIndex])\n this.low.splice(AIndex, 0, data.low[BIndex])\n this.close.splice(AIndex, 0, data.close[BIndex])\n this.volume.splice(AIndex, 0, data.volume[BIndex])\n // Incrementing AIndex because we're changing the array in-place\n AIndex++\n BIndex++\n } else if (ADate < BDate) {\n AIndex++\n } else {\n console.warn('fetchNewerData merge warning')\n window.Sentry?.captureMessage('quote.ts fetchNewerData merge warning', {\n extra: {\n thisDateLength: this.date.length,\n dataDateLength: data.date.length,\n AIndex,\n BIndex,\n ADate,\n BDate,\n },\n })\n }\n }\n\n newQuoteData.date = this.date\n newQuoteData.open = this.open\n newQuoteData.high = this.high\n newQuoteData.low = this.low\n newQuoteData.close = this.close\n newQuoteData.volume = this.volume\n }\n\n const hasUpdatedSuccessfully = this.updateAttributes(newQuoteData)\n // https://github.com/finvizhq/charts/issues/510\n if (!hasUpdatedSuccessfully) {\n // attempt to find if this.model.quote() => null is comming from this.save() validation fail\n window.Sentry?.captureMessage('quote.ts fetchNewerData save() validation failed', { extra: this })\n }\n if (!this) {\n // or this somehow became null / falsy\n window.Sentry?.captureMessage('quote.ts fetchNewerData this is falsy', { extra: this })\n }\n this.trigger(fetchType, this, fetchType)\n }\n\n async getResolvedFetchingPromise() {\n try {\n return await this.fetchingPromise\n } catch {\n // do nothing\n }\n }\n\n fetchOlderData() {\n return // not yet implemented\n // TODO cancel previous request\n }\n\n load(atts: ObjectHash) {\n super.load(atts)\n const { fetchedAt = 0 } = atts\n const { cachedAt } = (getCachedQuote({ cid: this.cid }) as { cachedAt: number } | null) || {}\n if (this.timeframe && cachedAt !== fetchedAt) {\n setCachedQuote({ cid: this.cid, key: 'cachedAt', value: fetchedAt, fetchedAt })\n this.isIntraday = [\n TIMEFRAME.i1,\n TIMEFRAME.i2,\n TIMEFRAME.i3,\n TIMEFRAME.i5,\n TIMEFRAME.i10,\n TIMEFRAME.i15,\n TIMEFRAME.i30,\n TIMEFRAME.h,\n TIMEFRAME.h2,\n TIMEFRAME.h4,\n ].includes(this.timeframe)\n this.interval = this.isIntraday\n ? IntradayTimeframeInterval[this.timeframe as keyof typeof IntradayTimeframeInterval]\n : 0\n this.drawDays = this.getDrawDays()\n this.barIndex = this.getBarIndexes()\n this.patterns = this.patterns ?? []\n this.barToDataIndex = this.barIndex.flatMap((barIndex, index) => {\n const lastIndex = this.barIndex[index - 1] ?? -1\n return [...Array.from({ length: barIndex - lastIndex - 1 }).fill(Math.max(0, index - 1)), index] as number[]\n })\n }\n if (this.timeframe && this.ticker) {\n this.chartEvents = getChartEventsWithId({\n ticker: this.ticker,\n chartEvents: this.chartEvents as unknown as ChartEventDataRaw[],\n })\n }\n return this\n }\n\n destroy(options?: ObjectHash) {\n super.destroy(options)\n deleteCachedQuote({ cid: this.cid })\n return this\n }\n\n getDrawDays() {\n if (this.instrument !== Instrument.Stock) {\n return Infinity\n }\n switch (this.timeframe) {\n case TIMEFRAME.i1:\n case TIMEFRAME.i2:\n case TIMEFRAME.i3:\n case TIMEFRAME.i5:\n case TIMEFRAME.i10:\n return 10\n case TIMEFRAME.i15:\n case TIMEFRAME.i30:\n case TIMEFRAME.h:\n case TIMEFRAME.h2:\n case TIMEFRAME.h4:\n return 15\n default:\n break\n }\n }\n\n getHeikinAshiData() {\n const cachedHeikinAshiData = getCachedQuote({ cid: this.cid, key: 'heikinAshiData', fetchedAt: this.fetchedAt })\n if (cachedHeikinAshiData) {\n return cachedHeikinAshiData as unknown as { open: number[]; close: number[] }\n }\n\n const HAClose = this.open.map((_, i) => (this.open[i] + this.high[i] + this.close[i] + this.low[i]) / 4)\n const HAOpen = this.open.reduce(\n (acc, open, i) => [...acc, (i === 0 ? open + HAClose[0] : acc[i - 1] + HAClose[i - 1]) / 2],\n [] as number[]\n )\n\n const heikAshiData = { open: HAOpen, close: HAClose }\n\n setCachedQuote({ cid: this.cid, key: 'heikinAshiData', value: heikAshiData, fetchedAt: this.fetchedAt })\n\n return heikAshiData\n }\n\n getDayToOffset(): ObjectHash {\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'dayToOffset', fetchedAt: this.fetchedAt })\n if (cachedDayToOffset) {\n return cachedDayToOffset as unknown as ObjectHash\n }\n const dayToOffset: ObjectHash = {}\n let day = 0\n let lastDay\n for (let i = 0, end = this.date.length, asc = end >= 0; asc ? i < end : i > end; asc ? i++ : i--) {\n const date = dateFromUnixTimestamp(this.date[i])\n const dateString = dateStringFromDate(date)\n if (dateString !== lastDay) {\n dayToOffset[dateString] = day\n day++\n lastDay = dateString\n }\n }\n // for ofscreen renderer we need to add lastDate to have correct dayToOffset because if\n // premarket=false in fetch query there isn't other way to distinguish that\n if (getIsSSr() && this.lastDate) {\n // YYYYMMDD / 20211118 => YYYY-MM-DD\n const [yyyy, mm, dd] = [~~(this.lastDate / 10000), ~~(this.lastDate / 100) % 100, this.lastDate % 100]\n const lastDate = `${yyyy}-${String(mm).padStart(2, '0')}-${String(dd).padStart(2, '0')}`\n\n if (lastDay !== lastDate) {\n dayToOffset[lastDate] = day\n }\n }\n\n setCachedQuote({ cid: this.cid, key: 'dayToOffset', value: dayToOffset, fetchedAt: this.fetchedAt })\n return dayToOffset\n }\n\n getDaysInQuote() {\n const cachedDayToOffset = getCachedQuote({ cid: this.cid, key: 'daysInQuote', fetchedAt: this.fetchedAt })\n if (cachedDayToOffset) {\n return cachedDayToOffset as unknown as Date[]\n }\n const dayToOffset = this.getDayToOffset()\n const daysInQuote = Object.keys(dayToOffset)\n .map((dateString) => {\n const [year, month, day] = dateString.split('-')\n return new Date(Number.parseInt(year), Number.parseInt(month) - 1, Number.parseInt(day))\n })\n .sort((a, b) => a.getTime() - b.getTime())\n\n setCachedQuote({ cid: this.cid, key: 'daysInQuote', value: daysInQuote, fetchedAt: this.fetchedAt })\n return daysInQuote\n }\n\n getBarIndexes() {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return Array.from({ length: this.date.length }).map((_, index) => index)\n }\n\n const barIndex = []\n const dayToOffset = this.getDayToOffset()\n\n for (let i = 0; i < this.date.length; i += 1) {\n const date = dateFromUnixTimestamp(this.date[i])\n let x = Math.ceil((date.getHours() * 60 + date.getMinutes() - this.marketStartMinutes) / this.interval)\n x += dayToOffset[dateStringFromDate(date)] * this.getBarsInDay()! // add days\n barIndex[i] = x\n }\n\n return barIndex\n }\n\n getBarIndex(i: number) {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return i\n }\n return this.barIndex[i]\n }\n\n getBarsInDay() {\n if (!this.isIntraday || this.instrument !== Instrument.Stock) {\n return\n }\n return Math.ceil(this.drawMinutesPerDay / this.interval)\n }\n\n getDataIndexByBarIndex(index: number) {\n if (this.barIndex) {\n for (let i = 0; i < this.barIndex.length; i++) {\n if (this.barIndex[i] === index) {\n return i\n }\n }\n }\n return -1\n }\n\n getDataByBarIndex(key: keyof Quote, index: number) {\n const dataIndex = this.getDataIndexByBarIndex(index)\n if (dataIndex > -1) {\n const quoteData = this[key as keyof Quote]! as number[]\n return quoteData[dataIndex] ?? null\n }\n return null\n }\n\n getDateToIndex() {\n const cachedDateToIndex = getCachedQuote({ cid: this.cid, key: 'dateToIndex', fetchedAt: this.fetchedAt })\n if (cachedDateToIndex) {\n return cachedDateToIndex as unknown as ObjectHash\n }\n const dateToIndex: ObjectHash = {}\n for (let i = 0; i < this.date.length; i++) {\n dateToIndex[this.date[i]] = i\n }\n setCachedQuote({ cid: this.cid, key: 'dateToIndex', value: dateToIndex, fetchedAt: this.fetchedAt })\n return dateToIndex\n }\n\n getTimestampFomPositionX(positionX: number) {\n if (this.date.length === 0) {\n return 0\n }\n return getTimestampFromPositionX({\n positionX,\n quote: this,\n })\n }\n\n getPositionXFromTimestamp(timestamp: number) {\n if (this.date.length === 0) {\n return 0\n }\n return getPositionXFromTimestamp({\n timestamp,\n quote: this,\n })\n }\n\n getUrl(options: QuoteUrlOptions) {\n const config: UrlOptions = {\n ticker: this.ticker,\n instrument: this.instrument,\n timeframe: this.timeframe || 'd1',\n aftermarket: this.aftermarket,\n premarket: this.premarket,\n patterns: this.hasPatterns,\n maxBars: this.maxBars,\n ...options,\n }\n\n const isStock = config.instrument === Instrument.Stock\n const isBrowserElite = !getIsSSr() && document.location.host === 'elite.finviz.com'\n let domain = isBrowserElite && isStock ? 'https://api.finviz.com' : ''\n\n if (getIsSSr()) {\n domain = process.env.BE_API_URL!\n }\n\n return `${domain}/api/quote.ashx?${queryString.stringify({ rev: Date.now(), ...config })}`\n }\n\n getRawTicker() {\n return getRawTickerForInstrument(this.instrument, this.ticker)\n }\n\n clearData() {\n this.updateAttributes(emptyQuote)\n }\n}\n\nQuote.initClass()\n\nexport default Quote\n","export enum QuoteFetchType {\n Refetch = 'refetch',\n NewerData = 'newerData',\n}\n\nexport enum QuoteFetchTypeUrlOption {\n New = 'new',\n Newer = 'newer',\n}\n\nexport interface QuoteUrlOptions {\n type: QuoteFetchTypeUrlOption\n dataId?: string\n events?: boolean\n}\n","export const largeChartFontSize = {\n S: 8,\n M: 10,\n XXL: 16,\n XXXL: 24,\n}\n","import { Theme } from '../../../types/shared'\nimport {\n CHART_MARGIN,\n FONT_SIZE,\n LINE_HEIGHT,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextBaseline,\n} from '../../constants/common'\nimport {\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n generalColors,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from '../constants'\nimport { ISettings } from './interfaces'\n\nexport const INTERACTIVE_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...(theme === Theme.light ? chartLightTheme : chartDarkTheme),\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: CHART_MARGIN.XL,\n baseline: TextBaseline.alphabetic,\n ticker: {\n margin: {\n top: 30,\n left: 0,\n },\n font: {\n size: FONT_SIZE.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 30,\n left: 30,\n right: 30,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n change: {\n margin: {\n top: 30,\n right: 0,\n },\n font: {\n size: FONT_SIZE.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: CHART_MARGIN.XXL,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: FONT_SIZE.S,\n lineHeight: LINE_HEIGHT.S,\n padding: {\n top: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: CHART_MARGIN.M,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 8,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n },\n left: {\n width: CHART_MARGIN.L,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -8,\n left: 6,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 28,\n },\n font: {\n size: FONT_SIZE.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 33,\n },\n font: {\n size: FONT_SIZE.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 2,\n border: 1,\n },\n top: {\n height: CHART_MARGIN.S,\n },\n right: {\n width: CHART_MARGIN.XXL,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: FONT_SIZE.S,\n lineHeight: LINE_HEIGHT.S,\n padding: {\n top: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: CHART_MARGIN.S,\n },\n left: {\n width: CHART_MARGIN.L,\n indicatorLabel: {\n labelSpacing: 4,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: FONT_SIZE.M,\n style: 'bold',\n lineHeight: LINE_HEIGHT.M,\n },\n },\n },\n },\n MarketSentimentSettings: {\n general: {\n Colors: theme === Theme.light ? chartLightTheme : chartDarkTheme,\n },\n center: {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n },\n top: {\n height: 0,\n },\n bottom: {\n height: 12,\n },\n left: {\n width: 0,\n },\n right: {\n width: 30,\n },\n },\n ColorsSettings: generalColors,\n ThumbSettings: {\n size: 8,\n touchSize: 16,\n color: '#ddd',\n borderWidth: 1,\n borderColor: '#999',\n },\n ElementSettings: {\n Colors: theme === Theme.light ? elementLightTheme : elementDarkTheme,\n defaultFill: '#1e6dc066',\n defaultTransparentFill: '#1e6dc000',\n },\n})\n","import merge from 'lodash.merge'\n\nimport { ChartConfigChart } from '../../server/chartConfig'\nimport { Instrument, ObjectHash, Theme } from '../../types/shared'\nimport { SpecificChartFunctionality } from '../constants/common'\nimport Utils, { isRedesignedPage } from '../utils'\nimport LayoutModel from './chart_layout'\nimport { getColorOverwrites } from './chart_settings'\nimport { largeChartFontSize } from './chart_settings/constants'\nimport { INTERACTIVE_CHART_SETTINGS } from './chart_settings/interactive_chart_settings'\nimport { ISettings } from './chart_settings/interfaces'\nimport {\n IChartThemeColors,\n chartDarkTheme,\n chartLightTheme,\n elementDarkTheme,\n elementLightTheme,\n indicatorDarkTheme,\n indicatorLightTheme,\n} from './constants'\n\ninterface Config {\n theme: Theme\n barMargin?: number\n barWidth?: number\n border?: number\n charts?: ChartConfigChart[]\n colorsOverride?: Array\n volumeHeight?: number\n colors?: ObjectHash, Theme>\n specificChartFunctionality?: SpecificChartFunctionality\n}\n\nexport function getSettings(config: Config, chartSettings?: ISettings): ISettings {\n const settings = merge({}, chartSettings ?? INTERACTIVE_CHART_SETTINGS(config.theme))\n\n if (config.barWidth != null) {\n settings.ChartSettings.center.barWidth = config.barWidth\n settings.IndicatorSettings.center.barWidth = config.barWidth\n }\n if (config.barMargin != null) {\n settings.ChartSettings.center.barMargin = config.barMargin\n settings.IndicatorSettings.center.barMargin = config.barMargin\n }\n if (config.border != null) {\n settings.ChartSettings.center.border = config.border\n settings.IndicatorSettings.center.border = config.border\n }\n if (config.colorsOverride) {\n settings.ColorsSettings = config.colorsOverride\n }\n if (config.volumeHeight) {\n settings.ChartSettings.center.volumeHeight = config.volumeHeight\n }\n if (config.colors) {\n const settingColors = settings.ChartSettings.general.Colors\n settings.ChartSettings.general.Colors = {\n ...settingColors,\n [Theme.light]: {\n ...settingColors[Theme.light],\n ...getColorOverwrites({ theme: Theme.light, colors: config.colors }),\n },\n [Theme.dark]: {\n ...settingColors[Theme.dark],\n ...getColorOverwrites({ theme: Theme.dark, colors: config.colors }),\n },\n }\n }\n if (config.specificChartFunctionality === SpecificChartFunctionality.chartPage && Utils.isMobile()) {\n settings.ChartSettings.left.width = 0\n settings.ChartSettings.top.ticker.margin.left = settings.ChartSettings.left.overlayLabel.margin.left\n settings.IndicatorSettings.left.width = 0\n }\n if (SpecificChartFunctionality.chartPage === config.specificChartFunctionality || isRedesignedPage(config)) {\n settings.ChartSettings.top.height = 10\n }\n\n if (config.specificChartFunctionality === SpecificChartFunctionality.offScreen) {\n const isGroupInstrument = config.charts?.some(({ instrument }) => instrument === Instrument.Group)\n if (isGroupInstrument) {\n settings.ChartSettings.top.ohlc.margin.top = 4\n settings.ChartSettings.top.ticker.margin.top = 0\n settings.ChartSettings.top.ticker.font = {\n size: largeChartFontSize.XXL,\n style: 'bold',\n }\n settings.ChartSettings.left.timeframe.margin.top = 12\n settings.ChartSettings.left.timeframe.font = {\n size: largeChartFontSize.S,\n style: 'bold',\n }\n }\n }\n\n return settings\n}\n\nexport function updateSettings(chart_layout: LayoutModel, theme: string): ISettings {\n const settings = merge({}, chart_layout.settings)\n const isLight = theme === Theme.light\n settings.MarketSentimentSettings.general.Colors = isLight ? { ...chartLightTheme } : { ...chartDarkTheme }\n settings.IndicatorSettings.general.Colors = isLight ? { ...indicatorLightTheme } : { ...indicatorDarkTheme }\n settings.ElementSettings.Colors = isLight ? { ...elementLightTheme } : { ...elementDarkTheme }\n\n return settings\n}\n\nexport function getChartLayoutSettings(chart_layout: LayoutModel): ISettings {\n const settings = chart_layout.settings\n\n return {\n ...settings,\n ChartSettings: {\n ...settings.ChartSettings,\n general: {\n ...settings.ChartSettings.general,\n Colors: {\n ...settings.ChartSettings.general.Colors,\n ...settings.ChartSettings.general.Colors[chart_layout.theme],\n },\n },\n },\n }\n}\n","import { Instrument } from '../../types/shared'\nimport ChartLayoutModel from './chart_layout'\nimport Element from './element'\n\nexport const handleRemoveIndicatorPane = ({\n paneIndex,\n chartLayoutModel,\n}: {\n paneIndex: number\n chartLayoutModel: ChartLayoutModel\n}) => {\n const charts = chartLayoutModel.getAllCharts()\n charts.forEach((chart) => chart.getAllPanes()[paneIndex].destroyCascade())\n}\n\nexport function getNormalizedZIndex({ index, isBelowZero }: { index: number; isBelowZero: boolean }) {\n return (index + 1) * (isBelowZero ? -1 : 1)\n}\n\nexport function rebuildElementZIndexes({\n elementsArray,\n isBelowZero,\n}: {\n elementsArray: Element[]\n isBelowZero: boolean\n}) {\n const elements = isBelowZero ? [...elementsArray].reverse() : elementsArray\n elements.forEach((element, index) => {\n const newZIndex = getNormalizedZIndex({ index, isBelowZero })\n if (newZIndex !== element.zIndex) {\n element.updateAttributes({ zIndex: newZIndex })\n }\n })\n}\n\nexport function changeElementZIndexes({\n elementsArray,\n addElement,\n oldZIndex,\n newZIndex,\n isBelowZero = false,\n}: {\n elementsArray: Element[]\n addElement: Element | undefined\n oldZIndex: number\n newZIndex: number\n isBelowZero?: boolean\n}) {\n const array = isBelowZero ? [...elementsArray].reverse() : elementsArray\n const elements =\n elementsArray.length === 0 && addElement\n ? [...array, addElement]\n : array\n .filter((_, index) => getNormalizedZIndex({ index, isBelowZero }) !== oldZIndex)\n .flatMap((el, index) =>\n getNormalizedZIndex({ index, isBelowZero }) === newZIndex && addElement ? [addElement, el] : el\n )\n\n // If there are only 2 drawings and we move a drawing from index 1 to index 2 to have to push it to the array because it's the last element and it didn't get into the array in the flatMap above\n if (elements.length < Math.abs(newZIndex) && addElement) {\n elements.push(addElement)\n }\n\n rebuildElementZIndexes({ elementsArray: isBelowZero ? [...elements].reverse() : elements, isBelowZero })\n}\n\nexport function getRawTickerForInstrument(instrument: Instrument, ticker: string) {\n return `${\n [Instrument.Crypto, Instrument.Forex, Instrument.Futures].includes(instrument) && !ticker.includes('@') ? '@' : ''\n }${ticker}`\n}\n","import {\n ChartConfigChartPaneElement,\n IModalConfig,\n IModalConfigInput,\n ObjectHash,\n RequireByKey,\n} from '../../types/shared'\nimport Element from '../canvas/element'\nimport BaseChart from '../charts/base_chart'\nimport { OverlayType } from '../constants/common'\nimport Quote from '../models/quote'\nimport { convertColorToHEX, getRGBAValueFromValidColorString } from '../utils/colors'\nimport { getParsedIntegersFromPeriodString, isInRange, isPositiveInteger } from '../utils/helpers'\n\nexport interface IOverlayIsValid {\n getIsValid(key: string): boolean | void\n}\n\nconst DEFAULT_LABEL_COLOR = '#0587cd'\n\nclass Overlay extends Element implements IOverlayIsValid {\n static type = OverlayType.Overlay\n static label = 'Overlay'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt] = getParsedIntegersFromPeriodString(period)\n return periodInt\n }\n\n declare data: Quote\n declare chart: BaseChart\n\n get type() {\n return (this.constructor as typeof Overlay).type\n }\n\n get label() {\n return (this.constructor as typeof Overlay).label\n }\n\n getLabelColor() {\n return this.attrs.color ? convertColorToHEX(this.attrs.color) : DEFAULT_LABEL_COLOR\n }\n\n getFreeColor() {\n return this.getChartLayoutSettings().ColorsSettings[0]\n // TODO proper implementation - example how this could be done:\n // let colorsUsed = []\n // for (let overlay of this.chart.overlays) {\n // let object = overlay.getModalConfig().inputs\n // for (let _ in object) {\n // let input = object[_]\n // if (input.type === 'color') {\n // colorsUsed.push(input.value)\n // }\n // }\n // }\n // for (let color of colors) {\n // if (!colorsUsed.includes(color)) {\n // return color\n // }\n // }\n // return colors[0]\n }\n\n renderContent(_?: RenderingContext2DType) {\n this.data = this.model.chart().quote()\n }\n\n fx = (x: number) => this.model.scale.x(this.data.barIndex[x])\n\n getIsValid(_: string): boolean | undefined {\n throw Error('Implement')\n }\n\n getIsNumberInputValid({ key, integerOnly = true }: { key: string; integerOnly?: boolean }): boolean {\n const input = this.getModalConfig().inputs.find(({ name }: { name: string }) => key === name)\n return !!input && isInRange(input) && (!integerOnly || isPositiveInteger(input.value))\n }\n\n isRendered() {\n return true\n }\n\n isRenderedOverlaysLabel() {\n return this.isRendered()\n }\n\n getModalConfig(): IModalConfig {\n return {\n title: '',\n inputs: [],\n inputsErrorMessages: {},\n }\n }\n\n toConfig() {\n const colors: string[] = []\n const periods: string[] = []\n\n this.getModalConfig().inputs.forEach((input: IModalConfigInput) => {\n if (input.type === 'color') {\n colors.push(getRGBAValueFromValidColorString(input.value.toString()))\n } else {\n periods.push(input.value.toString())\n }\n })\n\n return { type: this.type, period: periods.join(','), color: colors.join('|') }\n }\n}\n\nexport default Overlay\n","import { ChartConfigChartPaneElement, RequireByKey, Theme } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\nconst BB_COLORS = {\n [Theme.light]: {\n TOP: '#D386DF',\n BOTTOM: '#69C1EA',\n MIDDLE: '#CFD2F2',\n },\n [Theme.dark]: {\n TOP: '#D38BFB',\n BOTTOM: '#57AEFB',\n MIDDLE: '#E1B6FC',\n },\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 20,\n Deviations: 2.0,\n}\n\ninterface Attrs {\n period: number | string\n deviations: number\n topColor?: string\n bottomColor?: string\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const deviations = parseFloat(values[1]) || DEFAULT_PARAMETERS.Deviations\n\n return [period, deviations]\n}\n\nclass BollingerBands extends Overlay {\n static type = OverlayType.Bb\n static label = 'Bollinger Bands'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, deviations] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.deviations = deviations\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (typeof this.attrs.period !== 'number') {\n return\n }\n super.renderContent()\n const { Colors } = this.getChartLayoutSettings().ChartSettings.general\n const theme = this.model.chart().chart_layout().theme as Theme\n const { leftOffset, width } = this.model.chart()\n const [top, bottom] = this.model.scale.y.domain()\n const scaledTop = this.fy(top)\n const scaledBottom = this.fy(bottom)\n const { close } = this.data\n const period = Math.min(this.attrs.period, close.length - 1)\n\n let firstBarToRender\n let lastBarToRender = 0\n\n const sma: number[] = []\n const stdDev: number[] = []\n\n let sum = 0\n for (let i = 0; i < period; i++) {\n sum += close[i]\n }\n\n // middle line && find first & last bar to render\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', BB_COLORS[theme].MIDDLE)\n for (let i = period; i < close.length; i++) {\n sum = sum - close[i - period] + close[i]\n sma[i] = sum / period\n\n let stdDevSum = 0\n for (let j = i - period + 1; j <= i; j++) {\n stdDevSum += Math.pow(close[j] - sma[i], 2)\n }\n stdDev[i] = Math.sqrt(stdDevSum / period)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n context.lineTo(this.fx(i), Math.round(this.fy(sma[i])))\n\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n lastBarToRender = i\n }\n if (firstBarToRender === undefined) return\n context.stroke()\n context.set('fillStyle', Colors.overlayTransparentBackground)\n\n // top line\n context.beginPath()\n context.moveTo(this.fx(firstBarToRender), scaledTop)\n context.set('strokeStyle', BB_COLORS[theme].TOP)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const upperBand = sma[i] + stdDev[i] * this.attrs.deviations\n context.lineTo(this.fx(i), Math.round(this.fy(upperBand)))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), scaledTop)\n context.fill()\n\n // bottom line\n context.beginPath()\n context.moveTo(this.fx(firstBarToRender), scaledBottom)\n context.set('strokeStyle', BB_COLORS[theme].BOTTOM)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const lowerBand = sma[i] - stdDev[i] * this.attrs.deviations\n context.lineTo(this.fx(i), Math.round(this.fy(lowerBand)))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), scaledBottom)\n context.fill()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const deviations = {\n type: 'number',\n label: 'Deviations',\n name: 'deviations',\n value: this.attrs.deviations ?? DEFAULT_PARAMETERS.Deviations,\n required: true,\n min: 0.1,\n max: 999,\n step: 0.1,\n }\n const topColor = {\n type: 'color',\n label: 'Top Color',\n name: 'topColor',\n value: this.attrs.topColor ?? this.getFreeColor(),\n }\n const bottomColor = {\n type: 'color',\n label: 'Bottom Color',\n name: 'bottomColor',\n value: this.attrs.bottomColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, deviations, topColor, bottomColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n deviations: `${deviations.label} must be a number between ${deviations.min} and ${deviations.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'deviations':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'topColor':\n case 'bottomColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n const theme = this.model.chart().chart_layout().theme as Theme\n return this.attrs.topColor || BB_COLORS[theme].TOP\n }\n\n toString() {\n return `BB ${this.attrs.period},${this.attrs.deviations}`\n }\n}\n\nBollingerBands.prototype.defaults = { topColor: '#69c1ea', bottomColor: '#d386df' }\n\nexport default BollingerBands\n","import { OverlayType } from '../constants/common'\nimport utils from '../utils'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n channelStrokeColor: string\n channelFillColor: string\n medianBandColor: string\n}\n\nconst DEFAULT_PERIOD = 20\n\nconst COLORS = {\n ChannelStroke: '#69c1ea',\n ChannelFill: '#69C1EA12',\n MedianBandStroke: '#ffa75f',\n}\n\nclass DonchianChannels extends Overlay {\n static type = OverlayType.Dch\n static label = 'Donchian Channels'\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { period } = this.attrs\n const upperBand: number[] = []\n const lowerBand: number[] = []\n const medianBand: number[] = []\n let firstBarToRender = -1\n let lastBarToRender = 0\n if (this.data.close.length === undefined) {\n return\n }\n\n context.save()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', COLORS.ChannelStroke)\n context.set('fillStyle', COLORS.ChannelFill)\n\n //upper band + clip\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n firstBarToRender = firstBarToRender === -1 ? i : firstBarToRender\n upperBand[i] = utils.max(this.data.high.slice(Math.max(0, i - period), i + 1))\n lowerBand[i] = utils.min(this.data.low.slice(Math.max(0, i - period), i + 1))\n medianBand[i] = (upperBand[i] + lowerBand[i]) / 2\n\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\n lastBarToRender = i\n },\n })\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\n context.clip()\n\n // lower band + fill\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), 0)\n context.lineTo(0, 0)\n context.fill()\n\n // median band\n context.set('strokeStyle', COLORS.MedianBandStroke)\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(medianBand[i])))\n }\n context.stroke()\n context.restore()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PERIOD,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const strokeColor = {\n type: 'color',\n label: 'Channels Stroke Color',\n name: 'strokeColor',\n value: this.attrs.channelStrokeColor ?? this.getFreeColor(),\n }\n const fillColor = {\n type: 'color',\n label: 'Channels Fill Color',\n name: 'fillColor',\n value: this.attrs.channelFillColor ?? this.getFreeColor(),\n }\n const medianBandColor = {\n type: 'color',\n label: 'Median Band Color',\n name: 'medianBandColor',\n value: this.attrs.medianBandColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, medianBandColor, strokeColor, fillColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'medianBandColor':\n case 'strokeColor':\n case 'fillColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.medianBandColor\n }\n\n toString() {\n return `Donchian ${this.attrs.period}`\n }\n}\n\nDonchianChannels.prototype.defaults = {\n medianBandColor: COLORS.MedianBandStroke,\n channelStrokeColor: COLORS.ChannelStroke,\n channelFillColor: COLORS.ChannelFill,\n}\n\nexport default DonchianChannels\n","import { OverlayType } from '../constants/common'\nimport ExponentialMovingAverage from '../helpers/ema'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n deviations: number\n color: string\n}\n\nclass EMA extends Overlay {\n static type = OverlayType.Ema\n static label = 'Exponential Moving Average'\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const ema = new ExponentialMovingAverage(this.attrs.period)\n\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n for (let i = 0; i < this.data.close.length; i++) {\n ema.add(this.data.close[i])\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n context.lineTo(x, Math.round(this.fy(ema.value)))\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, color],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `EMA ${this.attrs.period}`\n }\n}\n\nEMA.prototype.defaults = { color: '#ffa75f' }\n\nexport default EMA\n","import { OverlayType } from '../constants/common'\nimport EMA from './ema'\n\nclass EMA2 extends EMA {\n static type = OverlayType.Ema2\n}\n\nEMA2.prototype.defaults = { color: '#ff6400' }\n\nexport default EMA2\n","import { OverlayType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport { getBarWidthWithMargin } from '../utils/chart'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n lowColor: string\n highColor: string\n}\n\nclass HighLow extends Overlay {\n static type = OverlayType.Hilo\n static label = 'High/Low'\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.renderContent = this.renderContent.bind(this)\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const chartModel = this.model.chart()\n const { ChartSettings } = this.getChartLayoutSettings()\n const { Colors } = ChartSettings.general\n const { leftOffset, width, zoomFactor } = chartModel\n const barWidth = getBarWidthWithMargin({\n zoomFactor,\n chartLayout: chartModel.chart_layout(),\n })\n const halfWidth = barWidth / 2\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\n let firstBarToRender\n let lastBarToRender = 0\n context.translate(0.5, 0.5)\n context.set('fillStyle', Colors.overlayTransparentBackground)\n context.beginPath()\n context.set('strokeStyle', this.attrs.highColor)\n let prevHigh = -1\n for (let i = 0; i < this.data.close.length; i++) {\n let highestHigh = this.data.high[i]\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.high[j] > highestHigh) {\n highestHigh = this.data.high[j]\n }\n }\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < -10) {\n prevHigh = highestHigh\n continue\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n\n const diff = this.data.barIndex[i] - this.data.barIndex[lastBarToRender]\n if (diff > 1 && prevHigh !== highestHigh && prevHigh > 0) {\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevHigh)))\n }\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(highestHigh)))\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(highestHigh)))\n\n prevHigh = highestHigh\n lastBarToRender = i\n }\n context.stroke()\n if (firstBarToRender === undefined) return\n\n // return to start and fill with background color\n context.lineTo(this.fx(lastBarToRender) + halfWidth, 0)\n context.lineTo(this.fx(firstBarToRender) - halfWidth, 0)\n context.fill()\n\n context.beginPath()\n context.set('strokeStyle', this.attrs.lowColor)\n let prevLow = -1\n let prevBar = firstBarToRender\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n let lowestLow = this.data.low[i]\n for (let j = i - period + 1; j <= i; j++) {\n if (this.data.low[j] < lowestLow) {\n lowestLow = this.data.low[j]\n }\n }\n\n const x = this.fx(i)\n const diff = this.data.barIndex[i] - this.data.barIndex[prevBar]\n if (diff > 1 && prevLow !== lowestLow && prevLow > 0) {\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(prevLow)))\n }\n context.lineTo(Math.round(x - halfWidth), Math.round(this.fy(lowestLow)))\n context.lineTo(Math.round(x + halfWidth), Math.round(this.fy(lowestLow)))\n\n prevLow = lowestLow\n prevBar = i\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n\n // return to start and fill with background color\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender) - halfWidth, context.canvas.height)\n context.fill()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 50,\n required: true,\n min: 1,\n max: 999999,\n }\n const highColor = {\n type: 'color',\n label: 'High Color',\n name: 'highColor',\n value: this.attrs.highColor ?? this.getFreeColor(),\n }\n const lowColor = {\n type: 'color',\n label: 'Low Color',\n name: 'lowColor',\n value: this.attrs.lowColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, highColor, lowColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'highColor':\n case 'lowColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.highColor\n }\n\n toString() {\n return `HILO ${this.attrs.period}`\n }\n}\n\nHighLow.prototype.defaults = {\n lowColor: '#69c1ea',\n highColor: '#d386df',\n}\n\nexport default HighLow\n","import { OverlayType } from '../constants/common'\nimport { isPositiveFloat } from '../utils/helpers'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n price: number\n color: string\n}\n\nclass HorizontalLine extends Overlay {\n static type = OverlayType.Hline\n static label = 'Horizontal Line'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (typeof this.attrs.period === 'string' && this.attrs.price === undefined) {\n this.attrs.price = parseFloat(this.attrs.period)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const y = Math.round(this.fy(this.attrs.price))\n context.set('strokeStyle', this.attrs.color)\n context.translate(0, 0.5)\n context.beginPath()\n context.moveTo(-this.model.chart().leftOffset, y)\n context.lineTo(-this.model.chart().leftOffset + this.model.chart().width, y)\n context.stroke()\n context.translate(0, -0.5)\n }\n\n getModalConfig() {\n const price = {\n type: 'number',\n label: 'Price',\n name: 'price',\n value: this.attrs.price || this.model?.scale?.y?.domain().reduce((a: number, b: number) => a + b, 0) / 2,\n required: true,\n step: 0.1,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [price, color],\n inputsErrorMessages: {\n price: `${price.label} must be number`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'price':\n return isPositiveFloat(this.attrs[key])\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `HL ${this.attrs.price}`\n }\n}\n\nHorizontalLine.prototype.defaults = { color: '#0587cd' }\n\nexport default HorizontalLine\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport { drawInVisibleArea } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period?: string\n conversion: number\n base: number\n spanB: number\n spanAStrokeColor: string\n spanAFillColor: string\n spanBStrokeColor: string\n spanBFillColor: string\n conversionLineColor: string\n baseLineColor: string\n laggingSpanColor: string\n}\n\nconst COLORS = {\n SpanA: {\n Stroke: '#009600',\n Fill: '#00960022',\n },\n SpanB: {\n Stroke: '#C80000',\n Fill: '#C8000022',\n },\n ConversionLine: '#69C1EA',\n BaseLine: '#E54040',\n LaggingSpan: '#FFA75F',\n}\n\nconst DEFAULT_PARAMETERS = {\n Conversion: 9,\n Base: 26,\n SpanB: 52,\n}\n\nfunction parsePeriod(period: string) {\n const [conversion = DEFAULT_PARAMETERS.Conversion, base = DEFAULT_PARAMETERS.Base, spanB = DEFAULT_PARAMETERS.SpanB] =\n getParsedIntegersFromPeriodString(period)\n return [conversion, base, spanB]\n}\n\nclass IchimokuCloud extends Overlay {\n static type = OverlayType.Ic\n static label = 'Ichimoku Cloud'\n static renderFull = false\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n return Math.max(...parsePeriod(period))\n }\n\n get renderFull() {\n return (this.constructor as typeof IchimokuCloud).renderFull\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (\n typeof this.attrs.period === 'string' &&\n (this.attrs.conversion === undefined || this.attrs.base === undefined || this.attrs.spanB === undefined)\n ) {\n const [conversion, base, spanB] = parsePeriod(this.attrs.period)\n this.attrs.conversion = conversion\n this.attrs.base = base\n this.attrs.spanB = spanB\n }\n this.trigger('change')\n return this\n }\n\n fx = (x: number) => {\n const lastIndex = this.data.close.length - 1\n const outsideBar = this.data.barIndex[lastIndex] + x - lastIndex\n\n return this.model.scale.x(this.data.barIndex[x] ?? outsideBar)\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { high, low, close } = this.data\n\n const {\n conversion,\n base,\n spanB,\n spanAFillColor,\n spanAStrokeColor,\n spanBFillColor,\n spanBStrokeColor,\n baseLineColor,\n conversionLineColor,\n laggingSpanColor,\n } = this.attrs\n\n const conversionLine: number[] = []\n const baseLine: number[] = []\n const senkouSpanA: number[] = []\n const senkouSpanB: number[] = []\n const conversionStartIndex = conversion - 1\n const baseStartIndex = base - 1\n const spanBIndex = spanB - 1\n const start = Math.min(baseStartIndex, conversionStartIndex)\n const end = close.length + baseStartIndex\n\n if (this.data.close.length === 0) return\n\n // Calculation\n for (let i = start; i < end; i++) {\n if (i >= conversionStartIndex && i < close.length) {\n const highestHi = Math.max(...high.slice(i - conversionStartIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - conversionStartIndex, i + 1))\n conversionLine[i] = (highestHi + lowestLo) / 2\n }\n\n if (i >= baseStartIndex && i < close.length) {\n const highestHi = Math.max(...high.slice(i - baseStartIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - baseStartIndex, i + 1))\n baseLine[i] = (highestHi + lowestLo) / 2\n\n senkouSpanA[i + baseStartIndex] = (baseLine[i] + conversionLine[i]) / 2 // + baseStart because it needs to be shifted to the future\n }\n\n if (i >= spanBIndex) {\n const highestHi = Math.max(...high.slice(i - spanBIndex, i + 1))\n const lowestLo = Math.min(...low.slice(i - spanBIndex, i + 1))\n senkouSpanB[i + baseStartIndex] = (highestHi + lowestLo) / 2 // + baseStart because it needs to be shifted to the future\n }\n }\n\n let lastSpanAX = 0\n let lastSpanBX = 0\n const cloudStartingX = this.fx(spanBIndex + baseStartIndex)\n\n context.set('lineWidth', 1)\n context.translate(0.5, 0.5)\n context.save()\n // 1. Senkou Span A\n // 1.1 Stroke\n context.set('strokeStyle', spanAStrokeColor)\n context.set('fillStyle', spanAFillColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\n lastSpanAX = x\n },\n })\n context.stroke()\n // 1.2 Clipping area\n context.lineTo(lastSpanAX, context.canvas.height)\n context.lineTo(cloudStartingX, context.canvas.height)\n context.clip()\n // 1.3 Fill\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n if (i >= senkouSpanA.length) return\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\n lastSpanBX = x\n },\n })\n context.lineTo(lastSpanBX, 0)\n context.lineTo(cloudStartingX, 0)\n context.fill()\n context.restore()\n\n // 2. Senkou Span B\n // 2.1 Stroke\n context.save()\n context.set('strokeStyle', spanBStrokeColor)\n context.set('fillStyle', spanBFillColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n if (i >= senkouSpanA.length) return\n context.lineTo(x, Math.round(this.fy(senkouSpanB[i])))\n },\n })\n context.stroke()\n // 2.2 Clipping area\n context.lineTo(lastSpanBX, context.canvas.height)\n context.lineTo(cloudStartingX, context.canvas.height)\n context.clip()\n // 2.3 Fill\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(senkouSpanA[i])))\n },\n })\n context.lineTo(lastSpanBX, 0)\n context.lineTo(cloudStartingX, 0)\n context.fill()\n context.restore()\n context.translate(-0.5, -0.5)\n\n if (this.renderFull) {\n // conversion line\n context.set('strokeStyle', conversionLineColor)\n context.translate(0.5, 0.5)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(conversionLine[i])))\n },\n })\n context.stroke()\n\n // base line\n context.set('strokeStyle', baseLineColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: this.fx,\n toIndexOffset: baseStartIndex,\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(baseLine[i])))\n },\n })\n context.stroke()\n\n // lagging span\n context.set('strokeStyle', laggingSpanColor)\n context.beginPath()\n drawInVisibleArea({\n quote: this.data,\n scale: this.model.scale,\n fxOverride: (x: number) => this.fx(x - base),\n leftOffset,\n width,\n drawBarCallback: (i, x) => {\n context.lineTo(x, Math.round(this.fy(this.data.close[i])))\n },\n })\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n }\n\n getModalConfig() {\n const conversion = {\n type: 'number',\n label: 'Conversion Line',\n name: 'conversion',\n value: this.attrs.conversion ?? DEFAULT_PARAMETERS.Conversion,\n required: true,\n min: 1,\n max: 999999,\n }\n const base = {\n type: 'number',\n label: 'Base Line Length',\n name: 'base',\n value: this.attrs.base ?? DEFAULT_PARAMETERS.Base,\n required: true,\n min: 1,\n max: 999999,\n }\n const spanB = {\n type: 'number',\n label: 'Leading Span B Length',\n name: 'spanB',\n value: this.attrs.spanB ?? DEFAULT_PARAMETERS.SpanB,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const spanAStrokeColor = {\n type: 'color',\n label: 'Span A Stroke Color',\n name: 'spanAStrokeColor',\n value: this.attrs.spanAStrokeColor ?? this.getFreeColor(),\n }\n const spanAFillColor = {\n type: 'color',\n label: 'Span A Fill Color',\n name: 'spanAFillColor',\n value: this.attrs.spanAFillColor ?? this.getFreeColor(),\n }\n const spanBStrokeColor = {\n type: 'color',\n label: 'Span B Stroke Color',\n name: 'spanBStrokeColor',\n value: this.attrs.spanBStrokeColor ?? this.getFreeColor(),\n }\n const spanBFillColor = {\n type: 'color',\n label: 'Span B Fill Color',\n name: 'spanBFillColor',\n value: this.attrs.spanBFillColor ?? this.getFreeColor(),\n }\n const conversionLineColor = {\n type: 'color',\n label: 'Conversion Line Color',\n name: 'conversionLineColor',\n value: this.attrs.conversionLineColor ?? this.getFreeColor(),\n }\n const baseLineColor = {\n type: 'color',\n label: 'Base Line Color',\n name: 'baseLineColor',\n value: this.attrs.baseLineColor ?? this.getFreeColor(),\n }\n const laggingSpanColor = {\n type: 'color',\n label: 'Lagging Span Color',\n name: 'laggingSpanColor',\n value: this.attrs.laggingSpanColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [\n conversion,\n base,\n spanB,\n spanAStrokeColor,\n spanAFillColor,\n spanBStrokeColor,\n spanBFillColor,\n conversionLineColor,\n baseLineColor,\n laggingSpanColor,\n ],\n inputsErrorMessages: {\n conversion: `${conversion.label} must be a whole number between ${conversion.min} and ${conversion.max}`,\n base: `${base.label} must be a whole number between ${base.min} and ${base.max}`,\n spanB: `${spanB.label} must be a whole number between ${spanB.min} and ${spanB.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'conversion':\n case 'base':\n case 'spanB':\n case 'lagging':\n return this.getIsNumberInputValid({ key })\n case 'spanAStrokeColor':\n case 'spanAFillColor':\n case 'spanBStrokeColor':\n case 'spanBFillColor':\n case 'conversionLineColor':\n case 'baseLineColor':\n case 'laggingSpanColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.spanAStrokeColor\n }\n\n toString() {\n return `Ichimoku ${this.attrs.conversion},${this.attrs.base},${this.attrs.spanB}`\n }\n}\n\nIchimokuCloud.prototype.defaults = {\n spanAStrokeColor: COLORS.SpanA.Stroke,\n spanAFillColor: COLORS.SpanA.Fill,\n spanBStrokeColor: COLORS.SpanB.Stroke,\n spanBFillColor: COLORS.SpanB.Fill,\n conversionLineColor: COLORS.ConversionLine,\n baseLineColor: COLORS.BaseLine,\n laggingSpanColor: COLORS.LaggingSpan,\n}\n\nexport default IchimokuCloud\n","import { OverlayType } from '../constants/common'\nimport IchimokuCloud from './ic'\n\nclass IchimokuCloudFull extends IchimokuCloud {\n static type = OverlayType.Icf\n static label = 'Ichimoku Cloud (Full)'\n static renderFull = true\n}\n\nexport default IchimokuCloudFull\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport ExponentialMovingAverage from '../helpers/ema'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period?: string\n emaPeriod: number\n multiplier: number\n atrPeriod: number\n strokeColor: string\n fillColor: string\n}\n\nconst DEFAULT_PARAMETERS = {\n emaPeriod: 20,\n multiplier: 2.0,\n atrPeriod: 10,\n}\n\nconst COLORS = {\n Stroke: '#69C1EA',\n Fill: '#69C1EA33',\n}\n\nfunction parsePeriod(period: string) {\n const values = period.split(',')\n const emaPeriod = parseInt(values[0])\n const multiplier = parseFloat(values[1])\n const atrPeriod = parseInt(values[2])\n\n return [emaPeriod, multiplier, atrPeriod]\n}\n\nclass KeltnerChannel extends Overlay {\n static type = OverlayType.Kch\n static label = 'Keltner Channel'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n return Math.max(...parsePeriod(period)) * 2\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (\n typeof this.attrs.period === 'string' &&\n (this.attrs.emaPeriod === undefined || this.attrs.multiplier === undefined || this.attrs.atrPeriod === undefined)\n ) {\n const [emaPeriod, multiplier, atrPeriod] = parsePeriod(this.attrs.period)\n this.attrs.emaPeriod = emaPeriod\n this.attrs.multiplier = multiplier\n this.attrs.atrPeriod = atrPeriod\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { emaPeriod, multiplier, atrPeriod, strokeColor, fillColor } = this.attrs\n const ema = new ExponentialMovingAverage(emaPeriod)\n const atr = new AverageTrueRange(atrPeriod)\n const middleLine: number[] = []\n const upperBand: number[] = []\n const lowerBand: number[] = []\n const start = Math.max(emaPeriod, atrPeriod)\n let firstBarToRender\n let lastBarToRender = 0\n\n context.save()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', strokeColor)\n context.set('fillStyle', fillColor)\n\n //top line + clip\n context.beginPath()\n for (let i = 1; i < this.data.close.length; i++) {\n ema.add(this.data.close[i])\n atr.add(this.data.high[i], this.data.low[i], this.data.close[i - 1])\n if (i < start) {\n continue\n }\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n middleLine[i] = ema.value\n upperBand[i] = ema.value + multiplier * atr.value\n lowerBand[i] = ema.value - multiplier * atr.value\n\n context.lineTo(x, Math.round(this.fy(upperBand[i])))\n lastBarToRender = i\n }\n if (firstBarToRender === undefined) {\n context.restore()\n return\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), context.canvas.height)\n context.lineTo(this.fx(firstBarToRender), context.canvas.height)\n context.clip()\n\n // bottom line + fill\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(lowerBand[i])))\n }\n context.stroke()\n context.lineTo(this.fx(lastBarToRender), 0)\n context.lineTo(0, 0)\n context.fill()\n\n // middle line\n context.beginPath()\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n context.lineTo(x, Math.round(this.fy(middleLine[i])))\n }\n context.stroke()\n context.restore()\n }\n\n getModalConfig() {\n const emaPeriod = {\n type: 'number',\n label: 'EMA Period',\n name: 'emaPeriod',\n value: this.attrs.emaPeriod ?? DEFAULT_PARAMETERS.emaPeriod,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const multiplier = {\n type: 'number',\n label: 'Multiplier',\n name: 'multiplier',\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.multiplier,\n required: true,\n step: 0.1,\n min: 0.0,\n max: 999,\n }\n\n const atrPeriod = {\n type: 'number',\n label: 'ATR Period',\n name: 'atrPeriod',\n value: this.attrs.atrPeriod ?? DEFAULT_PARAMETERS.atrPeriod,\n required: true,\n min: 1,\n max: 999999,\n }\n\n const strokeColor = {\n type: 'color',\n label: 'Stroke Color',\n name: 'strokeColor',\n value: this.attrs.strokeColor ?? this.getFreeColor(),\n }\n const fillColor = {\n type: 'color',\n label: 'Fill Color',\n name: 'fillColor',\n value: this.attrs.fillColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [emaPeriod, multiplier, atrPeriod, strokeColor, fillColor],\n inputsErrorMessages: {\n emaPeriod: `${emaPeriod.label} must be a whole number between ${emaPeriod.min} and ${emaPeriod.max}`,\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\n atrPeriod: `${atrPeriod.label} must be a whole number between ${atrPeriod.min} and ${atrPeriod.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'emaPeriod':\n return this.getIsNumberInputValid({ key })\n case 'multiplier':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'atrPeriod':\n return this.getIsNumberInputValid({ key })\n case 'strokeColor':\n case 'fillColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.strokeColor\n }\n\n toString() {\n return `Keltner Channel ${this.attrs.emaPeriod},${this.attrs.multiplier},${this.attrs.atrPeriod}`\n }\n}\n\nKeltnerChannel.prototype.defaults = { strokeColor: COLORS.Stroke, fillColor: COLORS.Fill }\n\nexport default KeltnerChannel\n","import { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\n// This indicator is used as a placeholder when we need to render TA like chart but don't need any overlay or indicator in the chart\nclass None extends Overlay {\n static type = OverlayType.None\n static label = 'None'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n isRendered() {\n return false\n }\n\n getIsValid() {\n return true\n }\n}\n\nexport default None\n","import Text from '../canvas/text'\nimport { OverlayType, TextAlign, TextBaseline } from '../constants/common'\nimport { getRoundedObject, getXYOffsetFromLine } from '../controllers/renderUtils'\nimport Overlay from './overlay'\n\ntype aboveBelowType = 'above' | 'below'\n\nclass Patterns extends Overlay {\n static type = OverlayType.Patterns\n static label = 'Patterns (daily charts)'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { ChartSettings } = this.getChartLayoutSettings()\n const data = this.data\n if (data.patterns.length === 0) {\n return\n }\n\n const originalScale = {\n width: 600,\n height: 300,\n barsInDay: Math.min(data.close.length, 200),\n high: data.patternsMaxRange,\n low: data.patternsMinRange,\n barWidth: 0,\n }\n originalScale.barWidth = originalScale.width / 200\n\n const scaleY = (originalScale.high - originalScale.low) / originalScale.height\n const fx = (x: number) => {\n if (x === 0) {\n return this.fx(0)\n }\n return this.fx(data.close.length - 1 - ~~(originalScale.barsInDay - x / originalScale.barWidth))\n }\n const fy = (y: number) => this.fy(originalScale.high - y * scaleY)\n const line = (color: string, x1: number, y1: number, x2: number, y2: number) => {\n const roundedXY = getRoundedObject({\n x1: fx(x1),\n y1: fy(y1),\n x2: fx(x2),\n y2: fy(y2),\n })\n const translateXY = getXYOffsetFromLine({ lineWidth: 1, ...roundedXY })\n context.translate(translateXY.x, translateXY.y)\n\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', color)\n context.lineTo(roundedXY.x1, roundedXY.y1)\n context.lineTo(roundedXY.x2, roundedXY.y2)\n context.stroke()\n\n context.translate(translateXY.x * -1, translateXY.y * -1)\n }\n const text = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, x2: number, y1: number) => {\n new Text(\n {\n x: fx((x1 + x2) / 2),\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\n font: { size: 8, style: 'bold' },\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\n fillStyle: color,\n textAlign: TextAlign.center,\n text,\n },\n this.model\n ).render(context)\n }\n const textHS = (text: string, aboveBelow: aboveBelowType, color: string, x1: number, y1: number) => {\n new Text(\n {\n x: fx(x1) + 5,\n y: fy(y1) + (aboveBelow === 'above' ? -1 : 2),\n font: { size: 9, style: 'bold' },\n textBaseline: aboveBelow === 'above' ? TextBaseline.bottom : TextBaseline.top,\n fillStyle: color,\n textAlign: TextAlign.center,\n text,\n },\n this.model\n ).render(context)\n }\n const above = (y: number) =>\n fy(y) + 10 >= this.model.height - ChartSettings.top.height - ChartSettings.bottom.height ? 'above' : 'below'\n const below = (y: number) => (fy(y) <= 15 ? 'below' : 'above')\n\n const supportColor = 'rgb(0, 150, 220)'\n const resistColor = 'rgb(180, 50, 200)'\n\n for (const pattern of data.patterns) {\n const { x1, x2, x3, y3 } = pattern\n let { y1, y2 } = pattern\n switch (pattern.kind) {\n case 1: // Horiz S/R\n line('rgba(50, 50, 180, 0.588)', x1, y1, x2, y2)\n break\n\n case 2: // tl resist\n line(resistColor, x1, y1, x2, y2)\n break\n\n case 3: // tl support\n if (y1 === originalScale.height && y2 === originalScale.height) {\n y1 = y2 = originalScale.height - 1\n // Maybe just need to check on the new scale?\n } // support \"pod grafom\"\n line(supportColor, x1, y1, x2, y2)\n break\n\n case 12: // double top\n text('Double Top', below(y1), resistColor, x1, x2, y1)\n break\n\n case 13: // double bottom\n text('Double Bottom', above(y1), supportColor, x1, x2, y1)\n break\n\n case 14: // multi top\n text('Multiple Top', below(y1), resistColor, x1, x2, y1)\n break\n\n case 15: // multi bottom\n text('Multiple Bottom', above(y1), supportColor, x1, x2, y1)\n break\n\n case 16: // h&s top\n textHS('L', below(y1), resistColor, x1, y1)\n textHS('H', below(y2), resistColor, x2, y2)\n textHS('R', below(y3), resistColor, x3, y3)\n break\n\n case 17: // h&s bot\n textHS('L', above(y1), supportColor, x1, y1)\n textHS('H', above(y2), supportColor, x2, y2)\n textHS('R', above(y3), supportColor, x3, y3)\n break\n default:\n break\n }\n }\n }\n\n getModalConfig() {\n const supportColor = {\n type: 'color',\n label: 'Support Color',\n name: 'supportColor',\n value: this.attrs.supportColor ?? this.getFreeColor(),\n }\n const resistColor = {\n type: 'color',\n label: 'Resist Color',\n name: 'resistColor',\n value: this.attrs.resistColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [supportColor, resistColor],\n inputsErrorMessages: {},\n }\n }\n\n getIsValid() {\n return true\n }\n\n isRenderedOverlaysLabel() {\n return false\n }\n\n toString() {\n return ''\n }\n}\n\nPatterns.prototype.defaults = { supportColor: '#69c1ea', resistColor: '#d386df' }\n\nexport default Patterns\n","import { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\ninterface Attrs {\n step: number\n period: string\n maxStep: number\n risingColor: string\n fallingColor: string\n}\n\nclass SAR extends Overlay {\n static type = OverlayType.Sar\n static label = 'Parabolic SAR'\n\n static getNumOfBarsBuffer() {\n return 0\n }\n\n set(obj: Partial) {\n super.set(obj)\n if (typeof this.attrs.period === 'string' && (this.attrs.step === undefined || this.attrs.maxStep === undefined)) {\n const [step = 0, maxStep = 0] = this.attrs.period.split(',').map((x) => parseFloat(x))\n this.attrs.step = step\n this.attrs.maxStep = maxStep\n }\n this.trigger('change')\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const data = this.data\n const deltaHigh = data.high[1] - data.high[0]\n const deltaLow = data.low[0] - data.low[1]\n const pdm = deltaHigh > 0 && deltaHigh > deltaLow ? deltaHigh : 0\n const mdm = deltaLow > 0 && deltaLow > deltaHigh ? deltaLow : 0\n let isLong = pdm >= mdm\n\n let sar = isLong ? data.low[0] : data.high[0]\n let ep = isLong ? data.high[1] : data.low[1]\n let newHigh = data.high[0]\n let newLow = data.low[0]\n let af = this.attrs.step\n\n for (let i = 1, end = data.close.length, asc = end >= 1; asc ? i < end : i > end; asc ? i++ : i--) {\n let sarToDraw\n const prevHigh = newHigh\n const prevLow = newLow\n newHigh = data.high[i]\n newLow = data.low[i]\n\n if (isLong) {\n if (newLow <= sar) {\n isLong = false\n sar = ep\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n\n sarToDraw = sar\n\n af = this.attrs.step\n ep = newLow\n\n sar = sar + af * (ep - sar)\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n } else {\n sarToDraw = sar\n\n if (newHigh > ep) {\n ep = newHigh\n af += this.attrs.step\n if (af > this.attrs.maxStep) {\n af = this.attrs.maxStep\n }\n }\n\n sar = sar + af * (ep - sar)\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n }\n } else {\n if (newHigh >= sar) {\n isLong = true\n sar = ep\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n\n sarToDraw = sar\n\n af = this.attrs.step\n ep = newHigh\n\n sar = sar + af * (ep - sar)\n\n if (sar > prevLow) {\n sar = prevLow\n }\n if (sar > newLow) {\n sar = newLow\n }\n } else {\n sarToDraw = sar\n\n if (newLow < ep) {\n ep = newLow\n af += this.attrs.step\n if (af > this.attrs.maxStep) {\n af = this.attrs.maxStep\n }\n }\n\n sar = sar + af * (ep - sar)\n\n if (sar < prevHigh) {\n sar = prevHigh\n }\n if (sar < newHigh) {\n sar = newHigh\n }\n }\n }\n\n const x = Math.round(this.fx(i) - 1.5)\n const y = Math.round(this.fy(sarToDraw) - 1.5)\n context.set('fillStyle', isLong ? this.attrs.risingColor : this.attrs.fallingColor)\n context.fillRect(x, y, 3, 3)\n }\n }\n\n getModalConfig() {\n const step = {\n type: 'number',\n step: 0.01,\n min: 0.01,\n max: 999,\n label: 'Step',\n name: 'step',\n value: this.attrs.step ?? 0.02,\n required: true,\n }\n const maxStep = {\n type: 'number',\n step: 0.01,\n min: 0.01,\n max: 999,\n label: 'Maximum Step',\n name: 'maxStep',\n value: this.attrs.maxStep ?? 0.2,\n required: true,\n }\n const risingColor = {\n type: 'color',\n label: 'Rising Color',\n name: 'risingColor',\n value: this.attrs.risingColor ?? this.getFreeColor(),\n customizable: false,\n }\n const fallingColor = {\n type: 'color',\n label: 'Falling Color',\n name: 'fallingColor',\n value: this.attrs.fallingColor ?? this.getFreeColor(),\n customizable: false,\n }\n\n return {\n title: this.label,\n inputs: [step, maxStep, risingColor, fallingColor],\n inputsErrorMessages: {\n step: `${step.label} must be a number between ${step.min} and ${step.max}`,\n maxStep: `${maxStep.label} must be a number between ${maxStep.min} and ${maxStep.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'step':\n case 'maxStep': {\n return this.getIsNumberInputValid({ key, integerOnly: false })\n }\n case 'risingColor':\n case 'fallingColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.risingColor\n }\n\n toString() {\n return `SAR ${this.attrs.step},${this.attrs.maxStep}`\n }\n}\n\nSAR.prototype.defaults = {\n risingColor: '#69c1ea',\n fallingColor: '#d386df',\n}\n\nexport default SAR\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport Overlay from './overlay'\n\ninterface Attrs {\n step: number\n period: string\n maxStep: number\n risingColor: string\n color: string\n}\n\nclass SMA extends Overlay {\n static type = OverlayType.Sma\n static label = 'Simple Moving Average'\n\n static getNumOfBarsBuffer(chartConfig: RequireByKey) {\n const numOfBarsBuffer = Overlay.getNumOfBarsBuffer(chartConfig)\n return numOfBarsBuffer + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n this.attrs.period = parseInt(period, 10)\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const period = Math.min(this.attrs.period, this.data.close.length - 1)\n context.beginPath()\n context.translate(0.5, 0.5)\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n let sum = 0\n for (let i = 0; i < period; i++) {\n sum += this.data.close[i]\n }\n for (let i = period; i < this.data.close.length; i++) {\n const x = this.fx(i)\n sum = sum - this.data.close[i - period] + this.data.close[i]\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n context.lineTo(x, Math.round(this.fy(sum / period)))\n }\n context.translate(-0.5, -0.5)\n context.stroke()\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? 5,\n required: true,\n min: 1,\n max: 999999,\n }\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, color],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'color':\n return !!this.attrs[key] // use real color validation, we got isValidHexColor but it might be also RGBA\n default:\n return false\n }\n }\n\n toString() {\n return `SMA ${this.attrs.period}`\n }\n}\n\nSMA.prototype.defaults = { color: '#ffa75f' }\n\nexport default SMA\n","import { OverlayType } from '../constants/common'\nimport SMA from './sma'\n\nclass SMA2 extends SMA {\n static type = OverlayType.Sma2\n}\n\nSMA2.prototype.defaults = { color: '#ff6400' }\n\nexport default SMA2\n","import { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport AverageTrueRange from '../helpers/atr'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n multiplier: number\n uptrendColor: string\n downtrendColor: string\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 7,\n Multiplier: 3.0,\n}\n\nconst COLORS = {\n Uptrend: '#00a000',\n Downtrend: '#c80000',\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const multiplier = parseFloat(values[1]) || DEFAULT_PARAMETERS.Multiplier\n\n return [period, multiplier]\n}\n\nclass Supertrend extends Overlay {\n static type = OverlayType.Str\n static label = 'Supertrend'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt] = parsePeriod(period)\n return periodInt + 1\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, multiplier] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.multiplier = multiplier\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n const { leftOffset, width } = this.model.chart()\n const { period, multiplier } = this.attrs\n const { high, low, close } = this.data\n const atr = new AverageTrueRange(period)\n const finalUpperBand: number[] = []\n const finalLowerBand: number[] = []\n const supertrend: boolean[] = []\n let firstBarToRender\n let lastBarToRender = 0\n\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.uptrendColor)\n for (let i = 1; i < close.length; i++) {\n atr.add(high[i], low[i], close[i - 1])\n\n // compute bands\n const avg = (high[i] + low[i]) / 2\n const upperBand = avg + multiplier * atr.value\n const lowerBand = avg - multiplier * atr.value\n\n finalUpperBand[i] = upperBand\n finalLowerBand[i] = lowerBand\n\n // identify supertrend\n if (close[i] > finalUpperBand[i - 1]) {\n supertrend[i] = true\n } else if (close[i] < finalLowerBand[i - 1]) {\n supertrend[i] = false\n } else {\n supertrend[i] = supertrend[i - 1]\n }\n\n // adjust bands\n if (supertrend[i] && finalLowerBand[i] < finalLowerBand[i - 1]) {\n finalLowerBand[i] = finalLowerBand[i - 1]\n }\n if (!supertrend[i] && finalUpperBand[i] > finalUpperBand[i - 1]) {\n finalUpperBand[i] = finalUpperBand[i - 1]\n }\n\n const x = this.fx(i)\n if (i < period || x + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n if (firstBarToRender === undefined) firstBarToRender = i\n\n if (supertrend[i] && !supertrend[i - 1]) {\n // buy\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalUpperBand[i - 1])))\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\n } else if (supertrend[i]) {\n // keep buying\n context.lineTo(x, Math.round(this.fy(finalLowerBand[i])))\n } else {\n // keep selling\n context.moveTo(x, Math.round(this.fy(finalLowerBand[i])))\n }\n lastBarToRender = i\n }\n context.stroke()\n\n if (firstBarToRender === undefined) {\n context.translate(-0.5, -0.5)\n return\n }\n\n context.beginPath()\n context.set('strokeStyle', this.attrs.downtrendColor)\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const x = this.fx(i)\n if (!supertrend[i] && supertrend[i - 1]) {\n // sell\n context.moveTo(this.fx(i - 1), Math.round(this.fy(finalLowerBand[i - 1])))\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\n } else if (!supertrend[i]) {\n // keep selling\n context.lineTo(x, Math.round(this.fy(finalUpperBand[i])))\n } else {\n // keep buying\n context.moveTo(x, Math.round(this.fy(finalUpperBand[i])))\n }\n }\n context.stroke()\n\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Period',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const multiplier = {\n type: 'number',\n label: 'Period',\n name: 'multiplier',\n value: this.attrs.multiplier ?? DEFAULT_PARAMETERS.Multiplier,\n required: true,\n step: 0.1,\n min: 0.0,\n max: 999,\n }\n\n const uptrendColor = {\n type: 'color',\n label: 'Uptrend Color',\n name: 'uptrendColor',\n value: this.attrs.uptrendColor ?? this.getFreeColor(),\n }\n const downtrendColor = {\n type: 'color',\n label: 'Downtrend Color',\n name: 'downtrendColor',\n value: this.attrs.downtrendColor ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [period, multiplier, uptrendColor, downtrendColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n multiplier: `${multiplier.label} must be a number between ${multiplier.min} and ${multiplier.max}`,\n },\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'multiplier':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'uptrendColor':\n case 'downtrendColor':\n return true\n default:\n return false\n }\n }\n\n getLabelColor(): string {\n return this.attrs.uptrendColor\n }\n\n toString() {\n return `Supertrend ${this.attrs.period},${this.attrs.multiplier}`\n }\n}\n\nSupertrend.prototype.defaults = {\n uptrendColor: COLORS.Uptrend,\n downtrendColor: COLORS.Downtrend,\n}\n\nexport default Supertrend\n","import * as d3 from 'd3'\n\nimport { ChartConfigChartPaneElement, RequireByKey } from '../../types/shared'\nimport { OverlayType } from '../constants/common'\nimport Chart from '../models/chart'\nimport utils from '../utils'\nimport { convertColorToHEX, getHEXWithSpecificAplha } from '../utils/colors'\nimport { getFirstBarToRenderIndex, getLastBarToRenderIndex } from '../utils/draw_in_visible_area'\nimport { getParsedIntegersFromPeriodString } from '../utils/helpers'\nimport Overlay from './overlay'\n\nconst VP_COLORS = {\n UP: '#00FF00',\n DOWN: '#FF0000',\n}\n\nconst DEFAULT_PARAMETERS = {\n Period: 20,\n Opacity: 0.3,\n}\n\ninterface Attrs {\n period: number | string\n opacity: number\n upColor?: string\n downColor?: string\n}\n\nfunction applyOpacityToColor(color: string, opacity: number) {\n return getHEXWithSpecificAplha(convertColorToHEX(color), opacity)\n}\n\nfunction getColorsWithAppliedOpacity(attrs: Attrs) {\n return [\n applyOpacityToColor(attrs.upColor ?? VP_COLORS.UP, attrs.opacity),\n applyOpacityToColor(attrs.downColor ?? VP_COLORS.DOWN, attrs.opacity),\n ]\n}\n\n// Only time when we want value to be able to equal start of segment is first segment,\n// because start of next segment is equal to end of previous and value would match two segments\nfunction isInSegment(val: number, start: number, end: number, notEqualStart: boolean) {\n return (notEqualStart ? val > start : val >= start) && val <= end\n}\n\nfunction parsePeriod(periodStr: string) {\n const values = periodStr.split(',')\n const period = parseInt(values[0]) || DEFAULT_PARAMETERS.Period\n const opacity = parseFloat(values[1]) || DEFAULT_PARAMETERS.Opacity\n\n return [period, opacity]\n}\n\nclass VolumeProfile extends Overlay {\n static type = OverlayType.Vp\n static label = 'Volume Profile'\n\n static getNumOfBarsBuffer({ period }: RequireByKey) {\n const [periodInt = 0] = getParsedIntegersFromPeriodString(period)\n return periodInt + 1 // +1 offsets rendering so it doesn't start on first bar which doesn't look OK in SSR rendered charts\n }\n\n set(obj: Partial) {\n super.set(obj)\n const { period } = obj\n if (typeof period === 'string') {\n const [periodInt, opacity] = parsePeriod(period)\n this.attrs.period = periodInt\n this.attrs.opacity = opacity\n this.trigger('change')\n }\n return this\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n if (typeof this.attrs.period !== 'number') {\n return\n }\n super.renderContent()\n\n const chartModel = this.model.chart() as Chart\n const { leftOffset, width } = chartModel\n const { left, right } = chartModel.getChartLayoutSettings().ChartSettings\n const chartWidth = width - left.width - right.width\n\n if (this.data.close.length === 0) return\n\n const firstBarToRender = getFirstBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n })\n\n const lastBarToRender = getLastBarToRenderIndex({\n quote: this.data,\n scale: this.model.scale,\n leftOffset,\n chartWidth,\n })\n\n const [upColor, downColor] = getColorsWithAppliedOpacity(this.attrs)\n const [minClose, maxClose] = utils.minMax(this.data.close.slice(firstBarToRender, lastBarToRender + 1))\n\n const segment = Math.abs(maxClose - minClose) / this.attrs.period\n const segments = [] // create an empty array to hold the segments\n\n for (let i = 0; i < this.attrs.period; i++) {\n const segmentStart = minClose + segment * i // calculate start of current segment\n const segmentEnd = segmentStart + segment // calculate end of current segment\n segments.push({ start: segmentStart, end: segmentEnd, up: 0, down: 0 }) // add segment to array\n }\n\n // loop through visible bars and assign volumes to segments\n for (let i = firstBarToRender; i <= lastBarToRender; i++) {\n const segmentIndex: number = segments.findIndex((item, segmentIndex) =>\n isInSegment(this.data.close[i], item.start, item.end, !!segmentIndex)\n )\n if (segmentIndex === -1) continue\n const volumeTrend = this.data.close[i] < this.data.open[i] ? 'down' : 'up'\n segments[segmentIndex][volumeTrend] += this.data.volume[i]\n }\n\n const max = utils.max(segments.map((item) => item.up + item.down))\n const rangeMax = chartWidth * 0.4 // maximum range in pixels where longest bar would reach (now it's 40% of chart width)\n const volumeFX = d3.scaleLinear().range([0, rangeMax]).domain([0, max])\n\n segments.forEach((item) => {\n const y = Math.round(this.fy(item.start))\n const segmentHeightRaw = Math.round(this.fy(item.end)) - y // raw segment height without gap between segments\n const segmentHeight = segmentHeightRaw + (Math.abs(segmentHeightRaw) > 5 ? 2 : 1) // apply gap to segment based on how high segment is\n const x = Math.abs(leftOffset) // segments are alligned to left side of chart which equal to absoulute value of leftOffset\n const upSegmentWidth = Math.round(volumeFX(item.up))\n const downSegmentWidth = Math.round(volumeFX(item.down))\n\n context.fillStyle = upColor\n context.fillRect(x, y, upSegmentWidth, segmentHeight)\n context.fillStyle = downColor\n context.fillRect(x + upSegmentWidth, y, downSegmentWidth, segmentHeight)\n })\n }\n\n getModalConfig() {\n const period = {\n type: 'number',\n label: 'Zones',\n name: 'period',\n value: this.attrs.period ?? DEFAULT_PARAMETERS.Period,\n required: true,\n min: 1,\n max: 999999,\n }\n const opacity = {\n type: 'number',\n label: 'Opacity',\n name: 'opacity',\n value: this.attrs.opacity ?? DEFAULT_PARAMETERS.Opacity,\n required: true,\n min: 0,\n max: 1,\n step: 0.1,\n }\n const upColor = {\n type: 'color',\n label: 'Up Color',\n name: 'upColor',\n value: this.attrs.upColor ?? VP_COLORS.UP,\n }\n const downColor = {\n type: 'color',\n label: 'Down Color',\n name: 'downColor',\n value: this.attrs.downColor ?? VP_COLORS.DOWN,\n }\n\n return {\n title: this.label,\n inputs: [period, opacity, upColor, downColor],\n inputsErrorMessages: {\n period: `${period.label} must be a whole number between ${period.min} and ${period.max}`,\n opacity: `${opacity.label} must be a number between ${opacity.min} and ${opacity.max}`,\n },\n }\n }\n\n getIsValid(key: string): boolean {\n switch (key) {\n case 'period':\n return this.getIsNumberInputValid({ key })\n case 'opacity':\n return this.getIsNumberInputValid({ key, integerOnly: false })\n case 'upColor':\n case 'downColor':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n getLabelColor() {\n return this.attrs.upColor || VP_COLORS.UP\n }\n\n toString() {\n return `VP ${this.attrs.period}`\n }\n}\n\nVolumeProfile.prototype.defaults = { upColor: VP_COLORS.UP, downColor: VP_COLORS.DOWN }\n\nexport default VolumeProfile\n","import { OverlayType } from '../constants/common'\nimport PaneModel from '../models/pane'\nimport { dateFromUnixTimestamp } from '../utils'\nimport Overlay from './overlay'\n\ninterface Attrs {\n period: number\n color: string\n}\n\nconst datesAreOnSameDay = (first: Date, second: Date) =>\n first.getFullYear() === second.getFullYear() &&\n first.getMonth() === second.getMonth() &&\n first.getDate() === second.getDate()\n\nclass VWAP extends Overlay {\n static type = OverlayType.Vwap\n static label = 'VWAP (intraday charts)'\n\n static getNumOfBarsBuffer() {\n return 1\n }\n\n constructor(values: Partial, model: PaneModel) {\n super(values, model)\n this.attrs.period = 5\n }\n\n renderContent(context: CanvasRenderingContext2D) {\n super.renderContent()\n if (!this.isRendered()) {\n return\n }\n\n const { leftOffset, width } = this.model.chart()\n context.translate(0.5, 0.5)\n context.beginPath()\n context.set('lineWidth', 1)\n context.set('strokeStyle', this.attrs.color)\n\n let cumulativePV = 0\n let cumulativeVolume = 0\n for (let i = 0; i < this.data.close.length; i++) {\n if (i > 0) {\n const prevDate = dateFromUnixTimestamp(this.data.date[i - 1])\n const date = dateFromUnixTimestamp(this.data.date[i])\n if (!datesAreOnSameDay(prevDate, date)) {\n cumulativePV = 0\n cumulativeVolume = 0\n }\n }\n\n const typicalPrice = (this.data.close[i] + this.data.low[i] + this.data.high[i]) / 3\n const pv = typicalPrice * this.data.volume[i]\n\n cumulativePV += pv\n cumulativeVolume += this.data.volume[i]\n\n const vwap = cumulativePV / cumulativeVolume\n\n const x = this.fx(i)\n if (this.fx(i + 1) + leftOffset < 0) {\n continue\n }\n if (this.fx(i - 1) + leftOffset > width) {\n break\n }\n const y = Math.round(this.fy(vwap))\n context.lineTo(x, y)\n }\n context.stroke()\n context.translate(-0.5, -0.5)\n }\n\n getModalConfig() {\n const color = {\n type: 'color',\n label: 'Color',\n name: 'color',\n value: this.attrs.color ?? this.getFreeColor(),\n }\n\n return {\n title: this.label,\n inputs: [color],\n inputsErrorMessages: {},\n }\n }\n\n getIsValid(key: string) {\n switch (key) {\n case 'color':\n // Some users have wrong colors which break the form validation\n return true\n default:\n return false\n }\n }\n\n isRendered() {\n return this.model.chart().quote().isIntraday\n }\n\n isRenderedOverlaysLabel() {\n return this.isRendered()\n }\n\n toString() {\n return `VWAP`\n }\n}\n\nVWAP.prototype.defaults = { color: '#9467bd' }\n\nexport default VWAP\n","import { OverlayType } from '../constants/common'\nimport bb from './bb'\nimport dch from './dch'\nimport ema from './ema'\nimport ema2 from './ema2'\nimport hilo from './hilo'\nimport hline from './hline'\nimport ic from './ic'\nimport icf from './icf'\nimport kch from './kch'\nimport none from './none'\nimport overlay from './overlay'\nimport patterns from './patterns'\nimport sar from './sar'\nimport sma from './sma'\nimport sma2 from './sma2'\nimport str from './str'\nimport vp from './vp'\nimport vwap from './vwap'\n\nexport const overlaysByType = Object.freeze({\n [OverlayType.Overlay]: overlay,\n [OverlayType.None]: none,\n [OverlayType.Bb]: bb,\n [OverlayType.Dch]: dch,\n [OverlayType.Ema]: ema,\n [OverlayType.Ema2]: ema2,\n [OverlayType.Hilo]: hilo,\n [OverlayType.Hline]: hline,\n [OverlayType.Ic]: ic,\n [OverlayType.Icf]: icf,\n [OverlayType.Kch]: kch,\n [OverlayType.Patterns]: patterns,\n [OverlayType.Sar]: sar,\n [OverlayType.Sma]: sma,\n [OverlayType.Sma2]: sma2,\n [OverlayType.Str]: str,\n [OverlayType.Vp]: vp,\n [OverlayType.Vwap]: vwap,\n})\n","import {\n MOBILE_VIEW_BREAKPOINT_WIDTH,\n PREMARKET_AFTERMARKET_HOURS,\n SpecificChartFunctionality,\n} from './constants/common'\nimport { captureException, getIsSSr } from './utils/helpers'\n\nfunction getIsDstInNy(date: Date) {\n const dayNumber = date.getDate()\n const monthIndex = date.getMonth()\n const dayOfWeek = date.getDay()\n const previousSunday = dayNumber - dayOfWeek\n if (monthIndex < 2 || monthIndex > 10) {\n return false\n }\n if (monthIndex > 2 && monthIndex < 10) {\n return true\n }\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\n}\n\nclass Utils {\n static min(...args: T[]): number {\n if (typeof args[0] === 'number') {\n return args[0] < +args[1] ? args[0] : (args[1] as number)\n }\n let min = args[0][0]\n for (const arg of args) {\n for (const el of arg as number[]) {\n if (el < min) {\n min = el\n }\n }\n }\n return min\n }\n\n static max(...args: T[]): number {\n if (typeof args[0] === 'number') {\n return args[0] > +args[1] ? args[0] : (args[1] as number)\n }\n let max = args[0][0]\n for (const arg of args) {\n for (const el of arg as number[]) {\n if (el > max) {\n max = el\n }\n }\n }\n return max\n }\n\n static minMax(...args: number[][]) {\n let max\n let min = (max = args[0][0] as number)\n for (const arg of args) {\n for (const el of arg) {\n if (el < min) {\n min = el\n }\n if (el > max) {\n max = el\n }\n }\n }\n return [min, max]\n }\n\n static getScaleRatio() {\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\n }\n\n static setSizeOnCanvasElement({\n canvasElement,\n width,\n height,\n ratio = Utils.getScaleRatio(),\n }: {\n canvasElement: HTMLCanvasElement | null\n width: number\n height: number\n ratio?: number\n }) {\n if (canvasElement) {\n canvasElement.width = width * ratio\n canvasElement.height = height * ratio\n canvasElement.style.width = width + 'px'\n canvasElement.style.height = height + 'px'\n }\n }\n\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\n const date = referenceDate || new Date()\n const dateAsNY = new Date(\n date.getUTCFullYear(),\n date.getUTCMonth(),\n date.getUTCDate(),\n date.getUTCHours() - 5,\n date.getUTCMinutes(),\n date.getUTCSeconds()\n )\n const isDst = getIsDstInNy(dateAsNY)\n return (isDst ? 4 : 5) * 60 * 60\n }\n\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\n const date = new Date(referenceDate)\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\n const offsetDirectionCoefficient = addOffset ? 1 : -1\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\n return date\n }\n\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\n const MARKET_START = { hours: 9, minutes: 30 }\n const MARKET_END = { hours: 16, minutes: 0 }\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\n\n const date = convertLocalToNyTime(new Date(), true)\n const dayOfWeek = date.getDay()\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\n\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\n\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\n return !isWeekend && isOpen && !isClosed\n }\n\n static dateFromUnixTimestamp(timestamp: number) {\n /*\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\n * The function adds seconds to the date instance if it exceeds 60.\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\n * */\n const date = new Date(0)\n date.setUTCSeconds(timestamp)\n return Utils.convertLocalToNyTime(date, true)\n }\n\n static dateStringFromDate(date: Date) {\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\n 2,\n '0'\n )}`\n }\n\n static dateFromDateString(dateString: string) {\n const [yyyy, mm, dd] = dateString.split('-')\n\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\n if (Number.isNaN(date.getTime())) {\n captureException(new Error('Invalid Date'), { extra: { date } })\n }\n\n return date\n }\n\n static isMobile(testTouchPoints?: boolean) {\n if (getIsSSr()) return false\n let isMobileOs = false\n\n // New iOS versions no longer report iPad in user agent\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\n try {\n document.createEvent('TouchEvent')\n isMobileOs = true\n } catch (e) {}\n } else {\n isMobileOs = !!navigator.userAgent.match(\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\n )\n }\n\n if (testTouchPoints) {\n try {\n return (\n isMobileOs &&\n (window.navigator.msMaxTouchPoints ||\n window.navigator.maxTouchPoints ||\n 'ontouchstart' in document.createElement('div'))\n )\n } catch (e) {}\n }\n\n return isMobileOs\n }\n\n static isIPad() {\n const matchesIPad = navigator.userAgent.match(/iPad/i)\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\n const matchesIPod = navigator.userAgent.match(/iPod/i)\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\n\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\n }\n\n static getCookie(name: string) {\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\n return document.cookie.replace(re, '$1')\n }\n\n static setCookie(name: string, value: string, expires: Date) {\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\n if (document.location.hostname !== 'localhost') {\n cookie += '; domain=.finviz.com'\n }\n document.cookie = cookie\n }\n}\n\nexport default Utils\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\nexport const dateStringFromDate = Utils.dateStringFromDate\nexport const dateFromDateString = Utils.dateFromDateString\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const getSanitizedTicker = (...args) => window.FLibs.getSanitizedTicker(...args)\n\nexport function getFullscreenStatus(): boolean {\n return (\n document.fullscreenElement ??\n document.webkitFullscreenElement ??\n document.mozFullScreenElement ??\n document.msFullscreenElement ??\n false\n )\n}\n\nexport function getRequestFullscreen(element: HTMLElement) {\n return (\n element.requestFullscreen ??\n element.webkitRequestFullScreen ??\n element.mozRequestFullScreen ??\n element.msRequestFullscreen\n )\n}\n\nexport function getExitFullscreen() {\n return (\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\n )\n}\n\nexport function ready(fn: () => void) {\n if (document.readyState !== 'loading') {\n fn()\n return\n }\n\n document.addEventListener('DOMContentLoaded', fn)\n}\n\nexport function getChartsDimensions(chartElementId: string) {\n const PADDING = 2 // Border widths\n const containerElement = document.getElementById(chartElementId)\n\n const box = containerElement?.getBoundingClientRect()\n\n return {\n width: Math.max((box?.width ?? 0) - PADDING, 0),\n height: Math.max((box?.height ?? 0) - PADDING, 0),\n }\n}\n\nexport function getIsMobileScreenSize() {\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\n}\n\nexport function getIsMobilePortrait(isMobile?: boolean) {\n if (isMobile ?? Utils.isMobile()) {\n return window.orientation % 180 === 0\n }\n return false\n}\n\nexport function numberToStringWithUnitsSuffix(value: number) {\n let suffix = ''\n if (value >= 1000000000) {\n value /= 1000000000\n suffix = 'B'\n } else if (value >= 1000000) {\n value /= 1000000\n suffix = 'M'\n } else if (value >= 1000) {\n value /= 1000\n suffix = 'K'\n }\n\n return value.toFixed(2) + suffix\n}\n\nexport function isRedesignEnabled() {\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\n}\n\nexport function isRedesignedPage(\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\n matchingPages = [\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.cryptoPage,\n ]\n) {\n return (\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\n // Legacy design on quote uses redesigned elements (page header + chart controls)\n obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\n )\n}\n","import { ObjectHash } from '../../types/shared'\n\nconst requestsAbortControllersCache: ObjectHash = {}\n\nexport function removeFromAbortCache(key: string) {\n delete requestsAbortControllersCache[key]\n}\n\nexport function abortRequest(key: string) {\n requestsAbortControllersCache[key]?.abort()\n removeFromAbortCache(key)\n}\n\nexport function getIsAbortError(error: Error) {\n return error.name === 'AbortError'\n}\n\nexport function createRequestAbortController({\n key,\n shouldAbortRunningRequest = false,\n}: {\n key: string\n shouldAbortRunningRequest?: boolean\n}) {\n if (shouldAbortRunningRequest) {\n abortRequest(key)\n }\n const controller = 'AbortController' in window ? new AbortController() : undefined\n if (controller) {\n requestsAbortControllersCache[key] = controller\n }\n return controller\n}\n","import websiteShared from '../website-shared'\nimport { captureException } from './helpers'\n\n/**\n * Hook used to asynchronously load a module\n *\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#useasyncmodule)\n */\nexport const useAsyncModule = (props: {\n importFn: () => Promise\n onError?: () => void\n cacheKey: string\n captureException?: (exception: Error, captureContext?: { extra: Record }) => void\n errorSeverity?: 'medium' | 'high'\n shouldLoadModule?: boolean\n isSuspenseMode?: SuspenseMode\n}) =>\n // @ts-expect-error - We intentionaly want to make this private so that it doesn’t show up as suggested import\n websiteShared.useAsyncModule({ captureException, ...props }) as [\n SuspenseMode extends true ? T : T | null,\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\n ]\n","import { Theme } from '../../types/shared'\nimport twColors from '../constants/colors'\nimport { ChartEventType } from '../constants/common'\nimport math, { BIG_NUMBER_VALUES, BigNumber } from '../helpers/math'\nimport utils from '../utils'\nimport { formatDateToStringUS } from '../utils/helpers'\n\ninterface IChartEventBase {\n elementId: string\n eventType: ChartEventType\n dateTimestamp: number // represent 'earningsDate' column of earnings and 'exdate' column for dividends & split\n}\n\nexport interface IEarnings extends IChartEventBase {\n epsActual?: number\n epsEstimate?: number\n epsReportedActual?: number\n epsReportedEstimate?: number\n fiscalEndDate: number\n fiscalPeriod: string\n salesActual?: number\n salesEstimate?: number\n}\n\nexport interface IDividends extends IChartEventBase {\n ordinary: number\n special: number\n}\n\nexport interface ISplit extends IChartEventBase {\n factorFrom: number\n factorTo: number\n}\n\nexport enum ChartEventBadgeState {\n default = 'default',\n hover = 'hover',\n selected = 'selected',\n}\n\nexport interface IChartEventBadgeProps {\n theme: Theme\n state: ChartEventBadgeState\n width: number\n}\n\ninterface IGetChartEventBadgeColors {\n theme: Theme\n state: ChartEventBadgeState\n colors: IBadgeColors\n}\n\ninterface IBadgeStateColors {\n default: string\n hover: string\n selected: string\n}\n\ninterface IBadgeThemeColors {\n outerStroke: string\n innerStroke: string\n innerFill: IBadgeStateColors\n textFill: IBadgeStateColors\n}\n\ninterface IBadgeColors {\n light: IBadgeThemeColors\n dark: IBadgeThemeColors\n}\n\nexport function getChartEventBadgeColors({ theme, state, colors }: IGetChartEventBadgeColors) {\n return {\n outerStroke: colors[theme].outerStroke,\n innerStroke: colors[theme].innerStroke,\n innerFill: colors[theme].innerFill[state],\n textFill: colors[theme].textFill[state],\n }\n}\n\nexport function getFormattedEventDate(\n exdate: number,\n hasEarningsDateSuffix = false,\n options: ObjectHash = {\n month: 'short',\n }\n) {\n const parsedDate = utils.dateFromUnixTimestamp(exdate)\n\n const hours = parsedDate.getHours()\n const formattedDate = formatDateToStringUS(parsedDate, options)\n\n if (hasEarningsDateSuffix) {\n let suffix = ''\n\n if (hours <= 9) {\n suffix = 'BMO'\n } else if (hours >= 16) {\n suffix = 'AMC'\n }\n\n return `${formattedDate} ${suffix}`\n }\n\n return formattedDate\n}\n\nexport function getFormattedValue({\n value,\n bigNumberUnit,\n maxDecimalPlaces = 3,\n}: {\n value: number\n bigNumberUnit?: BigNumber\n maxDecimalPlaces?: number\n}) {\n let numberString = ''\n let suffix = ''\n\n if (bigNumberUnit === undefined) {\n numberString = math.round({ value, overridePlaces: 3 })\n } else {\n const bigNumber = math.formatBigNumber(value * BIG_NUMBER_VALUES[bigNumberUnit], 3, BigNumber.Million)\n numberString = parseFloat(bigNumber.substring(0, bigNumber.length - 1)).toString() // parseFloat with toString are removing trailing zeroes\n suffix = bigNumber.substring(bigNumber.length - 1)\n }\n\n const [wholeNumber, decimalNumber] = numberString.split('.')\n\n if (decimalNumber === undefined) return `${wholeNumber}${suffix}`\n\n let formattedDecimalNumber = decimalNumber\n if (maxDecimalPlaces === 2 || decimalNumber[decimalNumber.length - 1] === '0') {\n formattedDecimalNumber = decimalNumber.slice(0, -1)\n }\n\n return `${[wholeNumber, formattedDecimalNumber].join('.')}${suffix}`\n}\n\nexport function getChartEventBageColors(colorKey: 'violet' | 'blue' | 'red' | 'gray' | 'purple' | 'green') {\n return {\n light: {\n outerStroke: twColors.white,\n innerStroke: twColors[colorKey][400],\n innerFill: {\n default: twColors[colorKey][50],\n hover: twColors[colorKey][100],\n selected: twColors[colorKey][400],\n },\n textFill: {\n default: twColors[colorKey][500],\n hover: twColors[colorKey][600],\n selected: twColors.white,\n },\n },\n dark: {\n outerStroke: twColors.gray[900],\n innerStroke: twColors[colorKey][400],\n innerFill: {\n default: twColors[colorKey][800],\n hover: twColors[colorKey][600],\n selected: twColors[colorKey][400],\n },\n textFill: {\n default: twColors.white,\n hover: twColors.white,\n selected: twColors.white,\n },\n },\n } as IBadgeColors\n}\n","import * as dateFns from 'date-fns'\n\nimport { ChartConfigChartPane, Instrument, ObjectHash } from '../../types/shared'\nimport Line from '../canvas/line'\nimport Text from '../canvas/text'\nimport { chartsByType } from '../charts/charts'\nimport {\n CRYPTOS,\n ChartEditorEnum,\n ChartElementType,\n OFFSET,\n PADDING,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TIMEFRAME_SECONDS,\n TextBaseline,\n} from '../constants/common'\nimport { getPercentageFromValue } from '../controllers/renderUtils'\nimport math from '../helpers/math'\nimport ChartLayoutModel from '../models/chart_layout'\nimport { IChartSettings } from '../models/chart_settings/interfaces'\nimport { Mouse } from '../models/mouse'\nimport Pane from '../models/pane'\nimport Quote, { QuoteGetParams } from '../models/quote'\nimport { getChartLayoutSettings } from '../models/settings'\nimport Utils, { dateFromUnixTimestamp } from '../utils'\nimport { FetchFunc } from './fetch_api'\nimport { captureException } from './helpers'\n\nconst DAY_IN_SECONDS = 86400\nconst TWO_MIN_IN_MS = 2 * 60 * 1000\nconst virtualDatesCache: ObjectHash<{\n fromSeconds: number\n toSeconds: number\n lastUsed: number\n virtualDates: number[]\n}> = {}\n\n// The reason to use this func instead of dateFns.isSameDay is performance as this is way faster\nfunction areTimestampsFromSameDay({ ts1, ts2 }: { ts1: number; ts2: number }) {\n const ts1Utc = ts1\n const ts2Utc = ts2\n return Math.floor(ts1Utc / DAY_IN_SECONDS) === Math.floor(ts2Utc / DAY_IN_SECONDS)\n}\n\nfunction getVirtualDatesCacheId({\n idRevision,\n ticker,\n timeframe,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n}) {\n return `${ticker}-${timeframe}-${idRevision}`\n}\n\nfunction getCachedVirtualDates({\n idRevision,\n ticker,\n timeframe,\n fromSeconds,\n toSeconds,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n fromSeconds: number\n toSeconds: number\n}) {\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\n const cache = virtualDatesCache[id]\n if (cache?.fromSeconds <= fromSeconds && cache?.toSeconds >= toSeconds) {\n cache.lastUsed = Date.now()\n if (cache.fromSeconds === fromSeconds && cache.toSeconds === toSeconds) {\n return cache.virtualDates\n }\n return cache.virtualDates.filter(\n (virtualDateSeconds) => virtualDateSeconds >= fromSeconds && virtualDateSeconds <= toSeconds\n )\n }\n return null\n}\n\nfunction checkVirtualCacheSize() {\n const now = Date.now()\n Object.keys(virtualDatesCache).forEach((virtualDatesCacheId) => {\n if (virtualDatesCache[virtualDatesCacheId].lastUsed < now - TWO_MIN_IN_MS) {\n delete virtualDatesCache[virtualDatesCacheId]\n }\n })\n}\n\nfunction setCachedVirtualDates({\n idRevision,\n ticker,\n timeframe,\n fromSeconds,\n toSeconds,\n virtualDates,\n}: {\n idRevision: number\n ticker: string\n timeframe: string\n fromSeconds: number\n toSeconds: number\n virtualDates: number[]\n}) {\n const id = getVirtualDatesCacheId({ idRevision, ticker, timeframe })\n checkVirtualCacheSize()\n virtualDatesCache[id] = {\n fromSeconds,\n toSeconds,\n virtualDates,\n lastUsed: Date.now(),\n }\n}\n\nconst MAX_BAR_BORDER_WIDTH = 1\nconst MIN_BAR_MARGIN_WIDTH = 0\nconst MAX_BAR_MARGIN_WIDTH = 16\n\nexport function getBarWidthWithMarginByParts({\n zoomFactor = 1,\n chartLayout,\n}: {\n zoomFactor?: number\n chartLayout: ChartLayoutModel\n}) {\n const { ChartSettings } = chartLayout.settings\n const settingsCenter = ChartSettings.center\n const barMargin =\n zoomFactor > 1 && settingsCenter.barMargin === 0\n ? Math.min(settingsCenter.barWidth, 1 - 1 / zoomFactor)\n : settingsCenter.barMargin\n\n const barFillWidth = settingsCenter.barWidth * zoomFactor\n const barBorderWidth = Math.min(settingsCenter.border * zoomFactor, MAX_BAR_BORDER_WIDTH)\n const barMarginWidth = Math.max(MIN_BAR_MARGIN_WIDTH, Math.min(barMargin * zoomFactor, MAX_BAR_MARGIN_WIDTH))\n\n return {\n barFillWidth,\n barBorderWidth,\n barMarginWidth,\n }\n}\n\nexport function getBarWidthWithMargin({\n zoomFactor = 1,\n chartLayout,\n shouldRound = true,\n}: {\n zoomFactor?: number\n chartLayout: ChartLayoutModel\n shouldRound?: boolean\n}) {\n const { barFillWidth, barBorderWidth, barMarginWidth } = getBarWidthWithMarginByParts({ zoomFactor, chartLayout })\n\n const barWidth = barFillWidth + barBorderWidth * 2 + barMarginWidth\n if (!shouldRound) {\n return barWidth\n }\n const roundDecimalPlaces = barWidth > 100 ? 10 : 10000\n return Math.round(barWidth * roundDecimalPlaces) / roundDecimalPlaces\n}\n\nconst DEFAULT_ZOOM_GUESS_INCREMENT = 0.001\n\nconst zoomFactorForBarsToDisplayCache: ObjectHash = {}\nconst zoomFactorForBarsToDisplayCacheKeys: string[] = []\nconst NUMBER_OF_CACHED_ZOOM_FACTORS = 10\nconst getZoomFactorFromCache = (key: string) => zoomFactorForBarsToDisplayCache[key] ?? null\nconst setZoomFactorToCache = (key: string, value: number) => {\n if (!zoomFactorForBarsToDisplayCacheKeys.includes(key)) {\n zoomFactorForBarsToDisplayCacheKeys.unshift(key)\n if (zoomFactorForBarsToDisplayCacheKeys.length > NUMBER_OF_CACHED_ZOOM_FACTORS) {\n const poppedKey = zoomFactorForBarsToDisplayCacheKeys.pop()\n if (poppedKey) {\n delete zoomFactorForBarsToDisplayCache[poppedKey]\n }\n }\n }\n\n zoomFactorForBarsToDisplayCache[key] = value\n}\n\nexport function getZoomFactorForBarsToDisplay({\n chartVisibleWidth,\n numOfVisibleBars,\n chartLayout,\n}: {\n chartVisibleWidth: number\n numOfVisibleBars: number\n chartLayout: ChartLayoutModel\n}) {\n const defaultBarWidthWithMargin = getBarWidthWithMargin({ chartLayout })\n const barWidthWithMargin = chartVisibleWidth / numOfVisibleBars\n const cacheKey = `${defaultBarWidthWithMargin}-${barWidthWithMargin}`\n let zoomIncrement = 0\n let currentZoomFactor = 1\n let finalZoomFactor = getZoomFactorFromCache(cacheKey)\n let iteration = 0\n if (barWidthWithMargin <= defaultBarWidthWithMargin) {\n finalZoomFactor = barWidthWithMargin / defaultBarWidthWithMargin\n }\n while (finalZoomFactor === null) {\n iteration += 1\n const threshold = 0.01\n currentZoomFactor += zoomIncrement\n const barWidth = getBarWidthWithMargin({ zoomFactor: currentZoomFactor, chartLayout, shouldRound: false })\n const barWidthDiff = barWidthWithMargin - barWidth\n if (barWidthDiff > threshold) {\n zoomIncrement = zoomIncrement > 0 ? zoomIncrement * 2 : DEFAULT_ZOOM_GUESS_INCREMENT\n } else if (barWidthDiff < -threshold) {\n zoomIncrement = zoomIncrement < 0 ? zoomIncrement * 2 : -DEFAULT_ZOOM_GUESS_INCREMENT\n } else {\n finalZoomFactor = currentZoomFactor\n }\n\n if (iteration === 1000) {\n captureException(new Error('Invalid zoom factor from getZoomFactorForBarsToDisplay'), {\n extra: {\n iteration,\n zoomIncrement,\n barWidthWithMargin,\n barWidth,\n barWidthDiff,\n currentZoomFactor,\n chartLayout: chartLayout.toConfig(['colors', 'panes']),\n },\n })\n return currentZoomFactor\n }\n }\n\n setZoomFactorToCache(cacheKey, finalZoomFactor)\n\n return finalZoomFactor\n}\n\nexport function getTimeframeSeconds({\n lowerIndex,\n dates,\n timeframe,\n}: {\n lowerIndex: number\n dates: number[]\n timeframe: TIMEFRAME\n}) {\n const upperIndex = lowerIndex + 1\n const areBoundsDefined = ![dates[upperIndex], dates[lowerIndex]].some((index) => index === undefined)\n return areBoundsDefined ? dates[upperIndex] - dates[lowerIndex] : TIMEFRAME_SECONDS[timeframe]\n}\n\nfunction getVirtualTradedDays({\n dateStartSeconds,\n dateEndSeconds,\n datesSeconds,\n marketStartMinutes,\n}: {\n dateStartSeconds: number\n dateEndSeconds: number\n datesSeconds: number[]\n marketStartMinutes: number\n}) {\n const dateStart = dateFromUnixTimestamp(dateStartSeconds)\n const dateEnd = dateFromUnixTimestamp(dateEndSeconds)\n const isStartBeforeDates = dateStartSeconds < datesSeconds[0]\n const isEndAfterDates = datesSeconds.length > 0 && datesSeconds[datesSeconds.length - 1] < dateEndSeconds\n const firstDate = dateFromUnixTimestamp(datesSeconds[0])\n const lastDate = dateFromUnixTimestamp(datesSeconds[datesSeconds.length - 1])\n return dateFns\n .eachDayOfInterval({\n start:\n isStartBeforeDates && (dateFns.isWeekend(dateStart) || dateStart.getMinutes() < marketStartMinutes)\n ? dateFns.addBusinessDays(dateStart, -1)\n : dateStart,\n end: isEndAfterDates ? dateFns.addBusinessDays(dateEnd, 1) : dateEnd,\n })\n .filter((date) => {\n const ts2 = date.getTime() / 1000 - date.getTimezoneOffset() * 60\n return (\n !dateFns.isWithinInterval(date, { start: dateFns.startOfDay(firstDate), end: dateFns.endOfDay(lastDate) }) ||\n datesSeconds.some((dateTime) =>\n areTimestampsFromSameDay({\n ts1: dateTime - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateTime * 1000)),\n ts2,\n })\n )\n )\n })\n}\n\nexport function getVirtualTimeframeTradedDates({\n dateStart,\n dateEnd,\n quote,\n}: {\n dateStart: number\n dateEnd: number\n quote: Quote\n}) {\n const { date: dates, ticker, timeframe, instrument, isIntraday, marketStartMinutes } = quote\n const barsInDay = quote.getBarsInDay() ?? 0\n\n // Currently we're passing first and last quote dates to dateStart / dateEnd so this is always true\n // but this function can be used on other places in the future where it will work with dates out of quote dates range\n const isWithinRangeOfQuoteDate = dateStart === dates[0] && dateEnd === dates[dates.length - 1]\n\n const commonVirtualCacheProps = {\n idRevision: dates.length,\n ticker,\n timeframe,\n fromSeconds: dateStart,\n toSeconds: dateEnd,\n }\n const cachedDates = getCachedVirtualDates(commonVirtualCacheProps)\n if (cachedDates) {\n return cachedDates\n }\n if (!isIntraday || instrument !== Instrument.Stock) {\n if (isWithinRangeOfQuoteDate) {\n return dates\n }\n const timeframeSeconds = TIMEFRAME_SECONDS[timeframe]\n const firstDate = dates[0]\n const lastDate = dates[dates.length - 1]\n const numOfDatesBefore = Math.ceil((firstDate - dateStart) / timeframeSeconds)\n const numOfDatesAfter = Math.ceil((dateEnd - lastDate) / timeframeSeconds)\n return [\n ...Array.from({ length: numOfDatesBefore })\n .map((_, index) => firstDate - (index + 1) * timeframeSeconds)\n .reverse(),\n ...dates,\n ...Array.from({ length: numOfDatesAfter }).map((_, index) => lastDate + (index + 1) * timeframeSeconds),\n ]\n }\n\n const virtualTradedDays = isWithinRangeOfQuoteDate\n ? quote.getDaysInQuote()\n : getVirtualTradedDays({\n dateStartSeconds: dateStart,\n dateEndSeconds: dateEnd,\n datesSeconds: dates,\n marketStartMinutes,\n })\n\n const marketStartSeconds = marketStartMinutes * 60\n const barTimeframeSeconds = Array.from({ length: barsInDay }).map((_, i) => i * TIMEFRAME_SECONDS[timeframe])\n const quoteDatesTimestampOffset = Utils.getQuoteDateTimestampOffsetInSeconds(new Date(dateStart * 1000))\n const virtualDates = virtualTradedDays.flatMap((date) => {\n const daySeconds =\n date.getTime() / 1000 + Utils.getQuoteDateTimestampOffsetInSeconds(date) - date.getTimezoneOffset() * 60\n const dayStartSeconds = daySeconds + marketStartSeconds\n return barTimeframeSeconds.map(\n // Hourly market starts at 9:30 but all other time ticks should be rounded down to :00 of the current hour\n (barSeconds, index) =>\n ([TIMEFRAME.h, TIMEFRAME.h2, TIMEFRAME.h4].includes(timeframe) && index > 0 ? -1800 : 0) +\n dayStartSeconds +\n barSeconds\n )\n })\n\n if (!isWithinRangeOfQuoteDate) {\n virtualDates.filter((date, index, virtualTimeframeTradedDates) => {\n const isLowerBounded =\n date >= dateStart ||\n areTimestampsFromSameDay({\n ts1: date - Utils.getQuoteDateTimestampOffsetInSeconds(new Date(date * 1000)),\n ts2: dateStart - quoteDatesTimestampOffset,\n })\n const isOneBeforeLowerBoundStarts = dateStart > date && dateStart < virtualTimeframeTradedDates[index + 1]\n return isLowerBounded || isOneBeforeLowerBoundStarts\n })\n }\n\n setCachedVirtualDates({\n ...commonVirtualCacheProps,\n virtualDates,\n })\n\n return virtualDates\n}\n\ninterface TimestampPositionGettersProps {\n quote: Quote\n}\n\nexport function getTimestampFromPositionX({ positionX, quote }: TimestampPositionGettersProps & { positionX: number }) {\n const { date, timeframe } = quote\n const dates = getVirtualTimeframeTradedDates({\n dateStart: date[0],\n dateEnd: date[date.length - 1],\n quote,\n })\n const dateStart = dates[0]\n const dateEnd = dates[dates.length - 1]\n const lastDateIndex = dates.length - 1\n if (positionX >= 0 && positionX <= lastDateIndex) {\n const lowerIndex = Math.floor(positionX)\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex, dates, timeframe })\n return dates[lowerIndex] + (positionX - lowerIndex) * timeframeSeconds\n }\n const isLookingBack = positionX < 0\n const averageBarDate = (dateEnd - dateStart) / dates.length\n const numOfSecondsOutOfBounds = isLookingBack\n ? Math.abs(positionX) * averageBarDate\n : (positionX - lastDateIndex) * averageBarDate\n return ~~(isLookingBack ? dateStart - numOfSecondsOutOfBounds : dateEnd + numOfSecondsOutOfBounds)\n}\n\nexport function getPositionXFromTimestamp({ timestamp, quote }: TimestampPositionGettersProps & { timestamp: number }) {\n const { date, timeframe } = quote\n const dates = getVirtualTimeframeTradedDates({\n dateStart: date[0],\n dateEnd: date[date.length - 1],\n quote,\n })\n const dateStart = dates[0]\n const dateEnd = dates[dates.length - 1]\n const lastDateIndex = dates.length - 1\n if (timestamp >= dates[0] && timestamp <= dates[dates.length - 1]) {\n const upperIndex = timestamp === dateEnd ? lastDateIndex : dates.findIndex((date) => date > timestamp)\n const timeframeSeconds = getTimeframeSeconds({ lowerIndex: upperIndex - 1, dates, timeframe })\n const positionDiffUpperTimestamp = (dates[upperIndex] - timestamp) / timeframeSeconds\n return upperIndex - positionDiffUpperTimestamp\n }\n const isLookingBack = timestamp < dateStart\n const averageBarDate = (dateEnd - dateStart) / dates.length\n return isLookingBack\n ? -((dateStart - timestamp) / averageBarDate)\n : lastDateIndex + (timestamp - dateEnd) / averageBarDate\n}\n\n// counterpart in Finviz-Website 'Finviz-Website/js/main/util.ts'\nexport function getInstrument(tickerRaw: string) {\n if (tickerRaw.indexOf('@') === 0) {\n const ticker = tickerRaw.substring(1) as keyof typeof CRYPTOS\n\n if (CRYPTOS[ticker]) {\n return Instrument.Crypto\n } else if (ticker.length === 6) {\n return Instrument.Forex\n } else {\n return Instrument.Futures\n }\n }\n return Instrument.Stock\n}\n\nexport function getPerfIndicatorTickerAndTimeframes({\n paneWithPerfIndicator,\n timeframe,\n}: {\n paneWithPerfIndicator: ChartConfigChartPane\n timeframe: TIMEFRAME\n}) {\n const { elements } = paneWithPerfIndicator\n const perfIndicatorElement = elements.find(({ type }) => type === 'indicators/perf')\n const tickers = perfIndicatorElement?.period?.split(',') ?? []\n return tickers.map((ticker) => ({\n ticker,\n instrument: getInstrument(ticker),\n timeframe,\n }))\n}\n\ninterface PrefetchPerfIndicatorAllQuotesProps extends Pick {\n paneWithPerfIndicator: ChartConfigChartPane\n fetchFunc?: FetchFunc\n chartUuid?: string\n}\n\nexport async function prefetchPerfIndicatorAllQuotes({\n paneWithPerfIndicator,\n timeframe,\n fetchFunc,\n options,\n chartUuid,\n}: PrefetchPerfIndicatorAllQuotesProps) {\n const tickersAndTimeframes = getPerfIndicatorTickerAndTimeframes({ paneWithPerfIndicator, timeframe })\n\n if (tickersAndTimeframes.length > 0) {\n const promises = tickersAndTimeframes.map(({ ticker, instrument, timeframe }) =>\n Quote.get({\n ticker,\n instrument,\n timeframe,\n options,\n fetchFunc,\n chartUuid,\n })\n )\n return Promise.all(promises)\n }\n return Promise.resolve([])\n}\n\ninterface RenderCrossProps {\n context: CanvasRenderingContext2D\n mouseModel: Mouse\n paneModel: Pane\n quote: Quote\n contentWidth: number\n contentHeight: number\n onRenderCrossText?: (context: CanvasRenderingContext2D, crossIndex: number) => void\n getRoundDecimalPlaces?: (price?: number) => number | undefined\n isIndicator?: boolean\n isPerfIndicator?: boolean\n}\n\nexport function renderCross({\n context,\n mouseModel,\n paneModel,\n quote,\n contentWidth,\n contentHeight,\n onRenderCrossText,\n getRoundDecimalPlaces,\n isIndicator = false,\n isPerfIndicator = false,\n}: RenderCrossProps) {\n const crossIndex = mouseModel.getCrossIndexForPane(paneModel)\n const chartModel = paneModel.chart()\n const { ChartSettings, IndicatorSettings } = getChartLayoutSettings(chartModel.chart_layout())\n const settings = isIndicator ? IndicatorSettings : ChartSettings\n const { Colors } = ChartSettings.general\n\n if (!mouseModel.getShouldRenderCrossInPane(paneModel)) {\n return false\n }\n\n const price = mouseModel.getPriceForPane(paneModel)\n const middle = paneModel.scale.x(crossIndex) + chartModel.leftOffset\n const isXAxisInView = middle > 0 && middle <= contentWidth\n if (isXAxisInView) {\n const x = middle + settings.left.width\n new Line(\n {\n x1: x,\n x2: x,\n y1: settings.top.height,\n y2: settings.top.height + contentHeight,\n strokeStyle: Colors.cross,\n },\n paneModel\n ).render(context)\n\n onRenderCrossText?.(context, crossIndex)\n }\n\n const domainRange = paneModel.scale.y\n .domain()\n .slice()\n .sort((a, b) => a - b)\n\n if (price === null || !(domainRange[0] <= price && price <= domainRange[1])) {\n return isXAxisInView\n }\n\n const priceFy = paneModel.scale.y(price)\n const y = Math.round(priceFy + settings.top.height)\n new Line(\n {\n x1: settings.left.width,\n x2: settings.left.width + contentWidth,\n y1: y,\n y2: y,\n strokeStyle: Colors.cross,\n },\n paneModel\n ).render(context)\n const YAxisLeftMargin = quote.instrument === Instrument.Crypto && quote.lastClose <= 0.001 ? 3 : 8\n\n const getCrossText = () => {\n if (chartModel.scale === ScaleType.Percentage && !isIndicator) {\n return `${math.round({\n value: getPercentageFromValue({ number: price, base: chartModel.firstBarClose }),\n lastClose: quote.lastClose,\n instrument: quote.instrument,\n overridePlaces: 2,\n })}%`\n }\n return `${math.round({\n value: price,\n lastClose: quote.lastClose,\n instrument: quote.instrument,\n overridePlaces: getRoundDecimalPlaces?.(price) ?? (paneModel.getIsChartPane() ? undefined : 2),\n })}${isPerfIndicator ? '%' : ''}`\n }\n\n new Text(\n {\n text: getCrossText(),\n x:\n settings.left.width +\n settings.right.axis.margin.left! +\n contentWidth +\n (isIndicator ? OFFSET.S : YAxisLeftMargin - PADDING.XXS),\n padding: isIndicator\n ? Text.getMergedPropsWithDefaults('padding', IndicatorSettings.right.axis.font.padding)\n : {\n top: PADDING.XXS,\n right: PADDING.XXS,\n bottom: PADDING.XXS,\n left: PADDING.XXS,\n },\n ...{\n y,\n textBaseline: TextBaseline.middle,\n fillStyle: Colors.crossText,\n background: Colors.crossTextBackground,\n font: Text.getMergedPropsWithDefaults('font', { ...settings.right.axis.font, style: 'bold' }),\n lineHeight: settings.right.axis.font.lineHeight,\n },\n },\n paneModel\n ).render(context)\n\n return true\n}\n\n/**\n * Set canvas width and height to 0 which fixes Safari memory problems\n *\n * @see https://stackoverflow.com/questions/52532614/total-canvas-memory-use-exceeds-the-maximum-limit-safari-12\n */\nexport function unmountCanvas(canvas?: HTMLCanvasElement | null) {\n if (!canvas) return\n\n canvas.width = 0\n canvas.height = 0\n canvas.style.width = '0px'\n canvas.style.height = '0px'\n}\n\nexport function getChangeColor({ change, ChartSettings }: { change: number; ChartSettings: IChartSettings }) {\n const { Colors } = ChartSettings.general\n if (change === 0) {\n return Colors.zeroChange\n }\n return change > 0 ? Colors.positiveChange : Colors.negativeChange\n}\n\nexport function round({ data, num, overridePlaces }: { data: Quote; num: number; overridePlaces?: number }) {\n return math.round({\n value: num,\n lastClose: data.lastClose,\n instrument: data.instrument,\n overridePlaces: overridePlaces,\n })\n}\n\nexport interface ITickerChange {\n points: number\n string: string\n percentString: string\n}\ninterface ITickerChangeResult {\n tickerChange: ITickerChange | null\n tickerAfterChange: ITickerChange | null\n}\n\nexport function getTickerChangeFromCloseValues({\n anchorClose,\n prevClose,\n data,\n}: {\n anchorClose: number\n prevClose: number\n data: Quote\n}): ITickerChange {\n const changePoints = anchorClose - prevClose\n const changePercent = (anchorClose / prevClose - 1) * 100\n const changePercentString = `${round({\n data,\n num: Math.abs(changePercent),\n overridePlaces: 2,\n })}%`\n const changePointsString = `${changePoints > 0 ? '+' : ''}${round({\n data,\n num: changePoints,\n })} (${changePercentString})`\n\n return {\n points: changePoints,\n string: changePointsString,\n percentString: `${changePoints > 0 ? '+' : ''}${changePoints < 0 ? '-' : ''}${changePercentString}`,\n }\n}\nexport function getTickerChange({ data }: { data: Quote }) {\n const result: ITickerChangeResult = { tickerChange: null, tickerAfterChange: null }\n const isChange = Number.isFinite(data.prevClose) // if not new stock always present\n if (isChange) {\n result.tickerChange = getTickerChangeFromCloseValues({\n data,\n anchorClose: data.lastClose,\n prevClose: data.prevClose,\n })\n }\n\n const isAfterChange = Number.isFinite(data.afterClose) && data.afterClose !== data.lastClose\n if (isAfterChange) {\n const tickerAfterChange = getTickerChangeFromCloseValues({\n data,\n anchorClose: data.afterClose,\n prevClose: data.lastClose,\n })\n result.tickerAfterChange = {\n ...tickerAfterChange,\n string: `AH: ${tickerAfterChange.string}`,\n }\n }\n\n return result\n}\n\nexport function isForexFuturesCryptoPage(specificChartFunctionality: SpecificChartFunctionality) {\n return [\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.cryptoPage,\n SpecificChartFunctionality.futuresPage,\n ].includes(specificChartFunctionality)\n}\n\nexport function getShouldUseDarkerWickColors({\n specificChartFunctionality,\n totalBarWidth,\n}: {\n specificChartFunctionality: SpecificChartFunctionality\n timeFrame?: TIMEFRAME\n totalBarWidth: number\n}) {\n const isForexFuturesCrypto = isForexFuturesCryptoPage(specificChartFunctionality)\n const isOffscreenChartWithNarrowBars =\n specificChartFunctionality === SpecificChartFunctionality.offScreen && totalBarWidth < 5\n const isQuoteChartWithNarrowBars =\n specificChartFunctionality === SpecificChartFunctionality.quotePage && totalBarWidth < 5\n\n return isForexFuturesCrypto || isOffscreenChartWithNarrowBars || isQuoteChartWithNarrowBars\n}\n\nexport const DRAWING_COOKIE_NAME = 'charts-draw'\nexport function getIsDrawingEnabled() {\n return Utils.getCookie(DRAWING_COOKIE_NAME) === 'on'\n}\n\nexport function setIsDrawingEnabled(value: boolean) {\n const expires = new Date()\n expires.setMonth(expires.getMonth() + 1)\n Utils.setCookie(DRAWING_COOKIE_NAME, value ? 'on' : 'off', expires)\n}\n\nexport function getIsSidebarEnabled(specificChartFunctionality: SpecificChartFunctionality) {\n return (\n specificChartFunctionality === SpecificChartFunctionality.chartPage && !!window.FinvizSettings.hasSidebarEnabled\n )\n}\n\nexport const handleTypeChange = ({\n type,\n chartLayoutModel,\n}: {\n type: ChartElementType\n chartLayoutModel: ChartLayoutModel\n}) => {\n const elements = chartLayoutModel.getAllElements()\n elements.forEach((element) => {\n if (element.isChart() && element.instance.attrs.type !== type) {\n const pane = element.pane()\n const instance = chartsByType[type].fromObject(\n {\n ...element.instance.attrs,\n type,\n },\n pane\n )\n element.replace(instance)\n }\n })\n}\n\nexport const getIsPreserveDrawingsAndAutosaveAvailable = (args: {\n specificChartFunctionality: SpecificChartFunctionality\n editable: boolean\n editors: ChartEditorEnum[]\n}) => {\n const { specificChartFunctionality, editable, editors } = args\n\n return (\n editable &&\n editors?.includes(ChartEditorEnum.tools) &&\n specificChartFunctionality &&\n [\n SpecificChartFunctionality.chartPage,\n SpecificChartFunctionality.quotePage,\n SpecificChartFunctionality.forexPage,\n SpecificChartFunctionality.futuresPage,\n SpecificChartFunctionality.cryptoPage,\n ].includes(specificChartFunctionality)\n )\n}\n","/**\n * Keep this file in sync with `Website/js/main/components/color-picker/util.ts` in website repo\n * */\n\nexport interface RGBA {\n r: number\n g: number\n b: number\n a: number\n}\n\nexport interface HSVA {\n h: number\n s: number\n v: number\n a: number\n}\n\nexport interface HSLA {\n h: number\n s: number\n l: number\n a: number\n}\n\n/**\n * Convert Hex string to RGBA object.\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hexStringToRGBA(hexString: string): RGBA {\n const hexColor = removeHashSymbol(hexString)\n let r: string | number = 0\n let g: string | number = 0\n let b: string | number = 0\n let a: string | number = 255\n\n // 3 digits\n if (hexColor.length === 3 || hexColor.length === 4) {\n r = '0x' + hexColor[0] + hexColor[0]\n g = '0x' + hexColor[1] + hexColor[1]\n b = '0x' + hexColor[2] + hexColor[2]\n // Get channel if defined\n a = hexColor.length === 4 ? '0x' + hexColor[3] + hexColor[3] : a\n\n // 6 digits\n } else if (hexColor.length === 6 || hexColor.length === 8) {\n r = '0x' + hexColor[0] + hexColor[1]\n g = '0x' + hexColor[2] + hexColor[3]\n b = '0x' + hexColor[4] + hexColor[5]\n // Get channel if defined\n a = hexColor.length === 8 ? '0x' + hexColor[6] + hexColor[7] : a\n }\n\n return { r: Number(r), g: Number(g), b: Number(b), a: Math.min(Math.round((Number(a) / 255) * 100) / 100, 1) }\n}\n\n/**\n * Convert HEX string to HSVA color representation.\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n */\nexport function hexStringToHSVA(hexString: string) {\n return rgbaToHSVA(hexStringToRGBA(hexString))\n}\n\n/**\n * Convert HEX string to HSLA color representation.\n *\n * Input: color in hex3, hex4, hex6 or hex8 format (#fff)\n *\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n */\nexport function hexStringToHSLA(hexString: string) {\n return rgbaToHSLA(hexStringToRGBA(hexString))\n}\n\n/**\n * Convert alpha value to hex value\n *\n * Input: [0,1]\n *\n * Output: alpha in HEX format\n */\nexport function alphaToHex(alpha: number) {\n return Math.max(Math.min(Math.round(alpha * 255), 255), 0)\n .toString(16)\n .padStart(2, '0')\n}\n\n/**\n * Convert RGBA color to HEX string.\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: color in hex6 or hex8 depending on whether or not alpha is enabled\n */\nexport function rgbaToHexString(color: RGBA, alpha = false) {\n const r = color.r.toString(16)\n const g = color.g.toString(16)\n const b = color.b.toString(16)\n const hexString = '#' + r.padStart(2, '0') + g.padStart(2, '0') + b.padStart(2, '0')\n\n if (!alpha || color.a === 1) {\n return hexString\n }\n\n return `${hexString}${alphaToHex(color.a)}`\n}\n\n/**\n * Convert HSVA object to HEX string\n *\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hsvaToHEXString(color: HSVA, alpha = false) {\n const rgbaColor = hsvaToRGBA(color)\n\n return rgbaToHexString(rgbaColor, alpha)\n}\n\n/**\n * Convert HSLA object to HEX string\n *\n * @see https://css-tricks.com/converting-color-spaces-in-javascript/\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hslaToHexString(color: HSLA, alpha = false) {\n const rgbaColor = hslaToRGBA(color)\n\n return rgbaToHexString(rgbaColor, alpha)\n}\n\n/**\n * Convert RGBA color to HSVA\n * @see https://stackoverflow.com/a/54070620/6662683\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n */\nexport function rgbaToHSVA(color: RGBA): HSVA {\n const r = color.r / 255\n const g = color.g / 255\n const b = color.b / 255\n\n const v = Math.max(r, g, b)\n const c = v - Math.min(r, g, b)\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\n\n return {\n h: 60 * (h < 0 ? h + 6 : h),\n s: v ? c / v : 0,\n v: v,\n a: color.a,\n }\n}\n\n/**\n * Convert RGBA to HSLA\n * @see https://stackoverflow.com/a/54071699/6662683\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n */\nexport function rgbaToHSLA(color: RGBA): HSLA {\n const r = color.r / 255\n const g = color.g / 255\n const b = color.b / 255\n\n const v = Math.max(r, g, b)\n const c = v - Math.min(r, g, b)\n const f = 1 - Math.abs(v + v - c - 1)\n const h = c && (v === r ? (g - b) / c : v === g ? 2 + (b - r) / c : 4 + (r - g) / c)\n\n return {\n h: 60 * (h < 0 ? h + 6 : h),\n s: f ? c / f : 0,\n l: (v + v - c) / 2,\n a: color.a,\n }\n}\n\n/**\n * Convert HSVA color to RGBA\n * @see https://stackoverflow.com/a/54024653/6662683\n *\n * Input: { h: [0,360], s: [0,1], v: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hsvaToRGBA(color: HSVA): RGBA {\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)\n\n return {\n r: Math.round(f(5) * 255),\n g: Math.round(f(3) * 255),\n b: Math.round(f(1) * 255),\n a: Math.round(color.a * 100) / 100,\n }\n}\n\n/**\n * Convert HSLA color to RGBA\n * @see https://stackoverflow.com/a/54014428/6662683\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function hslaToRGBA(color: HSLA): RGBA {\n const a = color.s * Math.min(color.l, 1 - color.l)\n const f = (n: number, k = (n + color.h / 30) % 12) => color.l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1)\n\n return {\n r: Math.round(f(0) * 255),\n g: Math.round(f(8) * 255),\n b: Math.round(f(4) * 255),\n a: color.a,\n }\n}\n\n/**\n * Convert RGBA color to rgba() string\n *\n * Input: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n *\n * Output: rgba(r, g, b, a)\n */\nexport function rgbaToRGBAString(color: RGBA) {\n return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`\n}\n\n/**\n * Convert rgba() string to RGBA color\n *\n * Input: rgba(r, g, b, a)\n *\n * Output: { r: [0,255], g: [0,255], b: [0,255], a: [0,1]}\n */\nexport function rgbaStringToObject(color: string) {\n const colorParts = /^rgba?\\(([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]+([0-9]{1,3})[ ,]*([01].?[0-9]*)?\\)$/.exec(color)\n const [red, green, blue, alpha = '1'] = colorParts?.slice(1) || [0, 0, 0, 1].map(String)\n return {\n r: Number.parseInt(red),\n g: Number.parseInt(green),\n b: Number.parseInt(blue),\n a: Number.parseFloat(alpha),\n }\n}\n\n/**\n * Convert HSLA color to hsla() string\n *\n * Input: { h: [0,360], s: [0,1], l: [0,1], a: [0,1]}\n *\n * Output: hsla(h, s, l, a)\n */\nexport function hslaToHSLAString(color: HSLA) {\n return `hsla(${Math.round(color.h)}, ${Math.round(color.s * 10000) / 100}%, ${Math.round(color.l * 10000) / 100}%, ${\n color.a\n })`\n}\n\nexport function removeHashSymbol(strColor: string) {\n return strColor.replace(/#/g, '')\n}\n\n/**\n * Check if the param is a valid color by setting it as style\n */\nexport function isValidColor(strColor: string) {\n const isRgb = strColor.startsWith('rgba')\n const s = new Option().style\n\n s.color = isRgb ? strColor : `#${removeHashSymbol(strColor)}`\n\n return s.color !== ''\n}\n\n/**\n * Normalize color to be a hex value\n */\nexport function convertColorToHEX(strColor: string, allowAlpha = true) {\n const isRgb = getIsRgb(strColor)\n const hexColor = isRgb ? rgbaToHexString(rgbaStringToObject(strColor), allowAlpha) : strColor\n\n if (allowAlpha) {\n return hexColor\n }\n return hexColor.slice(0, 7)\n}\n\n/**\n * Returns true if color is rgb or rgba\n */\nexport function getIsRgb(strColor: string, isAlphaAllowed = true) {\n const rgbKeys = ['rgb']\n if (isAlphaAllowed) {\n rgbKeys.push('rgba')\n }\n return rgbKeys.some((startsWith) => strColor.startsWith(startsWith))\n}\n\n/**\n * Convert any color format to HSVA (internal color picker representation)\n */\nexport function getHSVAFromColor(strColor: string) {\n if (getIsRgb(strColor)) {\n return rgbaToHSVA(rgbaStringToObject(strColor))\n }\n\n return hexStringToHSVA(strColor)\n}\n\n/**\n * Stringify HSVA color representation into a output format\n */\nexport function stringifyHSVAColor(color: HSVA, output: 'rgba' | 'hex', canSelectAlpha?: boolean) {\n switch (output) {\n case 'rgba':\n return rgbaToRGBAString(hsvaToRGBA(color))\n default:\n return hsvaToHEXString(color, canSelectAlpha)\n }\n}\n\n/**\n * Get luma value from RGBA color using the Rec. 709 coefficients\n * @see https://en.wikipedia.org/wiki/Luma_%28video%29\n *\n * If luma is >= 165 the foreground color should be dark\n */\nexport function getLumaFromRGBA(color: RGBA) {\n return 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b\n}\n\n/**\n * Checks if luma is >= 165 or alpha < 0.3\n */\nexport function getIsColorTooLightOrTransparent(color: RGBA) {\n return getLumaFromRGBA(color) >= 165 || color.a < 0.5\n}\n\n/**\n * Set specific alpha for a hex color\n */\nexport function getHEXWithSpecificAplha(color: string, alpha = 1) {\n const rgbaColor = hexStringToRGBA(color)\n return rgbaToHexString({ ...rgbaColor, a: alpha }, true)\n}\n\n/**\n * Get rgba from valid color string\n */\nexport function getRGBAValueFromValidColorString(value: string) {\n if (getIsRgb(value)) return rgbaToRGBAString(rgbaStringToObject(value))\n return rgbaToRGBAString(hexStringToRGBA(value))\n}\n","// if conditionalCursor provided, cursor is set only if current cursor !== conditionalCursor\n// otherwise cursor is set if element exists\nexport const setElementCursor = ({\n elementId,\n cursor,\n conditionalCursor,\n}: {\n elementId: string\n cursor: string\n conditionalCursor?: string\n}) => {\n const element = document.getElementById(elementId)\n if (element && (conditionalCursor ? element.style.cursor !== conditionalCursor : true)) {\n element.style.cursor = cursor\n }\n}\n","/*\n * We want to be able to render only bars/parts of line that are visible to users,\n * but without introducing visual artifacts like bars missing in front of users while scrolling\n * or lines that start in middle of chart for sparse intraday stock data.\n *\n * In general we want to start rendering lines one bar sooner than what is visible to user and stop rendering\n * one bar outside of visible area to create a continuous line.\n */\nimport { ScaleAxis } from '../models/pane'\nimport type Quote from '../models/quote'\n\nexport const drawInVisibleArea = ({\n quote,\n scale,\n fxOverride,\n fromIndexOffset = 0,\n toIndexOffset = 0,\n leftOffset,\n drawBarCallback,\n width,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n fromIndexOffset?: number\n toIndexOffset?: number\n fxOverride?: (index: number) => number\n leftOffset: number\n width: number\n drawBarCallback: (i: number, x: number) => void\n}) => {\n const fx = fxOverride ?? ((index: number) => scale.x(quote.barIndex[index]))\n // We want to render one bar before first visible bar to fix disconnected lines on charts with missing data\n const firstBarToRender = Math.max(0, getFirstBarToRenderIndex({ quote, scale, leftOffset }) - 1, fromIndexOffset - 1)\n\n let lastBarToRender = -1\n for (let i = firstBarToRender; i < quote.close.length + toIndexOffset; i++) {\n const x = fx(i)\n if (x + leftOffset > width) {\n lastBarToRender = i\n break\n }\n drawBarCallback(i, x)\n }\n\n if (lastBarToRender > -1) {\n const x = fx(lastBarToRender)\n drawBarCallback(lastBarToRender, x)\n }\n}\n\nexport const getFirstBarToRenderIndex = ({\n leftOffset,\n quote,\n scale,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n leftOffset: number\n}) => {\n const barIndex = Math.ceil(scale.x.invert(-leftOffset))\n return quote.barToDataIndex[Math.max(barIndex, 0)]\n}\n\nexport const getLastBarToRenderIndex = ({\n leftOffset,\n quote,\n scale,\n chartWidth,\n}: {\n quote: Quote\n scale: { x: ScaleAxis }\n leftOffset: number\n chartWidth: number\n}) => {\n const { barToDataIndex } = quote\n const barIndex = Math.ceil(scale.x.invert(-leftOffset + chartWidth))\n return barToDataIndex[Math.max(barIndex, 0)] ?? barToDataIndex[barToDataIndex.length - 1]\n}\n","import queryString from 'query-string'\n\nimport { ObjectHash } from '../../types/shared'\n\nexport type FetchFunc = (input: Request | string, init?: ObjectHash) => Promise\n\ninterface FetchApiProps {\n location: string\n queryParameters?: ObjectHash\n method?: string\n body?: ObjectHash | string\n contentType?: string\n abortController?: null | AbortController\n throwOnStatusCodes?: number[]\n throwOnPredicate?: (response: Response) => boolean\n fetchFunc?: FetchFunc\n keepalive?: boolean\n}\n\nexport const getFormDataFromObject = (object: ObjectHash) =>\n Object.keys(object).reduce((formData, key) => {\n formData.append(key, object[key])\n return formData\n }, new FormData())\n\n// Keep in sync with ContentType in https://github.com/finvizhq/Finviz-Website/blob/master/Website/js/main/services/api.ts\n// START\nexport enum ContentType {\n ApplicationJson = 'application/json',\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\n FormUrlEncoded = 'application/x-www-form-urlencoded',\n Html = 'text/html; charset=utf-8',\n}\n\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\n switch (contentType) {\n case ContentType.ApplicationJson:\n case ContentType.ApplicationJsonUTF:\n case ContentType.FormUrlEncoded:\n return JSON.parse(response)\n default:\n return response\n }\n}\n// END\n\nconst fetchApi = async ({\n location,\n queryParameters,\n method,\n body,\n contentType,\n abortController,\n throwOnStatusCodes,\n throwOnPredicate,\n fetchFunc = fetch,\n keepalive = false,\n}: FetchApiProps) => {\n const url = `${location}${queryParameters ? `?${queryString.stringify(queryParameters)}` : ''}`\n const parameters = {\n method: method || 'GET',\n credentials: 'include',\n headers: contentType && {\n 'Content-Type': contentType,\n },\n signal: abortController?.signal,\n body: body,\n keepalive,\n }\n try {\n const response = await fetchFunc(url, parameters)\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\n const responseData = parseResponseForContentType(await response.text(), responseContentType)\n if (throwOnStatusCodes?.includes(response.status) || throwOnPredicate?.(response)) {\n const StatusCodeError = getStatusCodeError(response.status)\n throw new StatusCodeError(`${url} returned ${response.status}`, responseData as T, response.status)\n }\n return responseData as T\n } catch (err) {\n throw err\n }\n}\n\nfunction getStatusCodeError(statusCode: number): typeof GenericStatusCodeError {\n switch (statusCode) {\n case 403:\n return ForbiddenError\n case 404:\n return NotFoundError\n case 500:\n return InternalServerError\n default:\n return GenericStatusCodeError\n }\n}\n\nexport class GenericStatusCodeError extends Error {\n response: ObjectHash | string\n statusCode: number\n\n constructor(message: string, response: ObjectHash | string, statusCode: number) {\n super(message)\n this.response = response\n this.statusCode = statusCode\n }\n}\nexport class ForbiddenError extends GenericStatusCodeError {}\nexport class NotFoundError extends GenericStatusCodeError {}\nexport class InternalServerError extends GenericStatusCodeError {}\n\nexport default fetchApi\n","import React from 'react'\n\nexport function useForceUpdate() {\n const [forceUpdateKey, increment] = React.useState(0)\n const forceUpdate = React.useCallback(() => {\n increment((prev) => prev + 1)\n }, [])\n return { forceUpdate, forceUpdateKey }\n}\n","import { EmptyObject, ObjectHash } from '../../types/shared'\n\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\n const precision = Math.pow(10, numOfDecimalPlaces)\n return String(Math.round(number * precision) / precision)\n}\n\nexport function getIsSSr() {\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\n}\n\nexport function isValidHexColor(color: string) {\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\n return !!color && regex.test(color)\n}\n\nexport function getParsedIntegersFromPeriodString(periodString: string) {\n const periodParts = periodString.split(',')\n return periodParts.map((part) => Number.parseInt(part, 10))\n}\n\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\n console.error(exception)\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\n import('@sentry/node').then((client) => {\n client.captureException(exception, captureContext)\n })\n } else {\n window.Sentry.captureException(exception, captureContext)\n }\n}\n\nexport function isPositiveFloat(value: string | number) {\n const parsedNumber = Number.parseFloat(`${value}`)\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\n}\n\nexport function isPositiveInteger(value: string | number) {\n const string = `${value}`\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\n}\n\nexport function isInRange({\n value,\n min = Number.MIN_SAFE_INTEGER,\n max = Number.MAX_SAFE_INTEGER,\n}: {\n value: string | number\n min?: number\n max?: number\n}) {\n const parsedNumber = Number.parseFloat(`${value}`)\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\n}\n\nexport function tryJsonParse(json: string | null = '') {\n try {\n return JSON.parse(json ?? '') as Result\n } catch {\n return null\n }\n}\n\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\n return Math.min(Math.max(value, min), max)\n}\n\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\n // as cy.get('.target').trigger('mousedown', { button: 0 })\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\n return (e as unknown as MouseEvent).button === 0\n } else {\n return true\n }\n}\n\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\nexport function getJSONReplacerFunc() {\n const visited = new WeakSet()\n return (key: string, value: any) => {\n if (typeof value === 'object' && value !== null) {\n if (visited.has(value)) {\n return\n }\n visited.add(value)\n }\n return value\n }\n}\n\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\n date.toLocaleDateString('en-US', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n ...options,\n })\n\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\nexport function randomUUID() {\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\n const c = Number(substring)\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\n })\n}\n\nexport function getUuid() {\n return window.crypto?.randomUUID?.() ?? randomUUID()\n}\n","export type HLC = {\n ts: number\n count: number\n uuid: string\n}\n\nexport const serializeHlc = ({ ts, count, uuid }: HLC) =>\n ts.toString().padStart(15, '0') + ':' + count.toString(36).padStart(5, '0') + ':' + uuid\n\nexport const parseHlc = (serialized: string) => {\n const [ts, count, uuid] = serialized.split(':')\n return {\n ts: Number.parseInt(ts),\n count: Number.parseInt(count, 36),\n uuid,\n }\n}\n\nexport const initHlc = (uuid: string, now: number): HLC => ({\n ts: now,\n count: 0,\n uuid,\n})\n\nexport const compareHlc = (one: HLC, two: HLC) => {\n if (one.ts === two.ts) {\n if (one.count === two.count) {\n if (one.uuid === two.uuid) {\n return 0\n }\n return one.uuid < two.uuid ? -1 : 1\n }\n return one.count - two.count\n }\n return one.ts - two.ts\n}\n\nexport const incrementHlc = (local: HLC, now: number): HLC => {\n if (now > local.ts) {\n return { ts: now, count: 0, uuid: local.uuid }\n }\n\n return { ...local, count: local.count + 1 }\n}\n\nexport const receiveHlc = (local: HLC, remote: HLC): HLC => {\n if (compareHlc(local, remote) >= 0) {\n return local\n }\n return { ...local, ts: remote.ts, count: remote.count }\n}\n","import { ObjectHash } from '../../types/shared'\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const decodeQueryString = = ObjectHash>(...args): T =>\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n window.FLibs.decodeQueryString(...args)\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const encodeQueryString = (...args) => window.FLibs.encodeQueryString(...args)\n","import { useChartLayoutGlobalModelAsyncModule } from '../controllers/chart-settings/async-modules'\nimport { useAsyncModule } from './async-modules-utils'\n\nexport function useChartLayoutGlobalModelAsync() {\n const [useChartLayoutGlobalModelModule] = useAsyncModule({\n ...useChartLayoutGlobalModelAsyncModule,\n isSuspenseMode: true,\n })\n return useChartLayoutGlobalModelModule.useChartLayoutGlobalModel()\n}\n","import { CanvasRenderingContext2D as NodeCanvasRenderingContext2D } from 'skia-canvas'\n\nimport {\n CanvasElementType,\n ChartEditorEnum,\n ChartElementType,\n ChartEventType,\n IndicatorType,\n LayoutType,\n OverlayType,\n ScaleType,\n SpecificChartFunctionality,\n TIMEFRAME,\n TextAlign,\n TextBaseline,\n} from '../app/constants/common'\nimport ChartModel from '../app/models/chart'\nimport ChartLayout from '../app/models/chart_layout'\nimport { IChartThemeColors } from '../app/models/constants'\n\ninterface ISentry {\n captureException: (exception: any, captureContext?: { extra: ObjectHash }) => any\n captureMessage: (message: string, captureContext?: { extra: ObjectHash }) => any\n}\n\ndeclare global {\n interface Window {\n Sentry: ISentry\n FinvizSettings: ObjectHash\n FinvizChartsSettings: ObjectHash\n globalChartConfig: ObjectHash\n isRenderInProgress: boolean | number\n FinvizQuoteTypeCurrent: string\n handleScriptNotLoaded: () => void\n renderScriptNotLoaded: () => void\n }\n\n interface Document {\n fullscreenElement: any\n mozFullScreenElement: any\n webkitFullscreenElement: any\n msFullscreenElement: any\n webkitExitFullscreen: any\n mozExitFullScreen: any\n msExitFullscreen: any\n }\n\n interface HTMLElement {\n webkitRequestFullScreen: any\n mozRequestFullScreen: any\n msRequestFullscreen: any\n }\n\n interface Navigator {\n msMaxTouchPoints: any\n }\n\n interface Array {\n last(): T | undefined\n }\n\n interface String {\n padLeft(paddingValue: string): string\n startsWith(str: string): boolean\n }\n\n type CanvasCache = Partial>\n\n interface CanvasRenderingContext2D {\n _cache: CanvasCache\n // We need to omit `canvas` because it is read only\n set>(\n key: Key,\n value: CanvasRenderingContext2D[Key]\n ): void\n }\n\n interface HTMLCanvasElement {\n _cache: CanvasCache\n }\n\n interface ImageBitmapRenderingContext {\n _cache: CanvasCache\n }\n\n type RenderingContext2DType = CanvasRenderingContext2D | NodeCanvasRenderingContext2D\n}\n\ndeclare module 'skia-canvas' {\n interface CanvasRenderingContext2D {\n _cache: CanvasCache\n\n set>(\n key: Key,\n value: CanvasRenderingContext2D[Key]\n ): void\n }\n}\n\nexport type TodoObjectHashAnyType = Record\nexport type TodoAreaObject = Record\nexport type ObjectHash = Record\nexport type EmptyObject = Record\n\nexport type TodoAnyType = any\n\nexport type ThumbType = string\n\nexport type PaneArea = {\n mouseDown?: boolean\n x: number\n y: number\n scaled: {\n x: number\n y: number\n }\n width: number\n height: number\n cursorX: number\n cursorY: number\n isCursorInChartWidthBoundaries: boolean\n} & T\n\nexport type Maybe = T | null | undefined\n\nexport interface DrawingBorder {\n color: string\n width: number\n}\n\nexport interface TextAttrs {\n text?: string\n background: string\n border?: { width: number; color: string }\n lineWidth?: number\n font: {\n size: number\n family?: string\n style?: string\n weight?: string\n }\n fillStyle?: string\n strokeStyle?: string\n angle?: number\n lineHeight: number\n textAlign?: TextAlign\n textBaseline: TextBaseline\n padding: {\n top: number\n right: number\n bottom: number\n left: number\n }\n}\n\nexport interface Point {\n x: number\n y: number\n}\n\nexport type RequireByKey = Omit & Required>\n\nexport interface ResizeByThumbFuncProps {\n type: ThumbType\n difX: number\n difY: number\n area: PaneArea\n}\n\nexport type ResizeByThumbWithTypeAndDifs = RequireByKey\n\nexport interface ChartConfigChartPaneElement {\n type: ChartElementType | CanvasElementType | IndicatorType | OverlayType | ChartEventType\n overlays?: OverlayConfigObject[]\n period?: string\n code?: string\n elementId?: string | null\n zIndex?: number\n}\n\nexport interface RendererChartBarProps {\n index: number\n chartSettingsColors: IChartThemeColors\n hasFillAndBorder?: boolean\n}\n\nexport interface ChartConfigChartPane {\n elements: ChartConfigChartPaneElement[]\n height: number\n chart?: ChartConfigObject | ChartModel\n}\n\nexport interface IIdea {\n id?: number\n date?: string\n note: string\n}\n\nexport interface ChartConfigObjectExtended {\n editable: boolean\n canChangeTicker: boolean\n scrollable: boolean\n cross: boolean\n ideas: boolean\n editors: ChartEditorEnum[]\n specificChartFunctionality: SpecificChartFunctionality\n theme: Theme\n layout: LayoutType\n uuid?: string\n idea?: IIdea\n}\n\nexport interface ChartConfigObject {\n width: number\n height: number\n panes: ChartConfigChartPane[]\n premarket: boolean\n aftermarket: boolean\n dateRange: string | null\n hasChartEvents?: boolean\n stretch: boolean\n ticker: string\n instrument: Instrument\n timeframe: TIMEFRAME\n chart_layout: ChartLayout\n zoomFactor: number\n leftOffset: number | null\n refreshData: boolean | number\n isHideDrawingsActive: boolean\n isScrolled?: boolean\n scale: ScaleType\n}\n\nexport interface RootChartConfigObject extends Partial {\n charts: ChartConfigObject[]\n width: number\n height: number\n newCharts?: boolean\n useGrid?: boolean\n}\n\nexport interface TaConfigObject {\n indicators: IndicatorConfigObject[]\n overlays: OverlayDatabaseRecordObject[]\n height: number\n style: string\n scale: string\n}\n\nexport interface IndicatorConfigObject {\n name: string\n parameters: string\n position: Position\n}\n\nexport interface OverlayConfigObject {\n color: string\n period: string\n type: OverlayType\n}\n\nexport interface OverlayDatabaseRecordObject {\n name: string\n parameters: string | null\n color: string | null\n}\n\nexport enum Instrument {\n Stock = 'stock',\n Crypto = 'crypto',\n MarketSentiment = 'market_sentiment',\n Futures = 'futures',\n Forex = 'forex',\n Group = 'group',\n}\n\nexport enum Theme {\n light = 'light',\n dark = 'dark',\n}\n\nexport interface IModalConfig {\n title: string\n inputs: IModalConfigInput[]\n inputsErrorMessages: ObjectHash\n}\nexport interface IModalConfigInput {\n type: React.HTMLInputTypeAttribute\n label: string\n name: string\n value: number | string\n required?: boolean\n min?: number\n color?: string\n step?: number\n}\n\nexport enum Position {\n Above = 'above',\n Below = 'below',\n}\n\nexport enum DefaultSpineEvents {\n Change = 'change',\n Destroy = 'destroy',\n Refresh = 'refresh',\n Update = 'update',\n}\n\nexport enum CustomSpineEvents {\n IndicatorsChange = 'indicatorsChange',\n ManualChange = 'manualChange',\n}\n\nexport enum DrawingSpineOptionsEvent {\n Remove = 'remove',\n}\n\nexport interface DrawingSpineOptions {\n eventType: DrawingSpineOptionsEvent\n}\n\nexport type TodoButtonProps = ObjectHash\nexport type TodoButtonTheme = string\n","module.exports = FLibs.DateFns;","module.exports = FLibs.React;","module.exports = FLibs.ReactDOM;","module.exports = FLibs.ReactRouterDOM;","module.exports = FLibs.classnames;","module.exports = FLibs.d3;"],"names":["BackgroundInput","_ref","label","value","onChange","React","InputColorPicker","inputDataTestId","concat","toLocaleLowerCase","color","convertColorToHEX","ColorRangeRowInput","colorValue","colorTestId","rangeValue","rangeTestId","rangeLabel","rangeProps","handleRangeChange","useCallback","ev","currentTarget","handleColorChange","className","RangeSlider","_extends","rightContent","Paragraph","as","size","BorderInput","min","max","width","step","CheckBox","Checkbox","checked","FONT_VALUES","FontInput","_FONT_VALUES$find","family","setFamily","useState","setSize","style","setStyle","weight","setWeight","setValue","key","valueSetter","Select","items","find","option","selected","map","SelectOption","Input","type","LineInput","MultilineStringInput","required","Textarea","placeholder","e","target","autoFocus","NumberInput","props","name","allowDecimal","pattern","parseFloat","parseInt","StringInput","Trend","active","trend","valueAsNumber","VisibilityInput","isCheckboxOnly","isOff","setIsOff","from","setFrom","to","setTo","macroKey","macroLabel","charAt","toUpperCase","slice","disabled","DEFAULTS","Math","Number","MacroTimeframe","INPUTS_AVAILABLE","getInitialState","visibilities","merge","visibility","macroTimeframe","valueMacroTimeframe","Object","keys","length","getIsVisibilityOutsideAvailableTimeframes","every","macrotimeframe","macroRange","MicroTimeframeRange","some","item","_macroRange$from","_macroRange$to","isInRange","Visibility","initialVisibilityRef","handleChange","result","handleDisableSubmit","current","includes","TAB_BUTTON_COMMON_PROPS","contentClass","getValuesFromFormState","formState","reduce","acc","cur","DialogTabs","ElementStyleDialog","_config$title","config","element","getModalConfig","initialFormStateRef","JSON","parse","stringify","inputs","setFormState","finalFocusRef","_document$querySelect","document","querySelector","body","selectedTab","setSelectedTab","Style","isSubmitDisabled","setIsSubmitDisabled","isDrawingElement","getIsDrawing","isEditInProgress","trigger","handleValuesChange","values","shouldSubmit","shouldDismiss","hasOnSubmit","onSubmit","hasOnDismiss","onDismiss","set","state","hide","handleValuesChangeDebounceRef","debounce","newFormState","maxWait","cancel","preventDefault","checkValidity","handleCloseDialog","Dialog","isDraggable","title","onOverlayClick","onHide","DialogHeader","onCloseClick","DialogBody","ButtonGroup","hasDivider","Button","onClick","input","InputComponent","getInputForType","inputType","prevState","stateInput","DialogFooter","animating","theme","ElementStyleDialogContext","ElementStyleDialogWrapper","setElement","setOnSubmit","setOnDismiss","dialog","useDialogState","modal","Provider","openDialog","show","children","getContainerType","model","_mainElement$instance","_mainElement$instance2","mainElement","indicatorType","instance","isIndicator","IndicatorType","isChart","getTickersAndContainerTypesInLayoutModel","chartLayout","tickers","containerTypes","getAllPanes","forEach","paneModel","ticker","getQuoteRawTicker","containerType","push","getInitialStoreDrawings","_ref4","_window$FinvizSetting","_window$FinvizSetting2","_window$FinvizChartsS","_initialDrawings$map","initialDrawings","window","FinvizSettings","initialDrawingsStore","FinvizChartsSettings","drawings","getAutosaveElementFromDBRecord","handleCallMethodOnAllDrawings","_ref5","chartLayoutModel","elementMethod","getAllElements","isDrawing","getNoteElementId","getElementNoteText","noteElement","_ref6","_JSON$parse","elementAttrs","text","getTickerNoteText","_ref7","elements","_ref8","elementId","zIndex","changeType","lastChange","ts","lastChangeTimestamp","count","lastChangeCounter","uuid","lastChangeNodeUUID","DRAWINGS_SAVE_INTERVAL_MS","RETRY_LIMIT","useDrawingAutoSaveApi","postRetryCountRef","deleteRetryCountRef","fetchDrawings","async","fetchApi","location","queryParameters","join","undefined","throwOnStatusCodes","drawing","saveDrawings","bodyJsonString","getDBRecordFromAutosaveElement","keepalive","s","n","i","l","hi","charCodeAt","lo","Error","getByteLengthOfString","error","_window$Sentry","Sentry","captureException","method","contentType","ContentType","latestChangeHlc","sort","a","b","compareHlc","_window$Sentry2","InternalServerError","Promise","r","setTimeout","ForbiddenError","extra","GenericStatusCodeError","response","invalidItems","index","deleteAllDrawings","lastLocalChange","_ref2","newHlc","incrementHlc","Date","now","getUuid","_window$Sentry3","useDrawingAutoSaveControls","isAutoSaveActive","useModelState","watchProperties","idea","isInit","isPreserveDrawingsActive","getIsPreserveDrawingsAndAutosaveAvailable","id","useIsAutoSaveActive","drawingsInternalStore","saveTimeoutRef","clearTimeout","saveLatestChanges","withDelayInMs","arguments","saveQueueExtraFilterCallback","saveQueue","filter","latestLocalUpdateTimestamp","instanceUUID","setAutoSaveState","AutoSaveState","save","updateAttributes","receiveHlc","syncChartLayoutDrawings","isRemove","paneContainerType","paneInternalStoreElements","autoSaveElement","paneElement","isCreator","paneDrawing","destroyCascade","parsedElementAttrs","toAutosaveConfig","pane","selection","hasOngoingInteraction","updateScales","getCanvasElementByType","fromObject","create","handleAutoSaveNoteChange","note","newNoteElement","handleIdeaNoteChange","_chartLayout$idea","_chartLayout$activeCh","_chartLayout$activeCh2","updateAttribute","activeChart","checkDrawingUpdate","isRefetchAll","latestRemoteUpdateTimestamp","initHlc","updatedDrawings","newLastUpdateTimestamp","updatedElementIds","newInternalStore","currentInternalStore","lastUpdateTimestamp","drawingIndex","findIndex","_ref3","currentDrawing","currentNote","autoSavedNote","mergeUpdatedDrawingsToInternalStore","allElements","normalizeZIndexes","specificChartFunctionality","SpecificChartFunctionality","_chartLayout$activeCh3","_chartLayout$activeCh4","activeTicker","updateInternalStoreWithElement","updateResult","destroyed","instanceJson","newDrawing","updateDrawingIndex","drawingElement","shouldSyncAndSave","updatedRecord","hasChangedZIndex","hasChangedType","hasChangedAttrs","hasChange","updateInternalStoreWithChangedElement","deleteAllAutoSavedElements","onElementChange","_","options","elementPane","elementContainerType","elementPaneTicker","eventType","DrawingSpineOptionsEvent","useDrawingAutoSave","drawingsInternalStoreUnwatched","prevIsAutoSaveActive","ref","usePrevious","runInitialSaveAndRefetchUpdate","onChartOrIndicatorChange","newTickers","newContainerTypes","ChartModel","CustomSpineEvents","Element","checkDrawingUpdateInterval","setInterval","clearInterval","getIdeaUrl","instrument","period","searchObject","t","p","isStock","Instrument","isQuotePage","test","pathname","isStockOnQute","path","queryString","ta","IdeasList","hasError","setHasError","hasFetched","setHasFetched","isDeleting","setIsDeleting","ideas","setIdeas","currentIdea","decodeQueryString","useEffect","_window$gtag","_window","gtag","call","event_category","getInstrument","fetchIdeas","onDeleteIdeaClick","useRef","_window$FinvizChartsS2","_window$globalChartCo","confirm","search","row","fetch","headers","String","href","url","ideaChart","globalChartConfig","stateIdea","reload","company","date","stopPropagation","IdeasDialog","IdeasDropdown","rounding","dropdownButtonClassName","tooltipState","useTooltipState","placement","isAnyQuoteLoading","setIsAnyQuoteLoading","dropdown","useDropdownState","hideTooltip","checkIfAnyQuoteIsLoading","fetchingQuotes","Quote","quote","isFetching","fetchedAt","visible","hasUserPremium","Dropdown","leftContent","appearance","DropdownItem","TooltipTrigger","closeOnClick","layoutModel","_layoutModel$idea","_window$gtag2","_window2","activeChartQuote","toJSON","cid","timeframe","ChartSettings","settings","layout","toObject","LayoutType","barWidth","center","barMargin","charts","c","chartId","dateRange","refreshData","layoutModelObjectPanes","tickersString","split","replace","getChartTickers","panes","quotes","isIdeaId","ideaID","array","quotesJsonString","q","omit","chart","quoteTickersTimeframes","toConfig","data","getFormDataFromObject","ideaUrl","open","saveIdea","DialogTrigger","Tooltip","Spinner","classnames","getIsMobileScreenSize","encodeQueryString","utm_source","utm_medium","utm_campaign","publishModalAsyncModule","importFn","cacheKey","Publish","publishModalModule","isLoading","useAsyncModule","shouldLoadModule","errorSeverity","onError","PublishDialog","default","buttonProps","Delayed","delayComponent","Icon","isPremium","TourButton","page","tour","useTour","pageTours","steps","getRequestFullscreen","documentElement","overlayPadding","isRedesignEnabled","Boolean","getTour","userTour","setCurrentTour","getStepsForUser","buttonTheme","hasNewTours","activeTour","startTour","once","isNativeMobileSelect","ChartTypesSelect","_chartTypes$find","_chartTypes$find2","chartTypes","getCurrentType","useLocation","ty","taInt","defaultType","QuoteShortToLongType","FinvizQuoteTypeCurrent","QuoteNodeChartTypes","generateRouterPath","FREE_TYPES_QUOTE_VALUES","QuoteLongToShortType","DEFAULT_TYPES","FREE_TYPES_QUOTE","reloadDocument","useChartTypes","currentType","selectedType","setSelectedType","icon","iconName","listProps","hasPopoverButtonWidthLimit","Link","CHANGE_UPATE_EVENTS","QUOTE_MODEL_CHANGE_EVENTS","QuoteFetchType","ChangeLabel","changePoints","isTiny","DailyChangeDisplay","withSuspense","_chartLayoutModel$get","_chartModel$quote","chartIndex","useChartLayoutGlobalModelAsync","chartModel","getAllCharts","listenOnEvents","quoteModel","tickerChange","getTickerChange","math","lastClose","tickerAfterChange","points","string","prevProps","nextProps","utmCampaign","testId","DrawButton","newValue","getIsDrawingEnabled","DRAWING_COOKIE_NAME","catch","then","res","ok","expires","setMonth","getMonth","utils","rest","getLayoutType","tickersCount","FullscreenButton","urlTickers","all","getRawTicker","Array","_tickers$index","Search","onTickerSelected","dropdownState","saveToPortfolioDialogState","createAlertDialogState","saveToPortfolioModule","isLoadingSaveToPortfolio","saveToPortfolioAsyncModule","createAlertModule","isLoadingCreateAlert","createAlertAsyncModule","SaveToPortfolio","CreateAlert","detailLink","formattedTicker","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","_window$gtag3","_window3","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","top","height","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","_chartModel$chart_lay","_chartLayoutModel$ide","unwatchedChartModel","isInteractive","navigate","useNavigate","chart_layout","chartModelRef","modelRef","useModelRef","setIsLoading","abortControllerKeyRef","isIdeaChart","updateChartModelWithNewQuote","_chartLayoutModel$act","_chartPane$getAllChar","isSameTicker","getChartOrIndicatorElement","leftOffset","getLeftOffset","isScrolled","getAllQuotes","chartQuote","eql","fetchData","fetchType","chartPane","getChartPane","activeChartEvent","toggleIsOpen","getAllChartEvents","isChartEvent","setChartEvents","chartEvents","updateChartEventsZIndexes","fetchQuote","hasChartEvents","premarket","aftermarket","patterns","getHasPatterns","currentQuote","abortController","createRequestAbortController","shouldAbortRunningRequest","events","cachePredicate","fetchNewDataOnCachedQuote","wasFetchAborted","isQuoteUsedInOtherCharts","destroy","removeFromAbortCache","decodedQueryString","rangesArray","ranges","shouldRecalculateOnCharts","hasSameBarWidth","IndicatorSettings","hasSameBarMargin","hasRedesignEnabled","ChartControls","_chartModel$quote$nam","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","editors","ChartEditorEnum","Heading","level","editable","compactViewMaxBreakpointPx","grow","FLibs","Hammerjs","CHART_LAYOUT_CHILD_CHANGE_EVENT","ContextMenu","Spine","static","this","configure","initClass","contextMenu","selector","constructor","_defineProperty","forceUpdate","componentDidMount","update","componentWillUnmount","render","_document$querySelect2","classList","remove","onContextMenu","ContextMenuComponent","left","add","ready","el","ReactDOM","event","shown","clientY","pageYOffset","clientX","ChartEventPopoverWithState","unwatchedChartLayout","popoverState","chartEventsModule","chartEventsAsyncModule","isChartEventOfThisChart","setData","clickAwayRef","callback","isListening","refCallback","isMobile","Utils","handler","contains","addEventListener","removeEventListener","useClickAway","_chartModel$getChartP","chartEvent","isHovered","unstable_popoverRef","popoverShow","popoverHide","isOpen","newData","getChartEventData","badgeType","getChartEvenBadgeType","ZIndexContext","tabIndex","hasBackdrop","classNames","ChartEventBadgeType","focusOnShow","hasViewportHeightLimit","ChartEventPopoverContent","LoadLatestDataButton","chartModelUnwatched","getIsMounted","isMountedRef","useIsMounted","hasNewDataAvailable","setHasNewDataAvailable","getRefreshInterval","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","zoomFactor","handleGoToMostRecent","handleChartModelChangeDebounced","bind","unbind","hidden","Pane","_this","super","hasSeenCrossNotification","localStorage","getItem","isTouchCrossActive","scrollable","renderAll","oldElementInstance","isDrawingModeContinuousActive","setSelection","startsWith","onPaneDestroy","setSelectedElement","clonedElementInstance","setCanvasSize","recountScale","area","getArea","MouseModel","x","y","_event$targetTouches","activeChartInteraction","TouchEvent","targetTouches","lastClientX","dif","addToLeftOffset","scaleRange","lastClientY","_this$props$model$get","_this$props$model$get2","_this$props$model$get3","difY","scale","ScaleType","invert","currentViewRange","getMinMax","touchEventsDisabled","onScalerMouseDown","onScalerMouseMove","onScalerMouseUp","setActiveChartInteraction","MouseEvent","button","scalerLastY","currentDomainMax","currentDomainMin","domain","onScalerTouchMove","onScalerTouchEnd","_model$getChartOrIndi","_model$getChartOrIndi2","originalMinMax","currentDiff","abs","originalDiff","getBarWidthWithMargin","getMinMaxLeftOffset","newLeftOffset","barIndex","fetchOlderData","getElement","openElementStyleDialog","pointerType","onCanvasPress","elementInArea","thumbsAreInArea","elementModel","ElementModel","hasProperties","isElementDrawing","makeClone","setVisibilityTo","SetVisibilityTo","bringToFront","sendToBack","bringForward","sendBackward","handleRemoveIndicatorPane","paneIndex","element_type","updateType","canvasCtx","_this$props$model$sel","_this$props$model$sel2","getIsCreator","hoveredElement","setIsHovered","_element$instance$get","_element$instance","_element$instance$get2","_element$instance2","getIsCreatorDialogOpen","cross","crossRafId","requestAnimationFrame","renderCross","rafId","_renderAll","canvasRef","getIsUpdatedDesign","renderPane","isMouseInPane","crossCanvasCtx","clearRect","isCrossDisabled","PaneModel","getIsDisabled","elementInstance","renderCrossText","NaN","restore","additionalData","Settings","getSettings","areaRectangle","canvas","areaRectangleCursorX","areaRectangleCursorY","chartLeftX","chartRightX","right","scaled","cursorX","cursorY","isCursorInChartWidthBoundaries","ratio","canvasElement","crossCanvasRef","isDisableTouchCrossAvailable","initialScrollable","lastActiveTool","DrawingTool","isChartsPage","setState","notificationContext","Notification","actions","setItem","inline","activeTool","_this$zoomControlsRef","isMouseDownIgnored","zoomControls","paneHeight","mouseDown","isInArea","touchEvent","onCanvasInteractionStart","_MouseModel$pane","setMousePosition","getMousePositionInBoundaries","_element$getIsChartEv","isTouch","getIsChartEvent","onPaneMouseMove","getIsHammerAllowScrollActive","onCanvasInteractionMove","onCanvasInteractionEnd","onMouseMoveOnScrolling","Touch","isPrimaryClick","_element$getIsChartEv2","_model$getChartOrIndi3","_model$getChartOrIndi4","_model$getChartOrIndi5","setElementCursor","getHTMLElementId","cursor","lastX","lastY","_model$selection$getI","_model$selection","CanvasElement","activeThumb","moveBy","isElementHovered","isSelected","crossCanvas","canvasAreaRectangle","chartLeft","chartRight","chartTop","chartBottom","bottom","getValueInRange","_MouseModel$pane2","isSameMouseModel","setIsSelected","isSelectionCanvas","getIsInChartView","onModelUpdate","onElementCreate","onElementDestroy","onElementReplace","onElementSelect","onElementClone","immediateRecountScaleOnChartIndicatorChange","onChartUpdate","isIndicatorPane","getIsIndicatorPane","_getInitialStoreDrawi","_this$canvasWrapperRe","initialStoreDrawings","_element$instance3","cachePointPositionTimestamp","_element$instance4","getContextWithCache","paneHammer","Hammer","paneRef","touchAction","threshold","time","on","onPress","canvasWrapperHammer","canvasWrapperRef","onTouchMove","passive","scalerRef","scalerHammer","onScalerReset","zoomerRef","zoomerHammer","onZoomerReset","onDoubleClick","_this$canvasWrapperRe2","unmountCanvas","onPaneClick","_this$paneHammer","_this$scalerHammer","_this$zoomerHammer","_this$canvasWrapperHa","_this$scalerHammer2","_this$zoomerHammer2","_this$paneHammer2","_this$canvasWrapperHa2","isChartPane","getIsChartPane","onMouseMove","onMouseLeave","onPaneMouseLeave","onTouchStart","onMouseDown","onResizerMouseDown","onMouseEnter","onScalerMouseEnter","onScalerTouchStart","onZoomerMouseDown","onZoomerMouseMove","onZoomerTouchStart","onAddToZoomFactor","diff","shouldCalculateRightAlign","onTouchEnd","onBlur","getChartAlt","isCharts","isRedesignedFuturesForexCrypto","isRedesignedPage","withNotificationContext","Component","context","withElementStyleDialogState","ChartSpinnerOverlay","shouldDisplay","setIsVisible","timeout","DEFAULT_WRAPPER_COMPONENT","preventDefaultFunc","Chart","panesWrapperElement","isWheelZoomEnabled","zoomerRightAlign","calcZoomerRightAlign","mouseWheelTimeout","activePane","_this$props$layoutMod","onModelChange","calculateMinimalPaneHeight","paneId","chartModelParam","panesHeight","sum","_pane$height","newPaneHeight","round","isNaN","newChartPaneHeight","newIsScrolled","lastWidth","lastHeight","handleQuoteChange","_pane$selection","resizerPaneIndex","onResizerMouseMove","onResizerMouseUp","resizePanesAccordingly","touches","onZoomerMouseUp","p1","p2","getRawDistance","onPinchMove","onPinchEnd","getChartLayoutSettings","fx","first","currentLeftOffset","isIntraday","getBarIndex","close","offsetDiff","shouldAlignDaysToLeftApplied","offsetBars","offset","_e$clientX","onZoomerTouchMove","onZoomerTouchEnd","deltaY","log","sign","isMouseWheel","difX","normalizeWheelDeltaY","addToZoomFactor","diffCoefficient","currentZoomFactor","minBarWidthInPx","maxBarWidthInPx","minZoomFactor","getZoomFactorForBarsToDisplay","chartVisibleWidth","numOfVisibleBars","maxZoomFactor","isNegativeDirection","newZoomFactor","newZoomFactorInRange","getZoomFactor","stretch","getIsSmallIndexChart","updateZoomAndLeftOffsetByDateRange","newQuote","shouldForceLeftOffsetUpdate","isMouseDown","onLayoutModelChange","onPaneCreate","onOlderDataLoaded","onDataLoaded","componentDidUpdate","_prevState$panesWrapp","_this$state$panesWrap","_this$state$panesWrap2","setStateWithPanesTimeout","renderChartToolbar","getAllValidPanes","showSettings","resetMouseModel","handleSetPanesWrapperRef","onPinchStart","onWheel","onMouseWheel","minHeight","total","optiMinHeight","floor","minimalPaneHeight","basePane","WrapperComp","gridArea","isModelDestroyedRef","initChartRef","panesConfig","_pane$elements","_element$overlays","overlays","overlay","panesWithPerfIndicator","allSettled","paneWithPerfIndicator","prefetchPerfIndicatorAllQuotes","paneProperties","createPaneCascade","shouldResize","chartsDimensions","getChartsDimensions","handleModelBeforeDestroy","isChartPage","isFuturesForexCryptoPage","isModelReady","loadingStyle","hasOutline","withWatchedPanesOnChartModel","ReactErrorBoundary","ModuleLoadFailed","DefaultErrorBoundary","message","portfolioWatchlistAsyncModule","SidebarModule","sidebarModules","freeze","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","isError","isSuspenseMode","withModuleAsyncLoad","mobile","SidebarContent","_width$min","_width$max","_width$default$mobile","_width$default","_width$default$deskto","_width$default2","direction","onResize","useSidebarContext","minWidth","DEFAULT_WIDTHS","maxWidth","defaultMobile","defaultDesktop","desktop","SidebarDirection","Resizable","enable","handleClasses","defaultSize","MOBILE_TOOLBAR_DIV_ID","SidebarTabs","activeModule","selectModule","unstable_timeout","entries","isActive","isBlurAfterClick","SIDEBAR_QUERY_PARAM","Sidebar","onShouldResize","tabsClassName","urlSearchParams","useSearchParams","sidebarModuleKey","get","setActiveModule","handleSelectModule","newUrlSearchParams","URLSearchParams","delete","toString","handleCloseSidebar","getIsMobilePortrait","contextValue","isCloseVisible","SidebarContext","ErrorBoundary","FallbackComponent","fallback","drawingCreatorsAsyncModule","drawingActions","DrawingActions","getToolbarDrawingActions","isAddNoteAvailable","isIdea","defaultItem","isDisabled","disabledTooltip","drawingSettings","DrawingSetting","iconActive","titleActive","preserveDrawingsAutosaveOverride","iconAction","titleAction","getToolbarDrawingSettings","isPreserveDrawingsAndAutosaveAvailable","isAutoSaveInProgress","isInAction","drawingTools","toolbarDrawingTools","toolGroup","toolGroupTitle","DISABLED_ITEM_TOOLTIP_LABEL","Toolbar","_chartLayoutModel$ide2","isSidebar","isHorizontal","isMobileOverlay","onActiveToolChange","onDrawingActionClick","onDrawingSettingClick","onDrawingEnd","isAlternativeTheme","areToolsDisabled","drawingCreatorsModule","isDrawingCreatorsModuleLoading","autoSaveState","setIsDrawing","availableDrawingSettings","availableDrawingActions","isDrawingModeContinuous","hasData","hasHiddenDrawings","tool","drawingToolsTouchCreatorsByType","drawingToolsCreatorsByType","ToolClass","one","ToolbarComponent","_item$toolGroup","isToolLoading","ToolbarItem","groupItems","groupTitle","useNativeSelect","ToolbarDivider","ChartAutoSaveNote","onNoteChange","rows","ChartAutoSaveNotes","setTickers","unwatchedInternalStore","handleChartChange","tickerNoteMap","_tickerNoteMap$ticker","AutoSaveNotesDialog","isBackdropDisabled","ConfirmationDialog","onCancel","onAction","isAutosaveDialogContent","dialogContent","getDialogContent","ConfirmationDialogComponent","ToolButton","ToolbarMobile","isToolbarVisible","setIsToolbarVisible","setUrlSearchParams","toolbarMobileElement","setToolbarMobileElement","handleActiveToolChange","drawingTool","wrapperRef","handleClickOutside","_wrapperRef$current","openSelect","actionId","has","params","AutoSaveStateIndicator","setVisibilityTimeout","newIsVisible","checkIfNeededPreventLeaving","returnValue","hasRedesign","ChartLayoutAutoSaveNote","chartLayoutModelUnwatched","ideaNoteRef","getPublishChartHtmlElements","publishChartElements","getElementsByClassName","getChartImgUrl","_imgElement$src","imgElement","src","PublishOldButtonClickListener","dialogConfig","setDialogConfig","isCanvas","chartImgUrl","publishChartHtmlElements","clickHandler","dataset","indexInt","IdeaDrawingsConfirmationOptions","IdeaLeaveDialog","actionCallback","Cancel","Override","Merge","Nothing","getChartElementTypeFromQueryType","queryType","_getChartElementTypeF","QuotePageQueryChartTypes","ChartElementType","getChartElementTypeFromResponseType","TA","useChartRouteChange","useTrackPageView","trackInitial","dateFns","months","updateChartConfig","_ty","decodedSearch","urlType","handleTypeChange","_decodedSearch$t$spli","_decodedSearch$p$spli","_decodedSearch$p","_decodedSearch$r$spli","_decodedSearch$r","urlTicker","urlTimeframe","urlDateRange","newChartConfig","getRawTickerForInstrument","updateAttributesAndSync","_chartLayoutModel$ide3","_chartLayoutModel$ide4","exitIdea","_window$FinvizSetting3","defaultPeriod","TIMEFRAME","defaultDateRange","handleIdeaLeave","action","getDefaultZoomFactor","innerWidth","MOBILE_VIEW_BREAKPOINT_WIDTH","MOBILE_BARS_TO_VIEW","OnInitListener","onRegisterChartLayoutModel","parentElement","setIsInit","checkIfInitIsComplete","isReady","elementIndex","_config$charts$chartI","opacity","withCompleteLayoutModelInit","_props$config$editabl","_props$config$canChan","_props$config$scrolla","_props$config$cross","_props$config$editors","_props$config$ideas","_props$config$specifi","_getInitialStoreDrawi2","_newConfig$idea","newConfig","Theme","isQuotePageWithDrawingsOff","noteDrawing","ideaObject","indicatorElement","getContainerTypeFromPaneConfig","newElements","ChartLayoutModel","isHideDrawingsActive","toolsState","isLockDrawingsActive","DrawingsInternalStore","withQuotePolling","pollingIntervalToCharts","setPollingIntervalToCharts","checkForChartsWithPolling","newPollingIntervalToCharts","chartRefreshInterval","_newPollingIntervalTo","intervalIdsRef","checkForChartsWithPollingDebounced","chartsCheckerIntervalId","EXTRA_MARKET_BUFFER_MINUTES","timeoutDurations","allCharts","timeoutDurationsMin","duration","timeoutId","chartIds","flatMap","quotesToUpdate","quoteToUpdate","dispatchEvent","Event","QUOTE_FETCH_EVENT","ChartLayoutComponentBase","AbortController","preserveDrawings","handlePreserveDrawingsSettings","setPreserveDrawings","val","preserveDrawingAbortController","abort","tools_state","orientationChangeTimeout","setToolbarPosition","handleResize","throttledResize","modelAttrs","throttle","_this$state","_this$state2","getFullscreenStatus","getVisualViewportScale","visualViewport","noteDialogState","toggle","confirmationDialogState","handleConfirmationDialogCloseBtn","settingId","newObj","toggleHideDrawings","handleLockDrawings","event_label","_this$model$activeCha","updateLayout","last","chartConfig","modelProperties","isToolbarHorizontal","handleInitialPreserveDrawingsState","DELETE","getPaneWithSelection","keyCode","ThumbSettings","touchSize","onChartDestroy","onWindowResize","handleOrientationChange","checkTouchEventsDisabled","newIsToolbarHorizontal","renderToolbar","args","isOverlayToolbar","handleDrawingAction","handleDrawingsSetting","_this$props$idea2","newCharts","useGrid","publish","LAYOUTS","isMobilePortrait","_this$props$idea","isSidebarEnabled","getIsSidebarEnabled","handleConfirmationDialogDeleteBtn","ChartGrid","border","columns","_chartLayout$gridArea","ChartGridCell","gridAreas","hasChartTools","renderTools","ideaTitleContainer","ideaTitle","clear","removeCharts","addCharts","_layout$gridAreas","rowStart","columnStart","rowEnd","columnEnd","num","numOfRowsCovered","numOfColumnsCovered","percentageOfRowsCovered","percentageOfColumnsCovered","newWidth","newHeight","general","settingsHeight","wantedCount","pop","ChartLayoutComponent","flowRight","checkQuoteCacheDebounce","cleanupQuoteCache","allQuotes","allChartQuotes","usedQuote","updateChartsTitle","defaultDocumentTitleRef","afterClose","prevClose","percentageChange","overridePlaces","useChartPageTitle","handleChartsUpdate","getChartLayoutWithChartRouteChange","ChartLayout","isWithNotifications","Wrapper","NotificationWrapper","ChartLayoutWithGlobalState","setChartLayoutModel","getChartLayoutModelConfig","lastGlobalRerender","isIPad","IPAD_FULLSCREEN_CLASS","isFullscreen","setIsFullscreen","requestFullscreen","exitFullscreen","getExitFullscreen","checkFullscreen","SORTED_LAYOUT_KEYS","arr","sortBy","sortDirection","SORT_DIRECTION","directionMultiplier","sortObjects","ChartLayoutDropdown","parsedQuery","getChartsToPath","useChartsPathLocation","orientation","DropdownSeparator","ChartSyncableParts","isChartPartInSync","getIsChartPartInSync","setSyncChartParts","ThemeToggleButton","isDarkMode","updateSettings","BREAKPOINTS","Infinity","marketBadgeText","timeFormat","ChartLayoutHeaderComponent","onSettingsOpen","hasPublish","Time","breakpointMode","breakpoints","ChartLayoutHeader","StockDetailTimeframeBar","isDateRangeAvailable","isLoadingOverride","isScrollIntoViewEnabled","containerElement","pushIndicators","indicator","_options$COTs","cotKeys","COTs","code","hasPaneWithCOTCode","PANE_HEIGHT_DEFAULT","parameters","getChartTypeByTaConfigStyle","candlestick","heikinashi","hollowcandlestick","line","ohlc","mergeChartAndTAConfig","taConfig","_chartScaleMap","linear","percentage","logarithmic","indicators","Position","_overlay$parameters","_overlay$color","getPanes","_overlay$parameters2","_overlay$color2","webpackEmptyContext","req","resolve","module","exports","componentsLib","components","white","black","inherit","transparent","finviz","blue","gray","red","orange","amber","yellow","brightYellow","lime","green","emerald","teal","violet","purple","pink","FLibsExports","___EXPOSE_LOADER_IMPORT___","require","___EXPOSE_LOADER_GLOBAL_THIS___","Arrow","renderContent","resize","_thumbs","Thumb","attrs","x1","y1","x2","y2","getBoundingPointKeys","getDefaults","ElementSettings","Colors","roundedXY","getRoundedObject","translateXY","getXYOffsetFromLine","lineWidth","translate","beginPath","angle","PI","moveTo","lineTo","stroke","lineAngle","atan2","h","cos","angle1","topx","topy","sin","angle2","botx","boty","getShouldRenderThumbs","renderThumbs","isDrawingElementLockedOrInvisible","CanvasElementType","prototype","modalConfig","Brush","previousFill","shouldRenderFill","_this$model","positionPointsTimestamps","getTimestampFomPositionX","places","domainDiff","numberOfLeadingZeros","log10","roundToFixed","untranslatedContext","createElement","setFillCache","fill","defaultTransparentFill","isPolyLineClosed","cachedFill","getShouldRenderFill","_this$attrs","brushPath","Path2D","fy","xc","yc","quadraticCurveTo","point","closePath","getThumbs","firstX","firstY","moveByThumb","onMouseUp","roundY","_this$untranslatedCon","isPointInPath","getPositionXFromTimestamp","getAutosaveOmittedProperties","getEdgeXYValues","edgeXYValues","_edgeXYValues$minX","_edgeXYValues$minY","_edgeXYValues$maxX","_edgeXYValues$maxY","minX","minY","maxX","maxY","TailDirection","getTailHalfWidth","halfWidth","dist","Callout","Text","getModalConfigBase","textWithoutBackground","font","fillStyle","lineHeight","textAlign","textBaseline","padding","background","defaultFill","setupContext","setupTextMetricsCache","_this$lastAttrs","_this$lastAttrs2","lastAttrs","lines","getLines","metrics","measureText","measuredHeight","currentIndex","actualBoundingBoxAscent","actualBoundingBoxDescent","PADDING","renderText","previousDescent","fillText","renderBackground","textWidth","minRadius","radius","requiredTailHalfWidth","rectangleSides","topLeft","topRight","rightTop","rightBottom","bottomRight","bottomLeft","leftBottom","leftTop","getRectangleSidesCoordinates","tail","tailRoot","tailTip","getTailCoordinates","tailDirection","topLeftCorner","topRightCorner","bottomLeftCorner","bottomRightCorner","topSide","rightSide","bottomSide","leftSide","noTail","getTailToSideIntersection","lineJoin","arcTo","tailLineToTopLineIntersection","tailHalfWidth","tailLineToRightLineIntersection","tailLineToBottomLineIntersection","tailLineToLeftLineIntersection","renderCallout","renderBorder","tailP1","distance","pointOffsetX","pointOffsetY","tailP2","polygon","Curve","x3","y3","drawQuadraticCurve","curve","Bezier","cp1x","cp2x","cp1y","cp2y","project","d","_Bezier$quadraticFrom","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","sx","getRotatedCoordinates","scaleX","sy","textHeight","scaleY","symbol","xScale","yScale","xOffset","yOffset","rotate","cx","cy","halfHeight","defaults","drawingToolsByType","arrow","brush_v1","callout_v1","elliottWaves","ellipse","ellipse_v1","fibonacci","horizontalLine","measure","pitchfork_v1","rectangle","rotatedRectangle","rotatedRectangle_v1","scaledLine","scaledText","symbolElement","triangle","verticalLine","xabcd","obj","xPointKeys","positionTimestamps","positionX","_this$model$chartEven","_this$model2","_this$model$elements","_this$model3","findByAttribute","__","getIsPaneSelection","_this$model$elements$","attrsSubset","customizer","objValue","srcValue","mergewith","defineProperty","globalAlpha","thumb","startEditing","pointPoitionsFromTimestamp","timestamp","getIsVisible","replaceMyself","captureMessage","oldElement","newElement","isCreatorDialogOpen","release","_this$attrs$visibilit","micro","macro","MicroMacroTimeframe","indexOf","timeframesToSet","attrsToSet","assign","_this$getBoundingPoin","xPoints","yPoints","positionY","isMaxXInvalid","isMinXInvalid","topBound","bottomBound","ElliottWaves","positionWavesTimestamps","waves","wave","getOffsetFromLineWidth","TextBaseline","TextAlign","EllipseV1","rotationAxisPoint","pointToRotate","oldLinePoint","newLinePoint","sharedPoint","rotatedPoinCoordinates","getEllipsePoints","P2","P4","coordinates","P3","P1","CP4","CP1","CP2","CP3","ellipsePath","inverted","cursorTargetX","cursorTargetY","perpendicularPoint","lineCenterX","lineCenterY","invertX","invertY","perpendicularPointEllipseOffsetX","perpendicularPointEllipseOffsetY","P1WithOffsetX","P1WithOffsetY","P3WithOffsetX","P3WithOffsetY","controlPointOffsetX","controlPointOffsetY","newLeftPoint","leftRotatedCursorPoint","getRotatedPointCoordinates","newRightPoint","rightRotatedCursorPoint","FibonacciRetracements","parseCoefficients","coefficients","parsed","trim","getMaxCoefficientUnscaledY","heightScaled","toFixed","splice","maxCoefficientY","HorizontalLine","ScaledLine","updateDecimalPlaces","decimalPlaces","repeat","renderLabels","Line","strokeStyle","dashLength","setLineDash","Measure","volume","roundedX1","roundedX2","minIndexLimit","maxIndexLimit","volMinIndex","volMaxIndex","volumeSum","volumeIndex","numberToStringWithUnitsSuffix","x1Dif","x2Dif","startingX1","startingX2","fillRect","priceDif","heightStr","getRoundedString","number","numOfDecimalPlaces","baseX","baseY","getHeight","getVolumeSumString","addToCoordinates","difs","newX1","newX2","paneArea","getEdgeIntersectionPoint","sides","rayOrigin","rayDirection","intersection","intersectionDistance","rayToLineIntersection","getPitchforkCoordinates","rayDirectionControlPoint1","rayDirectionControlPoint2","trend1","trend2","chartVisibleAreaLeftX","chartVisibleAreaRightX","chartVisibleAreaBottomY","chartVisibleAreaTopLeftPoint","chartVisibleAreaTopRightPoint","chartVisibleAreaBottomLeftPoint","chartVisibleAreaBottomRightPoint","getChartVisibleAreaBoundaries","medianRay","trend1Ray1","trend2Ray1","trend1Ray2","trend2Ray2","medianRayDirectionPoint","rayOriginToRayDirectionVector","rayDirectionControlPoint1ToPoint2Vector","normalizedRayDirectionControlPoint1ToPoint2Vector","medianRayDirectionPointToRayDirectionControlPoint1Distance","trend1Ray","getTrendRayCoordinates","medianToControlPointDistance","normalizedControlToControlPointVector","trendRay1","trendRay2","trend2Ray","medianToTrendLineDistance","trendRayPoint1Origin","trendPoint2RayOriginPoint2","trendRayPoint1DirectionPoint","trendPoint2RayDirectionPoint","Pitchfork","median","_trendLines$filter$","trendLines","line1","line2","trendLine","trendLineIndex","solidTrendColor","getHEXWithSpecificAplha","nextTrendLine","outerTrendLines","Polygon","isPolygon","_this$attrs$points$la","_this$attrs$points$la2","scaledPoints","xPoint","yPoint","targetY","stopY","centerY","stopBaseline","targetBaseline","targetColor","stopColor","targetDif","targetPerc","targetStr","stopDif","stopPerc","stopStr","middle","middle1","roundDif","coordType","coordIndex","Rectangle","strokeRect","RotatedRectangleV1","newMiddleLeftPoint","middleLeftRotatedCursorPoint","newMiddleRightPoint","middleRightRotatedCursorPoint","ScaledText","rect","textBoxX","textBoxY","textBoxWidth","textBoxHeight","propKey","f","_obj$font","testArea","convertArea","rawHight","_border$width","borderWidth","borderColor","thumbWidth","getThumbWidth","Triangle","VerticalLine","XABCD","xx","xy","ax","ay","bx","by","retLabel","len","ret","xab","bcd","result1","getIsSSr","rendered","refresh","drawImage","cWidth","cHeight","sWidth","screen","sHeight","OHLCType","ChartMinWidthBreakpoints","getChartBreakpoints","chartWidthInPx","isXs","xs","isS","isM","m","isL","getDateString","dateString","month","year","getFullYear","day","getDate","getHours","padLeft","getMinutes","MONTHS","gray300","tailwindColors","BaseChart","overlaysByType","getNumOfBarsBuffer","isLargeChart","overlayDefinition","addOverlay","renderYAxis","setupCache","renderOverlaysLabels","handleIndicatorsChange","mouseModelChangeHandler","mouseModel","baseCache","updateShouldRenderVolume","renderChart","renderChartNotAvailable","getIsRedesignedChart","renderTicker","clip","renderVolume","renderOverlays","renderPrevClose","renderFadeExtendedHours","renderGrid","renderXAxis","tickerText","margin","FONT_SIZE","OFFSET","baseline","renderTimeframe","_ChartSettings$left$t","volumeFY","range","getTimeframeLabel","textSecondary","tickerWidth","renderChange","lastOhlc","getOHLC","directRender","changePercentage","lastDate","renderOHLC","isSmallIndexChart","isNewestOHLC","high","low","afterHour","isFinite","roundOhlc","lastVolume","toLocaleTimeString","hour","minute","getRoundedLastData","lastOpen","lastHigh","lastLow","renderOverlaysLabelsChartsPage","renderOverlaysLabelsQuotePage","overlayLabel","isRenderedOverlaysLabel","labelSpacing","getLabelColor","getYAxisLeftMargin","getYAxisLastCloseLabel","firstVisibleClose","getPercentageFromValue","base","contentHeight","lineTicks","textTicks","lastCloseLabel","getTranslate","do","tickCount","minMax","placesAxis","stepPrice","minPerc","maxPerc","d3","nice","ticks","tick","getValueFromPercentage","pixelGap","negativeScale","previousNegativeTick","unshift","positiveScale","getYLineText","yTickText","axis","yTickLine","getYLine","resetYTicksStyles","percentageZeroLineText","undo","renderYAxisLabel","yCoordinate","getSecondaryLabelBackgroundColor","stringifyHSVAColor","getHSVAFromColor","currentBackground","getYAxisSecondaryLabelYCoordinate","_padding$top","_padding$bottom","mainLabelValue","secondaryLabelValue","LINE_HEIGHT","mainLabelValuePosition","secondaryLabelValuePosition","offsetedY","currentText","getDrawDays","render15MinXAxis","renderIntradayXAxis","renderIntradayXAxisFutures","renderDailyXAxis","renderWeeklyXAxis","renderMonthlyXAxis","isXPointVisible","buffer","renderXAxisLabels","_ref9","labels","textRenderer","allowedOverflow","sortedLabels","renderedLabelRanges","reverse","newLabel","hasPriority","_ref10","halfOfTextWidth","overflowLeft","overflowRight","labelX","getIsOverlapping","interval","IntradayTimeframeInterval","marketStartHour","marketStartMinutes","marketEndHour","ceil","aftermarketLengthMinutes","xLine","getXLine","dayToOffset","getDayToOffset","dayIndex","dateFromDateString","drawMinutesPerDay","roundedX","premarketLengthMinutes","lastDay","lastHours","hours","indexOffset","getBarsInDay","lastMonth","gridSecondary","isYearLabel","substring","lastYear","isJanuary","shouldRenderVolume","getIsIndicatorPresent","getVolumeTicks","fontHeight","renderVolumeAxis","relativeVolume","grid","rangeMax","volumeAxisFontSize","volumeAxis","format","tickFormat","domainFrom","domainTo","setupAxisTimeFrame","halfBarWidth","getHalfBarWidth","barWidthWithoutMargin","getBarWithoutMarginWidth","drawInVisibleArea","drawBarCallback","volumeTrendDown","volumeTrendUp","isRendered","contentWidth","getRoundDecimalPlaces","price","getPlacesLastClose","onRenderCrossText","conditionalCursor","getDataByCrossIndex","crossIndex","shouldReturnRoundedString","getDataByBarIndex","getCrossIndexChange","_this$data$close$cros","_this$data$close","crossDataIndex","getDataIndexByBarIndex","crossClose","previousClose","getTickerChangeFromCloseValues","anchorClose","dateByBarIndex","virtualTradedDates","getVirtualTimeframeTradedDates","dateStart","dateEnd","_ref11","change","isOffscreen","isGroupInstrument","changeText","percentString","getChangeColor","changeWidth","afterChangeText","afterChangeTextWidth","oneLineAHChangeWidth","afterChange","renderOHLCChartsPage","renderOHLCQuotePage","_ref12","chartBreakpoints","OhlcText","canvasFill","dateElements","trendColor","oElements","hElements","lElements","cElements","volElements","changeElements","getFlatLineArrayWithSpaces","lineElements","startX","lineElement","LabelsText","numberOfNewOhlcLines","_ref13","dateOnly","timeOnly","lineTopY","OHLCFontSize","centerXOffset","leftXOffset","OHLC","ohlcString","singleLine","OHLC_TEXT","getOHLCType","ohlcSettings","getOHLCSettings","CHART_MARGIN","alignTop","renderOHLCToCanvas","_ref14","ohlcSet","isSingleLineWithChange","n0","n1","x0","premarketFade","aftermarketFade","shouldShowPrevClose","isIntradayWithPreMarket","TIMEFRAMES_WITH_PRE_MARKET","isIndexChart","Cache","getIsMobileChartPage","setupAxis","_utils$max","volumeHeight","volumes","addMarginBottom","marginBottom","setOverlays","removeOverlay","MAX_VALUE","MIN_VALUE","start","end1","asc1","placesLastClose","barFillWidth","barBorderWidth","getBarWidthWithMarginByParts","priceAbs","hasOverlay","getCandleLikeChartsRenderingColors","colors","overwrittenColors","getColorOverwrites","overwrittenColorKeys","hasOverwrittenCandleColor","colorKey","getShouldUseDarkerWickColors","totalBarWidth","darkerWickColors","thinBarColorsOverride","CandleStick","getRenderChartBarProps","chartSettingsColors","hasFillAndBorder","trendDown","trendUp","borderDown","borderUp","wickDown","wickUp","wickColor","barFillColor","shouldRenderFillAndBorder","translateForWick","WICK_WIDTH","candleBodyHigh","candleBodyLow","candleWickHigh","candleWickLow","candleBodyHeight","candleBodyLeftX","halfBorderWidth","isBodyHeightGreaterOrEqualBorders","isWickLineCandleLessThanOnePixel","hasBorder","fillHeight","hasFill","HollowCandleStick","isHollow","generalTrendColor","ohlcTrendUp","ohlcTrendDown","zeroChange","HeikinAshi","haData","getHeikinAshiData","getLastValues","originalLatestClose","heikinLatestCloseLabel","originalLatestCloseLabel","_haData$close$barInde","_haData$close","LineChart","redLine","greenLine","MarketSentiment","MarketSentimentSettings","_data","lastIndex","_dataLastIndex","renderLineBullBear","oversold","overbought","isRedesign","marketDown","marketUp","_compute","computeVisibleMinMax","yLine","fillUp","fillDown","percent","MultiLineChart","ColorsSettings","getQuotes","end","asc","_this$data$getDataByB","maxTickerLength","isLastDate","tickersDimensions","closeValue","_len","arrays","_key","_this$data","OHLCChart","barWithoutMarginWidth","lineThickness","handleLengthFromWick","lineOffset","barX","PerfChart","overlayLabelWidth","perf","shouldRenderDate","tickerData","MARGIN","percentageText","lastCrossIndex","_d3$max","fromDate","toDate","filteredQuotes","closes","daysCount","end2","asc2","monthsInData","availableTickSpots","monthsToAvail","renderMonth","chartsByType","candleStick","heikinAshi","hollowCandleStick","lineChart","marketSentiment","multiLineCharts","ohlcChart","perfChart","XXS","XS","S","M","L","XXL","XXXL","XXXS","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OverlayType","ChartEventDbType","ChartEventType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","ASC","DESC","i1","i2","i3","i5","i10","i15","i30","h2","h4","DateRangeType","TIMEFRAME_SECONDS","w","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","QuotePollingIntervalInMs","ScaleLabel","Linear","Percentage","Logarithmic","INDICATOR_LABEL_HEIGHT","FREE_DATE_RANGES","minutes","days","weeks","prev","curr","PREMARKET_AFTERMARKET_HOURS","_chartLayoutModel$spe","useNotification","setIsFetching","dateFromUnixTimestamp","generatePathForTimeframeDateRange","timeframeUtm","getTimeframeGroupsWithHref","generatePath","timeFrame","getDateRangeGroupsWithHref","dateRangeState","getVisibleBarsNumber","getChartStartEndDates","timeoutInMs","unwatchedChartLayoutModel","hasSyncedTimeframe","ChartSyncablePart","syncChartParts","hasSyncedTicker","_decodedSearch$t","urlTimeframes","urlDateRanges","chartsArrayPlaceholder","_urlTickers$index","currentTicker","timeframes","_urlTimeframes$index","currentTimeframe","_urlDateRanges$index","currentDaterange","sidebar","getTimeframeGroups","timeFrameGroup","QuoteUrlChartTypes","cs","candlesticksimple","o","ha","hc","useChartLayoutGlobalModelAsyncModule","CustomDateRangePrefixEnum","DATE_RANGE_PREFIX_DELMITER","getParsedDateRange","startInSec","getTime","endInSec","lastQuoteDateIndex","lastVisibleBarIndex","firstVisibleBarIndex","quoteDate","isQuoteDateInRange","numOfBarsOffset","getChartZoomAndLeftOffset","numOfBarsToRender","numberOfBarsToDraw","daysInQuote","getDaysInQuote","dateRangePrefix","dateRangeValue","Range","dateFromString","dateToString","dateFrom","dateTo","Prev","years","parseCustomDateRangeUrlParam","convertLocalToNyTime","setHours","startDateIndex","numOfBarsInView","getFullChartWidth","hasAftermarket","hasPremarket","timeframeMinutes","barWidthWithMargin","marketMinutesLength","getIntradayChartConfig","fullChartWidth","offsetInPx","shouldCropChart","chartWidthWithOffset","offsetChartAfter","shouldAlignDaysToLeft","drawDaysInOneChart","_lastQuoteDate$getHou","lastQuoteDate","barsToOffset","offsetChartInPx","_quote$open","isStockIntraday","isQuoteOrOffscreen","isChartsInradayDateRange","getShouldOffsetChartDomain","scaleType","handleDomainOffset","currentScale","scaleCreator","protectedHeightPx","CHART_EVENT_BADGE_SIZE","minPx","extendedMin","rounded","fromEntries","_ref15","_numOfDaysToRender","_quote$getBarsInDay","parsedRange","startQuoteDate","endQuoteDate","numOfDaysToRender","_reversedDaysInQuote$","_reversedDaysInQuote$2","reversedDaysInQuote","startQuoteDayIndex","endQuoteDayIndex","renderDateStart","renderDateEnd","getParsedDateRangeMetaData","_ref16","shouldRenderCross","DEFAULT_CONTEXT","getInstrumentLabel","getResponseChartType","chartType","chartResponseType","tr","multiplier","ChartEvent","getChartEventModel","chartEventModel","getXYPosition","_chartEventModel$yInd","yIndex","_this$model$chart$quo","getChartEventBadgeImage","ChartEventBadgeState","isOpenOverride","isCurrentEventActive","scaledArea","Earnings","_this$getChartEventMo","eventItem","epsActual","epsEstimate","dateTimestamp","chartEventsByType","dividends","earnings","canvasElements","indicatorsByType","elementType","BigNumber","BIG_NUMBER_VALUES","Thousand","Million","Billion","Trillion","BIG_NUMBER_ZEROES","BIG_NUMBER_SUFFIX","dotProduct","crossProduct","pow","lineEquation","k","pointInPolygon","j","oddNodes","distanceToLine","distanceToSegment","l2","getInstrumentDecimalPlaces","formatBigNumber","minNumber","absNum","getString","suffix","zeroes","str","splitString","addZeroes","padEnd","numberByZeroesCount","isInteger","perpendicularPointToLine","yAxisCoeficient","xAxisCoeficient","radAngle","rotatedPointCoordinates","sharedPointLinesAngle","twoSegmentLinesIntersection","p3","p4","denominator","ua","ub","checkLineIntersection","line1_p1","line1_p2","line2_p1","line2_p2","onLine1","onLine2","numerator1","numerator2","getRayToLineSegmentIntersection","rayEnd","segmentStart","segmentEnd","lineIntersection","subtractPoints","getMiddlePointOnLineSegment","normalizeVector","v","multiplyVectorByScalar","scalar","addPoints","enabled","collapsed","logErrors","withStackTrace","logger","console","filterChanges","errorTransformer","titleFormatter","took","parts","nextState","pad","times","printLogEntry","logEntry","startedTime","formattedTime","getSeconds","getMilliseconds","titleCSS","headerCSS","formattedTitle","groupCollapsed","group","styles","trace","groupEnd","initialize","protoModelLoad","started","attributes","returnedValue","apply","badgeImages","getSvgImageCacheKey","ChartEventElement","belongsTo","onBadgeInitLoad","chartBadgeSvgByType","importWithRetry","badgeState","svgHTML","img","Image","encodeURIComponent","onload","fetchAndCacheChartEventBadges","_this$instance$model$","stockEvent","Indicator","Overlay","hostname","periodInt","getParsedIntegersFromPeriodString","INDICATOR_DEFAULT_DOMAIN","compute","renderIndicator","getIsChartPageSpecificFunctionality","renderLabel","isComputeNecessary","shouldUpdate","tickTextStep","formatAxis","valueY","lastValue","_IndicatorSettings$ri","_IndicatorSettings$ri2","_IndicatorSettings$ri3","_IndicatorSettings$ri4","_IndicatorSettings$ri5","_IndicatorSettings$ri6","_IndicatorSettings$ri7","_IndicatorSettings$ri8","indicatorCurrentText","indicatorCurrentBackground","renderLabelChartsPage","renderLabelQuotePage","indicatorLabel","labelWidth","ctx","roundedRect","isPerfIndicator","renderCrossTextChartsPage","renderCrossTextQuotePage","renderOversoldOverbought","zero","drawLines","clipHeight","drawInVisibleAreaProps","fromIndexOffset","renderZeroLine","tickStep","newAttrs","parsePeriodInt","setModel","getDomainDefaults","inputsErrorMessages","getIsValid","getIsNumberInputValid","integerOnly","isPositiveInteger","ADX","_this$adx$last","adx","amdm","apdm","mdi","pdi","atr","deltaHigh","deltaLow","pdm","mdm","di","_this$period","COLORS","Aroon","aroonUp","aroonDown","startAt","highPeriod","highestInPeriod","periodSinceHigh","lowPeriod","lowestInPeriod","periodSinceLow","textLabels","labelSetting","AroonOscillator","_this$oscillator$last","oscillator","ATR","_this$atr$last","AverageTrueRange","CommodityChannelIndex","_this$cci$last","smaCount","tp","cci","smaSum","devCount","typicalPrice","sma","devSum","dev","COT","cotQuoteCode","cot","commercialHedgers","largeTraders","smallTraders","units","renderAdditionalLabels","secondarylabelX","fontSettings","secondarylabel","ForceIndex","_this$fi$last","fi","ema","EMA","MACD","fastPeriod","slowPeriod","signalPeriod","_this$macd$last","macd","signal","histogram","ema1","ema2","ema3","signalLine","_this$fastPeriod","_this$slowPeriod","_this$signalPeriod","MFI","_this$mfi$last","negativeMoneyFlow","mf","mfi","prevTypicalPrice","positiveMoneyFlow","moneyFlow","oldMF","None","OBV","_this$obv$last","obv","currentObv","PricePerformance","getTickers","chartUuid","hasCachedData","getTickersAndTimeframe","firstFetchCalled","_this$model$scaleRang","_this$model$scaleRang2","_this$model$scaleRang3","_this$model$scaleRang4","firstBarTime","lastBarTime","dateToIndex","getDateToIndex","perfArrays","iterable","_this$quotes","_this$quotes2","_this$quotes3","crossIndexTickerTimeStamp","tickerDateToIndex","tickerPerformance","indicatorLabelWidth","performanceIndicatorLabel","_this$quotes4","_tickerQuote$close$le","isVertical","labelBottom","canFitItemsVertically","tickerQuote","maxCrossIndex","_this$quotes5","_this$quotes6","tickerTextWidth","crossText","getSanitizedTicker","RMI","momentum","_this$rmi$last","rmi","u","ad","au","sumu","sumd","rs","_this$momentum","ROC","_this$roc$last","roc","RSI","_this$rsi$last","rsi","DEFAULT_PARAMETERS","RelativeVolume","baseLine","periodStr","parsePeriod","_this$rvol$last","rvol","baseLineY","_this$baseLine","RWI","rwiHi","rwiLo","trSum","atrWeight","maxHi","maxLo","Stochastics","kPeriod","dPeriod","_this$k$last","dCount","dSum","k1","kSum","kCount","highestHigh","lowestLow","_this$kPeriod","_this$dPeriod","StochasticsFast","StochasticsSlow","Trix","_this$trix$last","trix","UltimateOscillator","period1","period2","period3","_this$ult$last","bpSum2","bpSum3","count2","count3","trSum2","trSum3","ult","bp","avg2","avg3","bpSum1","trSum1","count1","avg1","_this$period2","_this$period3","Volume","_this$data$volume$las","WilliamsR","_this$r$last","none","aro","aroosc","rwi","stofa","stofu","stosl","vol","wr","paddingValue","_callbackCache","getContext","_cache","_restore","CanvasRenderingContext2D","that","cb","record","fkey","newCb","origCb","getWatchedPropValue","watchedProp","spineObject","getIsSpineObject","hasToObject","getJSONReplacerFunc","getWatchedProps","getAreWatchedPropsEqual","currentValue","previousValue","DEFAULT_SPINE_EVENTS","DefaultSpineEvents","stringifiedOptions","useForceUpdate","watchedPropertiesRef","handleModelChange","_watchedPropertiesRef","isArray","spineEvents","hasMany","getChartElement","getChartType","_this$getChartElement","defaultRefreshInterval","customRefreshInterval","omitKeys","_this$quote","getIsScrollable","_this$quote$COTs","perfQuotes","quotePerfTickers","_this$getChartElement2","_paneProperties$eleme","_paneModel$mainElemen","chartOrIndicator","attrsInSync","ChartPartToAttrsSyncMap","modelAttr","hasOwnProperty","chartParts","isInSync","chartPart","_hasOverlay","_this$quote$getRawTic","_this$quote2","shouldClear","allChartEvents","Ticker","Timeframe","Crosshair","drawingsInternalStoreModel","_this$syncChartParts$","_this$syncChartParts","chartPartsToSync","newSyncedChartParts","_this$syncChartParts2","_this$charts$first","_this$idea$id","_this$idea","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","chartLightTheme","chartDarkTheme","toLowerCase","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","indicatorLightTheme","indicatorDarkTheme","elementLightTheme","elementDarkTheme","generalColors","_attrs$elements","_attrs$instanceUUID","_attrs$latestLocalUpd","_attrs$latestRemoteUp","_attrs$autoSaveState","newAutoSaveState","_elementAttrs$element","_this$generateUuid","generateUuid","_elementAttrs$zIndex","getElementZIndexRange","oldInstance","pane_id","clonedObj","cloned","moveToZIndex","currentZIndex","directionCoef","newZIndex","elementsBelowZero","elementsAboveZero","getBelowAboveZeroElements","changeElementZIndexes","elementsArray","addElement","oldZIndex","isBelowZero","_this$instance","_this$instance2","isOverlay","_this$instance3","_this$instance4","_this$instance5","_this$instance6","refreshElementId","_this$generateUuid2","MARKET_START","END_OF_DAY","roundTimeForSyncedPane","sourceChart","targetChart","dateToReturn","sourceChartHasPremarket","targetChartHasPremarket","setDate","lastDayOfMonth","lastDayOfWeek","weekStartsOn","endOfDay","getIsDateBeforeMarketStart","Mouse","_this$pane","_this$pane2","getIsCrossSyncOn","getIsMouseInChartOfPane","paneOfMouse","mouseInChart","currentPaneChart","mousePositionTimestamp","currentPanePositionX","_this$position$y","_this$position","_this$pane3","_this$pane4","getIndexInChart","mouse","CHART_EVENT_BADGE_TYPE_ORDER","chartEventElementModel","move","chartPanes","targetPane","currentChartPaneRecords","records","chart_id","ohterChartPaneRecords","targetRecordIndex","arrayWithoutTargetRecord","chartRecordIndex","panesAbove","panesBelow","getNumericId","isSorted","_this$getAllElements$","_this$mainElement","_this$mainElement2","resetHeight","allPaneElements","rebuildElementZIndexes","hoveredChartEvent","openedChartEvent","hoveredTypeChartEventElements","openedTypeChartEventElements","nonActiveChartEventElements","chartEventsOnSameXPoint","chartEvent_B","isOpened","isHoveredType","isOpenType","quoteCache","getCachedQuote","cachedAt","setCachedQuote","_quoteCache$cid","emptyQuote","numberOfRefreshChecks","is404","patternsMinRange","patternsMaxRange","dataId","tickerRaw","fetchFunc","shouldUseCache","select","doesQuoteAndFetchParamsMatch","isSameOrNoChartUuid","isNotEmptyQuote","isCacheAllowed","hasPatterns","doesQuoteAndOptionsMatch","getResolvedFetchingPromise","maxBars","tickersAndTimeframes","accumulator","err","QuoteFetchTypeUrlOption","fetchingPromise","getUrl","getIsAbortError","NotFoundError","shouldUseEmptyQuote","fetchRequest","_data$ticker","_data$patterns","_data$chartEvents","_this$numberOfRefresh","_this$numberOfRefresh2","noNewData","newQuoteData","lastTime","afterTime","AIndex","BIndex","mergeIndex","ADate","BDate","prevAIndex","prevDate","newDate","isSameWeek","isSameMonth","warn","thisDateLength","dataDateLength","load","atts","_this$patterns","drawDays","getBarIndexes","barToDataIndex","_this$barIndex","_chartEvents$map","getChartEventsWithId","deleteCachedQuote","cachedHeikinAshiData","HAClose","heikAshiData","cachedDayToOffset","dateStringFromDate","yyyy","mm","dd","padStart","dataIndex","_quoteData$dataIndex","cachedDateToIndex","getTimestampFromPositionX","host","process","env","BE_API_URL","rev","clearData","largeChartFontSize","INTERACTIVE_CHART_SETTINGS","tickerTimeframeChangeHeight","chartSettings","colorsOverride","settingColors","_config$charts","isLight","getNormalizedZIndex","getFreeColor","periods","getRGBAValueFromValidColorString","BB_COLORS","TOP","BOTTOM","MIDDLE","BollingerBands","deviations","scaledTop","scaledBottom","firstBarToRender","lastBarToRender","stdDev","stdDevSum","upperBand","lowerBand","_this$attrs$period","_this$attrs$deviation","_this$attrs$topColor","_this$attrs$bottomCol","topColor","bottomColor","DonchianChannels","medianBand","_this$attrs$channelSt","_this$attrs$channelFi","_this$attrs$medianBan","strokeColor","channelStrokeColor","fillColor","channelFillColor","medianBandColor","ExponentialMovingAverage","_this$attrs$color","EMA2","HighLow","highColor","prevHigh","lowColor","prevLow","prevBar","_this$attrs$highColor","_this$attrs$lowColor","isPositiveFloat","Stroke","Fill","Conversion","Base","SpanB","conversion","spanB","IchimokuCloud","_this$data$barIndex$x","outsideBar","renderFull","spanAFillColor","spanAStrokeColor","spanBFillColor","spanBStrokeColor","baseLineColor","conversionLineColor","laggingSpanColor","conversionLine","senkouSpanA","senkouSpanB","conversionStartIndex","baseStartIndex","spanBIndex","highestHi","lowestLo","lastSpanAX","lastSpanBX","cloudStartingX","fxOverride","toIndexOffset","_this$attrs$conversio","_this$attrs$base","_this$attrs$spanB","_this$attrs$spanAStro","_this$attrs$spanAFill","_this$attrs$spanBStro","_this$attrs$spanBFill","_this$attrs$conversio2","_this$attrs$baseLineC","_this$attrs$laggingSp","IchimokuCloudFull","KeltnerChannel","emaPeriod","atrPeriod","middleLine","_this$attrs$emaPeriod","_this$attrs$multiplie","_this$attrs$atrPeriod","_this$attrs$strokeCol","_this$attrs$fillColor","Patterns","originalScale","barsInDay","aboveBelow","textHS","above","below","supportColor","resistColor","kind","_this$attrs$supportCo","_this$attrs$resistCol","SAR","maxStep","isLong","sar","ep","newHigh","newLow","af","sarToDraw","risingColor","fallingColor","_this$attrs$step","_this$attrs$maxStep","_this$attrs$risingCol","_this$attrs$fallingCo","customizable","SMA","SMA2","Supertrend","finalUpperBand","finalLowerBand","supertrend","uptrendColor","avg","downtrendColor","_this$attrs$uptrendCo","_this$attrs$downtrend","VP_COLORS","applyOpacityToColor","VolumeProfile","chartWidth","getFirstBarToRenderIndex","getLastBarToRenderIndex","upColor","downColor","_attrs$upColor","_attrs$downColor","minClose","maxClose","segment","segments","up","down","segmentIndex","isInSegment","volumeTrend","volumeFX","segmentHeightRaw","segmentHeight","upSegmentWidth","downSegmentWidth","_this$attrs$opacity","_this$attrs$upColor","_this$attrs$downColor","VWAP","cumulativePV","cumulativeVolume","second","vwap","datesAreOnSameDay","bb","dch","hilo","hline","ic","icf","kch","sma2","vp","arg","_len2","_key2","_len3","_key3","devicePixelRatio","getScaleRatio","referenceDate","dayNumber","monthIndex","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addOffset","quoteDateTimeOffsetInMs","getQuoteDateTimestampOffsetInSeconds","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","bufferMinutes","dayOfWeek","currentDayMinutes","premarketMinutes","aftermarketMinutes","isWeekend","isClosed","setUTCSeconds","testTouchPoints","isMobileOs","navigator","userAgent","createEvent","match","msMaxTouchPoints","maxTouchPoints","matchesIPad","matchesIPhone","matchesIPod","re","RegExp","cookie","toUTCString","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","_element$requestFulls","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","_document$exitFullscr","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","fn","readyState","chartElementId","_box$width","_box$height","box","matchingPages","requestsAbortControllersCache","_requestsAbortControl","abortRequest","controller","websiteShared","getChartEventBadgeColors","outerStroke","innerStroke","innerFill","textFill","getFormattedEventDate","exdate","hasEarningsDateSuffix","parsedDate","formattedDate","formatDateToStringUS","getFormattedValue","bigNumberUnit","maxDecimalPlaces","numberString","bigNumber","wholeNumber","decimalNumber","formattedDecimalNumber","getChartEventBageColors","light","twColors","hover","dark","DAY_IN_SECONDS","TWO_MIN_IN_MS","virtualDatesCache","areTimestampsFromSameDay","ts1","ts2","ts1Utc","ts2Utc","getVirtualDatesCacheId","idRevision","setCachedVirtualDates","fromSeconds","toSeconds","virtualDates","virtualDatesCacheId","lastUsed","checkVirtualCacheSize","MAX_BAR_BORDER_WIDTH","MIN_BAR_MARGIN_WIDTH","MAX_BAR_MARGIN_WIDTH","settingsCenter","barMarginWidth","shouldRound","roundDecimalPlaces","DEFAULT_ZOOM_GUESS_INCREMENT","zoomFactorForBarsToDisplayCache","zoomFactorForBarsToDisplayCacheKeys","getZoomFactorFromCache","_zoomFactorForBarsToD","setZoomFactorToCache","poppedKey","defaultBarWidthWithMargin","zoomIncrement","finalZoomFactor","iteration","barWidthDiff","getTimeframeSeconds","lowerIndex","dates","upperIndex","isWithinRangeOfQuoteDate","commonVirtualCacheProps","cachedDates","cache","virtualDateSeconds","getCachedVirtualDates","timeframeSeconds","firstDate","numOfDatesBefore","numOfDatesAfter","virtualTradedDays","dateStartSeconds","dateEndSeconds","datesSeconds","isStartBeforeDates","isEndAfterDates","dateTime","getVirtualTradedDays","marketStartSeconds","barTimeframeSeconds","quoteDatesTimestampOffset","dayStartSeconds","barSeconds","virtualTimeframeTradedDates","isLowerBounded","isOneBeforeLowerBoundStarts","lastDateIndex","isLookingBack","averageBarDate","numOfSecondsOutOfBounds","_perfIndicatorElement","_perfIndicatorElement2","perfIndicatorElement","getPerfIndicatorTickerAndTimeframes","_ref17","getCrossIndexForPane","getShouldRenderCrossInPane","getPriceForPane","isXAxisInView","domainRange","priceFy","YAxisLeftMargin","getCrossText","_getRoundDecimalPlace","firstBarClose","_ref18","_ref19","_ref20","changePercent","changePercentString","_ref21","isForexFuturesCryptoPage","_ref22","isForexFuturesCrypto","isOffscreenChartWithNarrowBars","isQuoteChartWithNarrowBars","hasSidebarEnabled","_ref23","hexStringToRGBA","hexColor","removeHashSymbol","g","rgbaToHexString","alpha","alphaToHex","rgbaToHSVA","hsvaToRGBA","rgbaToRGBAString","rgbaStringToObject","colorParts","exec","strColor","allowAlpha","getIsRgb","rgbKeys","output","canSelectAlpha","hsvaToHEXString","_barToDataIndex$Math$","object","formData","append","FormData","statusCode","throwOnPredicate","credentials","responseContentType","Html","responseData","ApplicationJson","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","status","getStatusCodeError","forceUpdateKey","increment","precision","periodString","part","exception","captureContext","parsedNumber","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","visited","WeakSet","toLocaleDateString","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","getRandomValues","Uint8Array","two","local","remote","useChartLayoutGlobalModelModule","useChartLayoutGlobalModel","DateFns","ReactRouterDOM"],"sourceRoot":""}