import { css } from '@emotion/css';
import { GrafanaTheme2 } from '@grafana/data';
import { Trans } from '@grafana/i18n';
import { Button, FilterPill, Stack, Text, useStyles2 } from '@grafana/ui';
import { getModKey } from '../../core/utils/browser';
import { NodesMap, ScopesMap, SelectedScope } from '../scopes/selector/types';
type Props = {
selectedScopes: SelectedScope[];
isDirty: boolean;
apply: () => void;
deselectScope: (id: string) => void;
scopes: ScopesMap;
nodes: NodesMap;
};
/**
* Shows scopes that are already selected and applied or the ones user just selected in the palette, with an apply
* button if the selection is dirty.
*/
export function ScopesRow({ selectedScopes, isDirty, apply, deselectScope, scopes, nodes }: Props) {
const styles = useStyles2(getStyles);
return (
<>
Scopes:
{selectedScopes?.map((scope) => {
// We need to load scope data when an item is selected, so there may be a delay until we have it. We fallback
// to node.title if we have it and if not, show just a scopeId. node.title and scope.title should probably be
// the same, but it's not guaranteed
const label =
scopes[scope.scopeId]?.spec.title ||
(scope.scopeNodeId && nodes[scope.scopeNodeId]?.spec.title) ||
scope.scopeId;
return (
{
deselectScope(scope.scopeNodeId || scope.scopeId);
}}
/>
);
})}
{isDirty && (
)}
>
);
}
const getStyles = (theme: GrafanaTheme2) => {
return {
scopesText: css({
label: 'scopesText',
fontSize: theme.typography.bodySmall.fontSize,
fontWeight: theme.typography.fontWeightMedium,
lineHeight: theme.typography.bodySmall.lineHeight,
color: theme.colors.text.secondary,
}),
selectedScope: css({
background: theme.colors.background.secondary,
borderRadius: theme.shape.radius.default,
padding: theme.spacing(0, 0.5),
fontSize: theme.typography.bodySmall.fontSize,
fontWeight: theme.typography.fontWeightMedium,
lineHeight: theme.typography.bodySmall.lineHeight,
color: theme.colors.text.secondary,
display: 'inline-flex',
alignItems: 'center',
position: 'relative',
border: `1px solid ${theme.colors.background.secondary}`,
whiteSpace: 'nowrap',
marginRight: theme.spacing(0.5),
}),
};
};