UNPKG

@grafana/flamegraph

Version:

Grafana flamegraph visualization component

1 lines 10.4 kB
{"version":3,"file":"FunctionCellWithExpander.cjs","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":["useStyles2","jsxs","jsx","Button","css"],"mappings":"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"}