{"version":3,"file":"dataLinks.cjs","sources":["../../../src/utils/dataLinks.ts"],"sourcesContent":["import { ScopedVars } from '../types/ScopedVars';\nimport { Field } from '../types/dataFrame';\nimport { DataLink, InternalDataLink, LinkModel } from '../types/dataLink';\nimport { SplitOpen, ExplorePanelsState } from '../types/explore';\nimport { InterpolateFunction } from '../types/panel';\nimport { DataQuery } from '../types/query';\nimport { TimeRange } from '../types/time';\n\nimport { locationUtil } from './location';\nimport { serializeStateToUrlParam, toURLRange } from './url';\n\nexport const DataLinkBuiltInVars = {\n  keepTime: '__url_time_range',\n  timeRangeFrom: '__from',\n  timeRangeTo: '__to',\n  includeVars: '__all_variables',\n  seriesName: '__series.name',\n  fieldName: '__field.name',\n  valueTime: '__value.time',\n  valueNumeric: '__value.numeric',\n  valueText: '__value.text',\n  valueRaw: '__value.raw',\n  // name of the calculation represented by the value\n  valueCalc: '__value.calc',\n};\n\n// We inject these because we cannot import them directly as they reside inside grafana main package.\nexport type LinkToExploreOptions = {\n  link: DataLink;\n  scopedVars: ScopedVars;\n  range?: TimeRange;\n  field: Field;\n  internalLink: InternalDataLink;\n  onClickFn?: SplitOpen;\n  replaceVariables: InterpolateFunction;\n};\n\nexport function mapInternalLinkToExplore(options: LinkToExploreOptions): LinkModel<Field> {\n  const { onClickFn, replaceVariables, link, scopedVars, range, field, internalLink } = options;\n\n  const query =\n    typeof link.internal?.query === 'function'\n      ? link.internal.query({ replaceVariables, scopedVars })\n      : internalLink.query;\n\n  // datasource ref is optional in a query object, but Explore relies on it being defined for some\n  // functionalities, e.g., changing query filters directly from visualizations, so we need to put\n  // it here if it's missing. See also #112945\n  if (query && typeof query === 'object' && !query.datasource?.uid && internalLink.datasourceUid) {\n    query.datasource = query.datasource || {};\n    query.datasource.uid = internalLink.datasourceUid;\n  }\n\n  const interpolatedQuery = interpolateObject(query, scopedVars, replaceVariables);\n  const interpolatedPanelsState = interpolateObject(link.internal?.panelsState, scopedVars, replaceVariables);\n  const interpolatedCorrelationData = interpolateObject(link.meta?.correlationData, scopedVars, replaceVariables);\n  const title = link.title ? link.title : internalLink.datasourceName;\n\n  const interpolatedParams = interpolatedQuery\n    ? {\n        query: interpolatedQuery,\n        ...(range && { timeRange: range }),\n      }\n    : undefined;\n\n  return {\n    title: replaceVariables(title, scopedVars),\n    // In this case this is meant to be internal link (opens split view by default) the href will also points\n    // to explore but this way you can open it in new tab.\n    href: generateInternalHref(internalLink.datasourceUid, interpolatedQuery, range, interpolatedPanelsState),\n    onClick: onClickFn\n      ? (event) => {\n          // Explore data links can be displayed not only in DataLinkButton but it can be used by the consumer in\n          // other way, for example MenuItem. We want to provide the URL (for opening in the new tab as well as\n          // the onClick to open the split view).\n          if (event.preventDefault) {\n            event.preventDefault();\n          }\n\n          onClickFn({\n            datasourceUid: internalLink.datasourceUid,\n            queries: [interpolatedQuery],\n            panelsState: interpolatedPanelsState,\n            correlationHelperData: interpolatedCorrelationData,\n            range,\n          });\n        }\n      : undefined,\n    target: link?.targetBlank ? '_blank' : '_self',\n    origin: field,\n    ...(interpolatedParams && { interpolatedParams }),\n  };\n}\n\n/**\n * Generates href for internal derived field link.\n */\nfunction generateInternalHref<T extends DataQuery>(\n  datasourceUid: string,\n  query: T,\n  range?: TimeRange,\n  panelsState?: ExplorePanelsState\n): string {\n  return locationUtil.assureBaseUrl(\n    `/explore?left=${encodeURIComponent(\n      serializeStateToUrlParam({\n        // @deprecated mapInternalLinkToExplore required passing range. Some consumers to generate the URL\n        // with defaults pass range as `{} as any`. This is why we need to check for `range?.raw` not just\n        // `range ? ...` here. This behavior will be marked as deprecated in #72498\n        ...(range?.raw ? { range: toURLRange(range.raw) } : {}),\n        datasource: datasourceUid,\n        queries: [query],\n        panelsState: panelsState,\n      })\n    )}`\n  );\n}\n\nfunction interpolateObject<T>(\n  obj: T | undefined,\n  scopedVars: ScopedVars,\n  replaceVariables: InterpolateFunction\n): T | undefined {\n  if (!obj) {\n    return obj;\n  }\n  if (typeof obj === 'string') {\n    // @ts-ignore this is complaining we are returning string, but we are checking if obj is a string so should be fine.\n    return replaceVariables(obj, scopedVars);\n  }\n  const copy = JSON.parse(JSON.stringify(obj));\n  return interpolateObjectRecursive(copy, scopedVars, replaceVariables);\n}\n\nfunction interpolateObjectRecursive<T extends Object>(\n  obj: T,\n  scopedVars: ScopedVars,\n  replaceVariables: InterpolateFunction\n): T {\n  for (const k of Object.keys(obj)) {\n    // Honestly not sure how to type this to make TS happy.\n    // @ts-ignore\n    if (typeof obj[k] === 'string') {\n      // @ts-ignore\n      obj[k] = replaceVariables(obj[k], scopedVars);\n      // @ts-ignore\n    } else if (typeof obj[k] === 'object' && obj[k] !== null) {\n      // @ts-ignore\n      obj[k] = interpolateObjectRecursive(obj[k], scopedVars, replaceVariables);\n    }\n  }\n  return obj;\n}\n"],"names":["locationUtil","serializeStateToUrlParam","toURLRange"],"mappings":"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"}