diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java index c60e302e91c..6b0ff6955a3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractLeaderboardConfigPanel.java @@ -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; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorImportProviderSelectionDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorImportProviderSelectionDialog.java index 22612c49b91..6c1c0da6ad3 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorImportProviderSelectionDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorImportProviderSelectionDialog.java @@ -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; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java index 3a6aecf130c..a54df6bbd85 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RaceLogCompetitorRegistrationDialog.java @@ -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; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ParallelExecutionCallback.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/async/ParallelExecutionCallback.java similarity index 96% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ParallelExecutionCallback.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/async/ParallelExecutionCallback.java index 60b61f437f9..95024835292 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ParallelExecutionCallback.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/async/ParallelExecutionCallback.java @@ -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 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ParallelExecutionHolder.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/async/ParallelExecutionHolder.java similarity index 96% rename from java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ParallelExecutionHolder.java rename to java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/async/ParallelExecutionHolder.java index 4db49f20120..daa66711e7e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/ParallelExecutionHolder.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/async/ParallelExecutionHolder.java @@ -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); } \ No newline at end of file diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/TableWrapper.java b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/TableWrapper.java index 7b5c0106046..3dc75c6c722 100755 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/TableWrapper.java +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/celltable/TableWrapper.java @@ -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, 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 getSingleSelectedUserGroup(MultiSelectionModel selectionModel) { + return selectionModel.getSelectedSet() != null && selectionModel.getSelectedSet().size() == 1 ? + selectionModel.getSelectedSet().iterator().next() : null; + } } \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java index deff635a994..a84c8a7afa2 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupManagementPanel.java @@ -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 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 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 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() { - @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> 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> 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 additionalPermissions, ErrorReporter errorReporter, CellTableWithCheckboxResources tableResources) { + final UserManagementServiceAsync userManagementService, UserService userService, + Iterable 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; } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java index f19a415b7ab..e6c6ceeee61 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/UserGroupTableWrapper.java @@ -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, StringMessages, CellTableWithCheckboxResources> { + TableWrapper, StringMessages, CellTableWithCheckboxResources> { private final LabeledAbstractFilterablePanel filterField; private final UserService userService; public UserGroupTableWrapper(UserService userService, Iterable additionalPermissions, StringMessages stringMessages, ErrorReporter errorReporter, boolean enablePager, CellTableWithCheckboxResources tableResources, Runnable refresher) { - super(stringMessages, errorReporter, false, enablePager, new EntityIdentityComparator() { + super(stringMessages, errorReporter, /* multi selection */ true, enablePager, new EntityIdentityComparator() { @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 userColumnListHandler = getColumnSortHandler(); - - // users table + // user groups table final TextColumn userGroupUUidColumn = new AbstractSortableTextColumn( group -> group.getId() == null ? "" : group.getId().toString(), userColumnListHandler); - final TextColumn UserGroupWithSecurityDTONameColumn = new AbstractSortableTextColumn( UserGroupDTO -> UserGroupDTO.getName(), userColumnListHandler); - final HasPermissions type = SecuredSecurityTypes.USER_GROUP; final AccessControlledActionsColumn actionColumn = create( new DefaultActionsImagesBarCell(stringMessages), userService); diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java index d4c8e25908f..966935515f4 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/RoleDefinitionTableWrapper.java @@ -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, RefreshableSingleSelectionModel>, StringMessages, CellTableWithCheckboxResources> { private final LabeledAbstractFilterablePanel> filterField; - private final SingleSelectionModel userGroupSelectionModel; + private final MultiSelectionModel userGroupSelectionModel; public RoleDefinitionTableWrapper(UserService userService, Iterable additionalPermissions, StringMessages stringMessages, ErrorReporter errorReporter, boolean enablePager, CellTableWithCheckboxResources tableResources, Runnable refresher, - SingleSelectionModel userGroupSelectionModel) { + MultiSelectionModel userGroupSelectionModel) { super(stringMessages, errorReporter, false, enablePager, new EntityIdentityComparator>() { @Override @@ -64,9 +64,9 @@ public class RoleDefinitionTableWrapper extends dto -> dto.getA().getName(), userColumnListHandler); final AccessControlledActionsColumn, 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()); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java index 06cc970e648..c18bacd8a0e 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/roles/UserGroupRoleDefinitionPanel.java @@ -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 userGroupSelectionModel; + private final MultiSelectionModel 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 additionalPermissions, ErrorReporter errorReporter, CellTableWithCheckboxResources tableResources, - final SingleSelectionModel userGroupSelectionModel, + final MultiSelectionModel 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() { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java index cadf6964469..f59f9f29049 100755 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupDetailPanel.java @@ -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 userGroupSelectionModel; + private final MultiSelectionModel userGroupSelectionModel; private final UserGroupUsersTableWrapper tenantUsersTable; private final TenantUsersListDataProvider tenantUsersListDataProvider; private UserGroupSuggestOracle oracle; private class TenantUsersListDataProvider extends AbstractDataProvider { - private final TextBox filterBox; private TenantUsersListDataProvider(TextBox filterBox) { @@ -63,14 +63,20 @@ public class UserGroupDetailPanel extends Composite @Override protected void onRangeChanged(HasData display) { - final UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject(); + final Set selectedUserGroups = userGroupSelectionModel.getSelectedSet(); + final UserGroupDTO selectedUserGroup; + if (selectedUserGroups != null && selectedUserGroups.size() == 1) { + selectedUserGroup = selectedUserGroups.iterator().next(); + } else { + selectedUserGroup = null; + } final List result = new ArrayList<>(); final List 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 refreshableSelectionModel, + public UserGroupDetailPanel(MultiSelectionModel 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() { - - @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() { + @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 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() { - @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 selectedUserGroups = userGroupSelectionModel.getSelectedSet(); + if (selectedUserGroups != null && selectedUserGroups.size() == 1) { + final UserGroupDTO selectedUserGroup = selectedUserGroups.iterator().next(); + Set 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() { + @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 getSelectedUserGroupUsernames() { - final UserGroupDTO tenant = userGroupSelectionModel.getSelectedObject(); - return tenant == null ? Collections.emptyList() - : Util.asList(tenant.getUsers()).stream().map(StrippedUserDTO::getName).collect(Collectors.toList()); + final List 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; } } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupUsersTableWrapper.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupUsersTableWrapper.java index 3900d36e5cc..d0aa087da3f 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupUsersTableWrapper.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/component/usergroup/users/UserGroupUsersTableWrapper.java @@ -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 userGroupSelectionModel, Runnable refresher) { + MultiSelectionModel userGroupSelectionModel, Runnable refresher) { super(stringMessages, errorReporter, true, true, new EntityIdentityComparator() { @Override public boolean representSameEntity(StrippedUserDTO user1, StrippedUserDTO user2) { @@ -41,38 +41,38 @@ public class UserGroupUsersTableWrapper extends StrippedUserDTO::getName, getColumnSortHandler()); final AccessControlledActionsColumn 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() { - @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() { + @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); } - } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java index 85aca163136..bdc239b90c3 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/usermanagement/UserManagementPanel.java @@ -132,20 +132,16 @@ public class UserManagementPanel 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); }