{"version":3,"file":"FlameGraphPane.cjs","sources":["../../src/FlameGraphPane.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nimport { escapeStringForRegex } from '@grafana/data';\n\nimport FlameGraphCallTreeContainer from './CallTree/FlameGraphCallTreeContainer';\nimport FlameGraph from './FlameGraph/FlameGraph';\nimport { type GetExtraContextMenuButtonsFunction } from './FlameGraph/FlameGraphContextMenu';\nimport { type FlameGraphDataContainer } from './FlameGraph/dataTransform';\nimport FlameGraphTopTableContainer from './TopTable/FlameGraphTopTableContainer';\nimport { FLAMEGRAPH_CONTAINER_HEIGHT } from './constants';\nimport { useColorScheme } from './hooks';\nimport { type ClickedItemData, PaneView, type ViewMode, type TextAlign } from './types';\n\nexport type FlameGraphPaneProps = {\n  paneView: PaneView;\n  dataContainer: FlameGraphDataContainer;\n  search: string;\n  matchedLabels: Set<string> | undefined;\n  onTableSymbolClick?: (symbol: string) => void;\n  onTextAlignSelected?: (align: string) => void;\n  onTableSort?: (sort: string) => void;\n  showFlameGraphOnly?: boolean;\n  disableCollapsing?: boolean;\n  getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n  viewMode: ViewMode;\n  paneViewForContextMenu: PaneView;\n  setSearch: (search: string) => void;\n  resetKey?: number;\n  keepFocusOnDataChange?: boolean;\n  focusedItemIndexes?: number[];\n  setFocusedItemIndexes?: (itemIndexes: number[] | undefined) => void;\n  sharedSandwichItem?: string;\n  setSharedSandwichItem?: (item: string | undefined) => void;\n};\n\nconst FlameGraphPane = ({\n  paneView,\n  dataContainer,\n  search,\n  matchedLabels,\n  onTableSymbolClick,\n  onTextAlignSelected,\n  onTableSort,\n  showFlameGraphOnly,\n  disableCollapsing,\n  getExtraContextMenuButtons,\n  viewMode,\n  paneViewForContextMenu,\n  setSearch,\n  resetKey,\n  keepFocusOnDataChange,\n  focusedItemIndexes,\n  setFocusedItemIndexes,\n  sharedSandwichItem,\n  setSharedSandwichItem,\n}: FlameGraphPaneProps) => {\n  const [focusedItemData, setFocusedItemData] = useState<ClickedItemData>();\n  const [rangeMin, setRangeMin] = useState(0);\n  const [rangeMax, setRangeMax] = useState(1);\n  const [textAlign, setTextAlign] = useState<TextAlign>('left');\n  const [localSandwichItem, setLocalSandwichItem] = useState<string>();\n\n  const isUsingSharedSandwich = setSharedSandwichItem !== undefined;\n  const sandwichItem = isUsingSharedSandwich ? sharedSandwichItem : localSandwichItem;\n  const setSandwichItem = useCallback(\n    (item: string | undefined) => {\n      if (isUsingSharedSandwich && setSharedSandwichItem) {\n        setSharedSandwichItem(item);\n      } else {\n        setLocalSandwichItem(item);\n      }\n    },\n    [isUsingSharedSandwich, setSharedSandwichItem]\n  );\n  const [collapsedMap, setCollapsedMap] = useState(() => dataContainer.getCollapsedMap());\n  const [colorScheme, setColorScheme] = useColorScheme(dataContainer);\n\n  const styles = getStyles();\n\n  useLayoutEffect(() => {\n    setCollapsedMap(dataContainer.getCollapsedMap());\n  }, [dataContainer]);\n\n  useEffect(() => {\n    if (resetKey !== undefined && resetKey > 0) {\n      setFocusedItemData(undefined);\n      setRangeMin(0);\n      setRangeMax(1);\n      setLocalSandwichItem(undefined);\n    }\n  }, [resetKey]);\n\n  useEffect(() => {\n    if (!keepFocusOnDataChange) {\n      setFocusedItemData(undefined);\n      setRangeMin(0);\n      setRangeMax(1);\n      setSandwichItem(undefined);\n      return;\n    }\n\n    if (dataContainer && focusedItemData) {\n      const item = dataContainer.getNodesWithLabel(focusedItemData.label)?.[0];\n\n      if (item) {\n        setFocusedItemData({ ...focusedItemData, item });\n\n        const levels = dataContainer.getLevels();\n        const totalViewTicks = levels.length ? levels[0][0].value : 0;\n        setRangeMin(item.start / totalViewTicks);\n        setRangeMax((item.start + item.value) / totalViewTicks);\n      } else {\n        setFocusedItemData({\n          ...focusedItemData,\n          item: {\n            start: 0,\n            value: 0,\n            itemIndexes: [],\n            children: [],\n            level: 0,\n          },\n        });\n\n        setRangeMin(0);\n        setRangeMax(1);\n      }\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [dataContainer, keepFocusOnDataChange]);\n\n  const weSetFocusRef = useRef(false);\n\n  useEffect(() => {\n    if (!focusedItemIndexes || focusedItemIndexes.length === 0) {\n      return;\n    }\n\n    if (weSetFocusRef.current) {\n      weSetFocusRef.current = false;\n      return;\n    }\n\n    const currentIndexes = focusedItemData?.item.itemIndexes;\n    if (currentIndexes && currentIndexes.length === focusedItemIndexes.length) {\n      const matches = currentIndexes.every((val, idx) => val === focusedItemIndexes[idx]);\n      if (matches) {\n        return;\n      }\n    }\n\n    const levels = dataContainer.getLevels();\n    for (const level of levels) {\n      for (const item of level) {\n        if (\n          item.itemIndexes.length === focusedItemIndexes.length &&\n          item.itemIndexes.every((val, idx) => val === focusedItemIndexes[idx])\n        ) {\n          const label = dataContainer.getLabel(item.itemIndexes[0]);\n          const totalViewTicks = levels[0][0].value;\n\n          setFocusedItemData({ label, item, posX: 0, posY: 0 });\n          setRangeMin(item.start / totalViewTicks);\n          setRangeMax((item.start + item.value) / totalViewTicks);\n          return;\n        }\n      }\n    }\n  }, [focusedItemIndexes, dataContainer, focusedItemData]);\n\n  const resetFocus = useCallback(() => {\n    setFocusedItemData(undefined);\n    setRangeMin(0);\n    setRangeMax(1);\n    setFocusedItemIndexes?.(undefined);\n  }, [setFocusedItemIndexes]);\n\n  const resetSandwich = useCallback(() => {\n    setSandwichItem(undefined);\n  }, [setSandwichItem]);\n\n  const onSymbolClick = useCallback(\n    (symbol: string) => {\n      const anchored = `^${escapeStringForRegex(symbol)}$`;\n      if (search === anchored) {\n        setSearch('');\n      } else {\n        onTableSymbolClick?.(symbol);\n        setSearch(anchored);\n        resetFocus();\n      }\n    },\n    [search, setSearch, resetFocus, onTableSymbolClick]\n  );\n\n  const onCallTreeSymbolClick = useCallback(\n    (symbol: string) => {\n      onTableSymbolClick?.(symbol);\n    },\n    [onTableSymbolClick]\n  );\n\n  const onCallTreeSearch = useCallback(\n    (symbol: string) => {\n      const anchored = `^${escapeStringForRegex(symbol)}$`;\n      if (search === anchored) {\n        setSearch('');\n      } else {\n        onTableSymbolClick?.(symbol);\n        setSearch(anchored);\n        resetFocus();\n      }\n    },\n    [search, setSearch, resetFocus, onTableSymbolClick]\n  );\n\n  const onTopTableSearch = useCallback(\n    (str: string) => {\n      if (!str) {\n        setSearch('');\n        return;\n      }\n      setSearch(`^${escapeStringForRegex(str)}$`);\n    },\n    [setSearch]\n  );\n\n  let content;\n  switch (paneView) {\n    case PaneView.TopTable:\n      content = (\n        <div className={styles.tableContainer}>\n          <FlameGraphTopTableContainer\n            data={dataContainer}\n            onSymbolClick={onSymbolClick}\n            search={search}\n            matchedLabels={matchedLabels}\n            sandwichItem={sandwichItem}\n            onSandwich={setSandwichItem}\n            onSearch={onTopTableSearch}\n            onTableSort={onTableSort}\n            colorScheme={colorScheme}\n          />\n        </div>\n      );\n      break;\n    case PaneView.FlameGraph:\n    default:\n      content = (\n        <FlameGraph\n          data={dataContainer}\n          rangeMin={rangeMin}\n          rangeMax={rangeMax}\n          matchedLabels={matchedLabels}\n          setRangeMin={setRangeMin}\n          setRangeMax={setRangeMax}\n          onItemFocused={(data) => {\n            setFocusedItemData(data);\n            weSetFocusRef.current = true;\n            setFocusedItemIndexes?.(data.item.itemIndexes);\n          }}\n          focusedItemData={focusedItemData}\n          textAlign={textAlign}\n          onTextAlignChange={(align) => {\n            setTextAlign(align);\n            onTextAlignSelected?.(align);\n          }}\n          sandwichItem={sandwichItem}\n          onSandwich={(label: string) => {\n            resetFocus();\n            setSandwichItem(label);\n          }}\n          onFocusPillClick={resetFocus}\n          onSandwichPillClick={resetSandwich}\n          colorScheme={colorScheme}\n          onColorSchemeChange={setColorScheme}\n          isDiffMode={dataContainer.isDiffFlamegraph()}\n          showFlameGraphOnly={showFlameGraphOnly}\n          collapsing={!disableCollapsing}\n          getExtraContextMenuButtons={getExtraContextMenuButtons}\n          enableNewUI={true}\n          viewMode={viewMode}\n          paneView={paneViewForContextMenu}\n          search={search}\n          collapsedMap={collapsedMap}\n          setCollapsedMap={setCollapsedMap}\n        />\n      );\n      break;\n    case PaneView.CallTree:\n      content = (\n        <div className={styles.tableContainer}>\n          <FlameGraphCallTreeContainer\n            data={dataContainer}\n            onSymbolClick={onCallTreeSymbolClick}\n            sandwichItem={sandwichItem}\n            onSandwich={setSandwichItem}\n            onTableSort={onTableSort}\n            search={search}\n            onSearch={onCallTreeSearch}\n            focusedItemIndexes={focusedItemIndexes}\n            setFocusedItemIndexes={setFocusedItemIndexes}\n            getExtraContextMenuButtons={getExtraContextMenuButtons}\n            viewMode={viewMode}\n            paneView={paneViewForContextMenu}\n          />\n        </div>\n      );\n      break;\n  }\n\n  return <div className={styles.paneWrapper}>{content}</div>;\n};\n\nfunction getStyles() {\n  return {\n    paneWrapper: css({\n      width: '100%',\n      height: '100%',\n    }),\n    tableContainer: css({\n      height: FLAMEGRAPH_CONTAINER_HEIGHT,\n      minWidth: 0,\n      overflow: 'hidden',\n    }),\n  };\n}\n\nexport default FlameGraphPane;\n"],"names":["useState","useCallback","useColorScheme","useLayoutEffect","useEffect","useRef","escapeStringForRegex","PaneView","jsx","FlameGraphTopTableContainer","css","FLAMEGRAPH_CONTAINER_HEIGHT"],"mappings":"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"}