import React, { PureComponent } from 'react'; import { css, cx } from '@emotion/css'; import { Button, ConfirmButton, Container, Field, HorizontalGroup, Modal, stylesFactory, Themeable, withTheme, } from '@grafana/ui'; import { GrafanaTheme } from '@grafana/data'; import { AccessControlAction, Organization, OrgRole, UserOrg } from 'app/types'; import { OrgPicker, OrgSelectItem } from 'app/core/components/Select/OrgPicker'; import { OrgRolePicker } from './OrgRolePicker'; import { contextSrv } from 'app/core/core'; interface Props { orgs: UserOrg[]; onOrgRemove: (orgId: number) => void; onOrgRoleChange: (orgId: number, newRole: OrgRole) => void; onOrgAdd: (orgId: number, role: OrgRole) => void; } interface State { showAddOrgModal: boolean; } export class UserOrgs extends PureComponent { state = { showAddOrgModal: false, }; showOrgAddModal = (show: boolean) => () => { this.setState({ showAddOrgModal: show }); }; render() { const { orgs, onOrgRoleChange, onOrgRemove, onOrgAdd } = this.props; const { showAddOrgModal } = this.state; const addToOrgContainerClass = css` margin-top: 0.8rem; `; const canAddToOrg = contextSrv.hasPermission(AccessControlAction.OrgUsersAdd); return ( <>

Organizations

{orgs.map((org, index) => ( ))}
{canAddToOrg && ( )}
); } } const getOrgRowStyles = stylesFactory((theme: GrafanaTheme) => { return { removeButton: css` margin-right: 0.6rem; text-decoration: underline; color: ${theme.palette.blue95}; `, label: css` font-weight: 500; `, }; }); interface OrgRowProps extends Themeable { org: UserOrg; onOrgRemove: (orgId: number) => void; onOrgRoleChange: (orgId: number, newRole: string) => void; } interface OrgRowState { currentRole: OrgRole; isChangingRole: boolean; } class UnThemedOrgRow extends PureComponent { state = { currentRole: this.props.org.role, isChangingRole: false, }; onOrgRemove = () => { const { org } = this.props; this.props.onOrgRemove(org.orgId); }; onChangeRoleClick = () => { const { org } = this.props; this.setState({ isChangingRole: true, currentRole: org.role }); }; onOrgRoleChange = (newRole: OrgRole) => { this.setState({ currentRole: newRole }); }; onOrgRoleSave = () => { this.props.onOrgRoleChange(this.props.org.orgId, this.state.currentRole); }; onCancelClick = () => { this.setState({ isChangingRole: false }); }; render() { const { org, theme } = this.props; const { currentRole, isChangingRole } = this.state; const styles = getOrgRowStyles(theme); const labelClass = cx('width-16', styles.label); const canChangeRole = contextSrv.hasPermission(AccessControlAction.OrgUsersRoleUpdate); const canRemoveFromOrg = contextSrv.hasPermission(AccessControlAction.OrgUsersRemove); return ( {org.name} {isChangingRole ? ( ) : ( {org.role} )}
{canChangeRole && ( Change role )}
{canRemoveFromOrg && ( Remove from organization )}
); } } const OrgRow = withTheme(UnThemedOrgRow); const getAddToOrgModalStyles = stylesFactory(() => ({ modal: css` width: 500px; `, buttonRow: css` text-align: center; `, modalContent: css` overflow: visible; `, })); interface AddToOrgModalProps { isOpen: boolean; onOrgAdd(orgId: number, role: string): void; onDismiss?(): void; } interface AddToOrgModalState { selectedOrg: Organization | null; role: OrgRole; } export class AddToOrgModal extends PureComponent { state: AddToOrgModalState = { selectedOrg: null, role: OrgRole.Admin, }; onOrgSelect = (org: OrgSelectItem) => { this.setState({ selectedOrg: { ...org } }); }; onOrgRoleChange = (newRole: OrgRole) => { this.setState({ role: newRole, }); }; onAddUserToOrg = () => { const { selectedOrg, role } = this.state; this.props.onOrgAdd(selectedOrg!.id, role); }; onCancel = () => { if (this.props.onDismiss) { this.props.onDismiss(); } }; render() { const { isOpen } = this.props; const { role } = this.state; const styles = getAddToOrgModalStyles(); return ( ); } }