UNPKG

@grafana/ui

Version:
1 lines 14.6 kB
{"version":3,"file":"FieldsByFrameRefIdMatcher.mjs","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":["_a","v"],"mappings":"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"}