import { css, cx } from '@emotion/css'; import { forwardRef, ReactNode, ButtonHTMLAttributes } from 'react'; import * as React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Trans, t } from '@grafana/i18n'; import { Icon, getInputStyles, useTheme2, Text } from '@grafana/ui'; import { getFocusStyles, getMouseFocusStyles } from '@grafana/ui/internal'; import { FolderPickerSkeleton } from './Skeleton'; interface TriggerProps extends ButtonHTMLAttributes { isLoading: boolean; handleClearSelection?: (event: React.MouseEvent | React.KeyboardEvent) => void; invalid?: boolean; label?: ReactNode; } function Trigger( { handleClearSelection, isLoading, invalid, label, ...rest }: TriggerProps, ref: React.ForwardedRef ) { const theme = useTheme2(); const styles = getStyles(theme, invalid); const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Enter' || event.key === ' ') { handleClearSelection?.(event); } }; if (isLoading) { return ; } return (
{label ? (
) : undefined}
); } export default forwardRef(Trigger); const getStyles = (theme: GrafanaTheme2, invalid = false) => { const baseStyles = getInputStyles({ theme, invalid }); return { wrapper: baseStyles.wrapper, inputWrapper: baseStyles.inputWrapper, prefix: css([ baseStyles.prefix, { pointerEvents: 'none', color: theme.colors.text.primary, }, ]), suffix: css([ baseStyles.suffix, { pointerEvents: 'none', }, ]), fakeInput: css([ baseStyles.input, { textAlign: 'left', letterSpacing: 'normal', // We want the focus styles to appear only when tabbing through, not when clicking the button // (and when focus is restored after command palette closes) '&:focus': { outline: 'unset', boxShadow: 'unset', }, '&:focus-visible': getFocusStyles(theme), alignItems: 'center', display: 'flex', flexWrap: 'nowrap', justifyContent: 'space-between', paddingRight: 28, }, ]), hasPrefix: css({ paddingLeft: 28, }), clearIcon: css({ color: theme.colors.text.secondary, cursor: 'pointer', '&:hover': { color: theme.colors.text.primary, }, '&:focus:not(:focus-visible)': getMouseFocusStyles(theme), '&:focus-visible': getFocusStyles(theme), }), }; };