import { css, cx } from '@emotion/css'; import React, { memo } from 'react'; import { GrafanaTheme2, OrgRole } from '@grafana/data'; import { Button, HorizontalGroup, Icon, IconButton, useStyles2 } from '@grafana/ui'; import { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker'; import { contextSrv } from 'app/core/core'; import { OrgRolePicker } from 'app/features/admin/OrgRolePicker'; import { AccessControlAction, Role, ServiceAccountDTO } from 'app/types'; type ServiceAccountListItemProps = { serviceAccount: ServiceAccountDTO; onRoleChange: (role: OrgRole, serviceAccount: ServiceAccountDTO) => void; roleOptions: Role[]; builtInRoles: Record; onRemoveButtonClick: (serviceAccount: ServiceAccountDTO) => void; onDisable: (serviceAccount: ServiceAccountDTO) => void; onEnable: (serviceAccount: ServiceAccountDTO) => void; onAddTokenClick: (serviceAccount: ServiceAccountDTO) => void; }; const getServiceAccountsAriaLabel = (name: string) => { return `Edit service account's ${name} details`; }; const ServiceAccountListItem = memo( ({ serviceAccount, onRoleChange, roleOptions, builtInRoles, onRemoveButtonClick, onDisable, onEnable, onAddTokenClick, }: ServiceAccountListItemProps) => { const editUrl = `org/serviceaccounts/${serviceAccount.id}`; const styles = useStyles2(getStyles); const canUpdateRole = contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsWrite, serviceAccount); const displayRolePicker = contextSrv.hasPermission(AccessControlAction.ActionRolesList) && contextSrv.hasPermission(AccessControlAction.ActionUserRolesList); const enableRolePicker = contextSrv.hasPermission(AccessControlAction.OrgUsersWrite) && canUpdateRole; return ( {`Avatar {serviceAccount.name} {serviceAccount.login} {contextSrv.licensedAccessControlEnabled() ? ( {displayRolePicker && ( onRoleChange(newRole, serviceAccount)} roleOptions={roleOptions} builtInRoles={builtInRoles} disabled={!enableRolePicker || serviceAccount.isDisabled} /> )} ) : ( onRoleChange(newRole, serviceAccount)} /> )}
{serviceAccount.tokens || 'No tokens'}
{contextSrv.hasPermission(AccessControlAction.ServiceAccountsWrite) && !serviceAccount.tokens && ( )} {contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsWrite, serviceAccount) && (serviceAccount.isDisabled ? ( ) : ( ))} {contextSrv.hasPermissionInMetadata(AccessControlAction.ServiceAccountsDelete, serviceAccount) && ( onRemoveButtonClick(serviceAccount)} aria-label={`Delete service account ${serviceAccount.name}`} /> )} ); } ); ServiceAccountListItem.displayName = 'ServiceAccountListItem'; const getStyles = (theme: GrafanaTheme2) => { return { iconRow: css` svg { margin-left: ${theme.spacing(0.5)}; } `, accountId: cx( 'ellipsis', css` color: ${theme.colors.text.secondary}; ` ), deleteButton: css` color: ${theme.colors.text.secondary}; `, tokensInfo: css` span { margin-right: ${theme.spacing(1)}; } `, tokensInfoSecondary: css` color: ${theme.colors.text.secondary}; `, disabled: css` td a { color: ${theme.colors.text.secondary}; } `, }; }; export default ServiceAccountListItem;