{"version":3,"file":"utils.mjs","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":["_a","_b","_c","_d","_e"],"mappings":"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"}