import React, { PureComponent } from 'react'; import { getTagColorsFromName, Icon, Tooltip } from '@grafana/ui'; import { selectors } from '@grafana/e2e-selectors'; import { VariableOption, VariableTag } from '../../types'; export interface Props { multi: boolean; values: VariableOption[]; selectedValues: VariableOption[]; tags: VariableTag[]; highlightIndex: number; onToggle: (option: VariableOption, clearOthers: boolean) => void; onToggleAll: () => void; onToggleTag: (tag: VariableTag) => void; } export class VariableOptions extends PureComponent { onToggle = (option: VariableOption) => (event: React.MouseEvent) => { const clearOthers = event.shiftKey || event.ctrlKey || event.metaKey; this.handleEvent(event); this.props.onToggle(option, clearOthers); }; onToggleAll = (event: React.MouseEvent) => { this.handleEvent(event); this.props.onToggleAll(); }; onToggleTag = (tag: VariableTag) => (event: React.MouseEvent) => { this.handleEvent(event); this.props.onToggleTag(tag); }; handleEvent(event: React.MouseEvent) { event.preventDefault(); event.stopPropagation(); } render() { const { multi, values, tags } = this.props; return (
{this.renderMultiToggle()} {values.map((option, index) => this.renderOption(option, index))}
{this.renderTags(tags)}
); } renderTags(tags: VariableTag[]) { if (tags.length === 0) { return null; } return (
Tags
{tags.map((tag) => this.renderTag(tag))}
); } renderTag(tag: VariableTag) { const { color, borderColor } = getTagColorsFromName(tag.text.toString()); return ( {tag.text}     ); } renderOption(option: VariableOption, index: number) { const { highlightIndex } = this.props; const selectClass = option.selected ? 'variable-option pointer selected' : 'variable-option pointer'; const highlightClass = index === highlightIndex ? `${selectClass} highlighted` : selectClass; return ( {option.text} ); } renderMultiToggle() { const { multi, selectedValues } = this.props; if (!multi) { return null; } return ( 1 ? 'variable-options-column-header many-selected' : 'variable-options-column-header' }`} onClick={this.onToggleAll} data-placement="top" > Selected ({selectedValues.length}) ); } }