@grafana/flamegraph
Version:
Grafana flamegraph visualization component
1 lines • 16.9 kB
Source Map (JSON)
{"version":3,"file":"CallTreeTable.cjs","sources":["../../../src/CallTree/CallTreeTable.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { useEffect } from 'react';\nimport {\n type Row,\n type HeaderGroup,\n type TablePropGetter,\n type TableBodyPropGetter,\n type TableProps,\n type TableBodyProps,\n} from 'react-table';\n\nimport { type GrafanaTheme2 } from '@grafana/data';\nimport { Icon, useStyles2 } from '@grafana/ui';\n\nimport { type CallTreeNode } from './utils';\n\ntype CallTreeTableProps = {\n width: number;\n height: number;\n compactModeThreshold: number;\n isCompact: boolean;\n setIsCompact: (compact: boolean) => void;\n getFunctionColumnWidth: (availableWidth: number, compactMode: boolean) => number | undefined;\n getTableProps: (propGetter?: TablePropGetter<CallTreeNode>) => TableProps;\n getTableBodyProps: (propGetter?: TableBodyPropGetter<CallTreeNode>) => TableBodyProps;\n headerGroups: Array<HeaderGroup<CallTreeNode>>;\n rows: Array<Row<CallTreeNode>>;\n prepareRow: (row: Row<CallTreeNode>) => void;\n currentSearchMatchId?: string;\n searchMatchRowRef: (node: HTMLTableRowElement | null) => void;\n scrollContainerRef: { current: HTMLDivElement | null };\n focusedNodeId?: string;\n callersNodeLabel?: string;\n};\n\nexport function CallTreeTable({\n width,\n height,\n compactModeThreshold,\n isCompact,\n setIsCompact,\n getFunctionColumnWidth,\n getTableProps,\n getTableBodyProps,\n headerGroups,\n rows,\n prepareRow,\n currentSearchMatchId,\n searchMatchRowRef,\n scrollContainerRef,\n focusedNodeId,\n callersNodeLabel,\n}: CallTreeTableProps) {\n const styles = useStyles2(getStyles);\n const SCROLLBAR_WIDTH = 16;\n const availableWidth = width - SCROLLBAR_WIDTH;\n const shouldBeCompact = availableWidth > 0 && availableWidth < compactModeThreshold;\n\n useEffect(() => {\n if (availableWidth <= 0) {\n return;\n }\n if (shouldBeCompact !== isCompact) {\n setIsCompact(shouldBeCompact);\n }\n }, [availableWidth, shouldBeCompact, isCompact, setIsCompact]);\n\n const functionColumnWidth = getFunctionColumnWidth(availableWidth, isCompact);\n\n if (width < 3 || height < 3) {\n return null;\n }\n\n return (\n <div style={{ width, height, display: 'flex', flexDirection: 'column' }}>\n <table {...getTableProps()} className={styles.table} style={{ flexShrink: 0 }}>\n <thead className={styles.thead}>\n {headerGroups.map((headerGroup) => {\n const { key, ...headerGroupProps } = headerGroup.getHeaderGroupProps();\n return (\n <tr key={key} {...headerGroupProps}>\n {headerGroup.headers.map((column) => {\n const { key: headerKey, ...headerProps } = column.getHeaderProps(column.getSortByToggleProps());\n const columnWidth = column.id === 'label' ? functionColumnWidth : column.width;\n return (\n <th\n key={headerKey}\n {...headerProps}\n className={styles.th}\n style={{\n ...(columnWidth !== undefined && { width: columnWidth }),\n textAlign: column.id === 'self' || column.id === 'total' ? 'right' : undefined,\n ...(column.minWidth !== undefined && { minWidth: column.minWidth }),\n }}\n >\n {column.render('Header')}\n {column.isSorted && (\n <Icon\n name={column.isSortedDesc ? 'arrow-down' : 'arrow-up'}\n size=\"lg\"\n className={styles.sortIcon}\n />\n )}\n </th>\n );\n })}\n </tr>\n );\n })}\n </thead>\n </table>\n <div\n ref={scrollContainerRef}\n style={{ flex: 1, overflowY: 'scroll', overflowX: 'auto' }}\n className={styles.scrollContainer}\n >\n <table {...getTableProps()} className={styles.table}>\n <tbody {...getTableBodyProps()} className={styles.tbody}>\n {rows.map((row, rowIndex) => {\n prepareRow(row);\n const { key, ...rowProps } = row.getRowProps();\n const isFocusedRow = row.original.id === focusedNodeId;\n const isCallersTargetRow = callersNodeLabel && row.original.label === callersNodeLabel;\n const isSearchMatchRow = currentSearchMatchId && row.original.id === currentSearchMatchId;\n\n return (\n <tr\n key={key}\n {...rowProps}\n ref={isSearchMatchRow ? searchMatchRowRef : null}\n className={cx(\n styles.tr,\n (isFocusedRow ||\n (focusedNodeId?.startsWith('label:') && focusedNodeId.substring(6) === row.original.label)) &&\n styles.focusedRow,\n isCallersTargetRow && styles.callersTargetRow,\n isSearchMatchRow && styles.searchMatchRow\n )}\n >\n {row.cells.map((cell) => {\n const { key: cellKey, ...cellProps } = cell.getCellProps();\n const isValueColumn = cell.column.id === 'self' || cell.column.id === 'total';\n const isActionsColumn = cell.column.id === 'actions';\n const columnWidth = cell.column.id === 'label' ? functionColumnWidth : cell.column.width;\n return (\n <td\n key={cellKey}\n {...cellProps}\n className={cx(\n styles.td,\n isActionsColumn && styles.actionsColumnCell,\n isValueColumn && styles.valueColumnCell\n )}\n style={{\n ...(columnWidth !== undefined && { width: columnWidth }),\n ...(cell.column.minWidth !== undefined && { minWidth: cell.column.minWidth }),\n }}\n >\n {cell.render('Cell', { rowIndex })}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n scrollContainer: css({\n '&::-webkit-scrollbar': {\n width: '8px',\n },\n '&::-webkit-scrollbar-track': {\n background: theme.colors.background.secondary,\n },\n '&::-webkit-scrollbar-thumb': {\n background: theme.colors.text.disabled,\n borderRadius: theme.shape.radius.default,\n },\n '&::-webkit-scrollbar-thumb:hover': {\n background: theme.colors.text.secondary,\n },\n }),\n table: css({\n width: '100%',\n tableLayout: 'fixed',\n borderCollapse: 'collapse',\n fontSize: theme.typography.fontSize,\n color: theme.colors.text.primary,\n }),\n thead: css({\n backgroundColor: theme.colors.background.secondary,\n }),\n th: css({\n padding: '4px 6px',\n height: '36px',\n textAlign: 'left',\n fontWeight: theme.typography.fontWeightMedium,\n borderBottom: `1px solid ${theme.colors.border.weak}`,\n cursor: 'pointer',\n userSelect: 'none',\n '&:hover': {\n backgroundColor: theme.colors.emphasize(theme.colors.background.secondary, 0.03),\n },\n }),\n tbody: css({\n backgroundColor: theme.colors.background.primary,\n }),\n tr: css({\n '&:hover': {\n backgroundColor: theme.colors.emphasize(theme.colors.background.primary, 0.03),\n },\n }),\n focusedRow: css({\n backgroundColor: theme.colors.emphasize(theme.colors.background.primary, 0.08),\n borderLeft: `3px solid ${theme.colors.primary.main}`,\n fontWeight: theme.typography.fontWeightMedium,\n '&:hover': {\n backgroundColor: theme.colors.emphasize(theme.colors.background.primary, 0.1),\n },\n }),\n callersTargetRow: css({\n backgroundColor: theme.colors.emphasize(theme.colors.background.primary, 0.08),\n borderLeft: `3px solid ${theme.colors.info.main}`,\n fontWeight: theme.typography.fontWeightMedium,\n '&:hover': {\n backgroundColor: theme.colors.emphasize(theme.colors.background.primary, 0.1),\n },\n }),\n searchMatchRow: css({\n backgroundColor: theme.colors.warning.transparent,\n borderLeft: `3px solid ${theme.colors.warning.main}`,\n fontWeight: theme.typography.fontWeightMedium,\n '&:hover': {\n backgroundColor: theme.colors.emphasize(theme.colors.warning.transparent, 0.1),\n },\n }),\n td: css({\n padding: '0px 6px',\n borderBottom: 'none',\n height: '20px',\n verticalAlign: 'middle',\n overflow: 'hidden',\n }),\n sortIcon: css({\n marginLeft: theme.spacing(0.5),\n }),\n actionsColumnCell: css({\n backgroundColor: theme.colors.background.secondary,\n '&:hover': {\n backgroundColor: theme.colors.background.secondary,\n },\n }),\n valueColumnCell: css({\n overflow: 'visible',\n textAlign: 'right',\n }),\n };\n}\n"],"names":["useStyles2","useEffect","jsxs","jsx","Icon","cx","css"],"mappings":"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"}