@perses-dev/components 0.53.0-beta.4 → 0.53.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"nearby-series.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/nearby-series.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nearby-series.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/nearby-series.ts"],"names":[],"mappings":"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"}
@@ -249,7 +249,20 @@ export const SHOW_FEWER_SERIES_LIMIT = 5;
249
249
  const pointInGrid = getPointInGrid(mousePos.plotCanvas.x, mousePos.plotCanvas.y, chart);
250
250
  if (pointInGrid !== null) {
251
251
  const chartModel = chart['_model'];
252
- const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;
252
+ const yAxisScale = chartModel.getComponent('yAxis').axis.scale;
253
+ const isLogScale = yAxisScale.type === 'log';
254
+ let yInterval = yAxisScale._interval;
255
+ // For logarithmic scales, convert the log interval to actual data range
256
+ if (isLogScale && yAxisScale.base) {
257
+ const logBase = yAxisScale.base;
258
+ const extent = yAxisScale._extent;
259
+ // Calculate actual data range from log extent
260
+ // extent is in log space (e.g., [0, 2] for 10^0 to 10^2)
261
+ const actualMin = logBase ** extent[0];
262
+ const actualMax = logBase ** extent[1];
263
+ // Use a fraction of the actual range as the interval
264
+ yInterval = (actualMax - actualMin) / 100;
265
+ }
253
266
  const totalSeries = data.length;
254
267
  const yBuffer = getYBuffer({
255
268
  yInterval,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TimeSeriesTooltip/nearby-series.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ECharts as EChartsInstance } from 'echarts/core';\nimport { LineSeriesOption } from 'echarts/charts';\nimport { formatValue, TimeSeriesValueTuple, FormatOptions, TimeSeries } from '@perses-dev/core';\nimport { EChartsDataFormat, OPTIMIZED_MODE_SERIES_LIMIT, TimeChartSeriesMapping, DatapointInfo } from '../model';\nimport { batchDispatchNearbySeriesActions, getPointInGrid, getClosestTimestamp } from '../utils';\nimport { CursorCoordinates, CursorData, EMPTY_TOOLTIP_DATA } from './tooltip-model';\n\n// increase multipliers to show more series in tooltip\nexport const INCREASE_NEARBY_SERIES_MULTIPLIER = 5.5; // adjusts how many series show in tooltip (higher == more series shown)\nexport const DYNAMIC_NEARBY_SERIES_MULTIPLIER = 30; // used for adjustment after series number divisor\nexport const SHOW_FEWER_SERIES_LIMIT = 5;\n\nexport interface NearbySeriesInfo {\n seriesIdx: number | null;\n datumIdx: number | null;\n seriesName: string;\n date: number;\n markerColor: string;\n x: number;\n y: number;\n formattedY: string;\n isClosestToCursor: boolean;\n}\n\nexport type NearbySeriesArray = NearbySeriesInfo[];\n\n/**\n * Returns formatted series data for the points that are close to the user's cursor.\n * Adjust xBuffer and yBuffer to increase or decrease number of series shown.\n */\nexport function checkforNearbyTimeSeries(\n data: TimeSeries[],\n seriesMapping: TimeChartSeriesMapping,\n pointInGrid: number[],\n yBuffer: number,\n chart: EChartsInstance,\n format?: FormatOptions\n): NearbySeriesArray {\n const currentNearbySeriesData: NearbySeriesArray = [];\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) return currentNearbySeriesData;\n\n if (chart.dispatchAction === undefined) return currentNearbySeriesData;\n\n if (!Array.isArray(data)) return currentNearbySeriesData;\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [];\n const emphasizedDatapoints: DatapointInfo[] = [];\n const duplicateDatapoints: DatapointInfo[] = [];\n\n const totalSeries = data.length;\n\n const yValueCounts: Map<number, number> = new Map();\n\n // Only need to loop through first dataset source since getCommonTimeScale ensures xAxis timestamps are consistent\n const firstTimeSeriesValues = data[0]?.values;\n const closestTimestamp = getClosestTimestamp(firstTimeSeriesValues, cursorX);\n\n if (closestTimestamp === null) {\n return EMPTY_TOOLTIP_DATA;\n }\n\n // find the timestamp with data that is closest to cursorX\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = seriesMapping[seriesIdx];\n if (!currentSeries) break;\n\n const currentDataset = totalSeries > 0 ? data[seriesIdx] : null;\n if (!currentDataset) break;\n\n const currentDatasetValues: TimeSeriesValueTuple[] = currentDataset.values;\n if (currentDatasetValues === undefined || !Array.isArray(currentDatasetValues)) break;\n const lineSeries = currentSeries as LineSeriesOption;\n const currentSeriesName = lineSeries.name ? lineSeries.name.toString() : '';\n const markerColor = lineSeries.color ?? '#000';\n if (Array.isArray(data)) {\n for (let datumIdx = 0; datumIdx < currentDatasetValues.length; datumIdx++) {\n const nearbyTimeSeries = currentDatasetValues[datumIdx];\n if (nearbyTimeSeries === undefined || !Array.isArray(nearbyTimeSeries)) break;\n\n const xValue = nearbyTimeSeries[0];\n const yValue = nearbyTimeSeries[1];\n\n // TODO: ensure null values not displayed in tooltip\n if (yValue !== undefined && yValue !== null) {\n if (closestTimestamp === xValue) {\n if (cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {\n // show fewer bold series in tooltip when many total series\n const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;\n const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);\n const isClosestToCursor = isWithinPercentageRange({\n valueToCheck: cursorY,\n baseValue: yValue,\n percentage: percentRangeToCheck,\n });\n if (isClosestToCursor) {\n // shows as bold in tooltip, customize 'emphasis' options in getTimeSeries util\n emphasizedSeriesIndexes.push(seriesIdx);\n\n // Used to determine which datapoint to apply select styles to.\n // Accounts for cases where lines may be rendered directly on top of eachother.\n const duplicateValuesCount = yValueCounts.get(yValue) ?? 0;\n yValueCounts.set(yValue, duplicateValuesCount + 1);\n if (duplicateValuesCount > 0) {\n duplicateDatapoints.push({\n seriesIndex: seriesIdx,\n dataIndex: datumIdx,\n seriesName: currentSeriesName,\n yValue: yValue,\n });\n }\n\n // keep track of all bold datapoints in tooltip so that 'select' state only applied to topmost\n emphasizedDatapoints.push({\n seriesIndex: seriesIdx,\n dataIndex: datumIdx,\n seriesName: currentSeriesName,\n yValue: yValue,\n });\n } else {\n nonEmphasizedSeriesIndexes.push(seriesIdx);\n // ensure series far away from cursor are not highlighted\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: seriesIdx,\n });\n }\n const formattedY = formatValue(yValue, format);\n currentNearbySeriesData.push({\n seriesIdx: seriesIdx,\n datumIdx: datumIdx,\n seriesName: currentSeriesName,\n date: closestTimestamp,\n x: xValue,\n y: yValue,\n formattedY: formattedY,\n markerColor: markerColor.toString(),\n isClosestToCursor,\n });\n nearbySeriesIndexes.push(seriesIdx);\n }\n }\n }\n }\n }\n }\n\n batchDispatchNearbySeriesActions(\n chart,\n nearbySeriesIndexes,\n emphasizedSeriesIndexes,\n nonEmphasizedSeriesIndexes,\n emphasizedDatapoints,\n duplicateDatapoints\n );\n\n return currentNearbySeriesData;\n}\n\n/**\n * [DEPRECATED] Returns formatted series data for the points that are close to the user's cursor\n * Adjust yBuffer to increase or decrease number of series shown\n */\nexport function legacyCheckforNearbySeries(\n data: EChartsDataFormat,\n pointInGrid: number[],\n yBuffer: number,\n chart?: EChartsInstance,\n format?: FormatOptions\n): NearbySeriesArray {\n const currentNearbySeriesData: NearbySeriesArray = [];\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) {\n return currentNearbySeriesData;\n }\n\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [];\n const totalSeries = data.timeSeries.length;\n if (Array.isArray(data.xAxis) && Array.isArray(data.timeSeries)) {\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = data.timeSeries[seriesIdx];\n if (currentSeries === undefined) break;\n if (currentNearbySeriesData.length >= OPTIMIZED_MODE_SERIES_LIMIT) break;\n\n const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';\n const markerColor = currentSeries.color ?? '#000';\n if (Array.isArray(currentSeries.data)) {\n for (let datumIdx = 0; datumIdx < currentSeries.data.length; datumIdx++) {\n const xValue = data.xAxis[datumIdx] ?? 0;\n const yValue = currentSeries.data[datumIdx];\n // ensure null values not displayed in tooltip\n if (yValue !== undefined && yValue !== null && cursorX === datumIdx) {\n if (yValue !== '-' && cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {\n // show fewer bold series in tooltip when many total series\n const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;\n const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);\n const isClosestToCursor = isWithinPercentageRange({\n valueToCheck: cursorY,\n baseValue: yValue,\n percentage: percentRangeToCheck,\n });\n if (isClosestToCursor) {\n emphasizedSeriesIndexes.push(seriesIdx);\n } else {\n nonEmphasizedSeriesIndexes.push(seriesIdx);\n // ensure series not close to cursor are not highlighted\n if (chart?.dispatchAction !== undefined) {\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: seriesIdx,\n });\n }\n }\n\n // determine whether to convert timestamp to ms, see: https://stackoverflow.com/a/23982005/17575201\n const xValueMilliSeconds = xValue > 99999999999 ? xValue : xValue * 1000;\n const formattedY = formatValue(yValue, format);\n currentNearbySeriesData.push({\n seriesIdx: seriesIdx,\n datumIdx: datumIdx,\n seriesName: currentSeriesName,\n date: xValueMilliSeconds,\n x: xValue,\n y: yValue,\n formattedY: formattedY,\n markerColor: markerColor.toString(),\n isClosestToCursor,\n });\n nearbySeriesIndexes.push(seriesIdx);\n }\n }\n }\n }\n }\n }\n if (chart?.dispatchAction !== undefined) {\n // Clears emphasis state of all lines that are not emphasized.\n // Emphasized is a subset of just the nearby series that are closest to cursor.\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: nonEmphasizedSeriesIndexes,\n });\n\n // https://echarts.apache.org/en/api.html#action.highlight\n if (emphasizedSeriesIndexes.length > 0) {\n // Fadeout opacity of all series not closest to cursor.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: emphasizedSeriesIndexes,\n notBlur: false, // ensure blur IS triggered, this is default but setting so it is explicit\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n } else {\n // When no emphasized series with bold text, notBlur allows opacity fadeout to not trigger.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: nearbySeriesIndexes,\n notBlur: true, // do not trigger blur state when cursor is not immediately close to any series\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n }\n }\n\n return currentNearbySeriesData;\n}\n\n/**\n * Uses mouse position to determine whether user is hovering over a chart canvas\n * If yes, convert from pixel values to logical cartesian coordinates and return all nearby series\n */\nexport function getNearbySeriesData({\n mousePos,\n pinnedPos,\n data,\n seriesMapping,\n chart,\n format,\n showAllSeries = false,\n}: {\n mousePos: CursorData['coords'];\n pinnedPos: CursorCoordinates | null;\n data: TimeSeries[];\n seriesMapping: TimeChartSeriesMapping;\n chart?: EChartsInstance;\n format?: FormatOptions;\n showAllSeries?: boolean;\n}): NearbySeriesArray {\n if (chart === undefined || mousePos === null) return EMPTY_TOOLTIP_DATA;\n\n // prevents multiple tooltips showing from adjacent charts unless tooltip is pinned\n let cursorTargetMatchesChart = false;\n if (mousePos.target !== null) {\n const currentParent = (<HTMLElement>mousePos.target).parentElement;\n if (currentParent !== null) {\n const currentGrandparent = currentParent.parentElement;\n if (currentGrandparent !== null) {\n const chartDom = chart.getDom();\n if (chartDom === currentGrandparent) {\n cursorTargetMatchesChart = true;\n }\n }\n }\n }\n\n // allows moving cursor inside tooltip without it fading away\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n cursorTargetMatchesChart = true;\n }\n\n if (cursorTargetMatchesChart === false || data === null || chart['_model'] === undefined) return EMPTY_TOOLTIP_DATA;\n\n // mousemove position undefined when not hovering over chart canvas\n if (mousePos.plotCanvas.x === undefined || mousePos.plotCanvas.y === undefined) return EMPTY_TOOLTIP_DATA;\n\n const pointInGrid = getPointInGrid(mousePos.plotCanvas.x, mousePos.plotCanvas.y, chart);\n if (pointInGrid !== null) {\n const chartModel = chart['_model'];\n const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;\n const totalSeries = data.length;\n const yBuffer = getYBuffer({ yInterval, totalSeries, showAllSeries });\n return checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, chart, format);\n }\n\n // no nearby series found\n return EMPTY_TOOLTIP_DATA;\n}\n\n/**\n * [DEPRECATED] Uses mouse position to determine whether user is hovering over a chart canvas\n * If yes, convert from pixel values to logical cartesian coordinates and return all nearby series\n */\nexport function legacyGetNearbySeriesData({\n mousePos,\n pinnedPos,\n chartData,\n chart,\n format,\n showAllSeries = false,\n}: {\n mousePos: CursorData['coords'];\n pinnedPos: CursorCoordinates | null;\n chartData: EChartsDataFormat;\n chart?: EChartsInstance;\n format?: FormatOptions;\n showAllSeries?: boolean;\n}): NearbySeriesArray {\n if (chart === undefined || mousePos === null) return [];\n\n // prevents multiple tooltips showing from adjacent charts unless tooltip is pinned\n let cursorTargetMatchesChart = false;\n if (mousePos.target !== null) {\n const currentParent = (<HTMLElement>mousePos.target).parentElement;\n if (currentParent !== null) {\n const currentGrandparent = currentParent.parentElement;\n if (currentGrandparent !== null) {\n const chartDom = chart.getDom();\n if (chartDom === currentGrandparent) {\n cursorTargetMatchesChart = true;\n }\n }\n }\n }\n\n // allows moving cursor inside tooltip without it fading away\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n cursorTargetMatchesChart = true;\n }\n\n if (cursorTargetMatchesChart === false) return [];\n\n if (chart['_model'] === undefined) return [];\n const chartModel = chart['_model'];\n const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;\n const totalSeries = chartData.timeSeries.length;\n const yBuffer = getYBuffer({ yInterval, totalSeries, showAllSeries });\n const pointInPixel = [mousePos.plotCanvas.x ?? 0, mousePos.plotCanvas.y ?? 0];\n if (chart.containPixel('grid', pointInPixel)) {\n const pointInGrid = chart.convertFromPixel('grid', pointInPixel);\n if (pointInGrid[0] !== undefined && pointInGrid[1] !== undefined) {\n return legacyCheckforNearbySeries(chartData, pointInGrid, yBuffer, chart, format);\n }\n }\n\n return [];\n}\n\n/*\n * Check if two numbers are within a specified percentage range\n */\nexport function isWithinPercentageRange({\n valueToCheck,\n baseValue,\n percentage,\n}: {\n valueToCheck: number;\n baseValue: number;\n percentage: number;\n}): boolean {\n const range = (percentage / 100) * baseValue;\n const lowerBound = baseValue - range;\n const upperBound = baseValue + range;\n return valueToCheck >= lowerBound && valueToCheck <= upperBound;\n}\n\n/*\n * Get range to check within for nearby series to show in tooltip.\n */\nexport function getYBuffer({\n yInterval,\n totalSeries,\n showAllSeries = false,\n}: {\n yInterval: number;\n totalSeries: number;\n showAllSeries?: boolean;\n}): number {\n if (showAllSeries) {\n return yInterval * 10; // roughly correlates with grid so entire canvas is searched\n }\n\n // never let nearby series range be less than roughly the size of a single tick\n const yBufferMin = yInterval * 0.3;\n\n // tooltip trigger area gets smaller with more series\n if (totalSeries > SHOW_FEWER_SERIES_LIMIT) {\n const adjustedBuffer = (yInterval * DYNAMIC_NEARBY_SERIES_MULTIPLIER) / totalSeries;\n return Math.max(yBufferMin, adjustedBuffer);\n }\n\n // increase multiplier to expand nearby series range\n return Math.max(yBufferMin, yInterval * INCREASE_NEARBY_SERIES_MULTIPLIER);\n}\n"],"names":["formatValue","OPTIMIZED_MODE_SERIES_LIMIT","batchDispatchNearbySeriesActions","getPointInGrid","getClosestTimestamp","EMPTY_TOOLTIP_DATA","INCREASE_NEARBY_SERIES_MULTIPLIER","DYNAMIC_NEARBY_SERIES_MULTIPLIER","SHOW_FEWER_SERIES_LIMIT","checkforNearbyTimeSeries","data","seriesMapping","pointInGrid","yBuffer","chart","format","currentNearbySeriesData","cursorX","cursorY","dispatchAction","undefined","Array","isArray","nearbySeriesIndexes","emphasizedSeriesIndexes","nonEmphasizedSeriesIndexes","emphasizedDatapoints","duplicateDatapoints","totalSeries","length","yValueCounts","Map","firstTimeSeriesValues","values","closestTimestamp","seriesIdx","currentSeries","currentDataset","currentDatasetValues","lineSeries","currentSeriesName","name","toString","markerColor","color","datumIdx","nearbyTimeSeries","xValue","yValue","minPercentRange","percentRangeToCheck","Math","max","isClosestToCursor","isWithinPercentageRange","valueToCheck","baseValue","percentage","push","duplicateValuesCount","get","set","seriesIndex","dataIndex","seriesName","type","formattedY","date","x","y","legacyCheckforNearbySeries","timeSeries","xAxis","xValueMilliSeconds","notBlur","escapeConnect","getNearbySeriesData","mousePos","pinnedPos","showAllSeries","cursorTargetMatchesChart","target","currentParent","parentElement","currentGrandparent","chartDom","getDom","plotCanvas","chartModel","yInterval","getComponent","axis","scale","_interval","getYBuffer","legacyGetNearbySeriesData","chartData","pointInPixel","containPixel","convertFromPixel","range","lowerBound","upperBound","yBufferMin","adjustedBuffer"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAIjC,SAASA,WAAW,QAAyD,mBAAmB;AAChG,SAA4BC,2BAA2B,QAA+C,WAAW;AACjH,SAASC,gCAAgC,EAAEC,cAAc,EAAEC,mBAAmB,QAAQ,WAAW;AACjG,SAAwCC,kBAAkB,QAAQ,kBAAkB;AAEpF,sDAAsD;AACtD,OAAO,MAAMC,oCAAoC,IAAI,CAAC,wEAAwE;AAC9H,OAAO,MAAMC,mCAAmC,GAAG,CAAC,kDAAkD;AACtG,OAAO,MAAMC,0BAA0B,EAAE;AAgBzC;;;CAGC,GACD,OAAO,SAASC,yBACdC,IAAkB,EAClBC,aAAqC,EACrCC,WAAqB,EACrBC,OAAe,EACfC,KAAsB,EACtBC,MAAsB;IAEtB,MAAMC,0BAA6C,EAAE;IACrD,MAAMC,UAAyBL,WAAW,CAAC,EAAE,IAAI;IACjD,MAAMM,UAAyBN,WAAW,CAAC,EAAE,IAAI;IAEjD,IAAIK,YAAY,QAAQC,YAAY,MAAM,OAAOF;IAEjD,IAAIF,MAAMK,cAAc,KAAKC,WAAW,OAAOJ;IAE/C,IAAI,CAACK,MAAMC,OAAO,CAACZ,OAAO,OAAOM;IACjC,MAAMO,sBAAgC,EAAE;IACxC,MAAMC,0BAAoC,EAAE;IAC5C,MAAMC,6BAAuC,EAAE;IAC/C,MAAMC,uBAAwC,EAAE;IAChD,MAAMC,sBAAuC,EAAE;IAE/C,MAAMC,cAAclB,KAAKmB,MAAM;IAE/B,MAAMC,eAAoC,IAAIC;IAE9C,kHAAkH;IAClH,MAAMC,wBAAwBtB,IAAI,CAAC,EAAE,EAAEuB;IACvC,MAAMC,mBAAmB9B,oBAAoB4B,uBAAuBf;IAEpE,IAAIiB,qBAAqB,MAAM;QAC7B,OAAO7B;IACT;IAEA,0DAA0D;IAC1D,IAAK,IAAI8B,YAAY,GAAGA,YAAYP,aAAaO,YAAa;QAC5D,MAAMC,gBAAgBzB,aAAa,CAACwB,UAAU;QAC9C,IAAI,CAACC,eAAe;QAEpB,MAAMC,iBAAiBT,cAAc,IAAIlB,IAAI,CAACyB,UAAU,GAAG;QAC3D,IAAI,CAACE,gBAAgB;QAErB,MAAMC,uBAA+CD,eAAeJ,MAAM;QAC1E,IAAIK,yBAAyBlB,aAAa,CAACC,MAAMC,OAAO,CAACgB,uBAAuB;QAChF,MAAMC,aAAaH;QACnB,MAAMI,oBAAoBD,WAAWE,IAAI,GAAGF,WAAWE,IAAI,CAACC,QAAQ,KAAK;QACzE,MAAMC,cAAcJ,WAAWK,KAAK,IAAI;QACxC,IAAIvB,MAAMC,OAAO,CAACZ,OAAO;YACvB,IAAK,IAAImC,WAAW,GAAGA,WAAWP,qBAAqBT,MAAM,EAAEgB,WAAY;gBACzE,MAAMC,mBAAmBR,oBAAoB,CAACO,SAAS;gBACvD,IAAIC,qBAAqB1B,aAAa,CAACC,MAAMC,OAAO,CAACwB,mBAAmB;gBAExE,MAAMC,SAASD,gBAAgB,CAAC,EAAE;gBAClC,MAAME,SAASF,gBAAgB,CAAC,EAAE;gBAElC,oDAAoD;gBACpD,IAAIE,WAAW5B,aAAa4B,WAAW,MAAM;oBAC3C,IAAId,qBAAqBa,QAAQ;wBAC/B,IAAI7B,WAAW8B,SAASnC,WAAWK,WAAW8B,SAASnC,SAAS;4BAC9D,2DAA2D;4BAC3D,MAAMoC,kBAAkBrB,cAAcpB,0BAA0B,IAAI;4BACpE,MAAM0C,sBAAsBC,KAAKC,GAAG,CAACH,iBAAiB,MAAMrB;4BAC5D,MAAMyB,oBAAoBC,wBAAwB;gCAChDC,cAAcrC;gCACdsC,WAAWR;gCACXS,YAAYP;4BACd;4BACA,IAAIG,mBAAmB;gCACrB,+EAA+E;gCAC/E7B,wBAAwBkC,IAAI,CAACvB;gCAE7B,+DAA+D;gCAC/D,+EAA+E;gCAC/E,MAAMwB,uBAAuB7B,aAAa8B,GAAG,CAACZ,WAAW;gCACzDlB,aAAa+B,GAAG,CAACb,QAAQW,uBAAuB;gCAChD,IAAIA,uBAAuB,GAAG;oCAC5BhC,oBAAoB+B,IAAI,CAAC;wCACvBI,aAAa3B;wCACb4B,WAAWlB;wCACXmB,YAAYxB;wCACZQ,QAAQA;oCACV;gCACF;gCAEA,8FAA8F;gCAC9FtB,qBAAqBgC,IAAI,CAAC;oCACxBI,aAAa3B;oCACb4B,WAAWlB;oCACXmB,YAAYxB;oCACZQ,QAAQA;gCACV;4BACF,OAAO;gCACLvB,2BAA2BiC,IAAI,CAACvB;gCAChC,yDAAyD;gCACzDrB,MAAMK,cAAc,CAAC;oCACnB8C,MAAM;oCACNH,aAAa3B;gCACf;4BACF;4BACA,MAAM+B,aAAalE,YAAYgD,QAAQjC;4BACvCC,wBAAwB0C,IAAI,CAAC;gCAC3BvB,WAAWA;gCACXU,UAAUA;gCACVmB,YAAYxB;gCACZ2B,MAAMjC;gCACNkC,GAAGrB;gCACHsB,GAAGrB;gCACHkB,YAAYA;gCACZvB,aAAaA,YAAYD,QAAQ;gCACjCW;4BACF;4BACA9B,oBAAoBmC,IAAI,CAACvB;wBAC3B;oBACF;gBACF;YACF;QACF;IACF;IAEAjC,iCACEY,OACAS,qBACAC,yBACAC,4BACAC,sBACAC;IAGF,OAAOX;AACT;AAEA;;;CAGC,GACD,OAAO,SAASsD,2BACd5D,IAAuB,EACvBE,WAAqB,EACrBC,OAAe,EACfC,KAAuB,EACvBC,MAAsB;IAEtB,MAAMC,0BAA6C,EAAE;IACrD,MAAMC,UAAyBL,WAAW,CAAC,EAAE,IAAI;IACjD,MAAMM,UAAyBN,WAAW,CAAC,EAAE,IAAI;IAEjD,IAAIK,YAAY,QAAQC,YAAY,MAAM;QACxC,OAAOF;IACT;IAEA,MAAMO,sBAAgC,EAAE;IACxC,MAAMC,0BAAoC,EAAE;IAC5C,MAAMC,6BAAuC,EAAE;IAC/C,MAAMG,cAAclB,KAAK6D,UAAU,CAAC1C,MAAM;IAC1C,IAAIR,MAAMC,OAAO,CAACZ,KAAK8D,KAAK,KAAKnD,MAAMC,OAAO,CAACZ,KAAK6D,UAAU,GAAG;QAC/D,IAAK,IAAIpC,YAAY,GAAGA,YAAYP,aAAaO,YAAa;YAC5D,MAAMC,gBAAgB1B,KAAK6D,UAAU,CAACpC,UAAU;YAChD,IAAIC,kBAAkBhB,WAAW;YACjC,IAAIJ,wBAAwBa,MAAM,IAAI5B,6BAA6B;YAEnE,MAAMuC,oBAAoBJ,cAAcK,IAAI,GAAGL,cAAcK,IAAI,CAACC,QAAQ,KAAK;YAC/E,MAAMC,cAAcP,cAAcQ,KAAK,IAAI;YAC3C,IAAIvB,MAAMC,OAAO,CAACc,cAAc1B,IAAI,GAAG;gBACrC,IAAK,IAAImC,WAAW,GAAGA,WAAWT,cAAc1B,IAAI,CAACmB,MAAM,EAAEgB,WAAY;oBACvE,MAAME,SAASrC,KAAK8D,KAAK,CAAC3B,SAAS,IAAI;oBACvC,MAAMG,SAASZ,cAAc1B,IAAI,CAACmC,SAAS;oBAC3C,8CAA8C;oBAC9C,IAAIG,WAAW5B,aAAa4B,WAAW,QAAQ/B,YAAY4B,UAAU;wBACnE,IAAIG,WAAW,OAAO9B,WAAW8B,SAASnC,WAAWK,WAAW8B,SAASnC,SAAS;4BAChF,2DAA2D;4BAC3D,MAAMoC,kBAAkBrB,cAAcpB,0BAA0B,IAAI;4BACpE,MAAM0C,sBAAsBC,KAAKC,GAAG,CAACH,iBAAiB,MAAMrB;4BAC5D,MAAMyB,oBAAoBC,wBAAwB;gCAChDC,cAAcrC;gCACdsC,WAAWR;gCACXS,YAAYP;4BACd;4BACA,IAAIG,mBAAmB;gCACrB7B,wBAAwBkC,IAAI,CAACvB;4BAC/B,OAAO;gCACLV,2BAA2BiC,IAAI,CAACvB;gCAChC,wDAAwD;gCACxD,IAAIrB,OAAOK,mBAAmBC,WAAW;oCACvCN,MAAMK,cAAc,CAAC;wCACnB8C,MAAM;wCACNH,aAAa3B;oCACf;gCACF;4BACF;4BAEA,mGAAmG;4BACnG,MAAMsC,qBAAqB1B,SAAS,cAAcA,SAASA,SAAS;4BACpE,MAAMmB,aAAalE,YAAYgD,QAAQjC;4BACvCC,wBAAwB0C,IAAI,CAAC;gCAC3BvB,WAAWA;gCACXU,UAAUA;gCACVmB,YAAYxB;gCACZ2B,MAAMM;gCACNL,GAAGrB;gCACHsB,GAAGrB;gCACHkB,YAAYA;gCACZvB,aAAaA,YAAYD,QAAQ;gCACjCW;4BACF;4BACA9B,oBAAoBmC,IAAI,CAACvB;wBAC3B;oBACF;gBACF;YACF;QACF;IACF;IACA,IAAIrB,OAAOK,mBAAmBC,WAAW;QACvC,8DAA8D;QAC9D,+EAA+E;QAC/EN,MAAMK,cAAc,CAAC;YACnB8C,MAAM;YACNH,aAAarC;QACf;QAEA,0DAA0D;QAC1D,IAAID,wBAAwBK,MAAM,GAAG,GAAG;YACtC,uDAAuD;YACvDf,MAAMK,cAAc,CAAC;gBACnB8C,MAAM;gBACNH,aAAatC;gBACbkD,SAAS;gBACTC,eAAe;YACjB;QACF,OAAO;YACL,2FAA2F;YAC3F7D,MAAMK,cAAc,CAAC;gBACnB8C,MAAM;gBACNH,aAAavC;gBACbmD,SAAS;gBACTC,eAAe;YACjB;QACF;IACF;IAEA,OAAO3D;AACT;AAEA;;;CAGC,GACD,OAAO,SAAS4D,oBAAoB,EAClCC,QAAQ,EACRC,SAAS,EACTpE,IAAI,EACJC,aAAa,EACbG,KAAK,EACLC,MAAM,EACNgE,gBAAgB,KAAK,EAStB;IACC,IAAIjE,UAAUM,aAAayD,aAAa,MAAM,OAAOxE;IAErD,mFAAmF;IACnF,IAAI2E,2BAA2B;IAC/B,IAAIH,SAASI,MAAM,KAAK,MAAM;QAC5B,MAAMC,gBAAgB,AAAcL,SAASI,MAAM,CAAEE,aAAa;QAClE,IAAID,kBAAkB,MAAM;YAC1B,MAAME,qBAAqBF,cAAcC,aAAa;YACtD,IAAIC,uBAAuB,MAAM;gBAC/B,MAAMC,WAAWvE,MAAMwE,MAAM;gBAC7B,IAAID,aAAaD,oBAAoB;oBACnCJ,2BAA2B;gBAC7B;YACF;QACF;IACF;IAEA,6DAA6D;IAC7D,IAAIF,cAAc,MAAM;QACtBD,WAAWC;QACXE,2BAA2B;IAC7B;IAEA,IAAIA,6BAA6B,SAAStE,SAAS,QAAQI,KAAK,CAAC,SAAS,KAAKM,WAAW,OAAOf;IAEjG,mEAAmE;IACnE,IAAIwE,SAASU,UAAU,CAACnB,CAAC,KAAKhD,aAAayD,SAASU,UAAU,CAAClB,CAAC,KAAKjD,WAAW,OAAOf;IAEvF,MAAMO,cAAcT,eAAe0E,SAASU,UAAU,CAACnB,CAAC,EAAES,SAASU,UAAU,CAAClB,CAAC,EAAEvD;IACjF,IAAIF,gBAAgB,MAAM;QACxB,MAAM4E,aAAa1E,KAAK,CAAC,SAAS;QAClC,MAAM2E,YAAYD,WAAWE,YAAY,CAAC,SAASC,IAAI,CAACC,KAAK,CAACC,SAAS;QACvE,MAAMjE,cAAclB,KAAKmB,MAAM;QAC/B,MAAMhB,UAAUiF,WAAW;YAAEL;YAAW7D;YAAamD;QAAc;QACnE,OAAOtE,yBAAyBC,MAAMC,eAAeC,aAAaC,SAASC,OAAOC;IACpF;IAEA,yBAAyB;IACzB,OAAOV;AACT;AAEA;;;CAGC,GACD,OAAO,SAAS0F,0BAA0B,EACxClB,QAAQ,EACRC,SAAS,EACTkB,SAAS,EACTlF,KAAK,EACLC,MAAM,EACNgE,gBAAgB,KAAK,EAQtB;IACC,IAAIjE,UAAUM,aAAayD,aAAa,MAAM,OAAO,EAAE;IAEvD,mFAAmF;IACnF,IAAIG,2BAA2B;IAC/B,IAAIH,SAASI,MAAM,KAAK,MAAM;QAC5B,MAAMC,gBAAgB,AAAcL,SAASI,MAAM,CAAEE,aAAa;QAClE,IAAID,kBAAkB,MAAM;YAC1B,MAAME,qBAAqBF,cAAcC,aAAa;YACtD,IAAIC,uBAAuB,MAAM;gBAC/B,MAAMC,WAAWvE,MAAMwE,MAAM;gBAC7B,IAAID,aAAaD,oBAAoB;oBACnCJ,2BAA2B;gBAC7B;YACF;QACF;IACF;IAEA,6DAA6D;IAC7D,IAAIF,cAAc,MAAM;QACtBD,WAAWC;QACXE,2BAA2B;IAC7B;IAEA,IAAIA,6BAA6B,OAAO,OAAO,EAAE;IAEjD,IAAIlE,KAAK,CAAC,SAAS,KAAKM,WAAW,OAAO,EAAE;IAC5C,MAAMoE,aAAa1E,KAAK,CAAC,SAAS;IAClC,MAAM2E,YAAYD,WAAWE,YAAY,CAAC,SAASC,IAAI,CAACC,KAAK,CAACC,SAAS;IACvE,MAAMjE,cAAcoE,UAAUzB,UAAU,CAAC1C,MAAM;IAC/C,MAAMhB,UAAUiF,WAAW;QAAEL;QAAW7D;QAAamD;IAAc;IACnE,MAAMkB,eAAe;QAACpB,SAASU,UAAU,CAACnB,CAAC,IAAI;QAAGS,SAASU,UAAU,CAAClB,CAAC,IAAI;KAAE;IAC7E,IAAIvD,MAAMoF,YAAY,CAAC,QAAQD,eAAe;QAC5C,MAAMrF,cAAcE,MAAMqF,gBAAgB,CAAC,QAAQF;QACnD,IAAIrF,WAAW,CAAC,EAAE,KAAKQ,aAAaR,WAAW,CAAC,EAAE,KAAKQ,WAAW;YAChE,OAAOkD,2BAA2B0B,WAAWpF,aAAaC,SAASC,OAAOC;QAC5E;IACF;IAEA,OAAO,EAAE;AACX;AAEA;;CAEC,GACD,OAAO,SAASuC,wBAAwB,EACtCC,YAAY,EACZC,SAAS,EACTC,UAAU,EAKX;IACC,MAAM2C,QAAQ,AAAC3C,aAAa,MAAOD;IACnC,MAAM6C,aAAa7C,YAAY4C;IAC/B,MAAME,aAAa9C,YAAY4C;IAC/B,OAAO7C,gBAAgB8C,cAAc9C,gBAAgB+C;AACvD;AAEA;;CAEC,GACD,OAAO,SAASR,WAAW,EACzBL,SAAS,EACT7D,WAAW,EACXmD,gBAAgB,KAAK,EAKtB;IACC,IAAIA,eAAe;QACjB,OAAOU,YAAY,IAAI,4DAA4D;IACrF;IAEA,+EAA+E;IAC/E,MAAMc,aAAad,YAAY;IAE/B,qDAAqD;IACrD,IAAI7D,cAAcpB,yBAAyB;QACzC,MAAMgG,iBAAiB,AAACf,YAAYlF,mCAAoCqB;QACxE,OAAOuB,KAAKC,GAAG,CAACmD,YAAYC;IAC9B;IAEA,oDAAoD;IACpD,OAAOrD,KAAKC,GAAG,CAACmD,YAAYd,YAAYnF;AAC1C"}
1
+ {"version":3,"sources":["../../src/TimeSeriesTooltip/nearby-series.ts"],"sourcesContent":["// Copyright 2023 The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ECharts as EChartsInstance } from 'echarts/core';\nimport { LineSeriesOption } from 'echarts/charts';\nimport { formatValue, TimeSeriesValueTuple, FormatOptions, TimeSeries } from '@perses-dev/core';\nimport { EChartsDataFormat, OPTIMIZED_MODE_SERIES_LIMIT, TimeChartSeriesMapping, DatapointInfo } from '../model';\nimport { batchDispatchNearbySeriesActions, getPointInGrid, getClosestTimestamp } from '../utils';\nimport { CursorCoordinates, CursorData, EMPTY_TOOLTIP_DATA } from './tooltip-model';\n\n// increase multipliers to show more series in tooltip\nexport const INCREASE_NEARBY_SERIES_MULTIPLIER = 5.5; // adjusts how many series show in tooltip (higher == more series shown)\nexport const DYNAMIC_NEARBY_SERIES_MULTIPLIER = 30; // used for adjustment after series number divisor\nexport const SHOW_FEWER_SERIES_LIMIT = 5;\n\nexport interface NearbySeriesInfo {\n seriesIdx: number | null;\n datumIdx: number | null;\n seriesName: string;\n date: number;\n markerColor: string;\n x: number;\n y: number;\n formattedY: string;\n isClosestToCursor: boolean;\n}\n\nexport type NearbySeriesArray = NearbySeriesInfo[];\n\n/**\n * Returns formatted series data for the points that are close to the user's cursor.\n * Adjust xBuffer and yBuffer to increase or decrease number of series shown.\n */\nexport function checkforNearbyTimeSeries(\n data: TimeSeries[],\n seriesMapping: TimeChartSeriesMapping,\n pointInGrid: number[],\n yBuffer: number,\n chart: EChartsInstance,\n format?: FormatOptions\n): NearbySeriesArray {\n const currentNearbySeriesData: NearbySeriesArray = [];\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) return currentNearbySeriesData;\n\n if (chart.dispatchAction === undefined) return currentNearbySeriesData;\n\n if (!Array.isArray(data)) return currentNearbySeriesData;\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [];\n const emphasizedDatapoints: DatapointInfo[] = [];\n const duplicateDatapoints: DatapointInfo[] = [];\n\n const totalSeries = data.length;\n\n const yValueCounts: Map<number, number> = new Map();\n\n // Only need to loop through first dataset source since getCommonTimeScale ensures xAxis timestamps are consistent\n const firstTimeSeriesValues = data[0]?.values;\n const closestTimestamp = getClosestTimestamp(firstTimeSeriesValues, cursorX);\n\n if (closestTimestamp === null) {\n return EMPTY_TOOLTIP_DATA;\n }\n\n // find the timestamp with data that is closest to cursorX\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = seriesMapping[seriesIdx];\n if (!currentSeries) break;\n\n const currentDataset = totalSeries > 0 ? data[seriesIdx] : null;\n if (!currentDataset) break;\n\n const currentDatasetValues: TimeSeriesValueTuple[] = currentDataset.values;\n if (currentDatasetValues === undefined || !Array.isArray(currentDatasetValues)) break;\n const lineSeries = currentSeries as LineSeriesOption;\n const currentSeriesName = lineSeries.name ? lineSeries.name.toString() : '';\n const markerColor = lineSeries.color ?? '#000';\n if (Array.isArray(data)) {\n for (let datumIdx = 0; datumIdx < currentDatasetValues.length; datumIdx++) {\n const nearbyTimeSeries = currentDatasetValues[datumIdx];\n if (nearbyTimeSeries === undefined || !Array.isArray(nearbyTimeSeries)) break;\n\n const xValue = nearbyTimeSeries[0];\n const yValue = nearbyTimeSeries[1];\n // TODO: ensure null values not displayed in tooltip\n if (yValue !== undefined && yValue !== null) {\n if (closestTimestamp === xValue) {\n if (cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {\n // show fewer bold series in tooltip when many total series\n const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;\n const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);\n const isClosestToCursor = isWithinPercentageRange({\n valueToCheck: cursorY,\n baseValue: yValue,\n percentage: percentRangeToCheck,\n });\n if (isClosestToCursor) {\n // shows as bold in tooltip, customize 'emphasis' options in getTimeSeries util\n emphasizedSeriesIndexes.push(seriesIdx);\n\n // Used to determine which datapoint to apply select styles to.\n // Accounts for cases where lines may be rendered directly on top of eachother.\n const duplicateValuesCount = yValueCounts.get(yValue) ?? 0;\n yValueCounts.set(yValue, duplicateValuesCount + 1);\n if (duplicateValuesCount > 0) {\n duplicateDatapoints.push({\n seriesIndex: seriesIdx,\n dataIndex: datumIdx,\n seriesName: currentSeriesName,\n yValue: yValue,\n });\n }\n\n // keep track of all bold datapoints in tooltip so that 'select' state only applied to topmost\n emphasizedDatapoints.push({\n seriesIndex: seriesIdx,\n dataIndex: datumIdx,\n seriesName: currentSeriesName,\n yValue: yValue,\n });\n } else {\n nonEmphasizedSeriesIndexes.push(seriesIdx);\n // ensure series far away from cursor are not highlighted\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: seriesIdx,\n });\n }\n const formattedY = formatValue(yValue, format);\n currentNearbySeriesData.push({\n seriesIdx: seriesIdx,\n datumIdx: datumIdx,\n seriesName: currentSeriesName,\n date: closestTimestamp,\n x: xValue,\n y: yValue,\n formattedY: formattedY,\n markerColor: markerColor.toString(),\n isClosestToCursor,\n });\n nearbySeriesIndexes.push(seriesIdx);\n }\n }\n }\n }\n }\n }\n\n batchDispatchNearbySeriesActions(\n chart,\n nearbySeriesIndexes,\n emphasizedSeriesIndexes,\n nonEmphasizedSeriesIndexes,\n emphasizedDatapoints,\n duplicateDatapoints\n );\n\n return currentNearbySeriesData;\n}\n\n/**\n * [DEPRECATED] Returns formatted series data for the points that are close to the user's cursor\n * Adjust yBuffer to increase or decrease number of series shown\n */\nexport function legacyCheckforNearbySeries(\n data: EChartsDataFormat,\n pointInGrid: number[],\n yBuffer: number,\n chart?: EChartsInstance,\n format?: FormatOptions\n): NearbySeriesArray {\n const currentNearbySeriesData: NearbySeriesArray = [];\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) {\n return currentNearbySeriesData;\n }\n\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [];\n const totalSeries = data.timeSeries.length;\n if (Array.isArray(data.xAxis) && Array.isArray(data.timeSeries)) {\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = data.timeSeries[seriesIdx];\n if (currentSeries === undefined) break;\n if (currentNearbySeriesData.length >= OPTIMIZED_MODE_SERIES_LIMIT) break;\n\n const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';\n const markerColor = currentSeries.color ?? '#000';\n if (Array.isArray(currentSeries.data)) {\n for (let datumIdx = 0; datumIdx < currentSeries.data.length; datumIdx++) {\n const xValue = data.xAxis[datumIdx] ?? 0;\n const yValue = currentSeries.data[datumIdx];\n // ensure null values not displayed in tooltip\n if (yValue !== undefined && yValue !== null && cursorX === datumIdx) {\n if (yValue !== '-' && cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {\n // show fewer bold series in tooltip when many total series\n const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;\n const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);\n const isClosestToCursor = isWithinPercentageRange({\n valueToCheck: cursorY,\n baseValue: yValue,\n percentage: percentRangeToCheck,\n });\n if (isClosestToCursor) {\n emphasizedSeriesIndexes.push(seriesIdx);\n } else {\n nonEmphasizedSeriesIndexes.push(seriesIdx);\n // ensure series not close to cursor are not highlighted\n if (chart?.dispatchAction !== undefined) {\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: seriesIdx,\n });\n }\n }\n\n // determine whether to convert timestamp to ms, see: https://stackoverflow.com/a/23982005/17575201\n const xValueMilliSeconds = xValue > 99999999999 ? xValue : xValue * 1000;\n const formattedY = formatValue(yValue, format);\n currentNearbySeriesData.push({\n seriesIdx: seriesIdx,\n datumIdx: datumIdx,\n seriesName: currentSeriesName,\n date: xValueMilliSeconds,\n x: xValue,\n y: yValue,\n formattedY: formattedY,\n markerColor: markerColor.toString(),\n isClosestToCursor,\n });\n nearbySeriesIndexes.push(seriesIdx);\n }\n }\n }\n }\n }\n }\n if (chart?.dispatchAction !== undefined) {\n // Clears emphasis state of all lines that are not emphasized.\n // Emphasized is a subset of just the nearby series that are closest to cursor.\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: nonEmphasizedSeriesIndexes,\n });\n\n // https://echarts.apache.org/en/api.html#action.highlight\n if (emphasizedSeriesIndexes.length > 0) {\n // Fadeout opacity of all series not closest to cursor.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: emphasizedSeriesIndexes,\n notBlur: false, // ensure blur IS triggered, this is default but setting so it is explicit\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n } else {\n // When no emphasized series with bold text, notBlur allows opacity fadeout to not trigger.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: nearbySeriesIndexes,\n notBlur: true, // do not trigger blur state when cursor is not immediately close to any series\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n }\n }\n\n return currentNearbySeriesData;\n}\n\n/**\n * Uses mouse position to determine whether user is hovering over a chart canvas\n * If yes, convert from pixel values to logical cartesian coordinates and return all nearby series\n */\nexport function getNearbySeriesData({\n mousePos,\n pinnedPos,\n data,\n seriesMapping,\n chart,\n format,\n showAllSeries = false,\n}: {\n mousePos: CursorData['coords'];\n pinnedPos: CursorCoordinates | null;\n data: TimeSeries[];\n seriesMapping: TimeChartSeriesMapping;\n chart?: EChartsInstance;\n format?: FormatOptions;\n showAllSeries?: boolean;\n}): NearbySeriesArray {\n if (chart === undefined || mousePos === null) return EMPTY_TOOLTIP_DATA;\n\n // prevents multiple tooltips showing from adjacent charts unless tooltip is pinned\n let cursorTargetMatchesChart = false;\n if (mousePos.target !== null) {\n const currentParent = (<HTMLElement>mousePos.target).parentElement;\n if (currentParent !== null) {\n const currentGrandparent = currentParent.parentElement;\n if (currentGrandparent !== null) {\n const chartDom = chart.getDom();\n if (chartDom === currentGrandparent) {\n cursorTargetMatchesChart = true;\n }\n }\n }\n }\n\n // allows moving cursor inside tooltip without it fading away\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n cursorTargetMatchesChart = true;\n }\n\n if (cursorTargetMatchesChart === false || data === null || chart['_model'] === undefined) return EMPTY_TOOLTIP_DATA;\n\n // mousemove position undefined when not hovering over chart canvas\n if (mousePos.plotCanvas.x === undefined || mousePos.plotCanvas.y === undefined) return EMPTY_TOOLTIP_DATA;\n\n const pointInGrid = getPointInGrid(mousePos.plotCanvas.x, mousePos.plotCanvas.y, chart);\n if (pointInGrid !== null) {\n const chartModel = chart['_model'];\n const yAxisScale = chartModel.getComponent('yAxis').axis.scale;\n const isLogScale = yAxisScale.type === 'log';\n let yInterval = yAxisScale._interval;\n // For logarithmic scales, convert the log interval to actual data range\n if (isLogScale && yAxisScale.base) {\n const logBase = yAxisScale.base;\n const extent = yAxisScale._extent;\n // Calculate actual data range from log extent\n // extent is in log space (e.g., [0, 2] for 10^0 to 10^2)\n const actualMin = logBase ** extent[0];\n const actualMax = logBase ** extent[1];\n // Use a fraction of the actual range as the interval\n yInterval = (actualMax - actualMin) / 100;\n }\n const totalSeries = data.length;\n const yBuffer = getYBuffer({ yInterval, totalSeries, showAllSeries });\n return checkforNearbyTimeSeries(data, seriesMapping, pointInGrid, yBuffer, chart, format);\n }\n\n // no nearby series found\n return EMPTY_TOOLTIP_DATA;\n}\n\n/**\n * [DEPRECATED] Uses mouse position to determine whether user is hovering over a chart canvas\n * If yes, convert from pixel values to logical cartesian coordinates and return all nearby series\n */\nexport function legacyGetNearbySeriesData({\n mousePos,\n pinnedPos,\n chartData,\n chart,\n format,\n showAllSeries = false,\n}: {\n mousePos: CursorData['coords'];\n pinnedPos: CursorCoordinates | null;\n chartData: EChartsDataFormat;\n chart?: EChartsInstance;\n format?: FormatOptions;\n showAllSeries?: boolean;\n}): NearbySeriesArray {\n if (chart === undefined || mousePos === null) return [];\n\n // prevents multiple tooltips showing from adjacent charts unless tooltip is pinned\n let cursorTargetMatchesChart = false;\n if (mousePos.target !== null) {\n const currentParent = (<HTMLElement>mousePos.target).parentElement;\n if (currentParent !== null) {\n const currentGrandparent = currentParent.parentElement;\n if (currentGrandparent !== null) {\n const chartDom = chart.getDom();\n if (chartDom === currentGrandparent) {\n cursorTargetMatchesChart = true;\n }\n }\n }\n }\n\n // allows moving cursor inside tooltip without it fading away\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n cursorTargetMatchesChart = true;\n }\n\n if (cursorTargetMatchesChart === false) return [];\n\n if (chart['_model'] === undefined) return [];\n const chartModel = chart['_model'];\n const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;\n const totalSeries = chartData.timeSeries.length;\n const yBuffer = getYBuffer({ yInterval, totalSeries, showAllSeries });\n const pointInPixel = [mousePos.plotCanvas.x ?? 0, mousePos.plotCanvas.y ?? 0];\n if (chart.containPixel('grid', pointInPixel)) {\n const pointInGrid = chart.convertFromPixel('grid', pointInPixel);\n if (pointInGrid[0] !== undefined && pointInGrid[1] !== undefined) {\n return legacyCheckforNearbySeries(chartData, pointInGrid, yBuffer, chart, format);\n }\n }\n\n return [];\n}\n\n/*\n * Check if two numbers are within a specified percentage range\n */\nexport function isWithinPercentageRange({\n valueToCheck,\n baseValue,\n percentage,\n}: {\n valueToCheck: number;\n baseValue: number;\n percentage: number;\n}): boolean {\n const range = (percentage / 100) * baseValue;\n const lowerBound = baseValue - range;\n const upperBound = baseValue + range;\n return valueToCheck >= lowerBound && valueToCheck <= upperBound;\n}\n\n/*\n * Get range to check within for nearby series to show in tooltip.\n */\nexport function getYBuffer({\n yInterval,\n totalSeries,\n showAllSeries = false,\n}: {\n yInterval: number;\n totalSeries: number;\n showAllSeries?: boolean;\n}): number {\n if (showAllSeries) {\n return yInterval * 10; // roughly correlates with grid so entire canvas is searched\n }\n // never let nearby series range be less than roughly the size of a single tick\n const yBufferMin = yInterval * 0.3;\n\n // tooltip trigger area gets smaller with more series\n if (totalSeries > SHOW_FEWER_SERIES_LIMIT) {\n const adjustedBuffer = (yInterval * DYNAMIC_NEARBY_SERIES_MULTIPLIER) / totalSeries;\n return Math.max(yBufferMin, adjustedBuffer);\n }\n // increase multiplier to expand nearby series range\n return Math.max(yBufferMin, yInterval * INCREASE_NEARBY_SERIES_MULTIPLIER);\n}\n"],"names":["formatValue","OPTIMIZED_MODE_SERIES_LIMIT","batchDispatchNearbySeriesActions","getPointInGrid","getClosestTimestamp","EMPTY_TOOLTIP_DATA","INCREASE_NEARBY_SERIES_MULTIPLIER","DYNAMIC_NEARBY_SERIES_MULTIPLIER","SHOW_FEWER_SERIES_LIMIT","checkforNearbyTimeSeries","data","seriesMapping","pointInGrid","yBuffer","chart","format","currentNearbySeriesData","cursorX","cursorY","dispatchAction","undefined","Array","isArray","nearbySeriesIndexes","emphasizedSeriesIndexes","nonEmphasizedSeriesIndexes","emphasizedDatapoints","duplicateDatapoints","totalSeries","length","yValueCounts","Map","firstTimeSeriesValues","values","closestTimestamp","seriesIdx","currentSeries","currentDataset","currentDatasetValues","lineSeries","currentSeriesName","name","toString","markerColor","color","datumIdx","nearbyTimeSeries","xValue","yValue","minPercentRange","percentRangeToCheck","Math","max","isClosestToCursor","isWithinPercentageRange","valueToCheck","baseValue","percentage","push","duplicateValuesCount","get","set","seriesIndex","dataIndex","seriesName","type","formattedY","date","x","y","legacyCheckforNearbySeries","timeSeries","xAxis","xValueMilliSeconds","notBlur","escapeConnect","getNearbySeriesData","mousePos","pinnedPos","showAllSeries","cursorTargetMatchesChart","target","currentParent","parentElement","currentGrandparent","chartDom","getDom","plotCanvas","chartModel","yAxisScale","getComponent","axis","scale","isLogScale","yInterval","_interval","base","logBase","extent","_extent","actualMin","actualMax","getYBuffer","legacyGetNearbySeriesData","chartData","pointInPixel","containPixel","convertFromPixel","range","lowerBound","upperBound","yBufferMin","adjustedBuffer"],"mappings":"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"}
@@ -278,7 +278,20 @@ function getNearbySeriesData({ mousePos, pinnedPos, data, seriesMapping, chart,
278
278
  const pointInGrid = (0, _utils.getPointInGrid)(mousePos.plotCanvas.x, mousePos.plotCanvas.y, chart);
279
279
  if (pointInGrid !== null) {
280
280
  const chartModel = chart['_model'];
281
- const yInterval = chartModel.getComponent('yAxis').axis.scale._interval;
281
+ const yAxisScale = chartModel.getComponent('yAxis').axis.scale;
282
+ const isLogScale = yAxisScale.type === 'log';
283
+ let yInterval = yAxisScale._interval;
284
+ // For logarithmic scales, convert the log interval to actual data range
285
+ if (isLogScale && yAxisScale.base) {
286
+ const logBase = yAxisScale.base;
287
+ const extent = yAxisScale._extent;
288
+ // Calculate actual data range from log extent
289
+ // extent is in log space (e.g., [0, 2] for 10^0 to 10^2)
290
+ const actualMin = logBase ** extent[0];
291
+ const actualMax = logBase ** extent[1];
292
+ // Use a fraction of the actual range as the interval
293
+ yInterval = (actualMax - actualMin) / 100;
294
+ }
282
295
  const totalSeries = data.length;
283
296
  const yBuffer = getYBuffer({
284
297
  yInterval,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@perses-dev/components",
3
- "version": "0.53.0-beta.4",
3
+ "version": "0.53.0-rc.0",
4
4
  "description": "Common UI components used across Perses features",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/perses/perses/blob/main/README.md",
@@ -61,4 +61,4 @@
61
61
  "files": [
62
62
  "dist"
63
63
  ]
64
- }
64
+ }