{"version":3,"file":"main.e232cdd2.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/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/./app/controllers/sidebar/modules/portfolio-watchlist/async-modules.ts","webpack://charts/./app/controllers/sidebar/modules/module-load-failed.tsx","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/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/constants.ts","webpack://charts/./app/models/chart_settings/be_large_chart_with_overlays.ts","webpack://charts/./app/models/chart_settings/be_large_chart_without_overlays.ts","webpack://charts/./app/models/chart_settings/be_small_chart_with_overlays.ts","webpack://charts/./app/models/chart_settings/be_small_chart_without_overlays.ts","webpack://charts/./app/models/chart_settings/index.ts","webpack://charts/./app/models/chart_settings/interactive_chart_settings.ts","webpack://charts/./app/models/chart_settings/interfaces.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/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.tsx","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/import-with-retry.ts","webpack://charts/./app/utils/query_string.ts","webpack://charts/./app/utils/use-is-mounted.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 { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { getTickerChange } from '../../utils/chart'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\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 [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\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 CreateAlert,\n Dialog,\n DialogTrigger,\n Dropdown,\n DropdownItem,\n Icon,\n SaveToPortfolio,\n Search as WebsiteSearchComponent,\n useDialogState,\n useDropdownState,\n} from '../../components'\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 saveToPortfolioDialog = useDialogState()\n const createAlertDialog = useDialogState()\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 \n \n \n \n \n
\n )\n}\n","import React from 'react'\n\nimport {\n Button,\n Popover,\n PopoverTrigger,\n getExtendedDialogState,\n useElementMeasure,\n usePopoverState,\n} from '../../components'\nimport { SpecificChartFunctionality } from '../../constants/common'\nimport { chartSettingsAsyncModule } 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 [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { PreventClosingUnsavedChanges, ChartSettings } = chartsModule\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 return (\n \n {({ checkForUnsavedChangesAndClose }) => (\n \n {!isFullyClosed && {}} onClose={checkForUnsavedChangesAndClose} />}\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","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 >\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 elements = this.props.model.getAllElements()\n const chartEvents = this.props.model.getAllChartEvents()\n\n for (let i = chartEvents.length - 1; i >= 0; i--) {\n const el = chartEvents[i].instance\n if (el.isInArea(area)) {\n return el\n }\n }\n\n for (let i = elements.length - 1; i >= 0; i--) {\n const el = elements[i].instance\n if (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","export const portfolioWatchlistAsyncModule = {\n importFn: () => import(/* webpackChunkName: \"portfolio-watchlist\" */ './portfolio-watchlist'),\n cacheKey: 'portfolio-watchlist',\n}\n","import React from 'react'\n\nimport { Button, Paragraph } from '../../../components'\n\nexport function ModuleLoadFailed() {\n return (\n

\n
\n \n The Sidebar Widget didn't load successfully. Please refresh the page.\n \n \n
\n
\n )\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, { isLoading, isError }] = useAsyncModule({\n ...asyncModule,\n shouldLoadModule: true,\n })\n\n const SidebarModule = sidebarModule?.default\n\n if (isError) {\n return \n }\n\n return (\n <>\n {(isLoading || (!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 React from 'react'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\n\nimport { getIsMobilePortrait } from '../../utils'\nimport { localStorage } from '../../website-shared'\nimport { SidebarDirection } from './constants'\nimport { SidebarContext, SidebarContextType } from './hooks/sidebar-context'\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","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 { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\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 [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { setChartLayoutModel, getChartLayoutModelConfig, lastGlobalRerender } =\n chartsModule.useChartLayoutGlobalModel()\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 { useAsyncModule, withSuspense } from '../../utils/async-modules-utils'\nimport { chartSettingsAsyncModule } from '../chart-settings/async-modules'\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 [chartsModule] = useAsyncModule({\n ...chartSettingsAsyncModule,\n isSuspenseMode: true,\n })\n const { chartLayoutModel } = chartsModule.useChartLayoutGlobalModel()\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} SaveToPortfolio\n * @property {import('react').FC} ConfirmationDialog\n * @property {import('react').FC} CreateAlert\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} 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} PortfolioWatchlistTable\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} 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 {LocalStorageService} localStorage\n */\n\n/**\n * Add type so that the properties are suggested\n * @type {FLibsExport}\n */\nconst FLibsExports = window.FLibs\n\nmodule.exports = FLibsExports\n","export { getFullChartWidth, getIntradayChartConfig } from './controllers/renderUtils'\n\nexport { useAsyncModule, withSuspense } from './utils/async-modules-utils'\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 * as convertTa from './utils/convert_ta'\nexport { FREE_DATE_RANGES } from './constants/common'\n\nexport { chartSettingsAsyncModule } 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 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\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 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\nexport default Callout\n","import { Bezier } from 'bezier-js'\n\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 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\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\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\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\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 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 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 getIsInChartView(_: Chart) {\n return true\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\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 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\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 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\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\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 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 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","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","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 '../utils/import-with-retry'\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 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 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","export const largeChartFontSize = {\n S: 8,\n M: 10,\n XXL: 16,\n XXXL: 24,\n}\n","import { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\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 { largeChartFontSize } from './constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// large & ta\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 1,\n}\n\nexport const BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 20,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -46, top: -4 },\n font: {\n size: largeChartFontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: largeChartFontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.singleLine,\n },\n change: {\n margin: {\n top: 1,\n right: 40,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 3,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n left: {\n width: 50,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: 6,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 35,\n },\n font: {\n size: largeChartFontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 40,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 20,\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: -2,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n },\n left: {\n width: 50,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n lineHeight: largeChartFontSize.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 { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\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 { largeChartFontSize } from './constants'\nimport { ISettings, OHLCType } from './interfaces'\n\n// large & !ta\n\nconst center = {\n barWidth: 3,\n barMargin: 1,\n border: 1,\n}\n\nexport const BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 20,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -46, top: -4 },\n font: {\n size: largeChartFontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: largeChartFontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.singleLine,\n },\n change: {\n margin: {\n top: 1,\n right: 40,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: 0,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 3,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n left: {\n width: 50,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: 6,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 35,\n },\n font: {\n size: largeChartFontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 40,\n },\n font: {\n size: largeChartFontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 20,\n },\n right: {\n width: 50,\n axis: {\n margin: {\n left: -2,\n },\n font: {\n size: largeChartFontSize.S,\n lineHeight: largeChartFontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 20,\n },\n left: {\n width: 50,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.S,\n left: OFFSET.M,\n },\n font: {\n size: largeChartFontSize.M,\n style: 'bold',\n lineHeight: largeChartFontSize.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 { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\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, OHLCType } from './interfaces'\n\n// !large & ta => http://localhost:3000/?cs=m&ct=candle_stick&t=AAPL&tf=d&o[0][ot]=sma&o[0][op]=20&o[0][oc]=dc32b363&o[1][ot]=sma&o[1][op]=50&o[1][oc]=ff8f33c7&o[2][ot]=sma&o[2][op]=200&o[2][oc]=dcb3326e&o[3][ot]=patterns&o[3][op]=&o[3][oc]=87ceef|dc9fe5\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 0,\n}\n\nconst fontSize = {\n S: 7,\n M: 8,\n XXXL: 16,\n}\n\nexport const BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 15,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -26, top: 0 },\n font: {\n size: fontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: fontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.dateOnly,\n },\n change: {\n margin: {\n top: 1,\n right: 30,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 15,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 2,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n left: {\n width: 30,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -4,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 20,\n },\n font: {\n size: fontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 25,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 8,\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 8,\n },\n left: {\n width: 30,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.XXS,\n left: OFFSET.M,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n lineHeight: fontSize.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 { Theme } from '../../../types/shared'\nimport {\n FONT_SIZE,\n OFFSET,\n PADDING,\n SETTINGS_HEIGHT,\n TICKER_TIMEFRAME_CHANGE_HEIGHT,\n TextAlign,\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, OHLCType } from './interfaces'\n\n// !large & !ta => http://localhost:3000/?cs=m&ct=candle_stick&t=AAPL&tf=d\n\nconst center = {\n barWidth: 2,\n barMargin: 0,\n border: 1,\n}\n\nconst fontSize = {\n S: 7,\n M: 8,\n XXXL: 16,\n}\n\nexport const BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS = (theme: Theme): ISettings => ({\n ChartSettings: {\n general: {\n Colors: {\n ...chartLightTheme,\n [Theme.light]: chartLightTheme,\n [Theme.dark]: chartDarkTheme,\n },\n settingsHeight: SETTINGS_HEIGHT,\n tickerTimeframeChangeHeight: TICKER_TIMEFRAME_CHANGE_HEIGHT,\n },\n center,\n top: {\n height: 15,\n baseline: TextBaseline.top,\n ticker: {\n margin: { left: -26, top: 0 },\n font: {\n size: fontSize.XXXL,\n style: 'bold',\n },\n },\n ohlc: {\n margin: {\n top: 2,\n left: 15,\n right: 15,\n },\n font: {\n size: fontSize.S,\n textAlign: TextAlign.left,\n baseline: TextBaseline.top,\n },\n type: OHLCType.dateOnly,\n },\n change: {\n margin: {\n top: 1,\n right: 30,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n },\n },\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 15,\n baseline: TextBaseline.top,\n axis: {\n margin: {\n top: 2,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n left: {\n width: 30,\n overlayLabel: {\n labelSpacing: 12,\n margin: {\n top: -4,\n left: 4,\n },\n font: {\n size: FONT_SIZE.S,\n weight: 'bold',\n },\n },\n timeframe: {\n margin: {\n top: 0,\n left: 20,\n },\n font: {\n size: fontSize.M,\n weight: '900',\n family: 'Lato, sans-serif',\n },\n },\n volumeAxis: {\n margin: {\n left: 25,\n },\n font: {\n size: fontSize.S,\n },\n },\n },\n },\n IndicatorSettings: {\n general: {\n height: 140,\n Colors: theme === Theme.light ? indicatorLightTheme : indicatorDarkTheme,\n },\n center,\n top: {\n height: 8,\n },\n right: {\n width: 34,\n axis: {\n margin: {\n left: -4,\n },\n font: {\n size: fontSize.S,\n lineHeight: fontSize.S,\n padding: {\n top: PADDING.XXXS,\n bottom: PADDING.XS,\n left: PADDING.XXS,\n right: PADDING.XXS,\n },\n },\n },\n },\n bottom: {\n height: 8,\n },\n left: {\n width: 30,\n indicatorLabel: {\n labelSpacing: 1,\n margin: {\n top: OFFSET.XXS,\n left: OFFSET.M,\n },\n font: {\n size: fontSize.M,\n style: 'bold',\n lineHeight: fontSize.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 { ObjectHash, Theme } from '../../../types/shared'\nimport { IChartThemeColors, chartDarkTheme, chartLightTheme } from '../constants'\nimport { BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS } from './be_large_chart_with_overlays'\nimport { BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS } from './be_large_chart_without_overlays'\nimport { BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS } from './be_small_chart_with_overlays'\nimport { BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS } from './be_small_chart_without_overlays'\nimport { INTERACTIVE_CHART_SETTINGS } from './interactive_chart_settings'\nimport { ISettings } from './interfaces'\n\nexport enum CHART_FORMAT {\n INTERACTIVE = 'INTERACTIVE',\n BE_SMALL_CHART_WITHOUT_OVERLAYS = 'BE_SMALL_CHART_WITHOUT_OVERLAYS',\n BE_SMALL_CHART_WITH_OVERLAYS = 'BE_SMALL_CHART_WITH_OVERLAYS',\n BE_LARGE_CHART_WITHOUT_OVERLAYS = 'BE_LARGE_CHART_WITHOUT_OVERLAYS',\n BE_LARGE_CHART_WITH_OVERLAYS = 'BE_LARGE_CHART_WITH_OVERLAYS',\n}\n\nexport const getChartSettings = ({ chartFormat, theme }: { theme: Theme; chartFormat?: CHART_FORMAT }): ISettings => {\n switch (chartFormat) {\n case CHART_FORMAT.BE_SMALL_CHART_WITHOUT_OVERLAYS:\n return BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_SMALL_CHART_WITH_OVERLAYS:\n return BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_LARGE_CHART_WITHOUT_OVERLAYS:\n return BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.BE_LARGE_CHART_WITH_OVERLAYS:\n return BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS(theme)\n case CHART_FORMAT.INTERACTIVE:\n default:\n return INTERACTIVE_CHART_SETTINGS(theme)\n }\n}\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 { 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 { 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","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","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 { CHART_FORMAT, getChartSettings, getColorOverwrites } from './chart_settings'\nimport { largeChartFontSize } from './chart_settings/constants'\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 chartFormat?: CHART_FORMAT\n volumeHeight?: number\n colors?: ObjectHash, Theme>\n specificChartFunctionality?: SpecificChartFunctionality\n}\n\nexport function getSettings(config: Config): ISettings {\n const settings = merge({}, getChartSettings({ chartFormat: config.chartFormat, theme: 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 * as React from 'react'\n\nimport { Notification, Paragraph, useNotification } from '../components'\nimport { captureException } from './helpers'\nimport { importWithRetry } from './import-with-retry'\nimport { useIsMounted } from './use-is-mounted'\n\nconst cache: any = {}\nconst errorsCache: any = {}\n\nenum ErrorSeverity {\n medium,\n high,\n}\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 function useAsyncModule({\n importFn,\n onError,\n errorSeverity,\n cacheKey,\n shouldLoadModule = false,\n isSuspenseMode = false as SuspenseMode,\n}: {\n importFn: () => Promise\n onError?: () => void\n cacheKey: string\n errorSeverity?: keyof typeof ErrorSeverity\n shouldLoadModule?: boolean\n isSuspenseMode?: SuspenseMode\n}) {\n const notificationContext = useNotification()\n const [isLoading, setIsLoading] = React.useState(false)\n const [isError, setIsError] = React.useState(false)\n const getIsMounted = useIsMounted()\n\n const handleError = () => {\n onError?.()\n setIsError(true)\n\n if (errorSeverity === undefined) {\n return\n }\n\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.high) {\n window.handleScriptNotLoaded()\n window.renderScriptNotLoaded()\n }\n\n if (ErrorSeverity[errorSeverity] === ErrorSeverity.medium) {\n notificationContext.show(\n \n \n One or more of the required application components couldn’t be loaded.
Please try to repeat the\n action or{' '}\n window.location.reload()}>\n refresh the page\n {' '}\n if the problem persists.\n
\n
\n )\n }\n }\n\n const loadModule = async () => {\n if (cache[cacheKey]) {\n return cache[cacheKey]\n }\n\n setIsLoading(true)\n\n try {\n cache[cacheKey] = await importWithRetry(importFn)\n } catch (error) {\n captureException(error as Error)\n handleError()\n } finally {\n if (getIsMounted()) {\n setIsLoading(false)\n }\n }\n\n return cache[cacheKey]\n }\n\n React.useEffect(() => {\n if (shouldLoadModule) {\n loadModule()\n }\n // We want to run it only on shouldLoadModule change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [shouldLoadModule])\n\n const cachedModule = cache[cacheKey]\n if (isSuspenseMode) {\n if (errorsCache[cacheKey]) throw errorsCache[cacheKey]\n if (!cachedModule) {\n throw importFn()\n .then((mod) => (cache[cacheKey] = mod))\n .catch((err) => {\n handleError()\n errorsCache[cacheKey] = err\n })\n }\n }\n\n return [cachedModule ?? null, { isLoading, loadModule, isError }] as [\n SuspenseMode extends true ? T : T | null,\n { isLoading: boolean; loadModule: () => Promise; isError: boolean },\n ]\n}\n\n/**\n * HOC which wraps component in React.Suspense\n *\n * Usage: [wiki](https://github.com/finvizhq/Finviz-Website/wiki/Loading-modules-asynchronously#withsuspense)\n */\nexport function withSuspense

>(\n Component: React.ComponentType

,\n fallback: React.ReactNode = null\n) {\n return function WrappedComponent(props: P) {\n return (\n \n \n \n )\n }\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","const NUM_OF_RETRIES = 3\n\nexport function importWithRetry(importFn: () => Promise, retries = 0) {\n const result = importFn().catch(async (err) => {\n if (retries > NUM_OF_RETRIES) {\n throw err\n }\n\n await new Promise((r) => setTimeout(r, 1000 * retries))\n\n return importWithRetry(importFn, retries + 1)\n }) as Promise\n\n return result\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","// 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 { 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","chartsModule","chartSettingsAsyncModule","isSuspenseMode","useChartLayoutGlobalModel","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","saveToPortfolioDialog","createAlertDialog","detailLink","formattedTicker","WebsiteSearchComponent","inputClass","isSearchIcon","isSearchItemLink","isShowAllVisible","_window$gtag3","_window3","SaveToPortfolio","onClose","CreateAlert","SETTINGS_WIDTH","BUTTON_POPOVER_GUTTER","SETTINGS_POPOVER_ID","ScrollableChartSettingsPopover","elementWidth","bodyWidth","useElementMeasure","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","checkForUnsavedChangesAndClose","Popover","popoverWrapperStyle","focusOnHide","hideOnClickOutside","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","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","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","portfolioWatchlistAsyncModule","ModuleLoadFailed","SidebarModule","sidebarModules","freeze","portfolio","description","content","asyncModule","withInitialLoading","isComponentReady","setIsComponentReady","sidebarModule","isError","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","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","message","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","fallback","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","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","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","getIsInChartView","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","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","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","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","minX","maxX","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","OHLCType","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","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","maxY","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","largeChartFontSize","fontSize","CHART_FORMAT","getChartSettings","chartFormat","BE_SMALL_CHART_WITHOUT_OVERLAYS","chartLightTheme","chartDarkTheme","tickerTimeframeChangeHeight","indicatorLightTheme","indicatorDarkTheme","generalColors","elementLightTheme","elementDarkTheme","BE_SMALL_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS","BE_SMALL_CHART_WITH_OVERLAYS","BE_SMALL_CHART_WITH_OVERLAYS_CHART_SETTINGS","BE_LARGE_CHART_WITHOUT_OVERLAYS","BE_LARGE_CHART_WITHOUT_OVERLAYS_CHART_SETTINGS","BE_LARGE_CHART_WITH_OVERLAYS","BE_LARGE_CHART_WITH_OVERLAYS_CHART_SETTINGS","INTERACTIVE","INTERACTIVE_CHART_SETTINGS","normalizeHexAlpha","hexString","customColors","customColorKeys","defaultColors","toLowerCase","crossTextBackground","negativeChange","overlayTransparentBackground","positiveChange","_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","positionY","_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","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","cache","errorsCache","ErrorSeverity","setIsError","handleError","handleScriptNotLoaded","renderScriptNotLoaded","medium","loadModule","cachedModule","mod","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","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","NUM_OF_RETRIES","retries","isMountedRef","DateFns","ReactRouterDOM"],"sourceRoot":""}