Files
SCM-Manager/scm-ui/src/repos/permissions/containers/SinglePermission.js

287 lines
7.1 KiB
JavaScript
Raw Normal View History

// @flow
import React from "react";
2019-05-15 17:30:48 +02:00
import type { RepositoryRole, Permission } from "@scm-manager/ui-types";
import { translate } from "react-i18next";
import {
modifyPermission,
isModifyPermissionPending,
deletePermission,
isDeletePermissionPending,
findVerbsForRole
} from "../modules/permissions";
import { connect } from "react-redux";
import type { History } from "history";
import { Button } from "@scm-manager/ui-components";
import DeletePermissionButton from "../components/buttons/DeletePermissionButton";
2019-01-25 08:26:18 +01:00
import RoleSelector from "../components/RoleSelector";
2019-01-24 11:53:57 +01:00
import AdvancedPermissionsDialog from "./AdvancedPermissionsDialog";
import classNames from "classnames";
import injectSheet from "react-jss";
type Props = {
availableRepositoryRoles: RepositoryRole[],
availableRepositoryVerbs: string[],
submitForm: Permission => void,
modifyPermission: (
permission: Permission,
namespace: string,
name: string
) => void,
permission: Permission,
t: string => string,
namespace: string,
repoName: string,
match: any,
history: History,
loading: boolean,
deletePermission: (
permission: Permission,
namespace: string,
name: string
) => void,
deleteLoading: boolean,
classes: any
};
type State = {
2019-01-24 11:53:57 +01:00
permission: Permission,
showAdvancedDialog: boolean
};
const styles = {
iconColor: {
color: "#9a9a9a"
2019-02-01 16:25:32 +01:00
},
centerMiddle: {
display: "table-cell",
verticalAlign: "middle !important"
},
columnWidth: {
width: "100%"
}
};
class SinglePermission extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
2019-05-15 17:30:48 +02:00
const defaultPermission = props.availableRepositoryRoles
? props.availableRepositoryRoles[0]
: {};
this.state = {
permission: {
name: "",
2019-05-15 17:30:48 +02:00
role: undefined,
verbs: defaultPermission.verbs,
groupPermission: false,
_links: {}
},
2019-01-24 11:53:57 +01:00
showAdvancedDialog: false
};
}
componentDidMount() {
2019-05-15 17:30:48 +02:00
const { permission } = this.props;
if (permission) {
this.setState({
permission: {
name: permission.name,
2019-05-15 17:30:48 +02:00
role: permission.role,
verbs: permission.verbs,
groupPermission: permission.groupPermission,
_links: permission._links
2019-05-15 17:30:48 +02:00
}
});
}
}
deletePermission = () => {
this.props.deletePermission(
this.props.permission,
this.props.namespace,
this.props.repoName
);
};
render() {
2019-05-15 17:30:48 +02:00
const { permission, showAdvancedDialog } = this.state;
2019-01-24 13:34:05 +01:00
const {
t,
availableRepositoryRoles,
availableRepositoryVerbs,
2019-01-24 13:34:05 +01:00
loading,
namespace,
repoName,
classes
2019-01-24 13:34:05 +01:00
} = this.props;
2019-05-15 17:30:48 +02:00
const availableRoleNames =
!!availableRepositoryRoles && availableRepositoryRoles.map(r => r.name);
2019-01-25 13:55:04 +01:00
const readOnly = !this.mayChangePermissions();
const roleSelector = readOnly ? (
2019-05-15 17:30:48 +02:00
<td>{permission.role ? permission.role : t("permission.custom")}</td>
2019-01-25 13:55:04 +01:00
) : (
<td>
<RoleSelector
handleRoleChange={this.handleRoleChange}
availableRoles={availableRoleNames}
2019-05-15 17:30:48 +02:00
role={permission.role}
2019-01-25 13:55:04 +01:00
loading={loading}
/>
</td>
);
const selectedVerbs = permission.role
? findVerbsForRole(availableRepositoryRoles, permission.role)
: permission.verbs;
const advancedDialog = showAdvancedDialog ? (
2019-01-24 11:53:57 +01:00
<AdvancedPermissionsDialog
2019-01-25 13:55:04 +01:00
readOnly={readOnly}
availableVerbs={availableRepositoryVerbs}
selectedVerbs={selectedVerbs}
2019-01-24 11:53:57 +01:00
onClose={this.closeAdvancedPermissionsDialog}
onSubmit={this.submitAdvancedPermissionsDialog}
/>
) : null;
const iconType =
permission && permission.groupPermission ? (
2019-05-15 17:30:48 +02:00
<i
title={t("permission.group")}
className={classNames("fas fa-user-friends", classes.iconColor)}
/>
) : (
2019-05-15 17:30:48 +02:00
<i
title={t("permission.user")}
className={classNames("fas fa-user", classes.iconColor)}
/>
);
return (
2019-02-01 16:25:32 +01:00
<tr className={classes.columnWidth}>
<td className={classes.centerMiddle}>
{iconType} {permission.name}
</td>
2019-01-25 08:26:18 +01:00
{roleSelector}
2019-02-01 16:25:32 +01:00
<td className={classes.centerMiddle}>
2019-01-25 13:55:04 +01:00
<Button
label={t("permission.advanced-button.label")}
action={this.handleDetailedPermissionsPressed}
/>
</td>
2019-02-01 16:25:32 +01:00
<td className={classes.centerMiddle}>
<DeletePermissionButton
permission={permission}
namespace={namespace}
repoName={repoName}
deletePermission={this.deletePermission}
loading={this.props.deleteLoading}
/>
{advancedDialog}
</td>
</tr>
);
}
2019-01-25 13:55:04 +01:00
mayChangePermissions = () => {
return this.props.permission._links && this.props.permission._links.update;
};
2019-01-24 11:53:57 +01:00
handleDetailedPermissionsPressed = () => {
this.setState({ showAdvancedDialog: true });
};
closeAdvancedPermissionsDialog = () => {
this.setState({ showAdvancedDialog: false });
};
submitAdvancedPermissionsDialog = (newVerbs: string[]) => {
const { permission } = this.state;
this.setState(
{
showAdvancedDialog: false,
2019-05-15 17:30:48 +02:00
permission: { ...permission, role: undefined, verbs: newVerbs }
2019-01-24 11:53:57 +01:00
},
2019-05-15 17:30:48 +02:00
() => this.modifyPermissionVerbs(newVerbs)
2019-01-24 11:53:57 +01:00
);
};
2019-01-25 08:26:18 +01:00
handleRoleChange = (role: string) => {
2019-05-15 17:30:48 +02:00
const { permission } = this.state;
2019-01-24 11:53:57 +01:00
this.setState(
{
2019-05-15 17:30:48 +02:00
permission: { ...permission, role: role, verbs: undefined }
2019-01-24 10:45:23 +01:00
},
2019-05-15 17:30:48 +02:00
() => this.modifyPermissionRole(role)
2019-01-24 11:53:57 +01:00
);
2019-01-24 10:29:51 +01:00
};
2019-01-25 08:26:18 +01:00
findAvailableRole = (roleName: string) => {
const { availableRepositoryRoles } = this.props;
2019-05-15 17:30:48 +02:00
return availableRepositoryRoles.find(role => role.name === roleName);
};
modifyPermissionRole = (role: string) => {
let permission = this.state.permission;
permission.role = role;
this.props.modifyPermission(
permission,
this.props.namespace,
this.props.repoName
2019-01-24 10:29:51 +01:00
);
};
2019-05-15 17:30:48 +02:00
modifyPermissionVerbs = (verbs: string[]) => {
let permission = this.state.permission;
2019-01-24 10:29:51 +01:00
permission.verbs = verbs;
this.props.modifyPermission(
permission,
this.props.namespace,
this.props.repoName
);
};
}
const mapStateToProps = (state, ownProps) => {
const permission = ownProps.permission;
const loading = isModifyPermissionPending(
state,
ownProps.namespace,
ownProps.repoName,
permission
);
const deleteLoading = isDeletePermissionPending(
state,
ownProps.namespace,
ownProps.repoName,
permission
);
return { loading, deleteLoading };
};
const mapDispatchToProps = dispatch => {
return {
modifyPermission: (
permission: Permission,
namespace: string,
repoName: string
) => {
dispatch(modifyPermission(permission, namespace, repoName));
},
deletePermission: (
permission: Permission,
namespace: string,
repoName: string
) => {
dispatch(deletePermission(permission, namespace, repoName));
}
};
};
export default connect(
mapStateToProps,
mapDispatchToProps
)(translate("repos")(injectSheet(styles)(SinglePermission)));