{"version":3,"file":"FieldsByFrameRefIdMatcher.cjs","sources":["../../../../src/components/MatchersUI/FieldsByFrameRefIdMatcher.tsx"],"sourcesContent":["import { useMemo, useState, useCallback } from 'react';\n\nimport {\n  DataFrame,\n  getFrameDisplayName,\n  FieldMatcherID,\n  fieldMatchers,\n  SelectableValue,\n  toOption,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { MultiSelect, Select } from '../Select/Select';\n\nimport { FieldMatcherUIRegistryItem, MatcherUIProps } from './types';\n\nconst recoverRefIdMissing = (\n  newRefIds: SelectableValue[],\n  oldRefIds: SelectableValue[],\n  previousValue: string | undefined\n): SelectableValue | undefined => {\n  if (!previousValue) {\n    return;\n  }\n  // Previously selected value is missing from the new list.\n  // Find the value that is in the new list but isn't in the old list\n  let changedTo = newRefIds.find((refId) => {\n    return !oldRefIds.some((refId2) => {\n      return refId === refId2;\n    });\n  });\n  if (changedTo) {\n    // Found the new value, we assume the old value changed to this one, so we'll use it\n    return changedTo;\n  }\n  return;\n};\n\nexport interface Props {\n  value?: string; // refID\n  data: DataFrame[];\n  onChange: (value: string) => void;\n  placeholder?: string;\n  id?: string;\n}\n\n// Not exported globally... but used in grafana core\nexport function RefIDPicker({ value, data, onChange, placeholder, id }: Props) {\n  const listOfRefIds = useMemo(() => getListOfQueryRefIds(data), [data]);\n\n  const [priorSelectionState, updatePriorSelectionState] = useState<{\n    refIds: SelectableValue[];\n    value: string | undefined;\n  }>({\n    refIds: [],\n    value: undefined,\n  });\n\n  const currentValue = useMemo(() => {\n    return (\n      listOfRefIds.find((refId) => refId.value === value) ??\n      recoverRefIdMissing(listOfRefIds, priorSelectionState.refIds, priorSelectionState.value)\n    );\n  }, [value, listOfRefIds, priorSelectionState]);\n\n  const onFilterChange = useCallback(\n    (v: SelectableValue<string>) => {\n      onChange(v?.value!);\n    },\n    [onChange]\n  );\n\n  if (listOfRefIds !== priorSelectionState.refIds || currentValue?.value !== priorSelectionState.value) {\n    updatePriorSelectionState({\n      refIds: listOfRefIds,\n      value: currentValue?.value,\n    });\n  }\n  return (\n    <Select\n      inputId={id}\n      options={listOfRefIds}\n      onChange={onFilterChange}\n      isClearable={true}\n      placeholder={placeholder ?? 'Select query refId'}\n      value={currentValue}\n    />\n  );\n}\n\nconst recoverMultiRefIdMissing = (\n  newRefIds: Array<SelectableValue<string>>,\n  oldRefIds: Array<SelectableValue<string>>,\n  previousValue: Array<SelectableValue<string>> | undefined\n): Array<SelectableValue<string>> | undefined => {\n  if (!previousValue || !previousValue.length) {\n    return;\n  }\n  // Previously selected value is missing from the new list.\n  // Find the value that is in the new list but isn't in the old list\n  const changedTo = newRefIds.filter((newRefId) => {\n    return oldRefIds.some((oldRefId) => {\n      return newRefId === oldRefId;\n    });\n  });\n\n  if (changedTo.length) {\n    // Found the new value, we assume the old value changed to this one, so we'll use it\n    return changedTo;\n  }\n  return;\n};\n\nexport interface MultiProps {\n  value?: string; // 1 or more refID in reqExp format /A|B|C/\n  data: DataFrame[];\n  onChange: (value: string[]) => void;\n  placeholder?: string;\n  id?: string;\n}\n\nexport function RefIDMultiPicker({ value, data, onChange, placeholder, id }: MultiProps) {\n  const listOfRefIds = useMemo(() => getListOfQueryRefIds(data), [data]);\n\n  const [priorSelectionState, updatePriorSelectionState] = useState<{\n    refIds: SelectableValue[];\n    value: Array<SelectableValue<string>> | undefined;\n  }>({\n    refIds: [],\n    value: undefined,\n  });\n\n  const currentValue = useMemo(() => {\n    let extractedRefIds = new Set<string>();\n    if (value) {\n      if (value.startsWith('/^')) {\n        try {\n          extractedRefIds = new Set(regexpToStrings(value));\n        } catch {\n          extractedRefIds.add(value);\n        }\n      } else if (value.includes('|')) {\n        // old format that was simply unescaped pipe-joined strings -> regexp\n        extractedRefIds = new Set(value.split('|'));\n      } else {\n        extractedRefIds.add(value);\n      }\n    }\n\n    const matchedRefIds = listOfRefIds.filter((refId) => extractedRefIds.has(refId.value || ''));\n\n    if (matchedRefIds.length) {\n      return matchedRefIds;\n    }\n\n    const newRefIds = [...extractedRefIds].map(toOption);\n    const recoveredRefIDs =\n      recoverMultiRefIdMissing(newRefIds, priorSelectionState.refIds, priorSelectionState.value) ?? [];\n\n    return recoveredRefIDs.length > 0 ? recoveredRefIDs : newRefIds.length > 0 ? newRefIds : undefined;\n  }, [value, listOfRefIds, priorSelectionState]);\n\n  const onFilterChange = useCallback(\n    (v: Array<SelectableValue<string>>) => {\n      onChange(v.map((v) => v.value!));\n    },\n    [onChange]\n  );\n\n  if (listOfRefIds !== priorSelectionState.refIds || currentValue?.length !== priorSelectionState.value?.length) {\n    updatePriorSelectionState({\n      refIds: listOfRefIds,\n      value: currentValue,\n    });\n  }\n  return (\n    <MultiSelect\n      inputId={id}\n      options={listOfRefIds}\n      onChange={onFilterChange}\n      isClearable={true}\n      placeholder={placeholder ?? 'Select query refId'}\n      value={currentValue}\n    />\n  );\n}\n\nfunction getListOfQueryRefIds(data: DataFrame[]): Array<SelectableValue<string>> {\n  const queries = new Map<string, DataFrame[]>();\n\n  for (const frame of data) {\n    const refId = frame.refId ?? '';\n    const frames = queries.get(refId) ?? [];\n\n    if (frames.length === 0) {\n      queries.set(refId, frames);\n    }\n\n    frames.push(frame);\n  }\n\n  const values: Array<SelectableValue<string>> = [];\n\n  for (const [refId, frames] of queries.entries()) {\n    values.push({\n      value: refId,\n      label: refId\n        ? t('grafana-ui.matchers-ui.get-list-of-query-ref-ids.label', 'Query: {{refId}}', { refId })\n        : t('grafana-ui.matchers-ui.get-list-of-query-ref-ids.label-missing-ref-id', 'Query: (missing refId)'),\n      description: getFramesDescription(frames),\n    });\n  }\n\n  return values;\n}\n\nfunction getFramesDescription(frames: DataFrame[]): string {\n  return t(\n    'grafana-ui.matchers-ui.get-list-of-query-ref-ids.description',\n    'Frames ({{framesCount}}): {{framesNames}}',\n    {\n      framesCount: frames.length,\n      framesNames: `${frames\n        .slice(0, Math.min(3, frames.length))\n        .map((x) => getFrameDisplayName(x))\n        .join(', ')} ${frames.length > 3 ? '...' : ''}`,\n    }\n  );\n}\n\n/**\n * Registry item for UI to configure \"fields by frame refId\"-matcher.\n */\nexport const getFieldsByFrameRefIdItem: () => FieldMatcherUIRegistryItem<string> = () => ({\n  id: FieldMatcherID.byFrameRefID,\n  component: (props: MatcherUIProps<string>) => {\n    return <RefIDPicker value={props.options} data={props.data} onChange={props.onChange} />;\n  },\n  matcher: fieldMatchers.get(FieldMatcherID.byFrameRefID),\n  name: t('grafana-ui.matchers-ui.name-fields-by-query', 'Fields returned by query'),\n  description: t(\n    'grafana-ui.matchers-ui.description-fields-by-query',\n    'Set properties for fields from a specific query'\n  ),\n  optionsToLabel: (options) => options,\n});\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions#escaping\nfunction escapeRegExp(string: string) {\n  return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\n// funcs below will parse/unparse a regexp like /^(?:foo|bar)$/ -> [\"foo\", \"bar\"]\n\n/** @internal */\nexport const regexpToStrings = (regexp: string) => {\n  return (\n    regexp\n      // strip /^(?:)$/ wrapper\n      .slice(5, -3)\n      // split on unescaped |\n      .split(/(?<!\\\\)\\|/g)\n      // unescape remaining escaped chars\n      .map((string) => string.replace(/\\\\(.)/g, '$1'))\n  );\n};\n\n/** @internal */\nexport const stringsToRegexp = (strings: string[]) => {\n  return `/^(?:${strings.map((string) => escapeRegExp(string)).join('|')})$/`;\n};\n"],"names":["useMemo","useState","useCallback","jsx","Select","data","_a","toOption","v","MultiSelect","t","getFrameDisplayName","FieldMatcherID","fieldMatchers"],"mappings":"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"}