// @flow import React from "react"; import type { Link } from "@scm-manager/ui-types"; import { Notification, ErrorNotification, SubmitButton } from "@scm-manager/ui-components"; import { translate } from "react-i18next"; import { loadAvailablePermissions, loadPermissionsForEntity, setPermissions } from "./handlePermissions"; import PermissionCheckbox from "./PermissionCheckbox"; import { connect } from "react-redux"; import { getLink } from "../../modules/indexResource"; type Props = { t: string => string, availablePermissionLink: string, selectedPermissionsLink: Link }; type State = { permissions: { [string]: boolean }, loading: boolean, error?: Error, permissionsChanged: boolean, permissionsSubmitted: boolean, overwritePermissionsLink?: Link }; 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({ ...this.state, loading: true }); }; setErrorState = (error: Error) => { this.setState({ ...this.state, error: error, loading: false }); }; setSuccessfulState = () => { this.setState({ ...this.state, loading: false, permissionsSubmitted: true, permissionsChanged: false }); }; componentDidMount(): void { loadAvailablePermissions(this.props.availablePermissionLink).then( response => { const availablePermissions = response.permissions; const permissions = {}; availablePermissions.forEach(p => { permissions[p] = false; }); this.setState({ permissions }, this.loadPermissionsForEntity); } ); } loadPermissionsForEntity = () => { loadPermissionsForEntity(this.props.selectedPermissionsLink.href).then( response => { const checkedPermissions = response.permissions; this.setState(state => { const newPermissions = state.permissions; checkedPermissions.forEach(name => (newPermissions[name] = true)); return { loading: false, permissions: newPermissions, overwritePermissionsLink: response._links.overwrite }; }); } ); }; 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 => { if (result.error) { this.setErrorState(result.error); } else { this.setSuccessfulState(); } }) .catch(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; return Object.keys(permissions).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) );