{"version":3,"file":"FlameGraphHeader.mjs","sources":["../../src/FlameGraphHeader.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useEffect, useState } from 'react';\nimport * as React from 'react';\nimport { useDebounce, usePrevious } from 'react-use';\n\nimport { type ChatContextItem, OpenAssistantButton } from '@grafana/assistant';\nimport { type GrafanaTheme2, type SelectableValue } from '@grafana/data';\nimport { Button, ButtonGroup, Dropdown, IconButton, Input, Menu, RadioButtonGroup, useStyles2 } from '@grafana/ui';\n\nimport { ColorSchemeButton } from './ColorSchemeButton';\nimport { type CollapsedMap } from './FlameGraph/dataTransform';\nimport { MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH, MIN_WIDTH_TO_SHOW_SPLIT_PANE_SELECTORS } from './constants';\nimport { type ColorScheme, type ColorSchemeDiff, PaneView, SelectedView, type TextAlign, ViewMode } from './types';\n\ntype LegacyProps = {\n  search: string;\n  setSearch: (search: string) => void;\n  selectedView: SelectedView;\n  setSelectedView: (view: SelectedView) => void;\n  containerWidth: number;\n  onReset: () => void;\n  textAlign: TextAlign;\n  onTextAlignChange: (align: TextAlign) => void;\n  showResetButton: boolean;\n  colorScheme: ColorScheme | ColorSchemeDiff;\n  onColorSchemeChange: (colorScheme: ColorScheme | ColorSchemeDiff) => void;\n  stickyHeader: boolean;\n  vertical?: boolean;\n  isDiffMode: boolean;\n  setCollapsedMap: (collapsedMap: CollapsedMap) => void;\n  collapsedMap: CollapsedMap;\n\n  extraHeaderElements?: React.ReactNode;\n\n  assistantContext?: ChatContextItem[];\n};\n\ntype NewUIProps = {\n  search: string;\n  setSearch: (search: string) => void;\n  enableNewUI: true;\n  viewMode: ViewMode;\n  setViewMode: (mode: ViewMode) => void;\n  canShowSplitView: boolean;\n  containerWidth: number;\n  leftPaneView: PaneView;\n  setLeftPaneView: (view: PaneView) => void;\n  rightPaneView: PaneView;\n  setRightPaneView: (view: PaneView) => void;\n  singleView: PaneView;\n  setSingleView: (view: PaneView) => void;\n  onSwapPanes: () => void;\n  onReset: () => void;\n  showResetButton: boolean;\n  stickyHeader: boolean;\n\n  extraHeaderElements?: React.ReactNode;\n\n  assistantContext?: ChatContextItem[];\n};\n\ntype Props = LegacyProps | NewUIProps;\n\nfunction isNewUI(props: Props): props is NewUIProps {\n  return 'enableNewUI' in props && props.enableNewUI === true;\n}\n\nconst FlameGraphHeader = (props: Props) => {\n  const styles = useStyles2(getStyles);\n  const [localSearch, setLocalSearch] = useSearchInput(props.search, props.setSearch);\n\n  const suffix =\n    localSearch !== '' ? (\n      <Button\n        icon=\"times\"\n        fill=\"text\"\n        size=\"sm\"\n        onClick={() => {\n          // We could set only one and wait them to sync but there is no need to debounce this.\n          props.setSearch('');\n          setLocalSearch('');\n        }}\n      >\n        Clear\n      </Button>\n    ) : null;\n\n  if (isNewUI(props)) {\n    const effectiveViewMode = props.canShowSplitView ? props.viewMode : ViewMode.Single;\n\n    return (\n      <div className={cx(styles.header, styles.headerNew, { [styles.stickyHeader]: props.stickyHeader })}>\n        <div className={styles.inputContainerNew}>\n          <Input\n            value={localSearch || ''}\n            onChange={(v) => {\n              setLocalSearch(v.currentTarget.value);\n            }}\n            placeholder={'Search...'}\n            suffix={suffix}\n          />\n        </div>\n\n        {effectiveViewMode === ViewMode.Split && (\n          <div className={styles.middleContainer}>\n            {props.containerWidth >= MIN_WIDTH_TO_SHOW_SPLIT_PANE_SELECTORS ? (\n              <>\n                <RadioButtonGroup<PaneView>\n                  size=\"sm\"\n                  options={paneViewOptions}\n                  value={props.leftPaneView}\n                  onChange={props.setLeftPaneView}\n                  className={styles.buttonSpacing}\n                />\n                <IconButton name=\"exchange-alt\" size=\"sm\" tooltip=\"Swap views\" onClick={props.onSwapPanes} />\n                <RadioButtonGroup<PaneView>\n                  size=\"sm\"\n                  options={paneViewOptions}\n                  value={props.rightPaneView}\n                  onChange={props.setRightPaneView}\n                  className={styles.buttonSpacing}\n                />\n              </>\n            ) : (\n              <>\n                <Dropdown\n                  overlay={\n                    <Menu>\n                      {paneViewOptions.map((option) => (\n                        <Menu.Item\n                          key={option.value}\n                          label={option.label ?? ''}\n                          active={props.leftPaneView === option.value}\n                          onClick={() => option.value && props.setLeftPaneView(option.value)}\n                        />\n                      ))}\n                    </Menu>\n                  }\n                >\n                  <Button variant=\"secondary\" size=\"sm\" className={styles.paneDropdownButton}>\n                    {paneViewOptions.find((o) => o.value === props.leftPaneView)?.label}\n                  </Button>\n                </Dropdown>\n                <IconButton name=\"exchange-alt\" size=\"sm\" tooltip=\"Swap views\" onClick={props.onSwapPanes} />\n                <Dropdown\n                  overlay={\n                    <Menu>\n                      {paneViewOptions.map((option) => (\n                        <Menu.Item\n                          key={option.value}\n                          label={option.label ?? ''}\n                          active={props.rightPaneView === option.value}\n                          onClick={() => option.value && props.setRightPaneView(option.value)}\n                        />\n                      ))}\n                    </Menu>\n                  }\n                >\n                  <Button variant=\"secondary\" size=\"sm\" className={styles.paneDropdownButton}>\n                    {paneViewOptions.find((o) => o.value === props.rightPaneView)?.label}\n                  </Button>\n                </Dropdown>\n              </>\n            )}\n          </div>\n        )}\n\n        <div className={styles.rightContainer}>\n          {!!props.assistantContext?.length && (\n            <div className={styles.buttonSpacing}>\n              <OpenAssistantButton\n                origin=\"grafana/flame-graph\"\n                prompt=\"Analyze this flamegraph by querying the current datasource\"\n                context={props.assistantContext}\n              />\n            </div>\n          )}\n          {props.showResetButton && (\n            <Button\n              variant={'secondary'}\n              fill={'outline'}\n              size={'sm'}\n              icon={'history-alt'}\n              tooltip={'Reset focus and sandwich state'}\n              onClick={() => {\n                props.onReset();\n              }}\n              className={styles.buttonSpacing}\n              aria-label={'Reset focus and sandwich state'}\n            />\n          )}\n          {effectiveViewMode === ViewMode.Single && (\n            <RadioButtonGroup<PaneView>\n              size=\"sm\"\n              options={paneViewOptions}\n              value={props.singleView}\n              onChange={props.setSingleView}\n              className={styles.buttonSpacing}\n            />\n          )}\n          {props.canShowSplitView && (\n            <RadioButtonGroup<ViewMode>\n              size=\"sm\"\n              options={viewModeOptions}\n              value={props.viewMode}\n              onChange={props.setViewMode}\n              className={styles.buttonSpacing}\n            />\n          )}\n          {props.extraHeaderElements && <div className={styles.extraElements}>{props.extraHeaderElements}</div>}\n        </div>\n      </div>\n    );\n  }\n\n  // Legacy UI rendering\n  const {\n    selectedView,\n    setSelectedView,\n    containerWidth,\n    onReset,\n    textAlign,\n    onTextAlignChange,\n    showResetButton,\n    colorScheme,\n    onColorSchemeChange,\n    stickyHeader,\n    extraHeaderElements,\n    vertical,\n    isDiffMode,\n    setCollapsedMap,\n    collapsedMap,\n    assistantContext,\n  } = props;\n\n  return (\n    <div className={cx(styles.header, { [styles.stickyHeader]: stickyHeader })}>\n      <div className={styles.inputContainer}>\n        <Input\n          value={localSearch || ''}\n          onChange={(v) => {\n            setLocalSearch(v.currentTarget.value);\n          }}\n          placeholder={'Search...'}\n          suffix={suffix}\n        />\n      </div>\n\n      <div className={styles.rightContainer}>\n        {!!assistantContext?.length && (\n          <div className={styles.buttonSpacing}>\n            <OpenAssistantButton\n              origin=\"grafana/flame-graph\"\n              prompt=\"Analyze this flamegraph by querying the current datasource\"\n              context={assistantContext}\n            />\n          </div>\n        )}\n        {showResetButton && (\n          <Button\n            variant={'secondary'}\n            fill={'outline'}\n            size={'sm'}\n            icon={'history-alt'}\n            tooltip={'Reset focus and sandwich state'}\n            onClick={() => {\n              onReset();\n            }}\n            className={styles.buttonSpacing}\n            aria-label={'Reset focus and sandwich state'}\n          />\n        )}\n        <ColorSchemeButton value={colorScheme} onChange={onColorSchemeChange} isDiffMode={isDiffMode} />\n        <ButtonGroup className={styles.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            disabled={selectedView === SelectedView.TopTable}\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            disabled={selectedView === SelectedView.TopTable}\n          />\n        </ButtonGroup>\n        <RadioButtonGroup<TextAlign>\n          size=\"sm\"\n          disabled={selectedView === SelectedView.TopTable}\n          options={alignOptions}\n          value={textAlign}\n          onChange={onTextAlignChange}\n          className={styles.buttonSpacing}\n        />\n        <RadioButtonGroup<SelectedView>\n          size=\"sm\"\n          options={getViewOptions(containerWidth, vertical)}\n          value={selectedView}\n          onChange={setSelectedView}\n        />\n        {extraHeaderElements && <div className={styles.extraElements}>{extraHeaderElements}</div>}\n      </div>\n    </div>\n  );\n};\n\nexport const alignOptions: Array<SelectableValue<TextAlign>> = [\n  { value: 'left', description: 'Align text left', icon: 'align-left' },\n  { value: 'right', description: 'Align text right', icon: 'align-right' },\n];\n\nconst viewModeOptions: Array<SelectableValue<ViewMode>> = [\n  { value: ViewMode.Single, label: 'Single', description: 'Single view' },\n  { value: ViewMode.Split, label: 'Split', description: 'Split view' },\n];\n\nconst paneViewOptions: Array<SelectableValue<PaneView>> = [\n  { value: PaneView.TopTable, label: 'Top Table' },\n  { value: PaneView.FlameGraph, label: 'Flame Graph' },\n  { value: PaneView.CallTree, label: 'Call Tree' },\n];\n\nfunction getViewOptions(width: number, vertical?: boolean): Array<SelectableValue<SelectedView>> {\n  let viewOptions: Array<{ value: SelectedView; label: string; description: string }> = [\n    { value: SelectedView.TopTable, label: 'Top Table', description: 'Only show top table' },\n    { value: SelectedView.FlameGraph, label: 'Flame Graph', description: 'Only show flame graph' },\n  ];\n\n  if (width >= MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH || vertical) {\n    viewOptions.push({\n      value: SelectedView.Both,\n      label: 'Both',\n      description: 'Show both the top table and flame graph',\n    });\n  }\n\n  return viewOptions;\n}\n\nfunction useSearchInput(\n  search: string,\n  setSearch: (search: string) => void\n): [string | undefined, (search: string) => void] {\n  const [localSearchState, setLocalSearchState] = useState(search);\n  const prevSearch = usePrevious(search);\n\n  // Debouncing cause changing parent search triggers rerender on both the flamegraph and table\n  useDebounce(\n    () => {\n      setSearch(localSearchState);\n    },\n    250,\n    [localSearchState]\n  );\n\n  // Make sure we still handle updates from parent (from clicking on a table item for example). We check if the parent\n  // search value changed to something that isn't our local value.\n  useEffect(() => {\n    if (prevSearch !== search && search !== localSearchState) {\n      setLocalSearchState(search);\n    }\n  }, [search, prevSearch, localSearchState]);\n\n  return [localSearchState, setLocalSearchState];\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n  header: css({\n    label: 'header',\n    display: 'flex',\n    flexWrap: 'wrap',\n    justifyContent: 'space-between',\n    width: '100%',\n    top: 0,\n    gap: theme.spacing(1),\n    marginTop: theme.spacing(1),\n  }),\n  headerNew: css({\n    label: 'headerNew',\n    alignItems: 'flex-start',\n    position: 'relative',\n  }),\n  stickyHeader: css({\n    zIndex: theme.zIndex.navbarFixed,\n    position: 'sticky',\n    background: theme.colors.background.primary,\n  }),\n  inputContainer: css({\n    label: 'inputContainer',\n    flexGrow: 1,\n    minWidth: '150px',\n    maxWidth: '350px',\n  }),\n  inputContainerNew: css({\n    label: 'inputContainerNew',\n    flexGrow: 0,\n    minWidth: '150px',\n    maxWidth: '350px',\n  }),\n  middleContainer: css({\n    label: 'middleContainer',\n    display: 'flex',\n    alignItems: 'center',\n    flexWrap: 'wrap',\n    gap: theme.spacing(1),\n    position: 'absolute',\n    left: '50%',\n    transform: 'translateX(-50%)',\n  }),\n  rightContainer: css({\n    label: 'rightContainer',\n    display: 'flex',\n    alignItems: 'flex-start',\n    flexWrap: 'wrap',\n  }),\n  buttonSpacing: css({\n    label: 'buttonSpacing',\n    marginRight: theme.spacing(1),\n  }),\n  resetButton: css({\n    label: 'resetButton',\n    display: 'flex',\n    marginRight: theme.spacing(2),\n  }),\n  resetButtonIconWrapper: css({\n    label: 'resetButtonIcon',\n    padding: '0 5px',\n    color: theme.colors.text.disabled,\n  }),\n  extraElements: css({\n    label: 'extraElements',\n    marginLeft: theme.spacing(1),\n  }),\n  paneDropdownButton: css({\n    label: 'paneDropdownButton',\n    minWidth: '95px',\n    justifyContent: 'center',\n  }),\n});\n\nexport default FlameGraphHeader;\n"],"names":["_a"],"mappings":"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"}