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

250 lines
6.1 KiB
JavaScript
Raw Normal View History

// @flow
import React from "react";
import type {
AvailableRepositoryPermissions,
Permission
} from "@scm-manager/ui-types";
import { translate } from "react-i18next";
import {
modifyPermission,
isModifyPermissionPending,
deletePermission,
2019-01-24 10:29:51 +01:00
isDeletePermissionPending,
findMatchingRoleName
} from "../modules/permissions";
import { connect } from "react-redux";
import type { History } from "history";
2019-01-24 11:53:57 +01:00
import { Button, Checkbox } from "@scm-manager/ui-components";
import DeletePermissionButton from "../components/buttons/DeletePermissionButton";
import TypeSelector from "../components/TypeSelector";
2019-01-24 11:53:57 +01:00
import AdvancedPermissionsDialog from "./AdvancedPermissionsDialog";
type Props = {
availablePermissions: AvailableRepositoryPermissions,
submitForm: Permission => void,
modifyPermission: (Permission, string, string) => void,
permission: Permission,
t: string => string,
namespace: string,
repoName: string,
match: any,
history: History,
loading: boolean,
deletePermission: (Permission, string, string) => void,
deleteLoading: boolean
};
type State = {
role: string,
2019-01-24 11:53:57 +01:00
permission: Permission,
showAdvancedDialog: boolean
};
class SinglePermission extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
const defaultPermission = props.availablePermissions.availableRoles
? props.availablePermissions.availableRoles[0]
: {};
this.state = {
permission: {
name: "",
verbs: defaultPermission.verbs,
groupPermission: false,
_links: {}
},
2019-01-24 11:53:57 +01:00
role: defaultPermission.name,
showAdvancedDialog: false
};
}
componentDidMount() {
2019-01-24 10:29:51 +01:00
const { availablePermissions, permission } = this.props;
2019-01-24 10:29:51 +01:00
const matchingRole = findMatchingRoleName(
availablePermissions,
permission.verbs
);
if (permission) {
this.setState({
permission: {
name: permission.name,
verbs: permission.verbs,
groupPermission: permission.groupPermission,
_links: permission._links
},
role: matchingRole
});
}
}
deletePermission = () => {
this.props.deletePermission(
this.props.permission,
this.props.namespace,
this.props.repoName
);
};
render() {
2019-01-24 11:53:57 +01:00
const { role, permission, showAdvancedDialog } = this.state;
const { availablePermissions, loading, namespace, repoName } = this.props;
const availableRoleNames = availablePermissions.availableRoles.map(
r => r.name
);
const typeSelector =
this.props.permission._links && this.props.permission._links.update ? (
<td>
<TypeSelector
handleTypeChange={this.handleTypeChange}
availableTypes={availableRoleNames}
type={role}
loading={loading}
/>
2019-01-24 11:53:57 +01:00
<Button
label={"..."}
action={this.handleDetailedPermissionsPressed}
/>
</td>
) : (
<td>{role}</td>
);
2019-01-24 11:53:57 +01:00
const advancedDialg = showAdvancedDialog ? (
<AdvancedPermissionsDialog
availableVerbs={availablePermissions.availableVerbs}
selectedVerbs={permission.verbs}
onClose={this.closeAdvancedPermissionsDialog}
onSubmit={this.submitAdvancedPermissionsDialog}
/>
) : null;
return (
<tr>
<td>{permission.name}</td>
<td>
<Checkbox checked={permission ? permission.groupPermission : false} />
</td>
{typeSelector}
<td>
<DeletePermissionButton
permission={permission}
namespace={namespace}
repoName={repoName}
deletePermission={this.deletePermission}
loading={this.props.deleteLoading}
/>
2019-01-24 11:53:57 +01:00
{advancedDialg}
</td>
</tr>
);
}
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;
const newRole = findMatchingRoleName(
this.props.availablePermissions,
newVerbs
);
this.setState(
{
showAdvancedDialog: false,
permission: { ...permission, verbs: newVerbs },
role: newRole
},
() => this.modifyPermission(newVerbs)
);
};
handleTypeChange = (type: string) => {
2019-01-24 10:29:51 +01:00
const selectedRole = this.findAvailableRole(type);
2019-01-24 11:53:57 +01:00
this.setState(
{
permission: {
...this.state.permission,
verbs: selectedRole.verbs
},
role: type
2019-01-24 10:45:23 +01:00
},
2019-01-24 11:53:57 +01:00
() => this.modifyPermission(selectedRole.verbs)
);
2019-01-24 10:29:51 +01:00
};
findAvailableRole = (type: string) => {
return this.props.availablePermissions.availableRoles.find(
role => role.name === type
);
};
2019-01-24 10:29:51 +01:00
modifyPermission = (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
);
};
createSelectOptions(types: string[]) {
return types.map(type => {
return {
label: type,
value: type
};
});
}
}
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")(SinglePermission));