java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTag.java | 17 +++
java/code/src/com/redhat/rhn/frontend/taglibs/list/SelectableColumnTag.java | 48
++++++++--
web/html/javascript/check_all.js | 45
+++++++--
3 files changed, 92 insertions(+), 18 deletions(-)
New commits:
commit 87a023860be9cf80c12ec55e56d102dc723e6ae5
Author: Partha Aji <paji(a)redhat.com>
Date: Fri Apr 30 18:27:51 2010 -0400
Needed to add more JS magic to get selections to work
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTag.java
b/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTag.java
index 90d74b5..8488e2a 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTag.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTag.java
@@ -21,6 +21,7 @@ import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.context.Context;
import com.redhat.rhn.frontend.html.HtmlTag;
import com.redhat.rhn.frontend.struts.RequestContext;
+import com.redhat.rhn.frontend.taglibs.RhnListTagFunctions;
import com.redhat.rhn.frontend.taglibs.list.decorators.ListDecorator;
import com.redhat.rhn.frontend.taglibs.list.decorators.PageSizeDecorator;
import com.redhat.rhn.frontend.taglibs.list.helper.ListHelper;
@@ -63,6 +64,7 @@ public class ListTag extends BodyTagSupport {
private List pageData;
private Iterator iterator;
private Object currentObject;
+ private Object parentObject;
private String styleClass = "list";
private String styleId;
private int rowCounter = -1;
@@ -341,6 +343,14 @@ public class ListTag extends BodyTagSupport {
}
/**
+ * The parent if this list is dealing with expandable objects
+ * @return the parent of the current object being displayed
+ */
+ public Object getParentObject() {
+ return parentObject;
+ }
+
+ /**
* Name used to store the currentObject in the page
* @param nameIn row name
* @throws JspException if row name is empty
@@ -514,7 +524,11 @@ public class ListTag extends BodyTagSupport {
ListTagUtil.setCurrentCommand(pageContext, getUniqueName(),
ListCommand.RENDER);
if (iterator.hasNext()) {
- currentObject = iterator.next();
+ Object obj = iterator.next();
+ if (RhnListTagFunctions.isExpandable(obj)) {
+ parentObject = obj;
+ }
+ currentObject = obj;
}
else {
currentObject = null;
@@ -644,6 +658,7 @@ public class ListTag extends BodyTagSupport {
pageData = null;
iterator = null;
currentObject = null;
+ parentObject = null;
styleClass = "list";
styleId = null;
rowCounter = -1;
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/list/SelectableColumnTag.java
b/java/code/src/com/redhat/rhn/frontend/taglibs/list/SelectableColumnTag.java
index 4f9cabd..7cb860d 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/list/SelectableColumnTag.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/list/SelectableColumnTag.java
@@ -34,7 +34,7 @@ public class SelectableColumnTag extends TagSupport {
private static final long serialVersionUID = 2749189931275777440L;
private static final String CHECKBOX_CLICKED_SCRIPT =
- "process_checkbox_clicked(this,'%s', this.form.%s,
%s)";
+ "process_checkbox_clicked(this,'%s', this.form.%s, %s,
%s, '%s')";
private String valueExpr;
private String selectExpr;
private String disabledExpr;
@@ -244,18 +244,39 @@ public class SelectableColumnTag extends TagSupport {
*/
private void renderOnClick() throws JspException {
if (!StringUtils.isBlank(rhnSet)) {
+ Object current = getCurrent();
+ Object parent = getParentObject();
+ String childIds = "[]";
+ String memberIds = "[]";
+ String parentId = "";
+
+ if (RhnListTagFunctions.isExpandable(current)) {
+ childIds = getChildIds(current);
+ }
+ else {
+ parentId = getParentId(current, parent);
+ memberIds = getMemberIds(current, parent);
+ }
+
ListTagUtil.write(pageContext, " onclick=\"");
ListTagUtil.write(pageContext, String.format(CHECKBOX_CLICKED_SCRIPT,
- rhnSet, makeSelectAllCheckboxName(), getChildIds()));
+ rhnSet, makeSelectAllCheckboxName(),
+ childIds, memberIds, parentId));
ListTagUtil.write(pageContext, "\" ");
}
}
- private String getChildIds() {
- Object current = getCurrent();
- if (RhnListTagFunctions.isExpandable(current)) {
+ private String getParentId(Object current, Object parent) {
+ if (parent != null && parent != current) {
+ return makeCheckboxId(ListTagHelper.getObjectId(parent));
+ }
+ return "";
+ }
+
+ private String getChildIds(Object parent) {
+ if (RhnListTagFunctions.isExpandable(parent)) {
StringBuilder buf = new StringBuilder();
- for (Object child : ((Expandable)current).expand()) {
+ for (Object child : ((Expandable)parent).expand()) {
if (buf.length() > 0) {
buf.append(",");
}
@@ -272,6 +293,15 @@ public class SelectableColumnTag extends TagSupport {
return "[]";
}
+
+ private String getMemberIds(Object current, Object parent) {
+ if (parent != null && parent != current) {
+ return getChildIds(parent);
+ }
+ return "[]";
+
+ }
+
private void renderHiddenItem(String listId, String value) throws JspException {
ListTagUtil.write(pageContext, "<input type=\"hidden\"
");
@@ -327,4 +357,10 @@ public class SelectableColumnTag extends TagSupport {
BodyTagSupport.findAncestorWithClass(this, ListTag.class);
return parent.getCurrentObject();
}
+
+ private Object getParentObject() {
+ ListTag parent = (ListTag)
+ BodyTagSupport.findAncestorWithClass(this, ListTag.class);
+ return parent.getParentObject();
+ }
}
diff --git a/web/html/javascript/check_all.js b/web/html/javascript/check_all.js
index e4b8281..dacdfe5 100644
--- a/web/html/javascript/check_all.js
+++ b/web/html/javascript/check_all.js
@@ -62,14 +62,33 @@ function checkbox_clicked(thebox, set_label) {
form_name = thebox.form.id;
}
var checkall = eval("document.forms['" + form_name +
"'].checkall");
- process_checkbox_clicked(thebox, set_label, checkall, []);
+ process_checkbox_clicked(thebox, set_label, checkall, [], [],"");
}
-function process_checkbox_clicked(thebox, set_label, checkall, children) {
- process_single_checkbox(thebox, set_label, checkall);
+
+/**
+ * This method is called when a single checkbox is clicked
+ * thebox - The check box that was clicked
+ * set_label - The rhnSet label of the checkbox that was clicked
+ * checkall - The link to the select all box
+ *
+ * If this list tag is using some sort of tree/grouping structure
+ *
+ * children - if this is a parent node then list the children or [] otherwise
+ * members - if this is a child node then list the siblings and include the child or []
otherwise
+ * parent_id - if this is a child node then list the parent_id or [] otherwise
+ **/
+
+function process_checkbox_clicked(thebox, set_label, checkall, children, members,
parent_id ) {
+ var form_name = thebox.form.name;
+ if (form_name == "") {
+ form_name = thebox.form.id;
+ }
+ var cboxes = eval("document.forms['" + form_name + "']."
+ thebox.name);
+ process_single_checkbox(cboxes, checkall);
var a = new Array();
a.push(thebox.value);
-
+
var checkboxes = new Array();
for (var i = 0; i < children.length; i++) {
var checkbox = document.getElementById(children[i]);
@@ -79,17 +98,21 @@ function process_checkbox_clicked(thebox, set_label, checkall,
children) {
if (checkboxes.length > 0) {
process_group(set_label, checkboxes, thebox.checked);
}
+
+ if (parent_id) {
+ var parentBox = document.getElementById(parent_id);
+ var boxes = new Array();
+ for (var i = 0; i < members.length; i++) {
+ var checkbox = document.getElementById(members[i]);
+ boxes.push(checkbox);
+ }
+ process_single_checkbox(boxes, parentBox);
+ }
update_server_set("ids", set_label, thebox.checked, a);
}
-function process_single_checkbox(thebox, set_label, checkall) {
- var form_name = thebox.form.name;
- if (form_name == "") {
- form_name = thebox.form.id;
- }
+function process_single_checkbox(cboxes, checkall) {
var i;
- var cboxes = eval("document.forms['" + form_name + "']." +
thebox.name);
-
var count_checked_or_disabled = 0;
var all_checked = false;
if (cboxes.length) {