modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java | 3 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java | 209 +++++----- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java | 119 +++-- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java | 4 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java | 2 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java | 52 +- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java | 139 ++++++ modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java | 5 modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css | 4 11 files changed, 384 insertions(+), 157 deletions(-)
New commits: commit 927bc83226129c29feab114910c9d226bd2e5ddf Author: Ian Springer ian.springer@redhat.com Date: Tue Oct 19 18:55:33 2010 -0400
more work on group config component; add test view for group config (#TestGroupConfig); misc datasource fixes
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java index 6db7fc8..3888cdc 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/CoreGUI.java @@ -48,6 +48,7 @@ import org.rhq.enterprise.gui.coregui.client.menu.MenuBarView; import org.rhq.enterprise.gui.coregui.client.report.ReportTopView; import org.rhq.enterprise.gui.coregui.client.report.tag.TaggedView; import org.rhq.enterprise.gui.coregui.client.test.TestConfigurationView; +import org.rhq.enterprise.gui.coregui.client.test.TestGroupConfigurationView; import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler; import org.rhq.enterprise.gui.coregui.client.util.WidgetUtility; import org.rhq.enterprise.gui.coregui.client.util.message.MessageBar; @@ -217,6 +218,8 @@ public class CoreGUI implements EntryPoint, ValueChangeHandler<String> { canvas = new ReportTopView("Report"); } else if (breadcrumbName.equals(TestConfigurationView.VIEW_ID)) { canvas = new TestConfigurationView("TestConfig"); + } else if (breadcrumbName.equals(TestGroupConfigurationView.VIEW_ID)) { + canvas = new TestGroupConfigurationView("TestGroupConfig"); } else { canvas = null; } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java index 2cbebe4..df61aaa 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/ConfigurationEditor.java @@ -128,7 +128,6 @@ import org.rhq.core.domain.configuration.definition.constraint.IntegerRangeConst import org.rhq.core.domain.configuration.definition.constraint.RegexConstraint; import org.rhq.core.domain.resource.ResourceType; import org.rhq.enterprise.gui.coregui.client.CoreGUI; -import org.rhq.enterprise.gui.coregui.client.RefreshableView; import org.rhq.enterprise.gui.coregui.client.components.table.PropertyGrid; import org.rhq.enterprise.gui.coregui.client.gwt.ConfigurationGWTServiceAsync; import org.rhq.enterprise.gui.coregui.client.gwt.GWTServiceLookup; @@ -558,20 +557,8 @@ public class ConfigurationEditor extends LocatableVLayout { Property property, boolean oddRow, List<FormItem> fields, final boolean firePropertyChangedEvents) { - List<FormItem> fieldsForThisProperty = new ArrayList<FormItem>(); + List<FormItem> fieldsForThisProperty;
- StaticTextItem nameItem = new StaticTextItem(); - nameItem.setStartRow(true); - String title = "<b>" - + (propertyDefinition.getDisplayName() != null ? propertyDefinition.getDisplayName() : propertyDefinition - .getName()) + "</b>"; - nameItem.setValue(title); - nameItem.setShowTitle(false); - - fieldsForThisProperty.add(nameItem); - fields.add(nameItem); - - final FormItem valueItem; if (propertyDefinition instanceof PropertyDefinitionSimple) { final PropertyDefinitionSimple propertyDefinitionSimple = (PropertyDefinitionSimple)propertyDefinition; PropertySimple propertySimple = (PropertySimple)property; @@ -580,34 +567,8 @@ public class ConfigurationEditor extends LocatableVLayout { propertySimple = new PropertySimple(propertyDefinitionSimple.getName(), null); }
- final PropertySimple finalPropertySimple = propertySimple; - valueItem = buildSimpleField(propertyDefinitionSimple, propertySimple); - valueItem.addChangedHandler(new ChangedHandler() { - public void onChanged(ChangedEvent changedEvent) { - finalPropertySimple.setErrorMessage(null); - boolean isValid = changedEvent.getItem().validate(); - if (isValid) { - finalPropertySimple.setValue(changedEvent.getValue()); - } - if (firePropertyChangedEvents) { - firePropertyChangedEvent(finalPropertySimple, propertyDefinitionSimple, isValid); - } - } - }); - - FormItem unsetItem = buildUnsetItem(propertyDefinitionSimple, propertySimple, valueItem); - fieldsForThisProperty.add(unsetItem); - fields.add(unsetItem); - - fieldsForThisProperty.add(valueItem); - fields.add(valueItem); - - StaticTextItem descriptionItem = new StaticTextItem(); - descriptionItem.setValue(propertyDefinition.getDescription()); - descriptionItem.setShowTitle(false); - descriptionItem.setEndRow(true); - fieldsForThisProperty.add(descriptionItem); - fields.add(descriptionItem); + fieldsForThisProperty = buildFieldsForPropertySimple(propertyDefinition, propertyDefinitionSimple, + propertySimple); } else if (propertyDefinition instanceof PropertyDefinitionList) { PropertyDefinitionList propertyDefinitionList = (PropertyDefinitionList)propertyDefinition; PropertyDefinition memberDefinition = propertyDefinitionList.getMemberDefinition(); @@ -615,41 +576,9 @@ public class ConfigurationEditor extends LocatableVLayout { if (propertyList == null) { propertyList = new PropertyList(propertyDefinitionList.getName()); } - if (memberDefinition instanceof PropertyDefinitionMap) { - // List of Maps is a specially supported case with summary fields as columns in a table - // Note: This field spans 3 columns. - PropertyDefinitionMap memberDefinitionMap = (PropertyDefinitionMap)memberDefinition; - CanvasItem listOfMapsItem = buildListOfMapsField(locatorId, - memberDefinitionMap, - propertyList, oddRow); - fieldsForThisProperty.add(listOfMapsItem); - fields.add(listOfMapsItem); - } else if (memberDefinition instanceof PropertyDefinitionSimple) { - SpacerItem unsetItem = new SpacerItem(); - fieldsForThisProperty.add(unsetItem); - fields.add(unsetItem); - - CanvasItem listOfSimplesItem = buildListOfSimplesField(locatorId, propertyDefinitionList, propertyList, - oddRow); - fieldsForThisProperty.add(listOfSimplesItem); - fields.add(listOfSimplesItem); - - StaticTextItem descriptionItem = new StaticTextItem(); - descriptionItem.setValue(propertyDefinition.getDescription()); - descriptionItem.setShowTitle(false); - descriptionItem.setEndRow(true); - fieldsForThisProperty.add(descriptionItem); - fields.add(descriptionItem); - } else { - Log.error("List " + propertyList + " has unsupported member type: " + memberDefinition); - Canvas canvas = new Canvas(); - // TODO: Add label with error message to canvas. - CanvasItem canvasItem = buildComplexPropertyField(canvas); - canvasItem.setColSpan(3); - canvasItem.setEndRow(true); - fieldsForThisProperty.add(canvasItem); - fields.add(canvasItem); - } + fieldsForThisProperty = buildFieldsForPropertyList(locatorId, propertyDefinition, oddRow, + propertyDefinitionList, + memberDefinition, propertyList); } else if (propertyDefinition instanceof PropertyDefinitionMap) { PropertyDefinitionMap propertyDefinitionMap = (PropertyDefinitionMap)propertyDefinition; PropertyMap propertyMap = (PropertyMap)property; @@ -657,18 +586,113 @@ public class ConfigurationEditor extends LocatableVLayout { propertyMap = new PropertyMap(propertyDefinitionMap.getName()); }
- // Note: This field spans 3 columns. - FormItem mapField = - buildMapField(locatorId, propertyDefinitionMap, propertyMap); - fields.add(mapField); + fieldsForThisProperty = buildFieldsForPropertyMap(locatorId, propertyDefinitionMap, propertyMap); + } else { + throw new IllegalStateException("Property definition null or of unknown type: " + propertyDefinition); }
- // Set row background color. + // Add the fields for this property to the master fields list and set the row background color. for (FormItem field : fieldsForThisProperty) { + fields.add(field); field.setCellStyle(oddRow ? "OddRow" : "EvenRow"); } }
+ protected List<FormItem> buildFieldsForPropertySimple(PropertyDefinition propertyDefinition, + PropertyDefinitionSimple propertyDefinitionSimple, + PropertySimple propertySimple) { + List<FormItem> fields = new ArrayList<FormItem>(); + + StaticTextItem nameItem = buildNameItem(propertyDefinition); + fields.add(nameItem); + + FormItem valueItem; + valueItem = buildSimpleField(propertyDefinitionSimple, propertySimple); + + FormItem unsetItem = buildUnsetItem(propertyDefinitionSimple, propertySimple, valueItem); + fields.add(unsetItem); + + fields.add(valueItem); + + StaticTextItem descriptionItem = buildDescriptionField(propertyDefinition); + fields.add(descriptionItem); + + return fields; + } + + protected List<FormItem> buildFieldsForPropertyList(String locatorId, PropertyDefinition propertyDefinition, boolean oddRow, + PropertyDefinitionList propertyDefinitionList, + PropertyDefinition memberDefinition, PropertyList propertyList) { + List<FormItem> fields = new ArrayList<FormItem>(); + + StaticTextItem nameItem = buildNameItem(propertyDefinition); + fields.add(nameItem); + + if (memberDefinition instanceof PropertyDefinitionMap) { + // List of Maps is a specially supported case with summary fields as columns in a table + // Note: This field spans 3 columns. + PropertyDefinitionMap memberDefinitionMap = (PropertyDefinitionMap)memberDefinition; + CanvasItem listOfMapsItem = buildListOfMapsField(locatorId, + memberDefinitionMap, + propertyList, oddRow); + fields.add(listOfMapsItem); + } else if (memberDefinition instanceof PropertyDefinitionSimple) { + SpacerItem unsetItem = new SpacerItem(); + fields.add(unsetItem); + + CanvasItem listOfSimplesItem = buildListOfSimplesField(locatorId, propertyDefinitionList, propertyList, + oddRow); + fields.add(listOfSimplesItem); + + StaticTextItem descriptionItem = buildDescriptionField(propertyDefinition); + fields.add(descriptionItem); + } else { + Log.error("List " + propertyList + " has unsupported member type: " + memberDefinition); + Canvas canvas = new Canvas(); + // TODO: Add label with error message to canvas. + CanvasItem canvasItem = buildComplexPropertyField(canvas); + canvasItem.setColSpan(3); + canvasItem.setEndRow(true); + fields.add(canvasItem); + } + + return fields; + } + + protected List<FormItem> buildFieldsForPropertyMap(String locatorId, + PropertyDefinitionMap propertyDefinitionMap, PropertyMap propertyMap) { + List<FormItem> fields = new ArrayList<FormItem>(); + + StaticTextItem nameItem = buildNameItem(propertyDefinitionMap); + fields.add(nameItem); + + // Note: This field spans 3 columns. + FormItem mapField = + buildMapField(locatorId, propertyDefinitionMap, propertyMap); + fields.add(mapField); + + return fields; + } + + private StaticTextItem buildNameItem(PropertyDefinition propertyDefinition) { + StaticTextItem nameItem = new StaticTextItem(); + nameItem.setStartRow(true); + String title = "<b>" + + (propertyDefinition.getDisplayName() != null ? propertyDefinition.getDisplayName() : propertyDefinition + .getName()) + "</b>"; + nameItem.setValue(title); + nameItem.setShowTitle(false); + return nameItem; + } + + private StaticTextItem buildDescriptionField(PropertyDefinition propertyDefinition) { + StaticTextItem descriptionItem = new StaticTextItem(); + descriptionItem.setValue(propertyDefinition.getDescription()); + descriptionItem.setShowTitle(false); + descriptionItem.setEndRow(true); + return descriptionItem; + } + private void firePropertyChangedEvent(Property property, PropertyDefinition propertyDefinition, boolean isValid) { @@ -1300,6 +1324,24 @@ public class ConfigurationEditor extends LocatableVLayout { valueItem.setShowTitle(false); valueItem.setWidth(220);
+ // Only update the underlying property when the input is changed if it's a top-level simple or a simple within a + // top-level map. + PropertyDefinitionMap parentPropertyMapDefinition = + propertyDefinitionSimple.getParentPropertyMapDefinition(); + if (propertyDefinitionSimple.getConfigurationDefinition() != null || + (parentPropertyMapDefinition != null && parentPropertyMapDefinition.getConfigurationDefinition() != null)) { + valueItem.addChangedHandler(new ChangedHandler() { + public void onChanged(ChangedEvent changedEvent) { + propertySimple.setErrorMessage(null); + boolean isValid = changedEvent.getItem().validate(); + if (isValid) { + propertySimple.setValue(changedEvent.getValue()); + } + firePropertyChangedEvent(propertySimple, propertyDefinitionSimple, isValid); + } + }); + } + return valueItem; }
@@ -1334,11 +1376,10 @@ public class ConfigurationEditor extends LocatableVLayout { unsetItem.addChangeHandler(new ChangeHandler() { public void onChange(ChangeEvent changeEvent) { Boolean isUnset = (Boolean) changeEvent.getValue(); + valueItem.setDisabled(isUnset); if (isUnset) { setValue(valueItem, null); - valueItem.setDisabled(true); } else { - valueItem.setDisabled(false); valueItem.focusInItem(); } valueItem.redraw(); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java index de29950..c3ba6cb 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/components/configuration/GroupConfigurationEditor.java @@ -49,7 +49,6 @@ import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinition; import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple; -import org.rhq.enterprise.gui.coregui.client.RefreshableView; import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout;
/** @@ -60,6 +59,7 @@ import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; */ public class GroupConfigurationEditor extends ConfigurationEditor { private List<GroupMemberConfiguration> memberConfigurations; + private Map<String, FormItem> valueItemNameToStaticItemMap = new HashMap<String, FormItem>(); private Map<String, FormItem> valueItemNameToUnsetItemMap = new HashMap<String, FormItem>();
public GroupConfigurationEditor(String locatorId, ConfigurationDefinition configurationDefinition, @@ -80,6 +80,34 @@ public class GroupConfigurationEditor extends ConfigurationEditor { }
@Override + protected List<FormItem> buildFieldsForPropertySimple(PropertyDefinition propertyDefinition, + PropertyDefinitionSimple propertyDefinitionSimple, + PropertySimple propertySimple) { + List<FormItem> fields = super.buildFieldsForPropertySimple(propertyDefinition, propertyDefinitionSimple, + propertySimple); + + if (isAggregateProperty(propertySimple)) { + // Create the "MEMBER VALUES DIFFER" label that is displayed when member values are heterogeneous. + final StaticTextItem staticItem = new StaticTextItem(); + staticItem.setValue("MEMBER VALUES DIFFER"); + staticItem.setTextBoxStyle("InlineNote"); + staticItem.setShowTitle(false); + staticItem.setTooltip("Member values differ - click icon to edit them."); + Boolean isHomogeneous = isHomogeneous(propertySimple); + staticItem.setVisible(!isHomogeneous); + + FormItem valueItem = fields.get(2); + FormItemIcon icon = buildEditMemberValuesIcon(propertyDefinitionSimple, propertySimple, valueItem); + staticItem.setIcons(icon); + + this.valueItemNameToStaticItemMap.put(valueItem.getName(), staticItem); + fields.add(3, staticItem); + } + + return fields; + } + + @Override protected FormItem buildSimpleField(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple) { final FormItem item = super.buildSimpleField(propertyDefinitionSimple, propertySimple); @@ -87,40 +115,55 @@ public class GroupConfigurationEditor extends ConfigurationEditor { boolean isAggregate = isAggregateProperty(propertySimple); if (isAggregate) { // Add the icon that user can click to edit the member values. - FormItemIcon icon = new FormItemIcon(); - icon.setSrc("[SKIN]/actions/edit.png"); - icon.setName("Edit Member Values"); - icon.setNeverDisable(true); - icon.addFormItemClickHandler(new FormItemClickHandler() { - public void onFormItemClick(FormItemIconClickEvent event) { - // TODO: Pass the actual index, rather than null, if the prop is inside a list. - displayMemberValuesEditor(extendLocatorId("MemberValuesEditor"), propertyDefinitionSimple, - propertySimple, null, item); - } - }); - // TODO: Figure out a way to add a tooltip to the icon. - item.setIcons(icon); + FormItemIcon icon = buildEditMemberValuesIcon(propertyDefinitionSimple, propertySimple, item);
- if (!isHomogeneous(propertySimple)) { - updateHeterogeneousValueItem(item); - } + item.setIcons(icon);
item.addChangedHandler(new ChangedHandler() { public void onChanged(ChangedEvent changedEvent) { Object value = changedEvent.getValue(); - for (GroupMemberConfiguration memberConfiguration : memberConfigurations) { - Configuration configuration = memberConfiguration.getConfiguration(); - PropertySimple memberPropertySimple = - getPropertySimple(configuration, propertyDefinitionSimple, propertySimple, null); - memberPropertySimple.setValue(value); - } + updateMemberProperties(propertyDefinitionSimple, propertySimple, value); } }); + + Boolean isHomogeneous = isHomogeneous(propertySimple); + item.setVisible(isHomogeneous); }
return item; }
+ private FormItemIcon buildEditMemberValuesIcon(final PropertyDefinitionSimple propertyDefinitionSimple, + final PropertySimple propertySimple, final FormItem dynamicItem) { + FormItemIcon icon = new FormItemIcon(); + + icon.setSrc("[SKIN]/actions/edit.png"); + icon.setName("Edit Member Values"); + icon.setNeverDisable(true); + icon.addFormItemClickHandler(new FormItemClickHandler() { + public void onFormItemClick(FormItemIconClickEvent event) { + // TODO: Pass the actual index, rather than null, if the prop is inside a list. + displayMemberValuesEditor(extendLocatorId("MemberValuesEditor"), propertyDefinitionSimple, + propertySimple, null, dynamicItem); + } + }); + + // TODO: Figure out a way to add a tooltip to the icon. + + return icon; + } + + private void updateMemberProperties(PropertyDefinitionSimple propertyDefinitionSimple, + PropertySimple propertySimple, Object value + ) { + for (GroupMemberConfiguration memberConfiguration : memberConfigurations) { + Configuration configuration = memberConfiguration.getConfiguration(); + PropertySimple memberPropertySimple = + getPropertySimple(configuration, propertyDefinitionSimple, propertySimple, null); + memberPropertySimple.setValue(value); + } + } + @Override protected FormItem buildUnsetItem(final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple propertySimple, final FormItem valueItem) { @@ -136,8 +179,7 @@ public class GroupConfigurationEditor extends ConfigurationEditor {
private void displayMemberValuesEditor(String locatorId, final PropertyDefinitionSimple propertyDefinitionSimple, final PropertySimple aggregatePropertySimple, - Integer index, final FormItem aggregateValueItem - ) { + Integer index, final FormItem aggregateValueItem) { LocatableVLayout layout = new LocatableVLayout(locatorId); layout.setHeight100();
@@ -215,31 +257,36 @@ public class GroupConfigurationEditor extends ConfigurationEditor { memberPropertySimple.setErrorMessage(null); }
+ FormItem aggregateStaticItem = valueItemNameToStaticItemMap.get(aggregateValueItem.getName()); + FormItem aggregateUnsetItem = valueItemNameToUnsetItemMap.get(aggregateValueItem.getName()); aggregateUnsetItem.setDisabled(!valuesHomogeneous); + if (valuesHomogeneous) { // Update the value of the aggregate property and set its override flag to true. aggregatePropertySimple.setValue(firstValue); aggregatePropertySimple.setOverride(true);
+ aggregateUnsetItem.setValue(firstValue == null); + // Set the aggregate value item's value to the homogeneous value, enable it, and make sure it has // validators set. - aggregateValueItem.setDisabled(false); setValue(aggregateValueItem, firstValue); - aggregateValueItem.setTooltip(null); - aggregateValueItem.setValidateOnChange(true); - aggregateValueItem.setValidateOnExit(true); + aggregateValueItem.show(); + aggregateValueItem.setDisabled(false); + + aggregateStaticItem.hide();
- aggregateUnsetItem.setValue(firstValue == null); } else { aggregatePropertySimple.setValue(null); aggregatePropertySimple.setOverride(false);
- updateHeterogeneousValueItem(aggregateValueItem); + aggregateValueItem.hide();
- aggregateUnsetItem.setValue((String)null); + aggregateStaticItem.show(); }
+ form.markForRedraw(); popup.destroy(); } }); @@ -270,14 +317,6 @@ public class GroupConfigurationEditor extends ConfigurationEditor { popup.show(); }
- private void updateHeterogeneousValueItem(FormItem item) { - item.setDisabled(true); - item.setValidateOnChange(false); - item.setValidateOnExit(false); - item.setValue("MEMBER VALUES DIFFER"); - item.setTooltip("Member values differ - click icon to edit them."); - } - private PropertySimple getPropertySimple(Configuration configuration, PropertyDefinitionSimple propertyDefinitionSimple, PropertySimple aggregatePropertySimple, Integer index) { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java index 6fd1d01..2b5097f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupCompositeDataSource.java @@ -157,7 +157,7 @@ public class ResourceGroupCompositeDataSource extends RPCDataSource<ResourceGrou record.setAttribute("id", from.getResourceGroup().getId()); record.setAttribute("name", from.getResourceGroup().getName()); record.setAttribute("description", from.getResourceGroup().getDescription()); - record.setAttribute("category", from.getResourceGroup().getGroupCategory().toString()); + record.setAttribute("category", from.getResourceGroup().getGroupCategory());
record.setAttribute("explicitUp", String.valueOf(from.getExplicitUp())); record.setAttribute("explicitDown", String.valueOf(from.getExplicitDown())); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java index 190baf7..e0778bb 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/groups/ResourceGroupsDataSource.java @@ -152,7 +152,7 @@ public class ResourceGroupsDataSource extends RPCDataSource<ResourceGroup> { record.setAttribute("id", from.getId()); record.setAttribute("name", from.getName()); record.setAttribute("description", from.getDescription()); - record.setAttribute("category", from.getGroupCategory().toString()); + record.setAttribute("category", from.getGroupCategory());
if (from.getResourceType() != null) { record.setAttribute("resourceType", from.getResourceType()); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java index 59b55e9..be80e8e 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDataSourceField.java @@ -40,12 +40,12 @@ public enum ResourceDataSourceField { AVAILABILITY("currentAvailability", "Availability");
/** - * Corresponds to a property name of Resource + * Corresponds to a property name of Resource (e.g. resourceType.name). */ private String propertyName;
/** - * The display name for the field or property + * The table header for the field or property (e.g. Type). */ private String title;
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java index 2b3a4c2..7759f53 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/inventory/resource/ResourceDatasource.java @@ -163,7 +163,7 @@ public class ResourceDatasource extends RPCDataSource<Resource> { record.setAttribute(DESCRIPTION.propertyName(), from.getDescription()); record.setAttribute(TYPE.propertyName(), from.getResourceType().getId()); record.setAttribute(PLUGIN.propertyName(), from.getResourceType().getPlugin()); - record.setAttribute(CATEGORY.propertyName(), from.getResourceType().getCategory().getDisplayName()); + record.setAttribute(CATEGORY.propertyName(), from.getResourceType().getCategory()); record.setAttribute("icon", from.getResourceType().getCategory().getDisplayName() + "_" + (from.getCurrentAvailability().getAvailabilityType() == AvailabilityType.UP ? "up" : "down") + "_16.png");
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java index 396f07a..89d7d53 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestConfigurationFactory.java @@ -45,48 +45,48 @@ import org.rhq.core.domain.configuration.definition.PropertySimpleType; */ public abstract class TestConfigurationFactory { public static ConfigurationDefinition createConfigurationDefinition() { - ConfigurationDefinition configurationDefinition = new ConfigurationDefinition("TestConfig", "a test config"); + ConfigurationDefinition configDef = new ConfigurationDefinition("TestConfig", "a test config");
ConfigurationTemplate defaultTemplate = new ConfigurationTemplate(ConfigurationTemplate.DEFAULT_TEMPLATE_NAME, "default template"); - configurationDefinition.putTemplate(defaultTemplate); + configDef.putTemplate(defaultTemplate); Configuration defaultConfiguration = new Configuration(); defaultTemplate.setConfiguration(defaultConfiguration);
Map<String, PropertyDefinition> propertyDefinitions = new HashMap<String, PropertyDefinition>(); - configurationDefinition.setPropertyDefinitions(propertyDefinitions); + configDef.setPropertyDefinitions(propertyDefinitions);
int orderIndex = 0;
PropertyDefinitionSimple simplePropDef;
simplePropDef = createStringPropDef1(); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = createStringPropDef2(); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = new PropertyDefinitionSimple("LongString", "a Long String simple prop", false, PropertySimpleType.LONG_STRING); simplePropDef.setDisplayName(simplePropDef.getName()); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = new PropertyDefinitionSimple("Password", "a Password simple prop", false, PropertySimpleType.PASSWORD); simplePropDef.setDisplayName(simplePropDef.getName()); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = new PropertyDefinitionSimple("Boolean", "a required Boolean simple prop", true, PropertySimpleType.BOOLEAN); simplePropDef.setDisplayName(simplePropDef.getName()); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++); simplePropDef.setRequired(true);
simplePropDef = createIntegerPropDef(); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = new PropertyDefinitionSimple("Float", "a Float simple prop", false, PropertySimpleType.FLOAT); simplePropDef.setDisplayName(simplePropDef.getName()); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = new PropertyDefinitionSimple("StringEnum1", "a String enum prop with <=5 items - should be rendered as radio buttons", false, @@ -98,7 +98,7 @@ public abstract class TestConfigurationFactory { propDefEnums.add(new PropertyDefinitionEnumeration("NJ", "NJ")); propDefEnums.add(new PropertyDefinitionEnumeration("PA", "PA")); simplePropDef.setEnumeratedValues(propDefEnums, false); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
simplePropDef = new PropertyDefinitionSimple("StringEnum2", "a String enum prop with >5 items - should be rendered as a popup menu", false, PropertySimpleType.STRING); @@ -112,31 +112,31 @@ public abstract class TestConfigurationFactory { propDefEnums.add(new PropertyDefinitionEnumeration("blue", "blue")); propDefEnums.add(new PropertyDefinitionEnumeration("purple", "purple")); simplePropDef.setEnumeratedValues(propDefEnums, false); - addPropertyDefinition(propertyDefinitions, simplePropDef, orderIndex++); + addPropertyDefinition(configDef, simplePropDef, orderIndex++);
PropertyDefinitionMap mapPropDef = new PropertyDefinitionMap("MapOfSimples", "a map of simples", false); mapPropDef.put(createStringPropDef1()); mapPropDef.put(createStringPropDef2()); mapPropDef.put(createIntegerPropDef()); mapPropDef.setDisplayName(mapPropDef.getName()); - addPropertyDefinition(propertyDefinitions, mapPropDef, orderIndex++); + addPropertyDefinition(configDef, mapPropDef, orderIndex++);
PropertyDefinitionMap openMapPropDef = new PropertyDefinitionMap("OpenMapOfSimples", "an open map of simples", false); openMapPropDef.setDisplayName(openMapPropDef.getName()); - addPropertyDefinition(propertyDefinitions, openMapPropDef, orderIndex++); + addPropertyDefinition(configDef, openMapPropDef, orderIndex++);
PropertyDefinitionMap readOnlyOpenMapPropDef = new PropertyDefinitionMap("ReadOnlyOpenMapOfSimples", "a read-only open map of simples", false); readOnlyOpenMapPropDef.setDisplayName(readOnlyOpenMapPropDef.getName()); readOnlyOpenMapPropDef.setReadOnly(true); - addPropertyDefinition(propertyDefinitions, readOnlyOpenMapPropDef, orderIndex++); + addPropertyDefinition(configDef, readOnlyOpenMapPropDef, orderIndex++);
PropertyDefinitionList listOfSimplesPropDef = new PropertyDefinitionList("ListOfSimples", "a list of Integer simples", true, new PropertyDefinitionSimple("integer", "an integer", false, PropertySimpleType.INTEGER)); listOfSimplesPropDef.setDisplayName(listOfSimplesPropDef.getName()); - addPropertyDefinition(propertyDefinitions, listOfSimplesPropDef, orderIndex++); + addPropertyDefinition(configDef, listOfSimplesPropDef, orderIndex++);
PropertyDefinitionMap mapInListPropDef = new PropertyDefinitionMap("MapOfSimplesInList", "a map of simples in a list", false); @@ -148,7 +148,7 @@ public abstract class TestConfigurationFactory { PropertyDefinitionList listPropDef = new PropertyDefinitionList("ListOfMaps", "a list of maps", true, mapInListPropDef); listPropDef.setDisplayName(listPropDef.getName()); - addPropertyDefinition(propertyDefinitions, listPropDef, orderIndex++); + addPropertyDefinition(configDef, listPropDef, orderIndex++);
PropertyDefinitionMap mapInReadOnlyListPropDef = new PropertyDefinitionMap("MapOfSimplesInReadOnlyList", "a map of simples in a list", false); @@ -161,7 +161,7 @@ public abstract class TestConfigurationFactory { "a read-only list of maps", true, mapInReadOnlyListPropDef); readOnlyListPropDef.setDisplayName(readOnlyListPropDef.getName()); readOnlyListPropDef.setReadOnly(true); - addPropertyDefinition(propertyDefinitions, readOnlyListPropDef, orderIndex++); + addPropertyDefinition(configDef, readOnlyListPropDef, orderIndex++);
PropertyGroupDefinition propertyGroupDefinition = new PropertyGroupDefinition("myGroup"); propertyGroupDefinition.setDisplayName(propertyGroupDefinition.getName()); @@ -171,14 +171,14 @@ public abstract class TestConfigurationFactory { PropertySimpleType.STRING); myString.setDisplayName(myString.getName()); myString.setSummary(true); - addPropertyDefinition(propertyDefinitions, myString, orderIndex++); + addPropertyDefinition(configDef, myString, orderIndex++); myString.setPropertyGroupDefinition(propertyGroupDefinition);
PropertyDefinitionSimple myString2 = new PropertyDefinitionSimple("myString2", "my other little string", true, PropertySimpleType.STRING); myString2.setDisplayName(myString2.getName()); myString2.setSummary(true); - addPropertyDefinition(propertyDefinitions, myString2, orderIndex++); + addPropertyDefinition(configDef, myString2, orderIndex++); myString2.setPropertyGroupDefinition(propertyGroupDefinition);
PropertyGroupDefinition propertyGroupDefinition2 = new PropertyGroupDefinition("myGroup2"); @@ -189,7 +189,7 @@ public abstract class TestConfigurationFactory { PropertySimpleType.STRING); myString3.setDisplayName((myString3.getName())); myString3.setSummary(true); - addPropertyDefinition(propertyDefinitions, myString3, orderIndex++); + addPropertyDefinition(configDef, myString3, orderIndex++); myString3.setPropertyGroupDefinition(propertyGroupDefinition2);
PropertyDefinitionSimple enumExample = new PropertyDefinitionSimple("myEnum", @@ -201,16 +201,16 @@ public abstract class TestConfigurationFactory { myEnums.add(new PropertyDefinitionEnumeration("Camden", "Camden")); myEnums.add(new PropertyDefinitionEnumeration("Gloucester", "Gloucester")); enumExample.setEnumeratedValues(myEnums, false); - addPropertyDefinition(propertyDefinitions, enumExample, orderIndex++); + addPropertyDefinition(configDef, enumExample, orderIndex++); enumExample.setPropertyGroupDefinition(propertyGroupDefinition2);
- return configurationDefinition; + return configDef; }
- private static void addPropertyDefinition(Map<String, PropertyDefinition> propertyDefinitions, - PropertyDefinition propDef, int orderIndex) { + private static void addPropertyDefinition(ConfigurationDefinition configDef, + PropertyDefinition propDef, int orderIndex) { propDef.setOrder(orderIndex); - propertyDefinitions.put(propDef.getName(), propDef); + configDef.put(propDef); }
public static Configuration createConfiguration() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java new file mode 100644 index 0000000..7d71c02 --- /dev/null +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/test/TestGroupConfigurationView.java @@ -0,0 +1,139 @@ +/* + * RHQ Management Platform + * Copyright 2010, Red Hat Middleware LLC, and individual contributors + * as indicated by the @author tags. See the copyright.txt file in the + * distribution for a full listing of individual contributors. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +package org.rhq.enterprise.gui.coregui.client.test; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +import com.smartgwt.client.types.Overflow; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.layout.LayoutSpacer; +import com.smartgwt.client.widgets.toolbar.ToolStrip; + +import org.rhq.core.domain.configuration.Configuration; +import org.rhq.core.domain.configuration.definition.ConfigurationDefinition; +import org.rhq.enterprise.gui.coregui.client.CoreGUI; +import org.rhq.enterprise.gui.coregui.client.components.configuration.ConfigurationEditor; +import org.rhq.enterprise.gui.coregui.client.components.configuration.GroupConfigurationEditor; +import org.rhq.enterprise.gui.coregui.client.components.configuration.GroupMemberConfiguration; +import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeEvent; +import org.rhq.enterprise.gui.coregui.client.components.configuration.PropertyValueChangeListener; +import org.rhq.enterprise.gui.coregui.client.util.message.Message; +import org.rhq.enterprise.gui.coregui.client.util.message.MessageCenter; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableIButton; +import org.rhq.enterprise.gui.coregui.client.util.selenium.LocatableVLayout; + +/** + * @author Ian Springer + */ +public class TestGroupConfigurationView + extends LocatableVLayout implements PropertyValueChangeListener { + public static final String VIEW_ID = "TestGroupConfig"; + + private static final int GROUP_SIZE = 2; + + private ConfigurationEditor editor; + private LocatableIButton saveButton; + private ConfigurationDefinition configurationDefinition; + private List<GroupMemberConfiguration> memberConfigurations; + + public TestGroupConfigurationView(String locatorId) { + super(locatorId); + } + + @Override + protected void onDraw() { + super.onDraw(); + + setWidth100(); + setHeight100(); + + ToolStrip toolStrip = new ToolStrip(); + toolStrip.setWidth100(); + + toolStrip.addMember(new LayoutSpacer()); + + this.saveButton = new LocatableIButton(this.extendLocatorId("Save"), "Save"); + this.saveButton.addClickHandler(new ClickHandler() { + public void onClick(ClickEvent clickEvent) { + save(); + } + }); + this.saveButton.disable(); + toolStrip.addMember(this.saveButton); + + addMember(toolStrip); + + this.configurationDefinition = TestConfigurationFactory.createConfigurationDefinition(); + this.memberConfigurations = new ArrayList<GroupMemberConfiguration>(GROUP_SIZE); + for (int i = 0; i < GROUP_SIZE; i++) { + Configuration configuration = TestConfigurationFactory.createConfiguration(); + GroupMemberConfiguration memberConfiguration = new GroupMemberConfiguration(i, "Member #" + i, + configuration); + this.memberConfigurations.add(memberConfiguration); + } + + reloadConfiguration(); + } + + @Override + public void propertyValueChanged(PropertyValueChangeEvent event) { + MessageCenter messageCenter = CoreGUI.getMessageCenter(); + Message message; + if (event.isValidationStateChanged()) { + if (event.getInvalidPropertyNames().isEmpty()) { + this.saveButton.enable(); + message = new Message("All properties now have valid values, so the configuration can now be saved.", + Message.Severity.Info, EnumSet.of(Message.Option.Transient)); + } + else { + this.saveButton.disable(); + message = new Message( + "One or more properties have invalid values. The values must be corrected before the configuration can be saved.", + Message.Severity.Error, EnumSet.of(Message.Option.Transient, Message.Option.Sticky)); + } + messageCenter.notify(message); + } else { + this.saveButton.enable(); + } + } + + private void reloadConfiguration() { + this.saveButton.disable(); + if (editor != null) { + editor.destroy(); + removeMember(editor); + } + + editor = new GroupConfigurationEditor(extendLocatorId("Editor"), this.configurationDefinition, + this.memberConfigurations); + editor.setOverflow(Overflow.AUTO); + editor.addPropertyValueChangeListener(this); + addMember(editor); + } + + private void save() { + CoreGUI.getMessageCenter().notify( + new Message("Member configurations updated.", "Member configurations updated.")); + reloadConfiguration(); + } +} diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java index 3314eeb..ce0ce25 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/RPCDataSource.java @@ -24,6 +24,7 @@ import java.util.Collection; import java.util.List; import java.util.Map;
+import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.core.client.JavaScriptObject; import com.smartgwt.client.data.Criteria; import com.smartgwt.client.data.DSRequest; @@ -328,7 +329,7 @@ public abstract class RPCDataSource<T> extends DataSource {
@SuppressWarnings("unchecked") public static <S> S getFilter(DSRequest request, String paramName, Class<S> type) { - com.allen_sauer.gwt.log.client.Log.debug("Fetching " + paramName + " (" + type + ")"); + Log.debug("Fetching " + paramName + " (" + type + ")"); Criteria criteria = request.getCriteria(); Map<String, Object> criteriaMap = criteria.getValues();
@@ -350,7 +351,7 @@ public abstract class RPCDataSource<T> extends DataSource { } }
- com.allen_sauer.gwt.log.client.Log.debug("Result = " + result); + Log.debug("Result = " + result);
return result; } diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css index 54cc3a9..d60a616 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css +++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css @@ -386,6 +386,10 @@ a:hover { border-color: #EE1111; /* slightly darker medium red */ }
+.InlineNote { + color: #511; +} + .log-panel { z-index: 9999999 !important; }