{"version":3,"file":"FlameGraph.cjs","sources":["../../../src/FlameGraph/FlameGraph.tsx"],"sourcesContent":["// This component is based on logic from the flamebearer project\n// https://github.com/mapbox/flamebearer\n\n// ISC License\n\n// Copyright (c) 2018, Mapbox\n\n// Permission to use, copy, modify, and/or distribute this software for any purpose\n// with or without fee is hereby granted, provided that the above copyright notice\n// and this permission notice appear in all copies.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n// THIS SOFTWARE.\nimport { css, cx } from '@emotion/css';\nimport { useEffect, useState } from 'react';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { Button, ButtonGroup, Icon, RadioButtonGroup, useStyles2 } from '@grafana/ui';\n\nimport { ColorSchemeButton } from '../ColorSchemeButton';\nimport { alignOptions } from '../FlameGraphHeader';\nimport { PIXELS_PER_LEVEL } from '../constants';\nimport {\n  type ClickedItemData,\n  type ColorScheme,\n  type ColorSchemeDiff,\n  type PaneView,\n  type SelectedView,\n  type ViewMode,\n  type TextAlign,\n} from '../types';\n\nimport FlameGraphCanvas from './FlameGraphCanvas';\nimport { type GetExtraContextMenuButtonsFunction } from './FlameGraphContextMenu';\nimport FlameGraphMetadata from './FlameGraphMetadata';\nimport { type CollapsedMap, type FlameGraphDataContainer, type LevelItem } from './dataTransform';\n\ntype Props = {\n  data: FlameGraphDataContainer;\n  rangeMin: number;\n  rangeMax: number;\n  matchedLabels?: Set<string>;\n  setRangeMin: (range: number) => void;\n  setRangeMax: (range: number) => void;\n  onItemFocused: (data: ClickedItemData) => void;\n  focusedItemData?: ClickedItemData;\n  textAlign: TextAlign;\n  sandwichItem?: string;\n  onSandwich: (label: string) => void;\n  onFocusPillClick: () => void;\n  onSandwichPillClick: () => void;\n  colorScheme: ColorScheme | ColorSchemeDiff;\n  showFlameGraphOnly?: boolean;\n  getExtraContextMenuButtons?: GetExtraContextMenuButtonsFunction;\n  collapsing?: boolean;\n  search: string;\n  collapsedMap: CollapsedMap;\n  setCollapsedMap: (collapsedMap: CollapsedMap) => void;\n\n  // Legacy props\n  selectedView?: SelectedView;\n\n  // New UI props (when enableNewUI is true, renders toolbar with controls)\n  enableNewUI?: boolean;\n  viewMode?: ViewMode;\n  paneView?: PaneView;\n  onTextAlignChange?: (align: TextAlign) => void;\n  onColorSchemeChange?: (colorScheme: ColorScheme | ColorSchemeDiff) => void;\n  isDiffMode?: boolean;\n};\n\nconst FlameGraph = ({\n  data,\n  rangeMin,\n  rangeMax,\n  matchedLabels,\n  setRangeMin,\n  setRangeMax,\n  onItemFocused,\n  focusedItemData,\n  textAlign,\n  onSandwich,\n  sandwichItem,\n  onFocusPillClick,\n  onSandwichPillClick,\n  colorScheme,\n  showFlameGraphOnly,\n  getExtraContextMenuButtons,\n  collapsing,\n  search,\n  collapsedMap,\n  setCollapsedMap,\n  selectedView,\n  enableNewUI,\n  viewMode,\n  paneView,\n  onTextAlignChange,\n  onColorSchemeChange,\n  isDiffMode,\n}: Props) => {\n  const isNewUI = enableNewUI === true;\n  const newStyles = useStyles2(getStylesNew);\n  const legacyStyles = getStylesLegacy();\n\n  const [levels, setLevels] = useState<LevelItem[][]>();\n  const [levelsCallers, setLevelsCallers] = useState<LevelItem[][]>();\n  const [totalProfileTicks, setTotalProfileTicks] = useState<number>(0);\n  const [totalProfileTicksRight, setTotalProfileTicksRight] = useState<number>();\n  const [totalViewTicks, setTotalViewTicks] = useState<number>(0);\n\n  useEffect(() => {\n    if (data) {\n      let levels = data.getLevels();\n      let totalProfileTicks = levels.length ? levels[0][0].value : 0;\n      let totalProfileTicksRight = levels.length ? levels[0][0].valueRight : undefined;\n      let totalViewTicks = totalProfileTicks;\n      let levelsCallers = undefined;\n\n      if (sandwichItem) {\n        const [callers, callees] = data.getSandwichLevels(sandwichItem);\n        levels = callees;\n        levelsCallers = callers;\n        // We need this separate as in case of diff profile we want to compute diff colors based on the original ticks.\n        totalViewTicks = callees[0]?.[0]?.value ?? 0;\n      }\n      setLevels(levels);\n      setLevelsCallers(levelsCallers);\n      setTotalProfileTicks(totalProfileTicks);\n      setTotalProfileTicksRight(totalProfileTicksRight);\n      setTotalViewTicks(totalViewTicks);\n    }\n  }, [data, sandwichItem]);\n\n  if (!levels) {\n    return null;\n  }\n\n  const commonCanvasProps = {\n    data,\n    rangeMin,\n    rangeMax,\n    matchedLabels,\n    setRangeMin,\n    setRangeMax,\n    onItemFocused,\n    focusedItemData,\n    textAlign,\n    onSandwich,\n    colorScheme,\n    totalProfileTicks,\n    totalProfileTicksRight,\n    totalViewTicks,\n    showFlameGraphOnly,\n    collapsedMap,\n    setCollapsedMap,\n    getExtraContextMenuButtons,\n    collapsing,\n    search,\n    selectedView,\n    viewMode,\n    paneView,\n  };\n  let canvas = null;\n\n  // Both style objects share sandwich/canvas styles, pick the right one based on mode.\n  const canvasStyles = isNewUI ? newStyles : legacyStyles;\n\n  if (levelsCallers?.length) {\n    canvas = (\n      <>\n        <div className={canvasStyles.sandwichCanvasWrapper}>\n          <div className={canvasStyles.sandwichMarker}>\n            Callers\n            <Icon className={canvasStyles.sandwichMarkerIcon} name={'arrow-down'} />\n          </div>\n          <FlameGraphCanvas\n            {...commonCanvasProps}\n            root={levelsCallers[levelsCallers.length - 1][0]}\n            depth={levelsCallers.length}\n            direction={'parents'}\n            // We do not support collapsing in sandwich view for now.\n            collapsing={false}\n          />\n        </div>\n\n        <div className={canvasStyles.sandwichCanvasWrapper}>\n          <div className={cx(canvasStyles.sandwichMarker, canvasStyles.sandwichMarkerCalees)}>\n            <Icon className={canvasStyles.sandwichMarkerIcon} name={'arrow-up'} />\n            Callees\n          </div>\n          <FlameGraphCanvas\n            {...commonCanvasProps}\n            root={levels[0][0]}\n            depth={levels.length}\n            direction={'children'}\n            collapsing={false}\n          />\n        </div>\n      </>\n    );\n  } else if (levels?.length) {\n    canvas = (\n      <FlameGraphCanvas {...commonCanvasProps} root={levels[0][0]} depth={levels.length} direction={'children'} />\n    );\n  }\n\n  if (isNewUI) {\n    return (\n      <div className={newStyles.graph}>\n        <div className={newStyles.toolbar}>\n          <FlameGraphMetadata\n            data={data}\n            focusedItem={focusedItemData}\n            sandwichedLabel={sandwichItem}\n            totalTicks={totalViewTicks}\n            onFocusPillClick={onFocusPillClick}\n            onSandwichPillClick={onSandwichPillClick}\n          />\n          <div className={newStyles.controls}>\n            {onColorSchemeChange && (\n              <ColorSchemeButton value={colorScheme} onChange={onColorSchemeChange} isDiffMode={isDiffMode ?? false} />\n            )}\n            <ButtonGroup className={newStyles.buttonSpacing}>\n              <Button\n                variant={'secondary'}\n                fill={'outline'}\n                size={'sm'}\n                tooltip={'Expand all groups'}\n                onClick={() => {\n                  setCollapsedMap(collapsedMap.setAllCollapsedStatus(false));\n                }}\n                aria-label={'Expand all groups'}\n                icon={'angle-double-down'}\n              />\n              <Button\n                variant={'secondary'}\n                fill={'outline'}\n                size={'sm'}\n                tooltip={'Collapse all groups'}\n                onClick={() => {\n                  setCollapsedMap(collapsedMap.setAllCollapsedStatus(true));\n                }}\n                aria-label={'Collapse all groups'}\n                icon={'angle-double-up'}\n              />\n            </ButtonGroup>\n            {onTextAlignChange && (\n              <RadioButtonGroup<TextAlign>\n                size=\"sm\"\n                options={alignOptions}\n                value={textAlign}\n                onChange={onTextAlignChange}\n              />\n            )}\n          </div>\n        </div>\n        {canvas}\n      </div>\n    );\n  }\n\n  return (\n    <div className={legacyStyles.graph}>\n      <FlameGraphMetadata\n        data={data}\n        focusedItem={focusedItemData}\n        sandwichedLabel={sandwichItem}\n        totalTicks={totalViewTicks}\n        onFocusPillClick={onFocusPillClick}\n        onSandwichPillClick={onSandwichPillClick}\n      />\n      {canvas}\n    </div>\n  );\n};\n\nconst getStylesLegacy = () => ({\n  graph: css({\n    label: 'graph',\n    overflow: 'auto',\n    flexGrow: 1,\n    flexBasis: '50%',\n  }),\n  sandwichCanvasWrapper: css({\n    label: 'sandwichCanvasWrapper',\n    display: 'flex',\n    marginBottom: `${PIXELS_PER_LEVEL / window.devicePixelRatio}px`,\n  }),\n  sandwichMarker: css({\n    label: 'sandwichMarker',\n    writingMode: 'vertical-lr',\n    transform: 'rotate(180deg)',\n    overflow: 'hidden',\n    whiteSpace: 'nowrap',\n  }),\n  sandwichMarkerCalees: css({\n    label: 'sandwichMarkerCalees',\n    textAlign: 'right',\n  }),\n  sandwichMarkerIcon: css({\n    label: 'sandwichMarkerIcon',\n    verticalAlign: 'baseline',\n  }),\n});\n\nconst getStylesNew = (theme: GrafanaTheme2) => ({\n  graph: css({\n    label: 'graph',\n    overflow: 'auto',\n    flexGrow: 1,\n    flexBasis: '50%',\n  }),\n  toolbar: css({\n    label: 'toolbar',\n    display: 'flex',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n  }),\n  controls: css({\n    label: 'controls',\n    display: 'flex',\n    alignItems: 'center',\n    gap: theme.spacing(1),\n  }),\n  buttonSpacing: css({\n    label: 'buttonSpacing',\n    marginRight: theme.spacing(1),\n  }),\n  sandwichCanvasWrapper: css({\n    label: 'sandwichCanvasWrapper',\n    display: 'flex',\n    marginBottom: `${PIXELS_PER_LEVEL / window.devicePixelRatio}px`,\n  }),\n  sandwichMarker: css({\n    label: 'sandwichMarker',\n    writingMode: 'vertical-lr',\n    transform: 'rotate(180deg)',\n    overflow: 'hidden',\n    whiteSpace: 'nowrap',\n  }),\n  sandwichMarkerCalees: css({\n    label: 'sandwichMarkerCalees',\n    textAlign: 'right',\n  }),\n  sandwichMarkerIcon: css({\n    label: 'sandwichMarkerIcon',\n    verticalAlign: 'baseline',\n  }),\n});\n\nexport default FlameGraph;\n"],"names":["useStyles2","useState","useEffect","levels","totalProfileTicks","totalProfileTicksRight","totalViewTicks","levelsCallers","jsxs","Fragment","Icon","jsx","FlameGraphCanvas","cx","ColorSchemeButton","ButtonGroup","Button","RadioButtonGroup","alignOptions","css","PIXELS_PER_LEVEL"],"mappings":"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"}