import { css } from '@emotion/css'; import { ReactElement, useEffect, useState } from 'react'; import { useAsyncFn } from 'react-use'; import { GrafanaTheme2 } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { SceneVariable, SceneVariableState } from '@grafana/scenes'; import { Dashboard } from '@grafana/schema/dist/esm/index.gen'; import { CollapsableSection, Icon, Spinner, Stack, Tooltip, useStyles2 } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; import { VariableUsagesButton } from '../../variables/VariableUsagesButton'; import { getUnknownsNetwork, UsagesToNetwork } from '../../variables/utils'; export const SLOW_VARIABLES_EXPANSION_THRESHOLD = 1000; export interface VariablesUnknownTableProps { variables: Array>; dashboard: Dashboard | null; } export function VariablesUnknownTable({ variables, dashboard }: VariablesUnknownTableProps): ReactElement { const [open, setOpen] = useState(false); const [changed, setChanged] = useState(0); const style = useStyles2(getStyles); useEffect(() => setChanged((prevState) => prevState + 1), [variables, dashboard]); const [{ loading, value: usages }, getUnknowns] = useAsyncFn(async () => { 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); return unknownsNetwork; }, [variables, dashboard]); const onToggle = (isOpen: boolean) => { if (isOpen) { reportInteraction('Unknown variables section expanded'); // make sure we only fetch when opened and variables or dashboard have changed if (changed > 0) { getUnknowns(); } } setOpen(isOpen); }; return (
} isOpen={open} onToggle={onToggle}> {loading || !usages ? ( Loading... ) : usages.length > 0 ? ( ) : ( )}
); } function CollapseLabel(): ReactElement { const style = useStyles2(getStyles); return (
Renamed or missing variables
); } function NoUnknowns(): ReactElement { return ( No renamed or missing variables found. ); } function UnknownTable({ usages }: { usages: UsagesToNetwork[] }): ReactElement { const style = useStyles2(getStyles); return ( {usages.map((usage) => { const name = typeof usage.variable === 'string' ? usage.variable : usage.variable.state.name; return ( ); })}
Variable
{name}
); } const getStyles = (theme: GrafanaTheme2) => ({ container: css({ marginTop: theme.spacing(4), paddingTop: theme.spacing(4), }), infoIcon: css({ marginLeft: theme.spacing(1), }), defaultColumn: css({ width: '1%', }), firstColumn: css({ width: '1%', verticalAlign: 'top', color: theme.colors.text.maxContrast, }), lastColumn: css({ overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', width: '100%', textAlign: 'right', }), });