enable multi-selection in UserGroup table in AdminConsole

This commit is contained in:
Axel Uhl committed 2020-03-09 15:05:55 +01:00
1 parent b295e80344
commit 90fa548bd5
13 files changed
+189 -167

No files matched your search

@@ -40,8 +40,6 @@ import com.sap.sailing.domain.common.orc.ImpliedWindSource;
import com.sap.sailing.gwt.ui.adminconsole.RaceColumnInLeaderboardDialog.RaceColumnDescriptor;
import com.sap.sailing.gwt.ui.client.LeaderboardsDisplayer;
import com.sap.sailing.gwt.ui.client.LeaderboardsRefresher;
import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback;
import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder;
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.RegattasDisplayer;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
@@ -58,6 +56,8 @@ import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.Notification;
import com.sap.sse.gwt.client.Notification.NotificationType;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionHolder;
import com.sap.sse.gwt.client.celltable.FlushableCellTable;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
@@ -17,14 +17,14 @@ import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.base.CompetitorAndBoatStore;
import com.sap.sailing.domain.common.CompetitorDescriptor;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback;
import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.CompetitorProviderDTO;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionHolder;
import com.sap.sse.gwt.client.controls.busyindicator.BusyDisplay;
import com.sap.sse.gwt.client.controls.busyindicator.BusyIndicator;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
@@ -22,11 +22,11 @@ import com.sap.sailing.domain.common.dto.CompetitorAndBoatDTO;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.domain.common.dto.CompetitorWithToolTipDTO;
import com.sap.sailing.domain.common.dto.FleetDTO;
import com.sap.sailing.gwt.ui.client.ParallelExecutionCallback;
import com.sap.sailing.gwt.ui.client.ParallelExecutionHolder;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.ParallelExecutionCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionHolder;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
import com.sap.sse.security.ui.client.UserService;
@@ -1,7 +1,6 @@
package com.sap.sailing.gwt.ui.client;
package com.sap.sse.gwt.client.async;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
/**
* The class is used together with the {@link ParallelExecutionHolder} when two or more asynchronous service calls
@@ -1,4 +1,4 @@
package com.sap.sailing.gwt.ui.client;
package com.sap.sse.gwt.client.async;
import com.google.gwt.user.client.rpc.AsyncCallback;
@@ -42,12 +42,12 @@ public abstract class ParallelExecutionHolder {
}
/**
* Called only when all parallel callbacks have been completed.
* Called only when all parallel callbacks have been completed successfully
*/
protected abstract void handleSuccess();
/**
* Called when one of the parallel callbacks has returned with a failure.
* Called when one of the parallel callbacks has returned with a failure
*/
protected abstract void handleFailure(Throwable t);
}
@@ -9,6 +9,7 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.HasRows;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.Range;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
@@ -156,4 +157,13 @@ public abstract class TableWrapper<T, S extends RefreshableSelectionModel<T>, SM
protected TR getTableRes() {
return tableRes;
}
/**
* @return {@code null} if no or multiple objects are currently selected; the single selected object otherwise; this
* can be useful if certain actions are enabled with this table only if a single object is selected.
*/
public static <X> X getSingleSelectedUserGroup(MultiSelectionModel<X> selectionModel) {
return selectionModel.getSelectedSet() != null && selectionModel.getSelectedSet().size() == 1 ?
selectionModel.getSelectedSet().iterator().next() : null;
}
}
@@ -2,8 +2,13 @@ package com.sap.sse.security.ui.client.component;
import static com.sap.sse.security.shared.impl.SecuredSecurityTypes.USER_GROUP;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -11,8 +16,13 @@ import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.ParallelExecutionCallback;
import com.sap.sse.gwt.client.async.ParallelExecutionHolder;
import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources;
import com.sap.sse.gwt.client.celltable.RefreshableSelectionModel;
import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.dto.UserGroupDTO;
@@ -39,64 +49,74 @@ public class UserGroupManagementPanel extends Composite {
CellTableWithCheckboxResources tableResources) {
final UserManagementServiceAsync userManagementService = userService.getUserManagementService();
final VerticalPanel mainPanel = new VerticalPanel();
mainPanel.add(createButtonPanel(userService, stringMessages, userManagementService));
userGroupListDataProvider = new UserGroupListDataProvider(userManagementService, new TextBox());
userGroupTableWrapper = new UserGroupTableWrapper(userService, additionalPermissions, stringMessages,
errorReporter, /* enablePager */ true, tableResources, () -> updateUserGroups());
mainPanel.add(createButtonPanel(userService, stringMessages, userManagementService, userGroupTableWrapper.getSelectionModel()));
final LabeledAbstractFilterablePanel<UserGroupDTO> userGroupfilterBox = userGroupTableWrapper.getFilterField();
userGroupfilterBox.getElement().setPropertyString("placeholder", stringMessages.filterUserGroups());
mainPanel.add(userGroupfilterBox);
mainPanel.add(new ScrollPanel(userGroupTableWrapper.asWidget()));
mainPanel.add(createUserGroupDetailsPanel(stringMessages, userManagementService,
userService, additionalPermissions, errorReporter, tableResources));
initWidget(mainPanel);
}
/** Creates the button bar with add/remove/refresh buttons. */
/** Creates the button bar with add/remove/refresh buttons.
* @param userGroupSelectionModel */
private Widget createButtonPanel(final UserService userService, final StringMessages stringMessages,
final UserManagementServiceAsync userManagementService) {
final UserManagementServiceAsync userManagementService, RefreshableSelectionModel<UserGroupDTO> userGroupSelectionModel) {
final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, USER_GROUP);
buttonPanel.addUnsecuredAction(stringMessages.refresh(), () -> updateUserGroups());
buttonPanel.addCreateActionWithoutServerCreateObjectPermissionCheck(stringMessages.createUserGroup(),
() -> new CreateUserGroupDialog(stringMessages,
userService, userManagementService, userGroupListDataProvider, () -> updateUserGroups()).show());
buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> {
UserGroupDTO userGroup = userGroupTableWrapper.getSelectionModel().getSelectedObject();
if (userGroup == null) {
final Button removeButton = buttonPanel.addRemoveAction(stringMessages.removeUserGroup(), () -> {
Set<UserGroupDTO> userGroups = userGroupTableWrapper.getSelectionModel().getSelectedSet();
if (userGroups == null || userGroups.isEmpty()) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
} else if (Window.confirm(stringMessages.doYouReallyWantToRemoveUserGroup(userGroup.getName()))) {
userManagementService.deleteUserGroup(userGroup.getId().toString(), new AsyncCallback<SuccessInfo>() {
@Override
public void onSuccess(SuccessInfo result) {
userGroupListDataProvider.updateDisplays();
Window.alert(result.getMessage());
updateUserGroups();
} else {
final String userGroupNames = String.join(", ", Util.map(userGroups, g->g.getName()));
if (Window.confirm(stringMessages.doYouReallyWantToRemoveUserGroup(userGroupNames))) {
final Map<UserGroupDTO, ParallelExecutionCallback<SuccessInfo>> callbacks = new HashMap<>();
for (final UserGroupDTO userGroup : userGroups) {
callbacks.put(userGroup, new ParallelExecutionCallback<>());
}
new ParallelExecutionHolder(callbacks.values().toArray(new ParallelExecutionCallback<?>[0])) {
@Override
public void handleSuccess() {
userGroupListDataProvider.updateDisplays();
Window.alert(stringMessages.successMessageRemovedUserGroup(userGroupNames));
updateUserGroups();
}
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotDeleteUserGroup());
@Override
public void handleFailure(Throwable caught) {
Window.alert(stringMessages.couldNotDeleteUserGroup());
}
};
for (final Entry<UserGroupDTO, ParallelExecutionCallback<SuccessInfo>> groupAndCallback : callbacks.entrySet()) {
userManagementService.deleteUserGroup(groupAndCallback.getKey().getId().toString(), groupAndCallback.getValue());
}
});
}
}
});
userGroupSelectionModel.addSelectionChangeHandler(event -> {
removeButton.setText(stringMessages.remove() + " (" + userGroupSelectionModel.getSelectedSet().size() + ")");
removeButton.setEnabled(userGroupSelectionModel.getSelectedSet().size() >= 1);
});
return buttonPanel;
}
/** Creates the UserGroupDetailsPanel which contains details about the selected user group
* @param userService
* @param additionalPermissions
* @param errorReporter
* @param tableResources */
/**
* Creates the UserGroupDetailsPanel which contains details about the selected user group
*/
private HorizontalPanel createUserGroupDetailsPanel(final StringMessages stringMessages,
final UserManagementServiceAsync userManagementService, UserService userService, Iterable<HasPermissions> additionalPermissions, ErrorReporter errorReporter, CellTableWithCheckboxResources tableResources) {
final UserManagementServiceAsync userManagementService, UserService userService,
Iterable<HasPermissions> additionalPermissions, ErrorReporter errorReporter,
CellTableWithCheckboxResources tableResources) {
userGroupDetailPanel = new UserGroupDetailPanel(userGroupTableWrapper.getSelectionModel(),
userGroupListDataProvider, userService, stringMessages, errorReporter, tableResources);
userGroupRoleDefinitionPanel = new UserGroupRoleDefinitionPanel(userService,
stringMessages, additionalPermissions, errorReporter, tableResources,
userGroupTableWrapper.getSelectionModel(), userGroupListDataProvider);
@@ -116,7 +136,7 @@ public class UserGroupManagementPanel extends Composite {
listsWrapper.add(roleCaption);
listsWrapper.setVisible(false);
userGroupTableWrapper.getSelectionModel().addSelectionChangeHandler(
h -> listsWrapper.setVisible(userGroupTableWrapper.getSelectionModel().getSelectedObject() != null));
h -> listsWrapper.setVisible(TableWrapper.getSingleSelectedUserGroup(userGroupTableWrapper.getSelectionModel()) != null));
return listsWrapper;
}
@@ -18,7 +18,7 @@ import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.AbstractSortableTextColumn;
import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
import com.sap.sse.gwt.client.celltable.RefreshableSingleSelectionModel;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
@@ -36,14 +36,14 @@ import com.sap.sse.security.ui.shared.SuccessInfo;
* associated ACL.
*/
public class UserGroupTableWrapper extends
TableWrapper<UserGroupDTO, RefreshableSingleSelectionModel<UserGroupDTO>, StringMessages, CellTableWithCheckboxResources> {
TableWrapper<UserGroupDTO, RefreshableMultiSelectionModel<UserGroupDTO>, StringMessages, CellTableWithCheckboxResources> {
private final LabeledAbstractFilterablePanel<UserGroupDTO> filterField;
private final UserService userService;
public UserGroupTableWrapper(UserService userService, Iterable<HasPermissions> additionalPermissions,
StringMessages stringMessages, ErrorReporter errorReporter, boolean enablePager,
CellTableWithCheckboxResources tableResources, Runnable refresher) {
super(stringMessages, errorReporter, false, enablePager, new EntityIdentityComparator<UserGroupDTO>() {
super(stringMessages, errorReporter, /* multi selection */ true, enablePager, new EntityIdentityComparator<UserGroupDTO>() {
@Override
public boolean representSameEntity(UserGroupDTO dto1, UserGroupDTO dto2) {
return dto1.getId().toString().equals(dto2.getId().toString());
@@ -56,14 +56,11 @@ public class UserGroupTableWrapper extends
}, tableResources);
this.userService = userService;
final ListHandler<UserGroupDTO> userColumnListHandler = getColumnSortHandler();
// users table
// user groups table
final TextColumn<UserGroupDTO> userGroupUUidColumn = new AbstractSortableTextColumn<UserGroupDTO>(
group -> group.getId() == null ? "<null>" : group.getId().toString(), userColumnListHandler);
final TextColumn<UserGroupDTO> UserGroupWithSecurityDTONameColumn = new AbstractSortableTextColumn<UserGroupDTO>(
UserGroupDTO -> UserGroupDTO.getName(), userColumnListHandler);
final HasPermissions type = SecuredSecurityTypes.USER_GROUP;
final AccessControlledActionsColumn<UserGroupDTO, DefaultActionsImagesBarCell> actionColumn = create(
new DefaultActionsImagesBarCell(stringMessages), userService);
@@ -11,7 +11,7 @@ import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.MultiSelectionModel;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.AbstractSortableTextColumn;
@@ -35,12 +35,12 @@ public class RoleDefinitionTableWrapper extends
TableWrapper<Pair<StrippedRoleDefinitionDTO, Boolean>, RefreshableSingleSelectionModel<Pair<StrippedRoleDefinitionDTO, Boolean>>, StringMessages, CellTableWithCheckboxResources> {
private final LabeledAbstractFilterablePanel<Pair<StrippedRoleDefinitionDTO, Boolean>> filterField;
private final SingleSelectionModel<UserGroupDTO> userGroupSelectionModel;
private final MultiSelectionModel<UserGroupDTO> userGroupSelectionModel;
public RoleDefinitionTableWrapper(UserService userService, Iterable<HasPermissions> additionalPermissions,
StringMessages stringMessages, ErrorReporter errorReporter, boolean enablePager,
CellTableWithCheckboxResources tableResources, Runnable refresher,
SingleSelectionModel<UserGroupDTO> userGroupSelectionModel) {
MultiSelectionModel<UserGroupDTO> userGroupSelectionModel) {
super(stringMessages, errorReporter, false, enablePager,
new EntityIdentityComparator<Pair<StrippedRoleDefinitionDTO, Boolean>>() {
@Override
@@ -64,9 +64,9 @@ public class RoleDefinitionTableWrapper extends
dto -> dto.getA().getName(), userColumnListHandler);
final AccessControlledActionsColumn<Pair<StrippedRoleDefinitionDTO, Boolean>, RoleDefinitionImagesBarCell> actionsColumn = AccessControlledActionsColumn
.create(new RoleDefinitionImagesBarCell(stringMessages), userService,
role -> userGroupSelectionModel.getSelectedObject());
role -> TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel));
actionsColumn.addAction(RoleDefinitionImagesBarCell.ACTION_UPDATE, UPDATE, rolePair -> {
final UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject();
final UserGroupDTO selectedObject = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
final boolean value = !rolePair.getB().booleanValue();
if (selectedObject != null) {
userService.getUserManagementService().putRoleDefintionToUserGroup(selectedObject.getId().toString(),
@@ -87,7 +87,7 @@ public class RoleDefinitionTableWrapper extends
});
actionsColumn.addAction(RoleDefinitionImagesBarCell.ACTION_DELETE, UPDATE, rolePair -> {
final UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject();
final UserGroupDTO selectedObject = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (selectedObject != null) {
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(rolePair.getA().getName()))) {
userService.getUserManagementService().removeRoleDefinitionFromUserGroup(
@@ -152,7 +152,7 @@ public class RoleDefinitionTableWrapper extends
}
public void refreshRoleList() {
UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject();
UserGroupDTO selectedObject = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (selectedObject != null) {
filterField.updateAll(selectedObject.getRoleDefinitions());
}
@@ -16,12 +16,13 @@ import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources;
import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.HasPermissions;
import com.sap.sse.security.shared.dto.StrippedRoleDefinitionDTO;
@@ -37,7 +38,7 @@ public class UserGroupRoleDefinitionPanel extends Composite
implements Handler, ChangeHandler, KeyUpHandler, UserGroupListDataProviderChangeHandler {
private final RoleDefinitionTableWrapper roleDefinitionTableWrapper;
private final SingleSelectionModel<UserGroupDTO> userGroupSelectionModel;
private final MultiSelectionModel<UserGroupDTO> userGroupSelectionModel;
private final SuggestBox suggestRole;
private final UserGroupRoleResources userGroupRoleResources = GWT.create(UserGroupRoleResources.class);
private final RoleDefinitionSuggestOracle oracle;
@@ -45,29 +46,25 @@ public class UserGroupRoleDefinitionPanel extends Composite
public UserGroupRoleDefinitionPanel(final UserService userService, final StringMessages stringMessages,
Iterable<HasPermissions> additionalPermissions, ErrorReporter errorReporter,
CellTableWithCheckboxResources tableResources,
final SingleSelectionModel<UserGroupDTO> userGroupSelectionModel,
final MultiSelectionModel<UserGroupDTO> userGroupSelectionModel,
UserGroupListDataProvider userGroupListDataProvider) {
this.userGroupSelectionModel = userGroupSelectionModel;
final VerticalPanel mainPanel = new VerticalPanel();
oracle = new RoleDefinitionSuggestOracle(userService.getUserManagementService(), stringMessages);
suggestRole = new SuggestBox(
oracle);
userGroupRoleResources.css().ensureInjected();
suggestRole.addStyleName(userGroupRoleResources.css().roleDefinitionSuggest());
suggestRole.getElement().setPropertyString("placeholder", stringMessages.enterRoleName());
// create UserGroup Table
userGroupListDataProvider.addChangeHandler(this);
roleDefinitionTableWrapper = new RoleDefinitionTableWrapper(userService, additionalPermissions, stringMessages,
errorReporter, /* enablePager */ true, tableResources, () -> updateUserGroups(),
userGroupSelectionModel);
// create button bar
final Widget buttonPanel = createButtonPanel(userService, stringMessages);
this.userGroupSelectionModel.addSelectionChangeHandler(event -> {
final UserGroupDTO selectedUserGroup = this.userGroupSelectionModel.getSelectedObject();
final UserGroupDTO selectedUserGroup = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
buttonPanel.setVisible(userService.hasPermission(selectedUserGroup, UPDATE));
});
mainPanel.add(buttonPanel);
@@ -90,7 +87,7 @@ public class UserGroupRoleDefinitionPanel extends Composite
* has changed.
*/
private void updateOracle() {
UserGroupDTO selectedObject = this.userGroupSelectionModel.getSelectedObject();
UserGroupDTO selectedObject = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (selectedObject != null) {
((RoleDefinitionSuggestOracle) suggestRole.getSuggestOracle())
.resetAndRemoveExistingRoles(selectedObject.getRoleDefinitionMap().keySet());
@@ -106,7 +103,7 @@ public class UserGroupRoleDefinitionPanel extends Composite
final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, USER_GROUP);
final UserManagementServiceAsync userManagementService = userService.getUserManagementService();
buttonPanel.addUpdateAction(stringMessages.addRole(), () -> {
final UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject();
final UserGroupDTO selectedObject = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (selectedObject != null) {
StrippedRoleDefinitionDTO role = ((RoleDefinitionSuggestOracle) suggestRole.getSuggestOracle())
.fromString(suggestRole.getValue());
@@ -136,7 +133,7 @@ public class UserGroupRoleDefinitionPanel extends Composite
if (selectedRole == null) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
} else if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(selectedRole.getA().getName()))) {
UserGroupDTO selectedObject = userGroupSelectionModel.getSelectedObject();
UserGroupDTO selectedObject = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (selectedObject != null) {
userManagementService.removeRoleDefinitionFromUserGroup(selectedObject.getId().toString(),
selectedRole.getA().getId().toString(), new AsyncCallback<Void>() {
@@ -27,13 +27,14 @@ import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.AbstractDataProvider;
import com.google.gwt.view.client.HasData;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.Range;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.CellTableWithCheckboxResources;
import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.security.shared.dto.StrippedUserDTO;
import com.sap.sse.security.shared.dto.UserGroupDTO;
import com.sap.sse.security.ui.client.UserManagementServiceAsync;
@@ -47,14 +48,13 @@ public class UserGroupDetailPanel extends Composite
implements Handler, ChangeHandler, KeyUpHandler, UserGroupListDataProviderChangeHandler {
private final UserGroupUserResources userGroupUserResources = GWT.create(UserGroupUserResources.class);
private final SingleSelectionModel<UserGroupDTO> userGroupSelectionModel;
private final MultiSelectionModel<UserGroupDTO> userGroupSelectionModel;
private final UserGroupUsersTableWrapper tenantUsersTable;
private final TenantUsersListDataProvider tenantUsersListDataProvider;
private UserGroupSuggestOracle oracle;
private class TenantUsersListDataProvider extends AbstractDataProvider<StrippedUserDTO> {
private final TextBox filterBox;
private TenantUsersListDataProvider(TextBox filterBox) {
@@ -63,14 +63,20 @@ public class UserGroupDetailPanel extends Composite
@Override
protected void onRangeChanged(HasData<StrippedUserDTO> display) {
final UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject();
final Set<UserGroupDTO> selectedUserGroups = userGroupSelectionModel.getSelectedSet();
final UserGroupDTO selectedUserGroup;
if (selectedUserGroups != null && selectedUserGroups.size() == 1) {
selectedUserGroup = selectedUserGroups.iterator().next();
} else {
selectedUserGroup = null;
}
final List<StrippedUserDTO> result = new ArrayList<>();
final List<StrippedUserDTO> show = new ArrayList<>();
final Range range = display.getVisibleRange();
int start = range.getStart();
int end = range.getStart() + range.getLength();
if (tenant != null) {
for (final StrippedUserDTO user : tenant.getUsers()) {
if (selectedUserGroup != null) {
for (final StrippedUserDTO user : selectedUserGroup.getUsers()) {
if (user.getName().contains(filterBox.getText())) {
result.add(user);
}
@@ -79,7 +85,6 @@ public class UserGroupDetailPanel extends Composite
final StrippedUserDTO username = result.get(i);
show.add(username);
}
}
updateRowData(start, show);
updateRowCount(result.size(), true);
@@ -90,11 +95,10 @@ public class UserGroupDetailPanel extends Composite
}
}
public UserGroupDetailPanel(SingleSelectionModel<UserGroupDTO> refreshableSelectionModel,
public UserGroupDetailPanel(MultiSelectionModel<UserGroupDTO> refreshableSelectionModel,
UserGroupListDataProvider tenantListDataProvider, UserService userService, StringMessages stringMessages,
ErrorReporter errorReporter, CellTableWithCheckboxResources tableResources) {
userGroupUserResources.css().ensureInjected();
// setup filter
final HorizontalPanel filterPanel = new HorizontalPanel();
filterPanel.setSpacing(5);
@@ -103,32 +107,25 @@ public class UserGroupDetailPanel extends Composite
filterBox.addChangeHandler(this);
filterBox.addKeyUpHandler(this);
final Label labelFilter = new Label(stringMessages.filterUsers());
filterPanel.add(labelFilter);
filterPanel.add(filterBox);
refreshableSelectionModel.addSelectionChangeHandler(this);
this.userGroupSelectionModel = refreshableSelectionModel;
tenantListDataProvider.addChangeHandler(this);
this.tenantUsersTable = new UserGroupUsersTableWrapper(stringMessages, errorReporter, tableResources,
userService, userGroupSelectionModel, () -> updateUserList());
tenantUsersListDataProvider = new TenantUsersListDataProvider(filterBox);
tenantUsersListDataProvider.addDataDisplay(tenantUsersTable.getTable());
// add buttons, filter and listbox to panel
final VerticalPanel addUserToGroupPanel = new VerticalPanel();
final Widget buttonPanel = createButtonPanel(userService, stringMessages);
this.userGroupSelectionModel.addSelectionChangeHandler(event -> {
final UserGroupDTO selectedUserGroup = this.userGroupSelectionModel.getSelectedObject();
buttonPanel.setVisible(userService.hasPermission(selectedUserGroup, UPDATE));
buttonPanel.setVisible(userService.hasPermission(TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel), UPDATE));
});
addUserToGroupPanel.add(buttonPanel);
addUserToGroupPanel.add(filterPanel);
// addUserToGroupPanel.add(tenantUsersPanelCaption);
addUserToGroupPanel.add(tenantUsersTable);
initWidget(addUserToGroupPanel);
}
@@ -141,67 +138,68 @@ public class UserGroupDetailPanel extends Composite
final SuggestBox suggestUser = new SuggestBox(oracle);
suggestUser.addStyleName(userGroupUserResources.css().userDefinitionSuggest());
suggestUser.getElement().setPropertyString("placeholder", stringMessages.enterUsername());
// add suggest
buttonPanel.insertWidgetAtPosition(suggestUser, 0);
// add add button
buttonPanel.addUpdateAction(stringMessages.addUser(), () -> {
final String selectedUsername = suggestUser.getValue();
if (!getSelectedUserGroupUsernames().contains(selectedUsername)) {
final UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject();
userManagementService.addUserToUserGroup(tenant.getId().toString(), selectedUsername,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotAddUserToUserGroup(selectedUsername,
tenant.getName(), caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
tenant.add(new StrippedUserDTO(selectedUsername));
updateUserList();
suggestUser.setText("");
}
});
final UserGroupDTO selectedUserGroup = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (selectedUserGroup != null) {
userManagementService.addUserToUserGroup(selectedUserGroup.getId().toString(), selectedUsername,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotAddUserToUserGroup(selectedUsername,
selectedUserGroup.getName(), caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
selectedUserGroup.add(new StrippedUserDTO(selectedUsername));
updateUserList();
suggestUser.setText("");
}
});
}
}
});
// add remove button
final Button removeButton = buttonPanel.addUpdateAction(stringMessages.actionRemove(), () -> {
UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject();
Set<StrippedUserDTO> users = tenantUsersTable.getSelectionModel().getSelectedSet();
if (tenant == null) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
return;
}
for (StrippedUserDTO user : users) {
final String username = user.getName();
userManagementService.removeUserFromUserGroup(tenant.getId().toString(), username,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotRemoveUserFromUserGroup(username, tenant.getName(),
caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
StrippedUserDTO userToRemoveFromTenant = null;
for (final StrippedUserDTO userInTenant : tenant.getUsers()) {
if (Util.equalsWithNull(userInTenant.getName(), username)) {
userToRemoveFromTenant = userInTenant;
break;
final Set<UserGroupDTO> selectedUserGroups = userGroupSelectionModel.getSelectedSet();
if (selectedUserGroups != null && selectedUserGroups.size() == 1) {
final UserGroupDTO selectedUserGroup = selectedUserGroups.iterator().next();
Set<StrippedUserDTO> users = tenantUsersTable.getSelectionModel().getSelectedSet();
if (selectedUserGroups == null || selectedUserGroups.isEmpty()) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
return;
}
for (StrippedUserDTO user : users) {
final String username = user.getName();
userManagementService.removeUserFromUserGroup(selectedUserGroup.getId().toString(), username,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotRemoveUserFromUserGroup(username, selectedUserGroup.getName(),
caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
StrippedUserDTO userToRemoveFromTenant = null;
for (final StrippedUserDTO userInTenant : selectedUserGroup.getUsers()) {
if (Util.equalsWithNull(userInTenant.getName(), username)) {
userToRemoveFromTenant = userInTenant;
break;
}
}
if (userToRemoveFromTenant != null) {
selectedUserGroup.remove(userToRemoveFromTenant);
}
updateUserList();
}
if (userToRemoveFromTenant != null) {
tenant.remove(userToRemoveFromTenant);
}
updateUserList();
}
});
});
}
}
});
tenantUsersTable.getSelectionModel().addSelectionChangeHandler(
@@ -240,8 +238,13 @@ public class UserGroupDetailPanel extends Composite
}
private List<String> getSelectedUserGroupUsernames() {
final UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject();
return tenant == null ? Collections.emptyList()
: Util.asList(tenant.getUsers()).stream().map(StrippedUserDTO::getName).collect(Collectors.toList());
final List<String> result;
final UserGroupDTO tenant = TableWrapper.getSingleSelectedUserGroup(userGroupSelectionModel);
if (tenant != null) {
result = Util.asList(tenant.getUsers()).stream().map(StrippedUserDTO::getName).collect(Collectors.toList());
} else {
result = Collections.emptyList();
}
return result;
}
}
@@ -5,7 +5,7 @@ import static com.sap.sse.security.shared.HasPermissions.DefaultActions.UPDATE;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.view.client.SingleSelectionModel;
import com.google.gwt.view.client.MultiSelectionModel;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.AbstractSortableTextColumn;
@@ -24,7 +24,7 @@ public class UserGroupUsersTableWrapper extends
public UserGroupUsersTableWrapper(StringMessages stringMessages, ErrorReporter errorReporter,
CellTableWithCheckboxResources tableResources, UserService userService,
SingleSelectionModel<UserGroupDTO> userGroupSelectionModel, Runnable refresher) {
MultiSelectionModel<UserGroupDTO> userGroupSelectionModel, Runnable refresher) {
super(stringMessages, errorReporter, true, true, new EntityIdentityComparator<StrippedUserDTO>() {
@Override
public boolean representSameEntity(StrippedUserDTO user1, StrippedUserDTO user2) {
@@ -41,38 +41,38 @@ public class UserGroupUsersTableWrapper extends
StrippedUserDTO::getName, getColumnSortHandler());
final AccessControlledActionsColumn<StrippedUserDTO, UserGroupUsersImagesBarCell> actionColumns = AccessControlledActionsColumn
.create(new UserGroupUsersImagesBarCell(stringMessages), userService,
user -> userGroupSelectionModel.getSelectedObject());
user -> getSingleSelectedUserGroup(userGroupSelectionModel));
actionColumns.addAction(UserGroupUsersImagesBarCell.ACTION_DELETE, UPDATE, user -> {
final UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject();
final String username = user.getName();
userService.getUserManagementService().removeUserFromUserGroup(tenant.getId().toString(), username,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotRemoveUserFromUserGroup(username, tenant.getName(),
caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
StrippedUserDTO userToRemoveFromTenant = null;
for (final StrippedUserDTO userInTenant : tenant.getUsers()) {
if (Util.equalsWithNull(userInTenant.getName(), username)) {
userToRemoveFromTenant = userInTenant;
break;
final UserGroupDTO tenant = getSingleSelectedUserGroup(userGroupSelectionModel);
if (tenant != null) {
final String username = user.getName();
userService.getUserManagementService().removeUserFromUserGroup(tenant.getId().toString(), username,
new AsyncCallback<Void>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotRemoveUserFromUserGroup(username, tenant.getName(),
caught.getMessage()));
}
@Override
public void onSuccess(Void result) {
StrippedUserDTO userToRemoveFromTenant = null;
for (final StrippedUserDTO userInTenant : tenant.getUsers()) {
if (Util.equalsWithNull(userInTenant.getName(), username)) {
userToRemoveFromTenant = userInTenant;
break;
}
}
if (userToRemoveFromTenant != null) {
tenant.remove(userToRemoveFromTenant);
}
refresher.run();
}
if (userToRemoveFromTenant != null) {
tenant.remove(userToRemoveFromTenant);
}
refresher.run();
}
});
});
}
});
table.addColumn(usernameColumn, stringMessages.username());
table.addColumn(actionColumns);
}
}
@@ -132,20 +132,16 @@ public class UserManagementPanel<TR extends CellTableWithCheckboxResources> exte
}
});
updateUsers();
final HorizontalPanel detailsPanel = new HorizontalPanel();
// add details panel for user roles
userRoleDefinitionPanel = new UserRoleDefinitionPanel(userService, stringMessages,
errorReporter,
tableResources, userList.getSelectionModel(), () -> updateUsers());
detailsPanel.add(userRoleDefinitionPanel);
// add details panel for user permissions
final WildcardPermissionPanel userPermissionPanel = new WildcardPermissionPanel(userService, stringMessages,
errorReporter, tableResources, userList.getSelectionModel(), () -> updateUsers());
detailsPanel.add(userPermissionPanel);
west.add(detailsPanel);
}