UNPKG

@grafana/ui

Version:
1 lines 18.8 kB
{"version":3,"file":"utils.cjs","sources":["../../../../src/components/VizTooltip/utils.ts"],"sourcesContent":["import {\n FALLBACK_COLOR,\n type Field,\n FieldType,\n formattedValueToString,\n getFieldColorModeForField,\n type LinkModel,\n} from '@grafana/data';\nimport { SortOrder, TooltipDisplayMode } from '@grafana/schema';\n\n/** @alpha */\nexport interface TooltipScrollableOptions {\n mode: TooltipDisplayMode;\n maxHeight?: number;\n}\n\nimport { type ColorIndicatorStyles } from './VizTooltipColorIndicator';\nimport { VizTooltipColorIndicator, VizTooltipColorPlacement, type VizTooltipItem } from './types';\n\nexport const calculateTooltipPosition = (\n xPos = 0,\n yPos = 0,\n tooltipWidth = 0,\n tooltipHeight = 0,\n xOffset = 0,\n yOffset = 0,\n windowWidth = 0,\n windowHeight = 0\n) => {\n let x = xPos;\n let y = yPos;\n\n const overflowRight = Math.max(xPos + xOffset + tooltipWidth - (windowWidth - xOffset), 0);\n const overflowLeft = Math.abs(Math.min(xPos - xOffset - tooltipWidth - xOffset, 0));\n const wouldOverflowRight = overflowRight > 0;\n const wouldOverflowLeft = overflowLeft > 0;\n\n const overflowBelow = Math.max(yPos + yOffset + tooltipHeight - (windowHeight - yOffset), 0);\n const overflowAbove = Math.abs(Math.min(yPos - yOffset - tooltipHeight - yOffset, 0));\n const wouldOverflowBelow = overflowBelow > 0;\n const wouldOverflowAbove = overflowAbove > 0;\n\n if (wouldOverflowRight && wouldOverflowLeft) {\n x = overflowRight > overflowLeft ? xOffset : windowWidth - xOffset - tooltipWidth;\n } else if (wouldOverflowRight) {\n x = xPos - xOffset - tooltipWidth;\n } else {\n x = xPos + xOffset;\n }\n\n if (wouldOverflowBelow && wouldOverflowAbove) {\n y = overflowBelow > overflowAbove ? yOffset : windowHeight - yOffset - tooltipHeight;\n } else if (wouldOverflowBelow) {\n y = yPos - yOffset - tooltipHeight;\n } else {\n y = yPos + yOffset;\n }\n return { x, y };\n};\n\nexport const getColorIndicatorClass = (colorIndicator: string, styles: ColorIndicatorStyles) => {\n switch (colorIndicator) {\n case VizTooltipColorIndicator.series:\n return styles.series;\n case VizTooltipColorIndicator.value:\n return styles.value;\n case VizTooltipColorIndicator.hexagon:\n return styles.hexagon;\n case VizTooltipColorIndicator.pie_1_4:\n return styles.pie_1_4;\n case VizTooltipColorIndicator.pie_2_4:\n return styles.pie_2_4;\n case VizTooltipColorIndicator.pie_3_4:\n return styles.pie_3_4;\n case VizTooltipColorIndicator.marker_sm:\n return styles.marker_sm;\n case VizTooltipColorIndicator.marker_md:\n return styles.marker_md;\n case VizTooltipColorIndicator.marker_lg:\n return styles.marker_lg;\n default:\n return styles.value;\n }\n};\n\nconst numberCmp = (a: VizTooltipItem, b: VizTooltipItem) => a.numeric! - b.numeric!;\nconst collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });\nconst stringCmp = (a: VizTooltipItem, b: VizTooltipItem) => collator.compare(`${a.value}`, `${b.value}`);\n\n/**\n * Fields holding DataFrames (Tempo's nested spans, sparkline columns, expandable sub-tables) have\n * no meaningful one-line representation, and `applyFieldOverrides` gives every frame a circular\n * `__dataContext` back-reference to the field that owns it, so they cannot be serialized either.\n */\nconst isFrameValuedField = (field: Field) => field.type === FieldType.frame || field.type === FieldType.nestedFrames;\n\n// the catch only exists so an unserializable datasource value costs one row, not the whole panel\nconst stringifyValue = (value: unknown): string => {\n try {\n return JSON.stringify(value);\n } catch (error) {\n // This path shouldn't be hittable\n console.warn('Cannot render tooltip value', { error, value });\n return String(value);\n }\n};\n\nexport const getTooltipDisplayValue = (\n value: unknown,\n field: Field\n): {\n text: string;\n numeric: number;\n color?: string;\n} => {\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return { text: '', numeric: NaN };\n }\n\n return { text: stringifyValue(value), numeric: NaN };\n }\n\n if (value && typeof value === 'object') {\n return { text: stringifyValue(value), numeric: NaN };\n }\n\n const display = field.display!(value); // super expensive :(\n return { text: formattedValueToString(display), numeric: display.numeric, color: display.color };\n};\n\n/**\n * @alpha\n *\n * Builds the list of {@link VizTooltipItem} rows to display in a visualization tooltip.\n *\n * @param fields - All fields in the aligned data frame (including the x/time field).\n * @param xField - The x-axis or time field; it is excluded from the output rows.\n * @param dataIdxs - Per-field data row indices for the hovered point. A `null` entry means that field has no hovered value and is omitted.\n * @param seriesIdx - Index of the closest/hovered series. In `Single` mode only this series is shown; in `Multi` mode it controls the `isActive` highlight.\n * @param mode - Whether to show only the hovered series (`Single`) or all series (`Multi`).\n * @param sortOrder - How to sort the output rows. Use `SortOrder.None` to preserve field order.\n * @param fieldFilter - Optional predicate to exclude specific fields. Defaults to including all fields.\n * @param hideZeros - When `true`, rows whose value is exactly `0` are omitted. Defaults to `false`.\n * @param extraFields - Additional fields appended after the main rows as supplementary context (e.g. fields not shown in the visualization). These rows have `isHiddenFromViz: true` and are not sorted.\n */\nexport const getFieldDisplayItems = (\n fields: Field[],\n xField: Field,\n dataIdxs: Array<number | null>,\n seriesIdx: number | null | undefined,\n mode: TooltipDisplayMode,\n sortOrder: SortOrder,\n fieldFilter = (field: Field) => true,\n hideZeros = false,\n extraFields?: Field[]\n): VizTooltipItem[] => {\n let rows: VizTooltipItem[] = [];\n\n let allNumeric = true;\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n\n if (\n field === xField ||\n field.type === FieldType.time ||\n isFrameValuedField(field) ||\n !fieldFilter(field) ||\n field.config.custom?.hideFrom?.tooltip\n ) {\n continue;\n }\n\n // in single mode, skip all but closest field\n if (mode === TooltipDisplayMode.Single && seriesIdx !== i) {\n continue;\n }\n\n let dataIdx = dataIdxs[i];\n\n // omit non-hovered\n if (dataIdx == null) {\n continue;\n }\n\n if (!(field.type === FieldType.number || field.type === FieldType.boolean || field.type === FieldType.enum)) {\n allNumeric = false;\n }\n\n const v = fields[i].values[dataIdx];\n\n if ((v == null && field.config.noValue == null) || (hideZeros && v === 0)) {\n continue;\n }\n\n const display = getTooltipDisplayValue(v, field);\n\n // sort NaN and non-numeric to bottom (regardless of sort order)\n const numeric = !Number.isNaN(display.numeric)\n ? display.numeric\n : sortOrder === SortOrder.Descending\n ? Number.MIN_SAFE_INTEGER\n : Number.MAX_SAFE_INTEGER;\n\n const { colorIndicator, colorPlacement } = getIndicatorAndPlacement(field);\n\n rows.push({\n label: field.state?.displayName ?? field.name,\n value: display.text,\n color: display.color ?? FALLBACK_COLOR,\n colorIndicator,\n colorPlacement,\n isActive: mode === TooltipDisplayMode.Multi && seriesIdx === i,\n numeric,\n lineStyle: field.config.custom?.lineStyle,\n });\n }\n\n extraFields?.forEach((field) => {\n if (!field.config.custom?.hideFrom?.tooltip && !isFrameValuedField(field)) {\n const { colorIndicator, colorPlacement } = getIndicatorAndPlacement(field);\n const rawValue = field.values[dataIdxs[0]!];\n const display = getTooltipDisplayValue(rawValue, field);\n\n rows.push({\n label: field.state?.displayName ?? field.name,\n value: display.text,\n color: FALLBACK_COLOR,\n colorIndicator,\n colorPlacement,\n lineStyle: field.config.custom?.lineStyle,\n isHiddenFromViz: true,\n });\n }\n });\n\n if (sortOrder !== SortOrder.None && rows.length > 1) {\n const cmp = allNumeric ? numberCmp : stringCmp;\n const mult = sortOrder === SortOrder.Descending ? -1 : 1;\n rows.sort((a, b) => mult * cmp(a, b));\n }\n\n return rows;\n};\n\n/**\n * @alpha\n *\n * Returns the resolved data links for a specific data point in a field.\n *\n * Deduplicates links by `title/href` so that the same link target is not shown\n * twice when multiple override rules produce identical links.\n *\n * @param field - The field containing the data point and its link configuration.\n * @param rowIdx - The row index of the hovered data point within `field.values`.\n */\nexport const getFieldDisplayLinks = (field: Field, rowIdx: number): Array<LinkModel<Field>> => {\n const links: Array<LinkModel<Field>> = [];\n\n if ((field.config.links?.length ?? 0) > 0 && field.getLinks != null) {\n const v = field.values[rowIdx];\n const disp = field.display ? field.display(v) : { text: `${v}`, numeric: +v };\n const linkLookup = new Set<string>();\n\n field.getLinks({ calculatedValue: disp, valueRowIndex: rowIdx }).forEach((link) => {\n const key = `${link.title}/${link.href}`;\n if (!linkLookup.has(key)) {\n links.push(link);\n linkLookup.add(key);\n }\n });\n }\n\n return links;\n};\n\nconst getIndicatorAndPlacement = (field: Field) => {\n const colorMode = getFieldColorModeForField(field);\n\n let colorIndicator = VizTooltipColorIndicator.series;\n let colorPlacement = VizTooltipColorPlacement.first;\n\n if (colorMode.isByValue) {\n colorIndicator = VizTooltipColorIndicator.value;\n colorPlacement = VizTooltipColorPlacement.trailing;\n }\n\n return { colorIndicator, colorPlacement };\n};\n\n/**\n * @alpha\n *\n * Returns true when the tooltip content area should be vertically scrollable.\n *\n * Scrolling is enabled only in `Multi` mode with an explicit `maxHeight` set —\n * single-series tooltips are always short enough to not need it, and without a\n * `maxHeight` there is nothing to constrain the height against.\n */\nexport const isTooltipScrollable = ({ mode, maxHeight }: TooltipScrollableOptions): boolean => {\n return mode === TooltipDisplayMode.Multi && maxHeight != null;\n};\n"],"names":["VizTooltipColorIndicator","FieldType","formattedValueToString","TooltipDisplayMode","SortOrder","FALLBACK_COLOR","_a","_b","_c","_d","_e","getFieldColorModeForField","VizTooltipColorPlacement"],"mappings":"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"}