import React from 'react'; import { connect } from 'react-redux'; import { translate } from 'react-i18next'; import classNames from 'classnames'; import styled from 'styled-components'; import { Link } from '@scm-manager/ui-types'; import { Notification, ErrorNotification, SubmitButton, } from '@scm-manager/ui-components'; import { getLink } from '../../modules/indexResource'; import { loadPermissionsForEntity, setPermissions } from './handlePermissions'; import PermissionCheckbox from './PermissionCheckbox'; type Props = { availablePermissionLink: string; selectedPermissionsLink: Link; // context props t: (p: string) => string; }; type State = { permissions: { [key: string]: boolean; }; loading: boolean; error?: Error; permissionsChanged: boolean; permissionsSubmitted: boolean; overwritePermissionsLink?: Link; }; const PermissionsWrapper = styled.div` padding-bottom: 0; & .field .control { width: 100%; word-wrap: break-word; } `; class SetPermissions extends React.Component { constructor(props: Props) { super(props); this.state = { permissions: {}, loading: true, permissionsChanged: false, permissionsSubmitted: false, modifiable: false, overwritePermissionsLink: undefined, }; } setLoadingState = () => { this.setState({ loading: true, }); }; setErrorState = (error: Error) => { this.setState({ error: error, loading: false, }); }; setSuccessfulState = () => { this.setState({ loading: false, error: undefined, permissionsSubmitted: true, permissionsChanged: false, }); }; componentDidMount(): void { loadPermissionsForEntity( this.props.availablePermissionLink, this.props.selectedPermissionsLink.href, ).then(response => { const { permissions, overwriteLink } = response; this.setState({ permissions: permissions, loading: false, overwritePermissionsLink: overwriteLink, }); }); } submit = (event: Event) => { event.preventDefault(); if (this.state.permissions) { const { permissions } = this.state; this.setLoadingState(); const selectedPermissions = Object.entries(permissions) .filter(e => e[1]) .map(e => e[0]); if (this.state.overwritePermissionsLink) { setPermissions( this.state.overwritePermissionsLink.href, selectedPermissions, ) .then(result => { this.setSuccessfulState(); }) .catch(err => { this.setErrorState(err); }); } } }; render() { const { t } = this.props; const { loading, permissionsSubmitted, error } = this.state; let message = null; if (permissionsSubmitted) { message = ( this.onClose()} /> ); } else if (error) { message = ; } return (
{message} {this.renderPermissions()} ); } renderPermissions = () => { const { overwritePermissionsLink, permissions } = this.state; const permissionArray = Object.keys(permissions); return (
{permissionArray.slice(0, permissionArray.length / 2 + 1).map(p => ( ))} {permissionArray .slice(permissionArray.length / 2 + 1, permissionArray.length) .map(p => ( ))}
); }; valueChanged = (value: boolean, name: string) => { this.setState(state => { const newPermissions = state.permissions; newPermissions[name] = value; return { permissions: newPermissions, permissionsChanged: true, }; }); }; onClose = () => { this.setState({ permissionsSubmitted: false, }); }; } const mapStateToProps = state => { const availablePermissionLink = getLink(state, 'permissions'); return { availablePermissionLink, }; }; export default connect(mapStateToProps)( translate('permissions')(SetPermissions), );