mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-11 16:05:44 +01:00
fix autocompletion
This commit is contained in:
56
scm-ui/src/repos/permissions/components/GroupAutocomplete.js
Normal file
56
scm-ui/src/repos/permissions/components/GroupAutocomplete.js
Normal 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);
|
||||||
56
scm-ui/src/repos/permissions/components/UserAutocomplete.js
Normal file
56
scm-ui/src/repos/permissions/components/UserAutocomplete.js
Normal 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);
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user