// @flow import React from "react"; import { translate } from "react-i18next"; import { Autocomplete, SubmitButton, Button, LabelWithHelpIcon } from "@scm-manager/ui-components"; import RoleSelector from "../components/RoleSelector"; import type { AvailableRepositoryPermissions, 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, availablePermissions: AvailableRepositoryPermissions, createPermission: (permission: PermissionCreateEntry) => void, loading: boolean, currentPermissions: PermissionCollection, groupAutoCompleteLink: string, userAutoCompleteLink: string }; type State = { name: string, verbs: string[], groupPermission: boolean, valid: boolean, value?: SelectValue, showAdvancedDialog: boolean }; class CreatePermissionForm extends React.Component { constructor(props: Props) { super(props); this.state = { name: "", verbs: props.availablePermissions.availableRoles[0].verbs, groupPermission: false, valid: true, value: undefined, showAdvancedDialog: false }; } permissionScopeChanged = event => { const groupPermission = event.target.value === "GROUP_PERMISSION"; this.setState({ groupPermission: groupPermission, valid: validator.isPermissionValid( this.state.name, groupPermission, this.props.currentPermissions ) }); this.setState({ ...this.state, groupPermission }); }; 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, availablePermissions, loading } = this.props; const { verbs, showAdvancedDialog } = this.state; const availableRoleNames = availablePermissions.availableRoles.map( r => r.name ); const matchingRole = findMatchingRoleName(availablePermissions, 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, verbs: newVerbs }); }; submit = e => { this.props.createPermission({ name: this.state.name, verbs: this.state.verbs, groupPermission: this.state.groupPermission }); this.removeState(); e.preventDefault(); }; removeState = () => { this.setState({ name: "", verbs: this.props.availablePermissions.availableRoles[0].verbs, valid: true, value: undefined }); }; handleRoleChange = (role: string) => { const selectedRole = this.findAvailableRole(role); this.setState({ verbs: selectedRole.verbs }); }; findAvailableRole = (roleName: string) => { return this.props.availablePermissions.availableRoles.find( role => role.name === roleName ); }; } export default translate("repos")(CreatePermissionForm);