import React, { useCallback, useState } from 'react'; import { useStyles2, getSelectStyles, useTheme2 } from '@grafana/ui'; import { Role } from 'app/types'; import { RoleMenuGroupOption } from './RoleMenuGroupOption'; import { RoleMenuOption } from './RoleMenuOption'; import { RolePickerSubMenu } from './RolePickerSubMenu'; import { getStyles } from './styles'; import { isNotDelegatable } from './utils'; interface RoleMenuGroupsSectionProps { roles: Role[]; renderedName: string; showGroups?: boolean; optionGroups: Array<{ name: string; options: Role[]; value: string; }>; onGroupChange: (value: string) => void; groupSelected: (group: string) => boolean; groupPartiallySelected: (group: string) => boolean; disabled?: boolean; subMenuNode?: HTMLDivElement; selectedOptions: Role[]; onRoleChange: (option: Role) => void; onClearSubMenu: (group: string) => void; showOnLeftSubMenu: boolean; } export const RoleMenuGroupsSection = React.forwardRef( ( { roles, renderedName, showGroups, optionGroups, onGroupChange, groupSelected, groupPartiallySelected, subMenuNode, selectedOptions, onRoleChange, onClearSubMenu, showOnLeftSubMenu, }, _ref ) => { const [showSubMenu, setShowSubMenu] = useState(false); const [openedMenuGroup, setOpenedMenuGroup] = useState(''); const theme = useTheme2(); const selectStyles = getSelectStyles(theme); const styles = useStyles2(getStyles); const onOpenSubMenu = useCallback((value: string) => { setOpenedMenuGroup(value); setShowSubMenu(true); }, []); const onCloseSubMenu = useCallback(() => { setShowSubMenu(false); setOpenedMenuGroup(''); }, []); return (
{roles.length > 0 && (
{renderedName}
{showGroups && !!optionGroups?.length ? optionGroups.map((groupOption) => ( {showSubMenu && openedMenuGroup === groupOption.value && ( onClearSubMenu(openedMenuGroup)} showOnLeft={showOnLeftSubMenu} /> )} )) : roles.map((option) => ( opt.uid === option.uid))} disabled={isNotDelegatable(option)} onChange={onRoleChange} hideDescription /> ))}
)}
); } ); RoleMenuGroupsSection.displayName = 'RoleMenuGroupsSection';