{"version":3,"file":"FunctionCellWithExpander.mjs","sources":["../../../src/CallTree/FunctionCellWithExpander.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { type Row, type UseExpandedRowProps } from 'react-table';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { Button, useStyles2 } from '@grafana/ui';\n\nimport { type CallTreeNode } from './utils';\n\nexport function FunctionCellWithExpander({\n  row,\n  value,\n  depth,\n  hasChildren,\n  rowIndex,\n  rows,\n  onSymbolClick,\n  compact = false,\n  toggleRowExpanded,\n}: {\n  row: Row<CallTreeNode> & UseExpandedRowProps<CallTreeNode>;\n  value: string;\n  depth: number;\n  hasChildren: boolean;\n  rowIndex?: number;\n  rows: Array<Row<CallTreeNode>>;\n  onSymbolClick: (symbol: string) => void;\n  compact?: boolean;\n  toggleRowExpanded: (id: string[], value?: boolean) => void;\n}) {\n  const styles = useStyles2(getStyles);\n\n  const expandSingleChildChain = (node: CallTreeNode) => {\n    if (node.children?.length === 1) {\n      const childNode = node.children[0];\n      toggleRowExpanded([childNode.id], true);\n      if (childNode.children && childNode.children.length > 0) {\n        expandSingleChildChain(childNode);\n      }\n    }\n  };\n\n  const handleClick = () => {\n    if (hasChildren) {\n      const wasExpanded = row.isExpanded;\n      row.toggleRowExpanded();\n      if (!wasExpanded) {\n        expandSingleChildChain(row.original);\n      }\n    }\n    onSymbolClick(value);\n  };\n\n  const isLastVisibleChildAtIndex = (index: number): boolean => {\n    if (index === undefined) {\n      return false;\n    }\n\n    const currentRow = rows[index];\n    const parentId = currentRow.original.parentId;\n\n    for (let i = index + 1; i < rows.length; i++) {\n      if (rows[i].original.parentId === parentId) {\n        return false;\n      }\n      if (rows[i].original.depth <= currentRow.original.depth) {\n        break;\n      }\n    }\n    return true;\n  };\n\n  const buildTreeConnector = () => {\n    if (depth === 0) {\n      return null;\n    }\n\n    const lines: string[] = [];\n\n    const nodeIdToNode = new Map<string, CallTreeNode>();\n    rows.forEach((r) => {\n      nodeIdToNode.set(r.original.id, r.original);\n    });\n\n    const hasMoreNodesAtDepth = (targetDepth: number): boolean => {\n      if (rowIndex === undefined) {\n        return false;\n      }\n\n      for (let i = rowIndex + 1; i < rows.length; i++) {\n        const checkRow = rows[i];\n\n        if (checkRow.original.depth === targetDepth) {\n          return true;\n        }\n\n        if (checkRow.original.depth < targetDepth) {\n          break;\n        }\n      }\n      return false;\n    };\n\n    let currentNode = row.original;\n\n    while (currentNode.parentId && currentNode.depth > 0) {\n      const parent = nodeIdToNode.get(currentNode.parentId);\n      if (parent) {\n        currentNode = parent;\n      } else {\n        break;\n      }\n    }\n\n    for (let i = 0; i < depth - 1; i++) {\n      if (hasMoreNodesAtDepth(i + 1)) {\n        lines.push('│ ');\n      } else {\n        lines.push('  ');\n      }\n    }\n\n    const isLastChild = rowIndex !== undefined ? isLastVisibleChildAtIndex(rowIndex) : false;\n    lines.push(isLastChild ? '└─' : '├─');\n\n    return lines.join('');\n  };\n\n  const connector = buildTreeConnector();\n\n  return (\n    <div className={styles.functionCellContainer}>\n      {connector && <span className={styles.treeConnector}>{connector} </span>}\n      <span className={styles.functionNameWrapper}>\n        <Button fill=\"text\" size=\"sm\" onClick={handleClick} className={styles.functionButton}>\n          {value}\n        </Button>\n        {!compact && row.original.children && row.original.children.length > 0 && (\n          <span className={styles.nodeBadge}>\n            {row.original.children.length} {row.original.children.length === 1 ? 'child' : 'children'},{' '}\n            {row.original.subtreeSize} {row.original.subtreeSize === 1 ? 'node' : 'nodes'}\n          </span>\n        )}\n      </span>\n    </div>\n  );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n  return {\n    functionCellContainer: css({\n      display: 'flex',\n      alignItems: 'center',\n      gap: '2px',\n      height: '20px',\n      lineHeight: '1',\n      overflow: 'hidden',\n      minWidth: 0,\n    }),\n    treeConnector: css({\n      color: theme.colors.text.secondary,\n      fontSize: '16px',\n      lineHeight: '1',\n      fontFamily: 'monospace',\n      whiteSpace: 'pre',\n      display: 'inline-block',\n      verticalAlign: 'middle',\n      flexShrink: 0,\n    }),\n    functionNameWrapper: css({\n      display: 'inline-flex',\n      alignItems: 'center',\n      overflow: 'hidden',\n      minWidth: 0,\n    }),\n    functionButton: css({\n      padding: 0,\n      fontSize: theme.typography.fontSize,\n      textAlign: 'left',\n      overflow: 'hidden',\n      textOverflow: 'ellipsis',\n      whiteSpace: 'nowrap',\n      minWidth: 0,\n      flexShrink: 1,\n    }),\n    nodeBadge: css({\n      marginLeft: theme.spacing(0.5),\n      fontSize: theme.typography.bodySmall.fontSize,\n      color: theme.colors.text.secondary,\n      whiteSpace: 'nowrap',\n      flexShrink: 0,\n    }),\n  };\n}\n"],"names":[],"mappings":";;;;;AAQO,SAAS,wBAAA,CAAyB;AAAA,EACvC,GAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV;AACF,CAAA,EAUG;AACD,EAAA,MAAM,MAAA,GAAS,WAAW,SAAS,CAAA;AAEnC,EAAA,MAAM,sBAAA,GAAyB,CAAC,IAAA,KAAuB;AA/BzD,IAAA,IAAA,EAAA;AAgCI,IAAA,IAAA,CAAA,CAAI,EAAA,GAAA,IAAA,CAAK,QAAA,KAAL,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAe,MAAA,MAAW,CAAA,EAAG;AAC/B,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACjC,MAAA,iBAAA,CAAkB,CAAC,SAAA,CAAU,EAAE,CAAA,EAAG,IAAI,CAAA;AACtC,MAAA,IAAI,SAAA,CAAU,QAAA,IAAY,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AACvD,QAAA,sBAAA,CAAuB,SAAS,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,cAAc,GAAA,CAAI,UAAA;AACxB,MAAA,GAAA,CAAI,iBAAA,EAAkB;AACtB,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,sBAAA,CAAuB,IAAI,QAAQ,CAAA;AAAA,MACrC;AAAA,IACF;AACA,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,yBAAA,GAA4B,CAAC,KAAA,KAA2B;AAC5D,IAAA,IAAI,UAAU,KAAA,CAAA,EAAW;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,KAAK,CAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,WAAW,QAAA,CAAS,QAAA;AAErC,IAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,QAAA,CAAS,aAAa,QAAA,EAAU;AAC1C,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAI,KAAK,CAAC,CAAA,CAAE,SAAS,KAAA,IAAS,UAAA,CAAW,SAAS,KAAA,EAAO;AACvD,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAA0B;AACnD,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAA,KAAM;AAClB,MAAA,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,EAAE,QAAQ,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,MAAM,mBAAA,GAAsB,CAAC,WAAA,KAAiC;AAC5D,MAAA,IAAI,aAAa,KAAA,CAAA,EAAW;AAC1B,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,KAAA,IAAS,IAAI,QAAA,GAAW,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC/C,QAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AAEvB,QAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAA,KAAU,WAAA,EAAa;AAC3C,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,CAAS,QAAA,CAAS,KAAA,GAAQ,WAAA,EAAa;AACzC,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAEA,IAAA,IAAI,cAAc,GAAA,CAAI,QAAA;AAEtB,IAAA,OAAO,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,KAAA,GAAQ,CAAA,EAAG;AACpD,MAAA,MAAM,MAAA,GAAS,YAAA,CAAa,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA;AACpD,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,WAAA,GAAc,MAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,mBAAA,CAAoB,CAAA,GAAI,CAAC,CAAA,EAAG;AAC9B,QAAA,KAAA,CAAM,KAAK,SAAI,CAAA;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,QAAA,KAAa,KAAA,CAAA,GAAY,yBAAA,CAA0B,QAAQ,CAAA,GAAI,KAAA;AACnF,IAAA,KAAA,CAAM,IAAA,CAAK,WAAA,GAAc,cAAA,GAAO,cAAI,CAAA;AAEpC,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,YAAY,kBAAA,EAAmB;AAErC,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,qBAAA,EACpB,QAAA,EAAA;AAAA,IAAA,SAAA,oBAAa,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,aAAA,EAAgB,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MAAU;AAAA,KAAA,EAAC,CAAA;AAAA,oBACjE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,mBAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAS,WAAA,EAAa,SAAA,EAAW,MAAA,CAAO,cAAA,EACnE,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,MACC,CAAC,OAAA,IAAW,GAAA,CAAI,QAAA,CAAS,YAAY,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAA,oBACnE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,OAAO,SAAA,EACrB,QAAA,EAAA;AAAA,QAAA,GAAA,CAAI,SAAS,QAAA,CAAS,MAAA;AAAA,QAAO,GAAA;AAAA,QAAE,GAAA,CAAI,QAAA,CAAS,QAAA,CAAS,MAAA,KAAW,IAAI,OAAA,GAAU,UAAA;AAAA,QAAW,GAAA;AAAA,QAAE,GAAA;AAAA,QAC3F,IAAI,QAAA,CAAS,WAAA;AAAA,QAAY,GAAA;AAAA,QAAE,GAAA,CAAI,QAAA,CAAS,WAAA,KAAgB,CAAA,GAAI,MAAA,GAAS;AAAA,OAAA,EACxE;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,UAAU,KAAA,EAAsB;AACvC,EAAA,OAAO;AAAA,IACL,uBAAuB,GAAA,CAAI;AAAA,MACzB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,KAAA;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,eAAe,GAAA,CAAI;AAAA,MACjB,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,MACzB,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,WAAA;AAAA,MACZ,UAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAS,cAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,IACD,qBAAqB,GAAA,CAAI;AAAA,MACvB,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,QAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,IACD,gBAAgB,GAAA,CAAI;AAAA,MAClB,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,MAAM,UAAA,CAAW,QAAA;AAAA,MAC3B,SAAA,EAAW,MAAA;AAAA,MACX,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY,QAAA;AAAA,MACZ,QAAA,EAAU,CAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,IACD,WAAW,GAAA,CAAI;AAAA,MACb,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,MAC7B,QAAA,EAAU,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,QAAA;AAAA,MACrC,KAAA,EAAO,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,SAAA;AAAA,MACzB,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACb;AAAA,GACH;AACF;;;;"}