mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 01:53:33 -06:00
65 lines
2.1 KiB
TypeScript
65 lines
2.1 KiB
TypeScript
import { cx } from '@emotion/css';
|
|
import React, { FormEvent } from 'react';
|
|
|
|
import { Checkbox, Icon, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';
|
|
import { getSelectStyles } from '@grafana/ui/src/components/Select/getSelectStyles';
|
|
import { Role } from 'app/types';
|
|
|
|
import { getStyles } from './styles';
|
|
|
|
interface RoleMenuOptionProps {
|
|
data: Role;
|
|
onChange: (value: Role) => void;
|
|
isSelected?: boolean;
|
|
isFocused?: boolean;
|
|
disabled?: boolean;
|
|
hideDescription?: boolean;
|
|
}
|
|
|
|
export const RoleMenuOption = React.forwardRef<HTMLDivElement, React.PropsWithChildren<RoleMenuOptionProps>>(
|
|
({ data, isFocused, isSelected, disabled, onChange, hideDescription }, ref) => {
|
|
const theme = useTheme2();
|
|
const styles = getSelectStyles(theme);
|
|
const customStyles = useStyles2(getStyles);
|
|
|
|
const wrapperClassName = cx(
|
|
styles.option,
|
|
isFocused && styles.optionFocused,
|
|
disabled && customStyles.menuOptionDisabled
|
|
);
|
|
|
|
const onChangeInternal = (event: FormEvent<HTMLElement>) => {
|
|
if (disabled) {
|
|
return;
|
|
}
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
onChange(data);
|
|
};
|
|
|
|
return (
|
|
// TODO: fix keyboard a11y
|
|
// eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
|
|
<div ref={ref} className={wrapperClassName} aria-label="Role picker option" onClick={onChangeInternal}>
|
|
<Checkbox
|
|
value={isSelected}
|
|
className={customStyles.menuOptionCheckbox}
|
|
onChange={onChangeInternal}
|
|
disabled={disabled}
|
|
/>
|
|
<div className={cx(styles.optionBody, customStyles.menuOptionBody)}>
|
|
<span>{data.displayName || data.name}</span>
|
|
{!hideDescription && data.description && <div className={styles.optionDescription}>{data.description}</div>}
|
|
</div>
|
|
{data.description && (
|
|
<Tooltip content={data.description}>
|
|
<Icon name="info-circle" className={customStyles.menuOptionInfoSign} />
|
|
</Tooltip>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|
|
);
|
|
|
|
RoleMenuOption.displayName = 'RoleMenuOption';
|