UNPKG

@grafana/ui

Version:
1 lines 6.56 kB
{"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;;;;"}