Add advanced permission button for new permissions

This commit is contained in:
René Pfeuffer
2019-01-25 12:21:05 +01:00
parent ec1f066b1f
commit 3a44193459
3 changed files with 64 additions and 20 deletions

View File

@@ -94,6 +94,7 @@
"name": "User or Group", "name": "User or Group",
"role": "Role", "role": "Role",
"permissions": "Permissions", "permissions": "Permissions",
"permissions-help": "Use this to specify your own set of permissions regardless of predefined roles",
"group-permission": "Group Permission", "group-permission": "Group Permission",
"user-permission": "User Permission", "user-permission": "User Permission",
"edit-permission": { "edit-permission": {

View File

@@ -1,16 +1,22 @@
// @flow // @flow
import React from "react"; import React from "react";
import { translate } from "react-i18next"; import { translate } from "react-i18next";
import { Autocomplete, SubmitButton } from "@scm-manager/ui-components"; import {
import RoleSelector from "./RoleSelector"; Autocomplete,
SubmitButton,
Button,
LabelWithHelpIcon
} from "@scm-manager/ui-components";
import RoleSelector from "../components/RoleSelector";
import type { import type {
AvailableRepositoryPermissions, AvailableRepositoryPermissions,
PermissionCollection, PermissionCollection,
PermissionCreateEntry, PermissionCreateEntry,
SelectValue SelectValue
} from "@scm-manager/ui-types"; } from "@scm-manager/ui-types";
import * as validator from "./permissionValidation"; import * as validator from "../components/permissionValidation";
import { findMatchingRoleName } from "../modules/permissions"; import { findMatchingRoleName } from "../modules/permissions";
import AdvancedPermissionsDialog from "./AdvancedPermissionsDialog";
type Props = { type Props = {
t: string => string, t: string => string,
@@ -27,7 +33,8 @@ type State = {
verbs: string[], verbs: string[],
groupPermission: boolean, groupPermission: boolean,
valid: boolean, valid: boolean,
value?: SelectValue value?: SelectValue,
showAdvancedDialog: boolean
}; };
class CreatePermissionForm extends React.Component<Props, State> { class CreatePermissionForm extends React.Component<Props, State> {
@@ -39,7 +46,8 @@ class CreatePermissionForm extends React.Component<Props, State> {
verbs: props.availablePermissions.availableRoles[0].verbs, verbs: props.availablePermissions.availableRoles[0].verbs,
groupPermission: false, groupPermission: false,
valid: true, valid: true,
value: undefined value: undefined,
showAdvancedDialog: false
}; };
} }
@@ -126,19 +134,29 @@ class CreatePermissionForm extends React.Component<Props, State> {
render() { render() {
const { t, availablePermissions, loading } = this.props; const { t, availablePermissions, loading } = this.props;
const { verbs } = this.state; const { verbs, showAdvancedDialog } = this.state;
const availableRoleNames = availablePermissions.availableRoles.map( const availableRoleNames = availablePermissions.availableRoles.map(
r => r.name r => r.name
); );
const matchingRole = findMatchingRoleName(availablePermissions, verbs); const matchingRole = findMatchingRoleName(availablePermissions, verbs);
const advancedDialog = showAdvancedDialog ? (
<AdvancedPermissionsDialog
availableVerbs={availablePermissions.availableVerbs}
selectedVerbs={verbs}
onClose={this.closeAdvancedPermissionsDialog}
onSubmit={this.submitAdvancedPermissionsDialog}
/>
) : null;
return ( return (
<div> <div>
<hr /> <hr />
<h2 className="subtitle"> <h2 className="subtitle">
{t("permission.add-permission.add-permission-heading")} {t("permission.add-permission.add-permission-heading")}
</h2> </h2>
{advancedDialog}
<form onSubmit={this.submit}> <form onSubmit={this.submit}>
<div className="control"> <div className="control">
<label className="radio"> <label className="radio">
@@ -164,21 +182,31 @@ class CreatePermissionForm extends React.Component<Props, State> {
</div> </div>
<div className="columns"> <div className="columns">
<div className="column is-three-quarters"> <div className="column is-two-thirds">
{this.renderAutocompletionField()} {this.renderAutocompletionField()}
</div> </div>
<div className="column is-one-quarter"> <div className="column is-one-third">
<RoleSelector <div className="columns">
availableRoles={availableRoleNames} <div className="column is-half">
label={t("permission.role")} <RoleSelector
helpText={t("permission.help.roleHelpText")} availableRoles={availableRoleNames}
handleRoleChange={this.handleRoleChange} label={t("permission.role")}
role={ helpText={t("permission.help.roleHelpText")}
matchingRole handleRoleChange={this.handleRoleChange}
? matchingRole role={matchingRole}
: availablePermissions.availableRoles[0].name />
} </div>
/> <div className="column is-half">
<LabelWithHelpIcon
label={t("permission.permissions")}
helpText={t("permission.permissions.help")}
/>
<Button
label={t("permission.advanced-button.label")}
action={this.handleDetailedPermissionsPressed}
/>
</div>
</div>
</div> </div>
</div> </div>
<div className="columns"> <div className="columns">
@@ -195,6 +223,21 @@ class CreatePermissionForm extends React.Component<Props, State> {
); );
} }
handleDetailedPermissionsPressed = () => {
this.setState({ showAdvancedDialog: true });
};
closeAdvancedPermissionsDialog = () => {
this.setState({ showAdvancedDialog: false });
};
submitAdvancedPermissionsDialog = (newVerbs: string[]) => {
this.setState({
showAdvancedDialog: false,
verbs: newVerbs
});
};
submit = e => { submit = e => {
this.props.createPermission({ this.props.createPermission({
name: this.state.name, name: this.state.name,

View File

@@ -29,7 +29,7 @@ import type {
PermissionCreateEntry PermissionCreateEntry
} from "@scm-manager/ui-types"; } from "@scm-manager/ui-types";
import SinglePermission from "./SinglePermission"; import SinglePermission from "./SinglePermission";
import CreatePermissionForm from "../components/CreatePermissionForm"; import CreatePermissionForm from "./CreatePermissionForm";
import type { History } from "history"; import type { History } from "history";
import { getPermissionsLink } from "../../modules/repos"; import { getPermissionsLink } from "../../modules/repos";
import { import {