Files
Josh Hunt 06d78ea904 Dashboards: Disable variable pickers for snapshots (#52827)
* user essentials mob! 🔱

lastFile:public/app/features/variables/textbox/TextBoxVariablePicker.tsx

* user essentials mob! 🔱

* user essentials mob! 🔱

lastFile:public/app/features/variables/adhoc/picker/AdHocFilter.tsx

* finish up disabling variables in snapshots

* remove accident

* use theme.spacing instead of the v1 shim

Co-authored-by: Joao Silva <joao.silva@grafana.com>
Co-authored-by: Leodegario Pasakdal <leodegario.pasakdal@grafana.com>
2022-07-29 16:29:55 +01:00

124 lines
3.1 KiB
TypeScript

import { css } from '@emotion/css';
import React, { FC, MouseEvent, useCallback } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { Icon, Tooltip, useStyles2 } from '@grafana/ui';
interface Props {
onClick: () => void;
text: string;
loading: boolean;
onCancel: () => void;
disabled: boolean; // todo: optional?
/**
* htmlFor, needed for the label
*/
id: string;
}
export const VariableLink: FC<Props> = ({ loading, disabled, onClick: propsOnClick, text, onCancel, id }) => {
const styles = useStyles2(getStyles);
const onClick = useCallback(
(event: MouseEvent<HTMLButtonElement>) => {
event.stopPropagation();
event.preventDefault();
propsOnClick();
},
[propsOnClick]
);
if (loading) {
return (
<div
className={styles.container}
data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${text}`)}
title={text}
id={id}
>
<VariableLinkText text={text} />
<LoadingIndicator onCancel={onCancel} />
</div>
);
}
return (
<button
onClick={onClick}
className={styles.container}
data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${text}`)}
aria-expanded={false}
aria-controls={`options-${id}`}
id={id}
title={text}
disabled={disabled}
>
<VariableLinkText text={text} />
<Icon aria-hidden name="angle-down" size="sm" />
</button>
);
};
interface VariableLinkTextProps {
text: string;
}
const VariableLinkText: FC<VariableLinkTextProps> = ({ text }) => {
const styles = useStyles2(getStyles);
return <span className={styles.textAndTags}>{text}</span>;
};
const LoadingIndicator: FC<Pick<Props, 'onCancel'>> = ({ onCancel }) => {
const onClick = useCallback(
(event: MouseEvent) => {
event.preventDefault();
onCancel();
},
[onCancel]
);
return (
<Tooltip content="Cancel query">
<Icon
className="spin-clockwise"
name="sync"
size="xs"
onClick={onClick}
aria-label={selectors.components.LoadingIndicator.icon}
/>
</Tooltip>
);
};
const getStyles = (theme: GrafanaTheme2) => ({
container: css`
max-width: 500px;
padding-right: 10px;
padding: 0 ${theme.spacing(1)};
background-color: ${theme.components.input.background};
border: 1px solid ${theme.components.input.borderColor};
border-radius: ${theme.shape.borderRadius(1)};
display: flex;
align-items: center;
color: ${theme.colors.text};
height: ${theme.spacing(theme.components.height.md)};
.label-tag {
margin: 0 5px;
}
&:disabled {
background-color: ${theme.colors.action.disabledBackground};
color: ${theme.colors.action.disabledText};
border: 1px solid ${theme.colors.action.disabledBackground};
}
`,
textAndTags: css`
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-right: ${theme.spacing(0.25)};
user-select: none;
`,
});