import { css } from '@emotion/css'; import { groupBy } from 'lodash'; import React, { useMemo } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { IconButton, Input, Tooltip } from '@grafana/ui'; import { useStyles2 } from '@grafana/ui/'; import { t } from 'app/core/internationalization'; import { NodesMap, SelectedScope } from './types'; export interface ScopesInputProps { nodes: NodesMap; scopes: SelectedScope[]; isDisabled: boolean; isLoading: boolean; onInputClick: () => void; onRemoveAllClick: () => void; } export function ScopesInput({ nodes, scopes, isDisabled, isLoading, onInputClick, onRemoveAllClick, }: ScopesInputProps) { const styles = useStyles2(getStyles); const scopesPaths = useMemo(() => { const pathsTitles = scopes.map(({ scope, path }) => { let currentLevel = nodes; let titles: string[]; if (path.length > 0) { titles = path .map((nodeName) => { const cl = currentLevel[nodeName]; if (!cl) { return null; } const { title, nodes } = cl; currentLevel = nodes; return title; }) .filter((title) => title !== null) as string[]; if (titles[0] === '') { titles.splice(0, 1); } } else { titles = [scope.spec.title]; } const scopeName = titles.pop(); return [titles.join(' > '), scopeName]; }); const groupedByPath = groupBy(pathsTitles, ([path]) => path); return Object.entries(groupedByPath) .map(([path, pathScopes]) => { const scopesTitles = pathScopes.map(([, scopeTitle]) => scopeTitle).join(', '); return (path ? [path, scopesTitles] : [scopesTitles]).join(' > '); }) .map((path) => (
{path}
)); }, [nodes, scopes, styles]); const scopesTitles = useMemo(() => scopes.map(({ scope }) => scope.spec.title).join(', '), [scopes]); const input = ( 0 && !isDisabled ? (