modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java | 296 ++++++++-- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java | 54 + 2 files changed, 291 insertions(+), 59 deletions(-)
New commits: commit 3c15cf4358a7db142a39e773a91c25b69833a918 Author: Ian Springer ian.springer@redhat.com Date: Fri Nov 19 19:40:39 2010 -0500
finish permissions editor, with the exception of i18n
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java index 3ac6adf..b7c8fce 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/admin/roles/PermissionsItem.java @@ -20,6 +20,7 @@ package org.rhq.enterprise.gui.coregui.client.admin.roles;
import java.util.ArrayList; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Set;
@@ -27,22 +28,28 @@ import com.google.gwt.core.client.JavaScriptObject; import com.smartgwt.client.core.RefDataClass; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.types.ListGridEditEvent; import com.smartgwt.client.types.ListGridFieldType; import com.smartgwt.client.util.JSOHelper; +import com.smartgwt.client.widgets.Label; import com.smartgwt.client.widgets.form.fields.CanvasItem; +import com.smartgwt.client.widgets.form.fields.CheckboxItem; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; + import com.smartgwt.client.widgets.grid.ListGridRecord; -import com.smartgwt.client.widgets.grid.events.ChangeEvent; -import com.smartgwt.client.widgets.grid.events.ChangeHandler; +import com.smartgwt.client.widgets.grid.events.ChangedEvent; +import com.smartgwt.client.widgets.grid.events.ChangedHandler; import com.smartgwt.client.widgets.grid.events.RecordClickEvent; import com.smartgwt.client.widgets.grid.events.RecordClickHandler; +import com.smartgwt.client.widgets.layout.VLayout;
import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.authz.Role; import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.Messages; -import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; +import org.rhq.enterprise.gui.coregui.client.util.message.Message; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVStack;
/** * A complex form item for editing the set of RHQ {@link Permission permission}s associated with an RHQ @@ -87,14 +94,26 @@ public class PermissionsItem extends CanvasItem { public void redraw() { this.selectedPermissions = getValueAsPermissionSet();
- // Update the value of the authorized field for each row of the table. - ListGridRecord[] records = getCanvas().getGlobalPermissionsGrid().getRecords(); - for (ListGridRecord record : records) { + // Update the value of the authorized fields in each row of the grids. + + ListGridRecord[] globalPermissionRecords = getCanvas().getGlobalPermissionsGrid().getRecords(); + for (ListGridRecord record : globalPermissionRecords) { String permissionName = record.getAttribute("name"); Permission permission = Permission.valueOf(permissionName); record.setAttribute("authorized", this.selectedPermissions.contains(permission)); }
+ ListGridRecord[] resourcePermissionRecords = getCanvas().getResourcePermissionsGrid().getRecords(); + for (ListGridRecord record : resourcePermissionRecords) { + String readPermissionName = record.getAttribute("readName"); + Permission readPermission = Permission.valueOf(readPermissionName); + record.setAttribute("readAuthorized", this.selectedPermissions.contains(readPermission)); + + String writePermissionName = record.getAttribute("writeName"); + Permission writePermission = Permission.valueOf(writePermissionName); + record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission)); + } + super.redraw(); }
@@ -104,8 +123,9 @@ public class PermissionsItem extends CanvasItem { return RolesDataSource.toPermissionSet(permissionRecords); }
- private ListGrid buildGlobalPermissionsGrid() { - ListGrid globalPermissionsGrid = new ListGrid(); + private ListGrid createGlobalPermissionsGrid() { + ListGrid grid = new ListGrid(); + grid.setHeight(115); // TODO: Add table title.
ListGridField iconField = new ListGridField("icon", " ", 40); @@ -121,53 +141,178 @@ public class PermissionsItem extends CanvasItem {
ListGridField displayNameField = new ListGridField("displayName", "Name", 120);
- ListGridField descriptionField = new ListGridField("description", "Description", 370); + ListGridField descriptionField = new ListGridField("description", "Description", 450); descriptionField.setWrap(true);
- final ListGridField authorizedField = new ListGridField("authorized", "Authorized?", 65); - authorizedField.setType(ListGridFieldType.BOOLEAN); - if (!this.isReadOnly) { - authorizedField.setCanEdit(true); - final Record[] recordBeingEdited = {null}; - authorizedField.addRecordClickHandler(new RecordClickHandler() { - public void onRecordClick(RecordClickEvent event) { - recordBeingEdited[0] = event.getRecord(); - } - }); - authorizedField.addChangeHandler(new ChangeHandler() { - public void onChange(ChangeEvent event) { - Boolean authorized = (Boolean)event.getValue(); - String permissionName = recordBeingEdited[0].getAttribute("name"); - Permission permission = Permission.valueOf(permissionName); - updatePermissions(authorized, permission); + final ListGridField authorizedField = createAuthorizedField("authorized", "Authorized?", "name", grid);
- // Let our parent role editor know the permissions have been changed, so it can update the - // enablement of its Save and Reset buttons. - PermissionsItem.this.roleEditView.onItemChanged(); - } - }); - } - - globalPermissionsGrid.setFields(iconField, nameField, displayNameField, descriptionField, authorizedField); + grid.setFields(iconField, nameField, displayNameField, descriptionField, authorizedField);
List<ListGridRecord> records = new ArrayList<ListGridRecord>(); - ListGridRecord record = createSimplePermissionRecord("Manage Security", "global/Locked", Permission.MANAGE_SECURITY, + ListGridRecord record = createGlobalPermissionRecord("Manage Security", "global/Locked", Permission.MANAGE_SECURITY, "can create, update, or delete users and roles (viewing is implied for everyone)"); records.add(record); - record = createSimplePermissionRecord("Manage Inventory", "subsystems/inventory/Inventory", Permission.MANAGE_INVENTORY, + record = createGlobalPermissionRecord("Manage Inventory", "subsystems/inventory/Inventory", Permission.MANAGE_INVENTORY, "has all Resource permissions, as described below, for all Resources; can create, update, and delete groups; " + "and can import auto-discovered or manually discovered Resources"); records.add(record); - record = createSimplePermissionRecord("Manage Settings", "subsystems/configure/Configure", Permission.MANAGE_SETTINGS, + record = createGlobalPermissionRecord("Manage Settings", "subsystems/configure/Configure", Permission.MANAGE_SETTINGS, "can modify the RHQ Server configuration and perform any Server-related functionality"); records.add(record); - record = createSimplePermissionRecord("Manage Bundles", "subsystems/bundle/Bundle", Permission.MANAGE_BUNDLE, + record = createGlobalPermissionRecord("Manage Bundles", "subsystems/bundle/Bundle", Permission.MANAGE_BUNDLE, "can create, update, or delete provisioning bundles (viewing is implied for everyone)"); records.add(record);
- globalPermissionsGrid.setData(records.toArray(new ListGridRecord[records.size()])); + grid.setData(records.toArray(new ListGridRecord[records.size()])); + + return grid; + } + + private ListGrid createResourcePermissionsGrid() { + ListGrid grid = new ListGrid(); + grid.setHeight(290); + // TODO: Add table title. + + ListGridField iconField = new ListGridField("icon", " ", 40); + iconField.setShowDefaultContextMenu(false); + iconField.setAlign(Alignment.CENTER); + iconField.setType(ListGridFieldType.IMAGE); + iconField.setImageURLSuffix("_16.png"); + iconField.setImageWidth(16); + iconField.setImageHeight(16); + + ListGridField readNameField = new ListGridField("readName"); + readNameField.setHidden(true); + + ListGridField writeNameField = new ListGridField("writeName"); + writeNameField.setHidden(true); + + ListGridField displayNameField = new ListGridField("displayName", "Name", 120); + + ListGridField descriptionField = new ListGridField("description", "Description", 450); + descriptionField.setWrap(true); + + ListGridField readField = createAuthorizedField("readAuthorized", "Read?", "readName", grid); + ListGridField writeField = createAuthorizedField("writeAuthorized", "Write?", "writeName", grid); + + grid.setFields(iconField, readNameField, displayNameField, descriptionField, readField, writeField); + + List<ListGridRecord> records = new ArrayList<ListGridRecord>(); + + ListGridRecord record = createResourcePermissionRecord("Inventory", "subsystems/inventory/Inventory", + Permission.VIEW_RESOURCE, + "view Resource properties (name, description, version, etc.), connection settings, and connection settings history (IMPLIED)", + Permission.MODIFY_RESOURCE, + "update Resource name, version, description, and connection settings; delete connection settings history items"); + records.add(record); + + record = createResourcePermissionRecord("Manage Measurements", "subsystems/monitor/Monitor", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.MANAGE_MEASUREMENTS, + "TODO"); + records.add(record); + + record = createResourcePermissionRecord("Manage Alerts", "subsystems/alert/Alerts", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.MANAGE_ALERTS, + "TODO"); + records.add(record); + + record = createResourcePermissionRecord("Configure", "subsystems/configure/Configure", + Permission.CONFIGURE_READ, + "TODO", + Permission.CONFIGURE_WRITE, + "TODO"); + records.add(record); + + record = createResourcePermissionRecord("Control", "subsystems/control/Operation", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.CONTROL, + "TODO"); + records.add(record); + + record = createResourcePermissionRecord("Manage Events", "subsystems/event/Events", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.MANAGE_EVENTS, + "TODO"); + records.add(record); + + record = createResourcePermissionRecord("Manage Content", "subsystems/content/Content", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.MANAGE_CONTENT, + "TODO"); + records.add(record); + + record = createResourcePermissionRecord("Create Child Resources", "subsystems/inventory/Inventory", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.CREATE_CHILD_RESOURCES, + "TODO"); + records.add(record);
- return globalPermissionsGrid; + record = createResourcePermissionRecord("Delete Child Resources", "subsystems/inventory/Inventory", + Permission.VIEW_RESOURCE, + "TODO (IMPLIED)", + Permission.DELETE_RESOURCE, + "TODO"); + records.add(record); + + grid.setData(records.toArray(new ListGridRecord[records.size()])); + + return grid; + } + + private ListGridField createAuthorizedField(String name, String title, final String nameField, final ListGrid grid) { + final ListGridField authorizedField = new ListGridField(name, title, 65); + + // Show yes/no rather than true/false. + LinkedHashMap<String, String> valueMap = new LinkedHashMap<String, String>(); + valueMap.put(Boolean.TRUE.toString(), MSG.common_val_yes_lower()); + valueMap.put(Boolean.FALSE.toString(), MSG.common_val_no_lower()); + authorizedField.setValueMap(valueMap); + + if (!this.isReadOnly) { + authorizedField.setCanEdit(true); + grid.setEditEvent(ListGridEditEvent.CLICK); + CheckboxItem editor = new CheckboxItem(); + authorizedField.setEditorType(editor); + final Record[] recordBeingEdited = {null}; + authorizedField.addRecordClickHandler(new RecordClickHandler() { + public void onRecordClick(RecordClickEvent event) { + recordBeingEdited[0] = event.getRecord(); + } + }); + authorizedField.addChangedHandler(new ChangedHandler() { + public void onChanged(ChangedEvent event) { + Boolean authorized = (Boolean)event.getValue(); + int recordNum = event.getRowNum(); + ListGridRecord record = grid.getRecord(recordNum); + String permissionName = record.getAttribute(nameField); + Permission permission = Permission.valueOf(permissionName); + if (permission == Permission.VIEW_RESOURCE) { + event.getItem().setValue(true); + event.getItem().disable(); + String permissionDisplayName = record.getAttribute("displayName"); + Message message = new Message("Read access for the " + permissionDisplayName + + " permission is implied and cannot be disabled.", Message.Severity.Warning); + CoreGUI.getMessageCenter().notify(message); + } else { + updatePermissions(authorized, permission); + + // Let our parent role editor know the permissions have been changed, so it can update the + // enablement of its Save and Reset buttons. + PermissionsItem.this.roleEditView.onItemChanged(); + } + } + }); + } + + return authorizedField; }
private void updatePermissions(Boolean authorized, Permission permission) { @@ -181,7 +326,7 @@ public class PermissionsItem extends CanvasItem { getForm().setValue(getName(), permissionRecords); }
- private ListGridRecord createSimplePermissionRecord(String displayName, String icon, Permission globalPermission, + private ListGridRecord createGlobalPermissionRecord(String displayName, String icon, Permission globalPermission, String description) { ListGridRecord record = new ListGridRecord(); record.setAttribute("displayName", displayName); @@ -189,20 +334,22 @@ public class PermissionsItem extends CanvasItem { record.setAttribute("name", globalPermission.name()); record.setAttribute("description", description); record.setAttribute("authorized", this.selectedPermissions.contains(globalPermission)); + return record; }
- private ListGridRecord createReadWritePermissionRecord(String displayName, Permission readPermission, + private ListGridRecord createResourcePermissionRecord(String displayName, String icon, Permission readPermission, String readDescription, Permission writePermission, String writeDescription) { ListGridRecord record = new ListGridRecord(); record.setAttribute("displayName", displayName); + record.setAttribute("icon", icon); record.setAttribute("readName", readPermission.name()); record.setAttribute("readAuthorized", this.selectedPermissions.contains(readPermission)); - record.setAttribute("readDescription", readDescription); + record.setAttribute("description", "<b>Read:</b> " + readDescription + "<br/><b>Write:</b> " + writeDescription); record.setAttribute("writeName", writePermission.name()); record.setAttribute("writeAuthorized", this.selectedPermissions.contains(writePermission)); - record.setAttribute("writeDescription", writeDescription); + return record; }
@@ -210,34 +357,65 @@ public class PermissionsItem extends CanvasItem { return this.selectedPermissions; }
- private static ListGridRecord[] convertToListGridRecordArray(JavaScriptObject nativeArray) { - if (nativeArray == null) { - return new ListGridRecord[]{}; + private static ListGridRecord[] convertToListGridRecordArray(JavaScriptObject jsObject) { + if (jsObject == null) { + return new ListGridRecord[0]; } - JavaScriptObject[] componentsj = JSOHelper.toArray(nativeArray); - ListGridRecord[] objects = new ListGridRecord[componentsj.length]; - for (int i = 0; i < componentsj.length; i++) { - JavaScriptObject componentJS = componentsj[i]; - ListGridRecord obj = (ListGridRecord) RefDataClass.getRef(componentJS); - if (obj == null) obj = new ListGridRecord(componentJS); - objects[i] = obj; + JavaScriptObject[] jsArray = JSOHelper.toArray(jsObject); + ListGridRecord[] records = new ListGridRecord[jsArray.length]; + for (int i = 0; i < jsArray.length; i++) { + JavaScriptObject jsArrayItem = jsArray[i]; + ListGridRecord record = (ListGridRecord) RefDataClass.getRef(jsArrayItem); + if (record == null) { + record = new ListGridRecord(jsArrayItem); + } + records[i] = record; } - return objects; + return records; }
- class PermissionsEditor extends LocatableVLayout { + class PermissionsEditor extends LocatableVStack { private ListGrid globalPermissionsGrid; + private ListGrid resourcePermissionsGrid;
PermissionsEditor() { super(roleEditView.extendLocatorId("Permissions")); setWidth100(); - setHeight(350); - this.globalPermissionsGrid = buildGlobalPermissionsGrid(); - addMember(globalPermissionsGrid); + setHeight(500); + + VLayout spacer = createVerticalSpacer(13); + addMember(spacer); + + Label globalPermissionsHeader = new Label("<h4>Global Permissions</h4>"); + globalPermissionsHeader.setHeight(17); + addMember(globalPermissionsHeader); + + this.globalPermissionsGrid = createGlobalPermissionsGrid(); + addMember(this.globalPermissionsGrid); + + spacer = createVerticalSpacer(13); + addMember(spacer); + + Label resourcePermissionsHeader = new Label("<h4>Resource Permissions</h4>"); + resourcePermissionsHeader.setHeight(17); + addMember(resourcePermissionsHeader); + + this.resourcePermissionsGrid = createResourcePermissionsGrid(); + addMember(this.resourcePermissionsGrid); + } + + private VLayout createVerticalSpacer(int height) { + VLayout spacer = new VLayout(); + spacer.setHeight(height); + return spacer; }
public ListGrid getGlobalPermissionsGrid() { - return globalPermissionsGrid; + return this.globalPermissionsGrid; + } + + public ListGrid getResourcePermissionsGrid() { + return this.resourcePermissionsGrid; } }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java new file mode 100644 index 0000000..bb9093b --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/selenium/LocatableVStack.java @@ -0,0 +1,54 @@ +package org.rhq.enterprise.gui.coregui.client.util.selenium; + +import com.smartgwt.client.widgets.layout.VStack; + +/** + * Wrapper for a SmartGWT {@link VStack} that sets the ID for use with Selenium scLocators. + * + * @author Jay Shaughnessy + */ +public class LocatableVStack extends VStack implements Locatable { + + private String locatorId; + + /** + * <pre> + * ID Format: "simpleClassname_locatorId" + * </pre> + * @param locatorId not null or empty. + */ + public LocatableVStack(String locatorId) { + super(); + init(locatorId); + } + + /** + * <pre> + * ID Format: "simpleClassname_locatorId" + * </pre> + * @param locatorId not null or empty. + * @param membersMargin + */ + public LocatableVStack(String locatorId, int membersMargin) { + super(membersMargin); + init(locatorId); + } + + private void init(String locatorId) { + this.locatorId = locatorId; + SeleniumUtility.setID(this, locatorId); + } + + public String getLocatorId() { + return locatorId; + } + + public String extendLocatorId(String extension) { + return this.locatorId + "_" + extension; + } + + public void destroyMembers() { + SeleniumUtility.destroyMembers(this); + } + +}