UNPKG

@grafana/ui

Version:
1 lines • 21 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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"}