bug6239: fix the selenium test + groupdefinitionpanel/usergroupdetailpanel remove buttons update with counter and check for update permission

This commit is contained in:
masha.kashirina
2026-04-24 16:45:32 +02:00
parent 5fc3764805
commit b60ebe01df
5 changed files with 40 additions and 24 deletions
@@ -13,6 +13,7 @@ import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.MultiSelectionModel;
import com.google.gwt.view.client.SetSelectionModel;
import com.sap.sse.common.Named;
import com.sap.sse.security.shared.HasPermissions;
@@ -108,18 +109,36 @@ public class AccessControlledButtonPanel extends Composite {
}
/**
* Adds a secured action button, which is only visible if the current user has any
* {@link UserService#hasCurrentUserPermissionToDeleteAnyObjectOfType(HasPermissions) delete permission} for the
* {@link HasPermissions type} provided in this {@link AccessControlledButtonPanel}'s constructor.
* Like {@link #addRemoveAction(String, SetSelectionModel, boolean, Command)} but for rows that are not
* {@link SecuredDTO} instances themselves — use this when the permission to remove entries is governed by a parent
* secured object (e.g. UPDATE permission on the owning {@link UserGroup}) rather than per-row permissions. The
* button is {@link Button#setEnabled(boolean) enabled} when the selection is non-empty and the current user has
* {@link DefaultActions#UPDATE UPDATE} permission on the object supplied by {@code parentSecuredObject}; it shows
* the selected count in its label.
*
* @param text
* the {@link String text} to show on the button
* @param selectionModel
* the {@link MultiSelectionModel} of the sub-table; drives the count shown in the button label and the
* enabled state
* @param parentSecuredObject
* supplies the parent {@link SecuredDTO} whose UPDATE permission gates the button; may return
* {@code null} when nothing is selected, which disables the button
* @param callback
* the {@link Command callback} to execute on button click, if permission is granted
* @return the created {@link Button} instance
*/
public Button addRemoveAction(final String text, final Command callback) {
return addAction(text, removePermissionCheck, callback);
public <T> Button addRemoveAction(final String text, final MultiSelectionModel<T> selectionModel,
final Supplier<SecuredDTO> parentSecuredObject, final Command callback) {
final Button button = resolveButtonVisibility(removePermissionCheck,
new Button(text, wrap(removePermissionCheck, callback)));
selectionModel.addSelectionChangeHandler(event -> {
final int count = selectionModel.getSelectedSet().size();
button.setText(count > 0 ? text + " (" + count + ")" : text);
button.setEnabled(count > 0 && userService.hasPermission(parentSecuredObject.get(), DefaultActions.UPDATE));
});
button.setEnabled(false);
return button;
}
/**
@@ -110,12 +110,10 @@ public class RoleDefinitionsPanel extends VerticalPanel {
this::createRoleDefinition);
createButton.ensureDebugId("CreateRoleButton");
final Button removeButton = buttonPanel.addRemoveAction(stringMessages.remove(), roleSelectionModel, true,
() -> {final String roles = String.join(", ", Util.map(getSelectedRoleDefinitions(), RoleDefinitionDTO::getName));
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(roles))) {
final Set<RoleDefinitionDTO> selectedRoles = new HashSet<>(getSelectedRoleDefinitions());
filterablePanelRoleDefinitions.removeAll(selectedRoles);
}
});
() -> {
final Set<RoleDefinitionDTO> selectedRoles = new HashSet<>(getSelectedRoleDefinitions());
filterablePanelRoleDefinitions.removeAll(selectedRoles);
});
removeButton.ensureDebugId("RemoveRoleButton");
add(buttonPanel);
add(filterablePanelRoleDefinitions);
@@ -26,6 +26,7 @@ import com.sap.sse.gwt.client.celltable.TableWrapper;
import com.sap.sse.gwt.client.panels.LabeledAbstractFilterablePanel;
import com.sap.sse.security.shared.dto.StrippedRoleDefinitionDTO;
import com.sap.sse.security.shared.dto.UserGroupDTO;
import com.sap.sse.security.shared.dto.SecuredDTO;
import com.sap.sse.security.ui.client.UserManagementWriteServiceAsync;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.AccessControlledButtonPanel;
@@ -122,9 +123,10 @@ public class GroupRoleDefinitionPanel extends Composite
}
});
addButton.ensureDebugId("AddGroupUserButton");
final Button removeButton = buttonPanel.addUpdateAction(stringMessages.removeRole(), () -> {
Pair<StrippedRoleDefinitionDTO, Boolean> selectedRole = roleDefinitionTableWrapper.getSelectionModel()
.getSelectedObject();
buttonPanel.addRemoveAction(stringMessages.removeRole(),
roleDefinitionTableWrapper.getSelectionModel(),
() -> (SecuredDTO) TableWrapper.getSingleSelectedObjectOrNull(userGroupSelectionModel), () -> {
final Pair<StrippedRoleDefinitionDTO, Boolean> selectedRole = TableWrapper.getSingleSelectedObjectOrNull(roleDefinitionTableWrapper.getSelectionModel());
if (selectedRole == null) {
Window.alert(stringMessages.youHaveToSelectAUserGroup());
} else if (Window.confirm(stringMessages.doYouReallyWantToRemoveRole(selectedRole.getA().getName()))) {
@@ -148,9 +150,6 @@ public class GroupRoleDefinitionPanel extends Composite
}
}
});
roleDefinitionTableWrapper.getSelectionModel().addSelectionChangeHandler(event -> removeButton
.setEnabled(!roleDefinitionTableWrapper.getSelectionModel().getSelectedSet().isEmpty()));
removeButton.setEnabled(false);
buttonPanel.insertWidgetAtPosition(suggestRole, 0);
return buttonPanel;
}
@@ -17,7 +17,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.dto.StrippedRoleDefinitionDTO;
@@ -31,7 +31,7 @@ import com.sap.sse.security.ui.client.i18n.StringMessages;
* Name and whether the role is enabled for all users. There is also an options to delete the group.
*/
public class RoleDefinitionTableWrapper extends
TableWrapper<Pair<StrippedRoleDefinitionDTO, Boolean>, RefreshableSingleSelectionModel<Pair<StrippedRoleDefinitionDTO, Boolean>>, StringMessages, CellTableWithCheckboxResources> {
TableWrapper<Pair<StrippedRoleDefinitionDTO, Boolean>, RefreshableMultiSelectionModel<Pair<StrippedRoleDefinitionDTO, Boolean>>, StringMessages, CellTableWithCheckboxResources> {
private final LabeledAbstractFilterablePanel<Pair<StrippedRoleDefinitionDTO, Boolean>> filterField;
private final MultiSelectionModel<UserGroupDTO> userGroupSelectionModel;
@@ -39,7 +39,7 @@ public class RoleDefinitionTableWrapper extends
public RoleDefinitionTableWrapper(UserService userService, StringMessages stringMessages,
ErrorReporter errorReporter, boolean enablePager, CellTableWithCheckboxResources tableResources,
Runnable refresher, MultiSelectionModel<UserGroupDTO> userGroupSelectionModel) {
super(stringMessages, errorReporter, false, enablePager,
super(stringMessages, errorReporter, /* multiSelection */ true, enablePager,
new EntityIdentityComparator<Pair<StrippedRoleDefinitionDTO, Boolean>>() {
@Override
public boolean representSameEntity(Pair<StrippedRoleDefinitionDTO, Boolean> dto1,
@@ -25,6 +25,7 @@ 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.shared.dto.SecuredDTO;
import com.sap.sse.security.ui.client.UserManagementWriteServiceAsync;
import com.sap.sse.security.ui.client.UserService;
import com.sap.sse.security.ui.client.component.AccessControlledButtonPanel;
@@ -97,7 +98,9 @@ public class UserGroupDetailPanel extends Composite
});
addButton.ensureDebugId("AddUserButton");
// add remove button
final Button removeButton = buttonPanel.addUpdateAction(stringMessages.actionRemove(), () -> {
buttonPanel.addRemoveAction(stringMessages.actionRemove(),
tenantUsersTable.getSelectionModel(),
() -> (SecuredDTO) TableWrapper.getSingleSelectedObjectOrNull(userGroupSelectionModel), () -> {
final Set<UserGroupDTO> selectedUserGroups = userGroupSelectionModel.getSelectedSet();
if (selectedUserGroups != null && selectedUserGroups.size() == 1) {
final UserGroupDTO selectedUserGroup = selectedUserGroups.iterator().next();
@@ -134,9 +137,6 @@ public class UserGroupDetailPanel extends Composite
}
}
});
tenantUsersTable.getSelectionModel().addSelectionChangeHandler(
event -> removeButton.setEnabled(!tenantUsersTable.getSelectionModel().getSelectedSet().isEmpty()));
removeButton.setEnabled(false);
return buttonPanel;
}