UNPKG

@grafana/ui

Version:
1 lines • 21.2 kB
{"version":3,"file":"Graph.mjs","sources":["../../../../src/graveyard/Graph/Graph.tsx"],"sourcesContent":["// Libraries\nimport $ from 'jquery';\nimport { uniqBy } from 'lodash';\nimport { PureComponent } from 'react';\nimport * as React from 'react';\n\n// Types\nimport { TimeRange, GraphSeriesXY, TimeZone, createDimension } from '@grafana/data';\nimport { TooltipDisplayMode } from '@grafana/schema';\n\nimport { VizTooltipProps, VizTooltipContentProps, ActiveDimensions, VizTooltip } from '../../components/VizTooltip';\nimport { FlotPosition } from '../../components/VizTooltip/VizTooltip';\n\nimport { GraphContextMenu, GraphContextMenuProps, ContextDimensions } from './GraphContextMenu';\nimport { GraphTooltip } from './GraphTooltip/GraphTooltip';\nimport { GraphDimensions } from './GraphTooltip/types';\nimport { FlotItem } from './types';\nimport { graphTimeFormat, graphTickFormatter } from './utils';\n\n/** @deprecated */\nexport interface GraphProps {\n ariaLabel?: string;\n children?: JSX.Element | JSX.Element[];\n series: GraphSeriesXY[];\n timeRange: TimeRange; // NOTE: we should aim to make `time` a property of the axis, not force it for all graphs\n timeZone?: TimeZone; // NOTE: we should aim to make `time` a property of the axis, not force it for all graphs\n showLines?: boolean;\n showPoints?: boolean;\n showBars?: boolean;\n width: number;\n height: number;\n isStacked?: boolean;\n lineWidth?: number;\n onHorizontalRegionSelected?: (from: number, to: number) => void;\n}\n\n/** @deprecated */\ninterface GraphState {\n pos?: FlotPosition;\n contextPos?: FlotPosition;\n isTooltipVisible: boolean;\n isContextVisible: boolean;\n activeItem?: FlotItem<GraphSeriesXY>;\n contextItem?: FlotItem<GraphSeriesXY>;\n}\n\n/**\n * This is a react wrapper for the angular, flot based graph visualization.\n * Rather than using this component, you should use the `<PanelRender .../> with\n * timeseries panel configs.\n *\n * @deprecated\n */\nexport class Graph extends PureComponent<GraphProps, GraphState> {\n static defaultProps = {\n showLines: true,\n showPoints: false,\n showBars: false,\n isStacked: false,\n lineWidth: 1,\n };\n\n state: GraphState = {\n isTooltipVisible: false,\n isContextVisible: false,\n };\n\n element: HTMLElement | null = null;\n $element: JQuery<HTMLElement> | null = null;\n\n componentDidUpdate(prevProps: GraphProps, prevState: GraphState) {\n if (prevProps !== this.props) {\n this.draw();\n }\n }\n\n componentDidMount() {\n this.draw();\n if (this.element) {\n this.$element = $(this.element);\n this.$element.bind('plotselected', this.onPlotSelected);\n this.$element.bind('plothover', this.onPlotHover);\n this.$element.bind('plotclick', this.onPlotClick);\n }\n }\n\n componentWillUnmount() {\n if (this.$element) {\n this.$element.unbind('plotselected', this.onPlotSelected);\n }\n }\n\n onPlotSelected = (event: JQuery.Event, ranges: { xaxis: { from: number; to: number } }) => {\n const { onHorizontalRegionSelected } = this.props;\n if (onHorizontalRegionSelected) {\n onHorizontalRegionSelected(ranges.xaxis.from, ranges.xaxis.to);\n }\n };\n\n onPlotHover = (event: JQuery.Event, pos: FlotPosition, item?: FlotItem<GraphSeriesXY>) => {\n this.setState({\n isTooltipVisible: true,\n activeItem: item,\n pos,\n });\n };\n\n onPlotClick = (event: JQuery.Event, contextPos: FlotPosition, item?: FlotItem<GraphSeriesXY>) => {\n this.setState({\n isContextVisible: true,\n isTooltipVisible: false,\n contextItem: item,\n contextPos,\n });\n };\n\n getYAxes(series: GraphSeriesXY[]) {\n if (series.length === 0) {\n return [{ show: true, min: -1, max: 1 }];\n }\n return uniqBy(\n series.map((s) => {\n const index = s.yAxis ? s.yAxis.index : 1;\n const min = s.yAxis && s.yAxis.min && !isNaN(s.yAxis.min) ? s.yAxis.min : null;\n const tickDecimals =\n s.yAxis && s.yAxis.tickDecimals && !isNaN(s.yAxis.tickDecimals) ? s.yAxis.tickDecimals : null;\n return {\n show: true,\n index,\n position: index === 1 ? 'left' : 'right',\n min,\n tickDecimals,\n };\n }),\n (yAxisConfig) => yAxisConfig.index\n );\n }\n\n renderTooltip = () => {\n const { children, series, timeZone } = this.props;\n const { pos, activeItem, isTooltipVisible } = this.state;\n let tooltipElement: React.ReactElement<VizTooltipProps> | undefined;\n\n if (!isTooltipVisible || !pos || series.length === 0) {\n return null;\n }\n\n // Find children that indicate tooltip to be rendered\n React.Children.forEach(children, (c) => {\n // We have already found tooltip\n if (tooltipElement) {\n return;\n }\n const childType = c && c.type && (c.type.displayName || c.type.name);\n\n if (childType === VizTooltip.displayName) {\n tooltipElement = c;\n }\n });\n // If no tooltip provided, skip rendering\n if (!tooltipElement) {\n return null;\n }\n const tooltipElementProps = tooltipElement.props;\n\n const tooltipMode = tooltipElementProps.mode || 'single';\n\n // If mode is single series and user is not hovering over item, skip rendering\n if (!activeItem && tooltipMode === 'single') {\n return null;\n }\n\n // Check if tooltip needs to be rendered with custom tooltip component, otherwise default to GraphTooltip\n const tooltipContentRenderer = tooltipElementProps.tooltipComponent || GraphTooltip;\n // Indicates column(field) index in y-axis dimension\n const seriesIndex = activeItem ? activeItem.series.seriesIndex : 0;\n // Indicates row index in active field values\n const rowIndex = activeItem ? activeItem.dataIndex : undefined;\n\n const activeDimensions: ActiveDimensions<GraphDimensions> = {\n // Described x-axis active item\n // When hovering over an item - let's take it's dataIndex, otherwise undefined\n // Tooltip itself needs to figure out correct datapoint display information based on pos passed to it\n xAxis: [seriesIndex, rowIndex],\n // Describes y-axis active item\n yAxis: activeItem ? [activeItem.series.seriesIndex, activeItem.dataIndex] : null,\n };\n\n const tooltipContentProps: VizTooltipContentProps<GraphDimensions> = {\n dimensions: {\n // time/value dimension columns are index-aligned - see getGraphSeriesModel\n xAxis: createDimension(\n 'xAxis',\n series.map((s) => s.timeField)\n ),\n yAxis: createDimension(\n 'yAxis',\n series.map((s) => s.valueField)\n ),\n },\n activeDimensions,\n pos,\n mode: tooltipElementProps.mode || TooltipDisplayMode.Single,\n timeZone,\n };\n\n const tooltipContent = React.createElement(tooltipContentRenderer, { ...tooltipContentProps });\n\n return React.cloneElement(tooltipElement, {\n content: tooltipContent,\n position: { x: pos.pageX, y: pos.pageY },\n offset: { x: 10, y: 10 },\n });\n };\n\n renderContextMenu = () => {\n const { series } = this.props;\n const { contextPos, contextItem, isContextVisible } = this.state;\n\n if (!isContextVisible || !contextPos || !contextItem || series.length === 0) {\n return null;\n }\n\n // Indicates column(field) index in y-axis dimension\n const seriesIndex = contextItem ? contextItem.series.seriesIndex : 0;\n // Indicates row index in context field values\n const rowIndex = contextItem ? contextItem.dataIndex : undefined;\n\n const contextDimensions: ContextDimensions<GraphDimensions> = {\n // Described x-axis context item\n xAxis: [seriesIndex, rowIndex],\n // Describes y-axis context item\n yAxis: contextItem ? [contextItem.series.seriesIndex, contextItem.dataIndex] : null,\n };\n\n const dimensions: GraphDimensions = {\n // time/value dimension columns are index-aligned - see getGraphSeriesModel\n xAxis: createDimension(\n 'xAxis',\n series.map((s) => s.timeField)\n ),\n yAxis: createDimension(\n 'yAxis',\n series.map((s) => s.valueField)\n ),\n };\n\n const closeContext = () => this.setState({ isContextVisible: false });\n\n const getContextMenuSource = () => {\n return {\n datapoint: contextItem.datapoint,\n dataIndex: contextItem.dataIndex,\n series: contextItem.series,\n seriesIndex: contextItem.series.seriesIndex,\n pageX: contextPos.pageX,\n pageY: contextPos.pageY,\n };\n };\n\n const contextContentProps: GraphContextMenuProps = {\n x: contextPos.pageX,\n y: contextPos.pageY,\n onClose: closeContext,\n getContextMenuSource: getContextMenuSource,\n timeZone: this.props.timeZone,\n dimensions,\n contextDimensions,\n };\n\n return <GraphContextMenu {...contextContentProps} />;\n };\n\n getBarWidth = () => {\n const { series } = this.props;\n return Math.min(...series.map((s) => s.timeStep));\n };\n\n draw() {\n if (this.element === null) {\n return;\n }\n\n const {\n width,\n series,\n timeRange,\n showLines,\n showBars,\n showPoints,\n isStacked,\n lineWidth,\n timeZone,\n onHorizontalRegionSelected,\n } = this.props;\n\n if (!width) {\n return;\n }\n\n const ticks = width / 100;\n const min = timeRange.from.valueOf();\n const max = timeRange.to.valueOf();\n const yaxes = this.getYAxes(series);\n\n const flotOptions = {\n legend: {\n show: false,\n },\n series: {\n stack: isStacked,\n lines: {\n show: showLines,\n lineWidth: lineWidth,\n zero: false,\n },\n points: {\n show: showPoints,\n fill: 1,\n fillColor: false,\n radius: 2,\n },\n bars: {\n show: showBars,\n fill: 1,\n // Dividig the width by 1.5 to make the bars not touch each other\n barWidth: showBars ? this.getBarWidth() / 1.5 : 1,\n zero: false,\n lineWidth: lineWidth,\n },\n shadowSize: 0,\n },\n xaxis: {\n timezone: timeZone,\n show: true,\n mode: 'time',\n min: min,\n max: max,\n label: 'Datetime',\n ticks: ticks,\n timeformat: graphTimeFormat(ticks, min, max),\n tickFormatter: graphTickFormatter,\n },\n yaxes,\n grid: {\n minBorderMargin: 0,\n markings: [],\n backgroundColor: null,\n borderWidth: 0,\n hoverable: true,\n clickable: true,\n color: '#a1a1a1',\n margin: { left: 0, right: 0 },\n labelMarginX: 0,\n mouseActiveRadius: 30,\n },\n selection: {\n mode: onHorizontalRegionSelected ? 'x' : null,\n color: '#666',\n },\n crosshair: {\n mode: 'x',\n },\n };\n\n try {\n $.plot(\n this.element,\n series.filter((s) => s.isVisible),\n flotOptions\n );\n } catch (err) {\n console.error('Graph rendering error', err, flotOptions, series);\n throw new Error('Error rendering panel');\n }\n }\n\n render() {\n const { ariaLabel, height, width, series } = this.props;\n const noDataToBeDisplayed = series.length === 0;\n const tooltip = this.renderTooltip();\n const context = this.renderContextMenu();\n return (\n <div className=\"graph-panel\" aria-label={ariaLabel}>\n <div\n className=\"graph-panel__chart\"\n ref={(e) => (this.element = e)}\n style={{ height, width }}\n onMouseLeave={() => {\n this.setState({ isTooltipVisible: false });\n }}\n />\n {noDataToBeDisplayed && <div className=\"datapoints-warning\">No data</div>}\n {tooltip}\n {context}\n </div>\n );\n }\n}\n\nexport default Graph;\n"],"names":[],"mappings":"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"}