fix autocompletion

This commit is contained in:
Florian Scholdei
2019-06-05 18:36:14 +02:00
parent b406ec3eb6
commit 0918d18d5e
4 changed files with 135 additions and 60 deletions

View File

@@ -0,0 +1,56 @@
// @flow
import React from "react";
import { translate } from "react-i18next";
import { Autocomplete } from "@scm-manager/ui-components";
import type { SelectValue } from "@scm-manager/ui-types";
type Props = {
groupAutocompleteLink: string,
valueSelected: SelectValue => void,
value: string,
// Context props
t: string => string
};
class GroupAutocomplete extends React.Component<Props> {
loadGroupSuggestions = (inputValue: string) => {
const url = this.props.groupAutocompleteLink;
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
};
});
});
};
selectName = (selection: SelectValue) => {
this.props.valueSelected(selection);
};
render() {
const { t, value } = this.props;
return (
<Autocomplete
loadSuggestions={this.loadGroupSuggestions}
label={t("permission.group")}
noOptionsMessage={t("permission.autocomplete.no-group-options")}
loadingMessage={t("permission.autocomplete.loading")}
placeholder={t("permission.autocomplete.group-placeholder")}
valueSelected={this.selectName}
value={value}
creatable={true}
/>
);
}
}
export default translate("repos")(GroupAutocomplete);

View File

@@ -0,0 +1,56 @@
// @flow
import React from "react";
import { translate } from "react-i18next";
import { Autocomplete } from "@scm-manager/ui-components";
import type { SelectValue } from "@scm-manager/ui-types";
type Props = {
userAutocompleteLink: string,
valueSelected: SelectValue => void,
value: string,
// Context props
t: string => string
};
class UserAutocomplete extends React.Component<Props> {
loadUserSuggestions = (inputValue: string) => {
const url = this.props.userAutocompleteLink;
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
};
});
});
};
selectName = (selection: SelectValue) => {
this.props.valueSelected(selection);
};
render() {
const { t, value } = this.props;
return (
<Autocomplete
loadSuggestions={this.loadUserSuggestions}
label={t("permission.user")}
noOptionsMessage={t("permission.autocomplete.no-user-options")}
loadingMessage={t("permission.autocomplete.loading")}
placeholder={t("permission.autocomplete.user-placeholder")}
valueSelected={this.selectName}
value={value}
creatable={true}
/>
);
}
}
export default translate("repos")(UserAutocomplete);

View File

