// @flow import React from "react"; import { translate } from "react-i18next"; import { Autocomplete, SubmitButton, Button, LabelWithHelpIcon, Radio } from "@scm-manager/ui-components"; import RoleSelector from "../components/RoleSelector"; import type { RepositoryRole, PermissionCollection, PermissionCreateEntry, SelectValue } from "@scm-manager/ui-types"; import * as validator from "../components/permissionValidation"; import { findMatchingRoleName } from "../modules/permissions"; import AdvancedPermissionsDialog from "./AdvancedPermissionsDialog"; type Props = { t: string => string, availableRoles: RepositoryRole[], availableVerbs: string[], createPermission: (permission: PermissionCreateEntry) => void, loading: boolean, currentPermissions: PermissionCollection, groupAutoCompleteLink: string, userAutoCompleteLink: string }; type State = { name: string, role?: string, verbs: string[], groupPermission: boolean, valid: boolean, value?: SelectValue, showAdvancedDialog: boolean }; class CreatePermissionForm extends React.Component { constructor(props: Props) { super(props); this.state = { name: "", role: props.availableRoles[0].name, verbs: props.availableRoles[0].verbs, groupPermission: false, valid: true, value: undefined, showAdvancedDialog: false }; } permissionScopeChanged = event => { const groupPermission = event.target.value === "GROUP_PERMISSION"; this.setState({ value: undefined, name: "", groupPermission: groupPermission, valid: false }); }; loadUserAutocompletion = (inputValue: string) => { return this.loadAutocompletion(this.props.userAutoCompleteLink, inputValue); }; loadGroupAutocompletion = (inputValue: string) => { return this.loadAutocompletion( this.props.groupAutoCompleteLink, inputValue ); }; loadAutocompletion(url: string, inputValue: string) { const link = url + "?q="; return fetch(link + inputValue) .then(response => response.json()) .then(json => { return json.map(element => { const label = element.displayName ? `${element.displayName} (${element.id})` : element.id; return { value: element, label }; }); }); } renderAutocompletionField = () => { const { t } = this.props; if (this.state.groupPermission) { return ( ); } return ( ); }; groupOrUserSelected = (value: SelectValue) => { this.setState({ value, name: value.value.id, valid: validator.isPermissionValid( value.value.id, this.state.groupPermission, this.props.currentPermissions ) }); }; render() { const { t, availableRoles, availableVerbs, loading } = this.props; const { verbs, showAdvancedDialog } = this.state; const availableRoleNames = availableRoles.map(r => r.name); const matchingRole = findMatchingRoleName(availableRoles, verbs); const advancedDialog = showAdvancedDialog ? ( ) : null; return (

{t("permission.add-permission.add-permission-heading")}

{advancedDialog}
{this.renderAutocompletionField()}
); } handleDetailedPermissionsPressed = () => { this.setState({ showAdvancedDialog: true }); }; closeAdvancedPermissionsDialog = () => { this.setState({ showAdvancedDialog: false }); }; submitAdvancedPermissionsDialog = (newVerbs: string[]) => { this.setState({ showAdvancedDialog: false, role: undefined, verbs: newVerbs }); }; submit = e => { this.props.createPermission({ name: this.state.name, role: this.state.role, verbs: this.state.verbs, groupPermission: this.state.groupPermission }); this.removeState(); e.preventDefault(); }; removeState = () => { this.setState({ name: "", role: undefined, verbs: this.props.availableRoles[0].verbs, valid: true, value: undefined }); }; handleRoleChange = (role: string) => { const selectedRole = this.findAvailableRole(role); if (!selectedRole) { return; } this.setState({ role: selectedRole.name, verbs: selectedRole.verbs }); }; findAvailableRole = (roleName: string) => { return this.props.availableRoles.find(role => role.name === roleName); }; } export default translate("repos")(CreatePermissionForm);