{"version":3,"file":"utils.cjs","sources":["../../../../src/components/VizTooltip/utils.ts"],"sourcesContent":["import { FALLBACK_COLOR, Field, FieldType, formattedValueToString, getFieldColorModeForField } from '@grafana/data';\nimport { SortOrder, TooltipDisplayMode } from '@grafana/schema';\n\nimport { ColorIndicatorStyles } from './VizTooltipColorIndicator';\nimport { ColorIndicator, ColorPlacement, 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 ColorIndicator.series:\n      return styles.series;\n    case ColorIndicator.value:\n      return styles.value;\n    case ColorIndicator.hexagon:\n      return styles.hexagon;\n    case ColorIndicator.pie_1_4:\n      return styles.pie_1_4;\n    case ColorIndicator.pie_2_4:\n      return styles.pie_2_4;\n    case ColorIndicator.pie_3_4:\n      return styles.pie_3_4;\n    case ColorIndicator.marker_sm:\n      return styles.marker_sm;\n    case ColorIndicator.marker_md:\n      return styles.marker_md;\n    case ColorIndicator.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\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: JSON.stringify(value), numeric: NaN };\n  }\n\n  if (value && typeof value === 'object') {\n    return { text: JSON.stringify(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\nexport const getContentItems = (\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  _restFields?: 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      !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  _restFields?.forEach((field) => {\n    if (!field.config.custom?.hideFrom?.tooltip) {\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\nconst getIndicatorAndPlacement = (field: Field) => {\n  const colorMode = getFieldColorModeForField(field);\n\n  let colorIndicator = ColorIndicator.series;\n  let colorPlacement = ColorPlacement.first;\n\n  if (colorMode.isByValue) {\n    colorIndicator = ColorIndicator.value;\n    colorPlacement = ColorPlacement.trailing;\n  }\n\n  return { colorIndicator, colorPlacement };\n};\n"],"names":["ColorIndicator","formattedValueToString","FieldType","TooltipDisplayMode","SortOrder","FALLBACK_COLOR","_a","_b","_c","_d","_e","getFieldColorModeForField","ColorPlacement"],"mappings":"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"}