{"version":3,"file":"utils.mjs","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.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 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): 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      field.config.custom?.hideFrom?.viz\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 = field.display!(v); // super expensive :(\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 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    rows.push({\n      label: field.state?.displayName ?? field.name,\n      value: formattedValueToString(display),\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  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"],"names":[],"mappings":";;;AAMO,MAAM,2BAA2B,CACtC,IAAA,GAAO,CACP,EAAA,IAAA,GAAO,GACP,YAAe,GAAA,CAAA,EACf,aAAgB,GAAA,CAAA,EAChB,UAAU,CACV,EAAA,OAAA,GAAU,GACV,WAAc,GAAA,CAAA,EACd,eAAe,CACZ,KAAA;AACH,EAAA,IAAI,CAAI,GAAA,IAAA;AACR,EAAA,IAAI,CAAI,GAAA,IAAA;AAER,EAAM,MAAA,aAAA,GAAgB,KAAK,GAAI,CAAA,IAAA,GAAO,UAAU,YAAgB,IAAA,WAAA,GAAc,UAAU,CAAC,CAAA;AACzF,EAAM,MAAA,YAAA,GAAe,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,OAAO,OAAU,GAAA,YAAA,GAAe,OAAS,EAAA,CAAC,CAAC,CAAA;AAClF,EAAA,MAAM,qBAAqB,aAAgB,GAAA,CAAA;AAC3C,EAAA,MAAM,oBAAoB,YAAe,GAAA,CAAA;AAEzC,EAAM,MAAA,aAAA,GAAgB,KAAK,GAAI,CAAA,IAAA,GAAO,UAAU,aAAiB,IAAA,YAAA,GAAe,UAAU,CAAC,CAAA;AAC3F,EAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,GAAA,CAAI,IAAK,CAAA,GAAA,CAAI,OAAO,OAAU,GAAA,aAAA,GAAgB,OAAS,EAAA,CAAC,CAAC,CAAA;AACpF,EAAA,MAAM,qBAAqB,aAAgB,GAAA,CAAA;AAC3C,EAAA,MAAM,qBAAqB,aAAgB,GAAA,CAAA;AAE3C,EAAA,IAAI,sBAAsB,iBAAmB,EAAA;AAC3C,IAAA,CAAA,GAAI,aAAgB,GAAA,YAAA,GAAe,OAAU,GAAA,WAAA,GAAc,OAAU,GAAA,YAAA;AAAA,aAC5D,kBAAoB,EAAA;AAC7B,IAAA,CAAA,GAAI,OAAO,OAAU,GAAA,YAAA;AAAA,GAChB,MAAA;AACL,IAAA,CAAA,GAAI,IAAO,GAAA,OAAA;AAAA;AAGb,EAAA,IAAI,sBAAsB,kBAAoB,EAAA;AAC5C,IAAA,CAAA,GAAI,aAAgB,GAAA,aAAA,GAAgB,OAAU,GAAA,YAAA,GAAe,OAAU,GAAA,aAAA;AAAA,aAC9D,kBAAoB,EAAA;AAC7B,IAAA,CAAA,GAAI,OAAO,OAAU,GAAA,aAAA;AAAA,GAChB,MAAA;AACL,IAAA,CAAA,GAAI,IAAO,GAAA,OAAA;AAAA;AAEb,EAAO,OAAA,EAAE,GAAG,CAAE,EAAA;AAChB;;;;"}