import React from 'react'; import { connect } from 'react-redux'; import { History } from 'history'; import { translate } from 'react-i18next'; import styled from 'styled-components'; import { RepositoryRole, Permission } from '@scm-manager/ui-types'; import { Button, Icon } from '@scm-manager/ui-components'; import { modifyPermission, isModifyPermissionPending, deletePermission, isDeletePermissionPending, findVerbsForRole, } from '../modules/permissions'; import DeletePermissionButton from '../components/buttons/DeletePermissionButton'; import RoleSelector from '../components/RoleSelector'; import AdvancedPermissionsDialog from './AdvancedPermissionsDialog'; type Props = { availableRepositoryRoles: RepositoryRole[]; availableRepositoryVerbs: string[]; submitForm: (p: Permission) => void; modifyPermission: ( permission: Permission, namespace: string, name: string, ) => void; permission: Permission; t: (p: string) => string; namespace: string; repoName: string; match: any; history: History; loading: boolean; deletePermission: ( permission: Permission, namespace: string, name: string, ) => void; deleteLoading: boolean; }; type State = { permission: Permission; showAdvancedDialog: boolean; }; const FullWidthTr = styled.tr` width: 100%; `; const VCenteredTd = styled.td` display: table-cell; vertical-align: middle !important; `; class SinglePermission extends React.Component { constructor(props: Props) { super(props); const defaultPermission = props.availableRepositoryRoles ? props.availableRepositoryRoles[0] : {}; this.state = { permission: { name: '', role: undefined, verbs: defaultPermission.verbs, groupPermission: false, _links: {}, }, showAdvancedDialog: false, }; } componentDidMount() { const { permission } = this.props; if (permission) { this.setState({ permission: { name: permission.name, role: permission.role, verbs: permission.verbs, groupPermission: permission.groupPermission, _links: permission._links, }, }); } } deletePermission = () => { this.props.deletePermission( this.props.permission, this.props.namespace, this.props.repoName, ); }; render() { const { availableRepositoryRoles, availableRepositoryVerbs, loading, namespace, repoName, t, } = this.props; const { permission, showAdvancedDialog } = this.state; const availableRoleNames = !!availableRepositoryRoles && availableRepositoryRoles.map(r => r.name); const readOnly = !this.mayChangePermissions(); const roleSelector = readOnly ? ( {permission.role ? permission.role : t('permission.custom')} ) : ( ); const selectedVerbs = permission.role ? findVerbsForRole(availableRepositoryRoles, permission.role) : permission.verbs; const advancedDialog = showAdvancedDialog ? ( ) : null; const iconType = permission && permission.groupPermission ? ( ) : ( ); return ( {iconType} {permission.name} {roleSelector}