UNPKG

@grafana/ui

Version:
1 lines 12.8 kB
{"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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"}