{"version":3,"file":"utils.mjs","sources":["../../../../src/components/MatchersUI/utils.ts"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { type DataFrame, type Field, getFieldDisplayName, FieldNamePickerBaseNameMode, FieldType } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { type MatcherScope } from '@grafana/schema';\n\nimport { getFieldTypeIcon } from '../../types/icon';\nimport { type ComboboxOption } from '../Combobox/types';\n\n/**\n * @internal\n */\nexport interface FrameFieldsDisplayNames {\n  // The display names\n  display: Set<string>;\n\n  // raw field names (that are explicitly not visible)\n  raw: Set<string>;\n\n  // Field mappings (duplicates are not supported)\n  fields: Map<string, Field>;\n\n  // if set, the scope to use for the field.\n  scopes: Map<string, MatcherScope>;\n}\n\n/**\n * @internal\n */\nexport function frameHasName(name: string | undefined, names: FrameFieldsDisplayNames) {\n  if (!name) {\n    return false;\n  }\n  return names.display.has(name) || names.raw.has(name);\n}\n\n/**\n * Returns the distinct names in a set of frames\n */\nexport function getFrameFieldsDisplayNames(\n  data: DataFrame[],\n  filter?: (field: Field) => boolean,\n  existingNames?: FrameFieldsDisplayNames,\n  parentData: DataFrame[] = data,\n  scope: MatcherScope = 'series'\n): FrameFieldsDisplayNames {\n  const names =\n    existingNames ??\n    ({\n      display: new Set(),\n      raw: new Set(),\n      fields: new Map(),\n      scopes: new Map(),\n    } satisfies FrameFieldsDisplayNames);\n\n  for (const frame of data) {\n    for (const field of frame.fields) {\n      if (filter && !filter(field)) {\n        continue;\n      }\n      if (field.type === FieldType.nestedFrames) {\n        field.values.forEach((nestedData) =>\n          getFrameFieldsDisplayNames(nestedData, filter, names, parentData, 'nested')\n        );\n        continue;\n      }\n      const disp = getFieldDisplayName(field, frame, parentData);\n      names.display.add(disp);\n      names.fields.set(disp, field);\n      names.scopes.set(disp, scope);\n\n      if (field.name && disp !== field.name) {\n        names.raw.add(field.name);\n        names.fields.set(field.name, field);\n        names.scopes.set(field.name, scope);\n      }\n    }\n  }\n  return names;\n}\n\n/**\n * @internal\n */\nexport function getGroupLabelForScope(scope?: MatcherScope): string | undefined {\n  switch (scope) {\n    case 'nested':\n      return t('grafana-ui.matchers.groups.nested', 'Nested');\n    case 'annotation':\n      return t('grafana-ui.matchers.groups.annotation', 'Annotations');\n    case 'exemplar':\n      return t('grafana-ui.matchers.groups.exemplar', 'Exemplars');\n    case 'series':\n    default:\n      return t('grafana-ui.matchers.groups.series', 'Dataframe');\n  }\n}\n\n/**\n * @internal\n */\nexport function getGroupDescriptionForScope(scope: MatcherScope): string | undefined {\n  switch (scope) {\n    case 'nested':\n      return t('grafana-ui.matchers.groups.nested.description', 'Fields from nested dataframes.');\n    case 'annotation':\n      return t('grafana-ui.matchers.groups.annotation.description', 'Annotations series for this panel.');\n    case 'series':\n      return t('grafana-ui.matchers.groups.series.description', 'Fields from the dataframes in this panel.');\n    case 'exemplar':\n      return t('grafana-ui.matchers.groups.exemplar.description', 'Trace exemplars for this panel.');\n    default:\n      return undefined;\n  }\n}\n\n/**\n * @internal\n */\nexport function useFieldDisplayNames(\n  data: DataFrame[],\n  filter?: (field: Field) => boolean,\n  scope?: MatcherScope\n): FrameFieldsDisplayNames {\n  return useMemo(() => getFrameFieldsDisplayNames(data, filter, undefined, undefined, scope), [data, filter, scope]);\n}\n\ninterface UseMatcherSelectOptionsProps {\n  /**\n   * An additional first option to add to the beginning of the list. This is useful for an \"All\" option, for example.\n   */\n  firstItem?: ComboboxOption;\n  /**\n   * if set, filter the options by field type.\n   */\n  fieldType?: string;\n  /**\n   * this controls whether and how entries are added to the combobox fo the base field name of a field with a display name.\n   */\n  baseNameMode?: FieldNamePickerBaseNameMode;\n  /**\n   * if set, filter the options by matcher scope.\n   */\n  scope?: MatcherScope;\n}\n\n/**\n * @internal\n * given the FrameFieldsDisplayNames object other configuration options, this builds the options for the combobox, grouped by matcher scope.\n * this is intended to be used by consumers of the MatchersUI, like FieldNamePicker and FieldTypeMatcherEditor. There are optional configuration\n * options to augment and control the contents of the list.\n */\nexport function useMatcherSelectOptions(\n  displayNames: FrameFieldsDisplayNames,\n  currentName?: string,\n  { firstItem, fieldType, baseNameMode, scope }: UseMatcherSelectOptionsProps = {}\n): ComboboxOption[] {\n  return useMemo(() => {\n    let found = false;\n\n    const uniqueScopes = new Set(displayNames.scopes.values());\n    const shouldShowScopes = !scope && uniqueScopes.size > 1;\n    const isFound = (name: string) => name === currentName && (scope ? displayNames.scopes.get(name) === scope : true);\n    const getGroup = (name: string) =>\n      shouldShowScopes ? getGroupLabelForScope(displayNames.scopes.get(name)) : undefined;\n    const optionFactory =\n      (getLabel: (name: string) => string, getExtraOptions?: (name: string) => Partial<ComboboxOption> | undefined) =>\n      (name: string) => ({\n        value: name,\n        label: getLabel(name),\n        group: getGroup(name),\n        ...getExtraOptions?.(name),\n      });\n\n    const displayNameBuilder = optionFactory(\n      (name) => name,\n      (name) => {\n        const field = displayNames.fields.get(name);\n        if (!field) {\n          return;\n        }\n        return { icon: getFieldTypeIcon(field) };\n      }\n    );\n    const baseFieldNameBuilder = optionFactory((name) =>\n      t('grafana-ui.matchers.labels.base-field-name', '{{name}} (base field name)', { name })\n    );\n\n    let options: ComboboxOption[] = [];\n    if (firstItem) {\n      options.push(firstItem);\n    }\n\n    // the list order and contents of the list depends on the baseNameMode\n    const sets: Array<{ set: Set<string>; builder: (name: string) => ComboboxOption }> = [];\n    if (baseNameMode === FieldNamePickerBaseNameMode.OnlyBaseNames) {\n      sets.push({ set: displayNames.raw, builder: baseFieldNameBuilder });\n    } else {\n      sets.push({ set: displayNames.display, builder: displayNameBuilder });\n    }\n    if (baseNameMode !== FieldNamePickerBaseNameMode.ExcludeBaseNames) {\n      sets.push({ set: displayNames.raw, builder: baseFieldNameBuilder });\n    }\n\n    for (const { set, builder } of sets) {\n      const shouldCheckFieldType = fieldType && set === displayNames.display;\n      for (const name of set) {\n        if (!found && isFound(name)) {\n          found = true;\n        }\n        if (scope && displayNames.scopes.get(name) !== scope) {\n          continue;\n        }\n        if (shouldCheckFieldType && fieldType !== displayNames.fields.get(name)?.type) {\n          continue;\n        }\n        options.push(builder(name));\n      }\n    }\n\n    if (currentName && !found) {\n      const notFoundOption = optionFactory((name) =>\n        t('grafana-ui.matchers.labels.not-found', '{{name}} (not found)', { name })\n      );\n      options.push(notFoundOption(currentName));\n    }\n\n    return options;\n  }, [baseNameMode, currentName, displayNames, fieldType, firstItem, scope]);\n}\n\nexport function getUniqueMatcherScopes(data: DataFrame[]): Set<MatcherScope> {\n  return new Set([...getFrameFieldsDisplayNames(data).scopes.values()]);\n}\n"],"names":[],"mappings":"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"}