@@ -9,7 +9,6 @@ import type {
} from "@scm-manager/ui-types"; } from "@scm-manager/ui-types";
import { import {
Subtitle, Subtitle,
Autocomplete,
SubmitButton, SubmitButton,
Button, Button,
LabelWithHelpIcon, LabelWithHelpIcon,
@@ -17,6 +16,8 @@ import {
} from "@scm-manager/ui-components"; } from "@scm-manager/ui-components";
import * as validator from "../components/permissionValidation"; import * as validator from "../components/permissionValidation";
import RoleSelector from "../components/RoleSelector"; import RoleSelector from "../components/RoleSelector";
import GroupAutocomplete from "../components/GroupAutocomplete";
import UserAutocomplete from "../components/UserAutocomplete";
import AdvancedPermissionsDialog from "./AdvancedPermissionsDialog"; import AdvancedPermissionsDialog from "./AdvancedPermissionsDialog";
import { findVerbsForRole } from "../modules/permissions"; import { findVerbsForRole } from "../modules/permissions";
@@ -26,8 +27,8 @@ type Props = {
createPermission: (permission: PermissionCreateEntry) => void, createPermission: (permission: PermissionCreateEntry) => void,
loading: boolean, loading: boolean,
currentPermissions: PermissionCollection, currentPermissions: PermissionCollection,
groupAutoCompleteLink: string, groupAutocompleteLink: string,
userAutoCompleteLink: string, userAutocompleteLink: string,
// Context props // Context props
t: string => string t: string => string
@@ -68,65 +69,27 @@ class CreatePermissionForm extends React.Component<Props, State> {
}); });
}; };
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 = () => { renderAutocompletionField = () => {
const { t } = this.props; const group = this.state.groupPermission;
if (this.state.groupPermission) { if (group) {
return ( return (
<Autocomplete <GroupAutocomplete
loadSuggestions={this.loadGroupAutocompletion} groupAutocompleteLink={this.props.groupAutocompleteLink}
valueSelected={this.groupOrUserSelected} valueSelected={this.selectName}
value={this.state.value ? this.state.value : ""} value={this.state.value ? this.state.value : ""}
label={t("permission.group")}
noOptionsMessage={t("permission.autocomplete.no-group-options")}
loadingMessage={t("permission.autocomplete.loading")}
placeholder={t("permission.autocomplete.group-placeholder")}
creatable={true}
/> />
); );
} }
return ( return (
<Autocomplete <UserAutocomplete
loadSuggestions={this.loadUserAutocompletion} userAutocompleteLink={this.props.userAutocompleteLink}
valueSelected={this.groupOrUserSelected} valueSelected={this.selectName}
value={this.state.value ? this.state.value : ""} value={this.state.value ? this.state.value : ""}
label={t("permission.user")}
noOptionsMessage={t("permission.autocomplete.no-user-options")}
loadingMessage={t("permission.autocomplete.loading")}
placeholder={t("permission.autocomplete.user-placeholder")}
creatable={true}
/> />
); );
}; };
groupOrUserSelected = (value: SelectValue) => { selectName = (value: SelectValue) => {
this.setState({ this.setState({
value, value,
name: value.value.id, name: value.value.id,

View File

@@ -60,8 +60,8 @@ type Props = {
repositoryRolesLink: string, repositoryRolesLink: string,
repositoryVerbsLink: string, repositoryVerbsLink: string,
permissionsLink: string, permissionsLink: string,
groupAutoCompleteLink: string, groupAutocompleteLink: string,
userAutoCompleteLink: string, userAutocompleteLink: string,
//dispatch functions //dispatch functions
fetchAvailablePermissionsIfNeeded: ( fetchAvailablePermissionsIfNeeded: (
@@ -129,8 +129,8 @@ class Permissions extends React.Component<Props> {
repoName, repoName,
loadingCreatePermission, loadingCreatePermission,
hasPermissionToCreate, hasPermissionToCreate,
userAutoCompleteLink, userAutocompleteLink,
groupAutoCompleteLink groupAutocompleteLink
} = this.props; } = this.props;
if (error) { if (error) {
return ( return (
@@ -153,8 +153,8 @@ class Permissions extends React.Component<Props> {
createPermission={permission => this.createPermission(permission)} createPermission={permission => this.createPermission(permission)}
loading={loadingCreatePermission} loading={loadingCreatePermission}
currentPermissions={permissions} currentPermissions={permissions}
userAutoCompleteLink={userAutoCompleteLink} userAutocompleteLink={userAutocompleteLink}
groupAutoCompleteLink={groupAutoCompleteLink} groupAutocompleteLink={groupAutocompleteLink}
/> />
) : null; ) : null;
@@ -228,8 +228,8 @@ const mapStateToProps = (state, ownProps) => {
const repositoryRolesLink = getRepositoryRolesLink(state); const repositoryRolesLink = getRepositoryRolesLink(state);
const repositoryVerbsLink = getRepositoryVerbsLink(state); const repositoryVerbsLink = getRepositoryVerbsLink(state);
const permissionsLink = getPermissionsLink(state, namespace, repoName); const permissionsLink = getPermissionsLink(state, namespace, repoName);
const groupAutoCompleteLink = getGroupAutoCompleteLink(state); const groupAutocompleteLink = getGroupAutoCompleteLink(state);
const userAutoCompleteLink = getUserAutoCompleteLink(state); const userAutocompleteLink = getUserAutoCompleteLink(state);
const availablePermissions = getAvailablePermissions(state); const availablePermissions = getAvailablePermissions(state);
const availableRepositoryRoles = getAvailableRepositoryRoles(state); const availableRepositoryRoles = getAvailableRepositoryRoles(state);
const availableVerbs = getAvailableRepositoryVerbs(state); const availableVerbs = getAvailableRepositoryVerbs(state);
@@ -248,8 +248,8 @@ const mapStateToProps = (state, ownProps) => {
hasPermissionToCreate, hasPermissionToCreate,
loadingCreatePermission, loadingCreatePermission,
permissionsLink, permissionsLink,
groupAutoCompleteLink, groupAutocompleteLink,
userAutoCompleteLink userAutocompleteLink
}; };
}; };