}
@Test
- @Ignore("To be fixed by SONAR-8994")
public void admin_can_manage_groups() {
String orgKey = createOrganization();
userRule.createUser("foo", "pwd");
//@flow
import { getJSON, post } from '../helpers/request';
-export function searchUsersGroups(query?: string, organization?: string) {
+export function searchUsersGroups(
+ data: { f?: string, organization?: string, p?: number, ps?: number, q?: string }
+) {
const url = '/api/user_groups/search';
- const data: { q?: string, organization?: string } = {};
- if (query) {
- data.q = query;
- }
- if (organization) {
- data.organization = organization;
- }
return getJSON(url, data);
}
-export function addUserToGroup(groupId: string, login: string) {
+export function addUserToGroup(
+ data: { id?: string, name?: string, login?: string, organization?: string }
+) {
const url = '/api/user_groups/add_user';
- return post(url, { id: groupId, login });
+ return post(url, data);
}
-export function removeUserFromGroup(groupId: string, login: string) {
+export function removeUserFromGroup(
+ data: { id?: string, name?: string, login?: string, organization?: string }
+) {
const url = '/api/user_groups/remove_user';
- return post(url, { id: groupId, login });
+ return post(url, data);
}
);
};
-export const fetchOrganizationGroups = (key: string): Function =>
+export const fetchOrganizationGroups = (organization: string): Function =>
(dispatch: Function): Promise<*> => {
- return searchUsersGroups('', key).then(
+ return searchUsersGroups({ organization }).then(
response => {
- dispatch(actions.receiveOrganizationGroups(key, response.groups));
+ dispatch(actions.receiveOrganizationGroups(organization, response.groups));
},
onFail(dispatch)
);
};
export const updateOrganizationMemberGroups = (
+ organization: Organization,
member: Member,
add: Array<string>,
remove: Array<string>
) =>
(dispatch: Function) => {
+ dispatch(
+ receiveUser({
+ ...member,
+ groupCount: (member.groupCount || 0) + add.length - remove.length
+ })
+ );
const promises = [
- ...add.map(id => addUserToGroup(id, member.login)),
- ...remove.map(id => removeUserFromGroup(id, member.login))
+ ...add.map(name =>
+ addUserToGroup({ name, login: member.login, organization: organization.key })),
+ ...remove.map(name =>
+ removeUserFromGroup({ name, login: member.login, organization: organization.key }))
];
- return Promise.all(promises).then(
- () => {
- dispatch(
- receiveUser({
- ...member,
- groupCount: (member.groupCount || 0) + add.length - remove.length
- })
- );
- },
- onFail(dispatch)
- );
+ return Promise.all(promises).catch(error => {
+ dispatch(receiveUser(member));
+ onFail(dispatch)(error);
+ });
};
props: Props;
onCheck = (checked: boolean) => {
- this.props.onCheck(this.props.group.id, checked);
+ this.props.onCheck(this.props.group.name, checked);
};
toggleCheck = () => {
- this.props.onCheck(this.props.group.id, !this.props.checked);
+ this.props.onCheck(this.props.group.name, !this.props.checked);
};
render() {
addOrganizationMember: (organizationKey: string, member: Member) => void,
removeOrganizationMember: (organizationKey: string, member: Member) => void,
updateOrganizationMemberGroups: (
+ organization: Organization,
member: Member,
add: Array<string>,
remove: Array<string>
this.props.removeOrganizationMember(this.props.organization.key, member);
};
+ updateMemberGroups = (member: Member, add: Array<string>, remove: Array<string>) => {
+ this.props.updateOrganizationMemberGroups(this.props.organization, member, add, remove);
+ };
+
render() {
const { organization, status, members } = this.props;
return (
organizationGroups={this.props.organizationGroups}
organization={organization}
removeMember={this.removeMember}
- updateMemberGroups={this.props.updateOrganizationMemberGroups}
+ updateMemberGroups={this.updateMemberGroups}
/>
{status.total != null &&
<ListFooter
exports[`test should be able to toggle check 2`] = `
Array [
Array [
- "7",
+ "professionals",
false,
],
]
"name": "Foo",
}
}
- removeMember={[Function]} />
+ removeMember={[Function]}
+ updateMemberGroups={[Function]} />
<ListFooter
count={2}
loadMore={[Function]}
"name": "Foo",
}
}
- removeMember={[Function]} />
+ removeMember={[Function]}
+ updateMemberGroups={[Function]} />
<ListFooter
count={2}
loadMore={[Function]}
<div className="modal-large-field">
<label>{translate('users.search_description')}</label>
<UsersSelectSearch
+ autoFocus={true}
selectedUser={this.state.selectedMember}
excludedUsers={this.props.memberLogins}
searchUsers={searchUsers}
loadUserGroups = () => {
this.setState({ loading: true });
getUserGroups(this.props.member.login, this.props.organization.key).then(response => {
- this.setState({ loading: false, userGroups: keyBy(response.groups, 'id') });
+ this.setState({ loading: false, userGroups: keyBy(response.groups, 'name') });
});
};
- isGroupSelected = (groupId: string) => {
+ isGroupSelected = (groupName: string) => {
if (this.state.userGroups) {
- const group = this.state.userGroups[groupId] || {};
+ const group = this.state.userGroups[groupName] || {};
if (group.status) {
return group.status === 'add';
} else {
return false;
};
- onCheck = (groupId: string, checked: boolean) => {
+ onCheck = (groupName: string, checked: boolean) => {
this.setState((prevState: State) => {
const userGroups = prevState.userGroups || {};
- const group = userGroups[groupId] || {};
+ const group = userGroups[groupName] || {};
let status = '';
if (group.selected && !checked) {
status = 'remove';
} else if (!group.selected && checked) {
status = 'add';
}
- return { userGroups: { ...userGroups, [groupId]: { ...group, status } } };
+ return { userGroups: { ...userGroups, [groupName]: { ...group, status } } };
});
};
<OrganizationGroupCheckbox
key={group.id}
group={group}
- checked={this.isGroupSelected(group.id)}
+ checked={this.isGroupSelected(group.name)}
onCheck={this.onCheck}
/>
))}
users.search_description
</label>
<UsersSelectSearch
+ autoFocus={true}
excludedUsers={
Array [
"admin",
};
type Props = {
- selectedUser?: Option,
+ autoFocus?: boolean,
excludedUsers: Array<string>,
+ handleValueChange: (Option) => void,
searchUsers: (string, number) => Promise<*>,
- handleValueChange: (Option) => void
+ selectedUser?: Option
};
type State = {
- searchResult: Array<Option>,
isLoading: boolean,
- search: string
+ search: string,
+ searchResult: Array<Option>
};
const LIST_SIZE = 10;
: translate('no_results');
return (
<Select
+ autofocus={this.props.autoFocus}
className="Select-big"
options={this.state.searchResult}
isLoading={this.state.isLoading}