mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 10:03:33 -06:00
* Add exploration option to node layout * Add hidden node count * Add grid layout option * Fix panning bounds calculation * Add legend with sorting * Allow sorting on any stats or arc value * Fix merge * Make sorting better * Reset focused node on layout change * Refactor limit hook a bit * Disable selected layout button * Don't show markers if only 1 node is hidden * Move legend to the bottom * Fix text backgrounds * Add show in graph layout action in grid layout * Center view on the focused node, fix perf issue when expanding big graph * Limit the node counting * Comment and linting fixes * Bit of code cleanup and comments * Add state for computing layout * Prevent computing map with partial data * Add rollup plugin for worker * Add rollup plugin for worker * Enhance data from worker * Fix perf issues with reduce and object creation * Improve comment * Fix tests * Css fixes * Remove worker plugin * Add comments * Fix test * Add test for exploration * Add test switching to grid layout * Apply suggestions from code review Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com> * Remove unused plugin * Fix function name * Remove unused rollup plugin * Review fixes * Fix context menu shown on layout change * Make buttons bigger * Moved NodeGraph to core grafana Co-authored-by: Zoltán Bedi <zoltan.bedi@gmail.com>
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import React, { memo } from 'react';
|
|
import { EdgeDatum, NodeDatum } from './types';
|
|
import { css } from '@emotion/css';
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
|
import { useStyles2 } from '@grafana/ui';
|
|
import { shortenLine } from './utils';
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => {
|
|
return {
|
|
mainGroup: css`
|
|
pointer-events: none;
|
|
font-size: 8px;
|
|
`,
|
|
|
|
background: css`
|
|
fill: ${theme.components.tooltip.background};
|
|
`,
|
|
|
|
text: css`
|
|
fill: ${theme.components.tooltip.text};
|
|
`,
|
|
};
|
|
};
|
|
|
|
interface Props {
|
|
edge: EdgeDatum;
|
|
}
|
|
export const EdgeLabel = memo(function EdgeLabel(props: Props) {
|
|
const { edge } = props;
|
|
// Not great typing but after we do layout these properties are full objects not just references
|
|
const { source, target } = edge as { source: NodeDatum; target: NodeDatum };
|
|
|
|
// As the nodes have some radius we want edges to end outside of the node circle.
|
|
const line = shortenLine(
|
|
{
|
|
x1: source.x!,
|
|
y1: source.y!,
|
|
x2: target.x!,
|
|
y2: target.y!,
|
|
},
|
|
90
|
|
);
|
|
|
|
const middle = {
|
|
x: line.x1 + (line.x2 - line.x1) / 2,
|
|
y: line.y1 + (line.y2 - line.y1) / 2,
|
|
};
|
|
const styles = useStyles2(getStyles);
|
|
|
|
return (
|
|
<g className={styles.mainGroup}>
|
|
<rect className={styles.background} x={middle.x - 40} y={middle.y - 15} width="80" height="30" rx="5" />
|
|
<text className={styles.text} x={middle.x} y={middle.y - 5} textAnchor={'middle'}>
|
|
{edge.mainStat}
|
|
</text>
|
|
<text className={styles.text} x={middle.x} y={middle.y + 10} textAnchor={'middle'}>
|
|
{edge.secondaryStat}
|
|
</text>
|
|
</g>
|
|
);
|
|
});
|