import React, { ReactNode } from 'react'; import Highlighter from 'react-highlight-words'; import { selectors } from '@grafana/e2e-selectors'; import { Field, Label } from '@grafana/ui'; import { OptionsPaneCategoryDescriptor } from './OptionsPaneCategoryDescriptor'; import { OptionsPaneItemOverrides } from './OptionsPaneItemOverrides'; import { OptionPaneItemOverrideInfo } from './types'; export interface OptionsPaneItemProps { title: string; value?: any; description?: string; popularRank?: number; render: () => React.ReactNode; skipField?: boolean; showIf?: () => boolean; overrides?: OptionPaneItemOverrideInfo[]; } /** * This is not a real React component but an intermediary to enable deep option search without traversing a React node tree. */ export class OptionsPaneItemDescriptor { parent!: OptionsPaneCategoryDescriptor; constructor(public props: OptionsPaneItemProps) {} getLabel(searchQuery?: string): ReactNode { const { title, description, overrides } = this.props; if (!searchQuery) { // Do not render label for categories with only one child if (this.parent.props.title === title && !overrides?.length) { return null; } return ( ); } const categories: React.ReactNode[] = []; if (this.parent.parent) { categories.push(this.highlightWord(this.parent.parent.props.title, searchQuery)); } if (this.parent.props.title !== title) { categories.push(this.highlightWord(this.parent.props.title, searchQuery)); } return ( ); } highlightWord(word: string, query: string) { return ( ); } renderOverrides() { const { overrides } = this.props; if (!overrides || overrides.length === 0) { return; } } render(searchQuery?: string) { const { title, description, render, showIf, skipField } = this.props; const key = `${this.parent.props.id} ${title}`; if (showIf && !showIf()) { return null; } if (skipField) { return render(); } return ( {render() as React.ReactElement} ); } }