import { css } from '@emotion/css'; import React, { ReactElement, useEffect, useState } from 'react'; import { useAsync } from 'react-use'; import { GrafanaTheme } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { CollapsableSection, HorizontalGroup, Icon, Spinner, Tooltip, useStyles, VerticalGroup } from '@grafana/ui'; import { DashboardModel } from '../../dashboard/state'; import { VariableModel } from '../types'; import { VariablesUnknownButton } from './VariablesUnknownButton'; import { getUnknownsNetwork, UsagesToNetwork } from './utils'; export const SLOW_VARIABLES_EXPANSION_THRESHOLD = 1000; export interface VariablesUnknownTableProps { variables: VariableModel[]; dashboard: DashboardModel | null; } export function VariablesUnknownTable({ variables, dashboard }: VariablesUnknownTableProps): ReactElement { const [open, setOpen] = useState(false); const [changed, setChanged] = useState(0); const [usages, setUsages] = useState([]); const style = useStyles(getStyles); useEffect(() => setChanged((prevState) => prevState + 1), [variables, dashboard]); const { loading } = useAsync(async () => { if (open && changed > 0) { // make sure we only fetch when opened and variables or dashboard have changed const start = Date.now(); const unknownsNetwork = await getUnknownsNetwork(variables, dashboard); const stop = Date.now(); const elapsed = stop - start; if (elapsed >= SLOW_VARIABLES_EXPANSION_THRESHOLD) { reportInteraction('Slow unknown variables expansion', { elapsed }); } setChanged(0); setUsages(unknownsNetwork); return unknownsNetwork; } return []; }, [variables, dashboard, open, changed]); const onToggle = (isOpen: boolean) => { if (isOpen) { reportInteraction('Unknown variables section expanded'); } setOpen(isOpen); }; return (
} isOpen={open} onToggle={onToggle}> {loading && ( Loading... )} {!loading && usages && ( <> {usages.length === 0 && } {usages.length > 0 && } )}
); } function CollapseLabel(): ReactElement { const style = useStyles(getStyles); return (
Renamed or missing variables
); } function NoUnknowns(): ReactElement { return No renamed or missing variables found.; } function UnknownTable({ usages }: { usages: UsagesToNetwork[] }): ReactElement { const style = useStyles(getStyles); return ( {usages.map((usage) => { const { variable } = usage; const { id, name } = variable; return ( ); })}
Variable
{name}
); } const getStyles = (theme: GrafanaTheme) => ({ container: css` margin-top: ${theme.spacing.xl}; padding-top: ${theme.spacing.xl}; `, infoIcon: css` margin-left: ${theme.spacing.sm}; `, defaultColumn: css` width: 1%; `, firstColumn: css` width: 1%; vertical-align: top; color: ${theme.colors.textStrong}; `, lastColumn: css` overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 100%; text-align: right; `, });