java/code/src/com/redhat/rhn/frontend/taglibs/RhnListTagFunctions.java |
13 ++
java/code/src/com/redhat/rhn/frontend/taglibs/list/DataSetManipulator.java |
58 ++++++++--
java/code/src/com/redhat/rhn/frontend/taglibs/list/ListTag.java |
40 ++++--
java/code/src/com/redhat/rhn/frontend/taglibs/list/SelectableColumnTag.java |
51 ++++++--
java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/ExpansionDecorator.java |
14 +-
java/code/src/com/redhat/rhn/frontend/taglibs/rhn-list.tld |
13 ++
java/code/webapp/WEB-INF/pages/systems/duplicate/duplicateIPList.jsp |
3
web/html/javascript/check_all.js |
49 ++++++--
8 files changed, 190 insertions(+), 51 deletions(-)
New commits:
commit 52415e8c5f658e744d23ea2d13c24180cb5be4e8
Author: Partha Aji <paji(a)redhat.com>
Date: Mon May 3 18:17:23 2010 -0400
More changes to properly handle selection javascript magic
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/RhnListTagFunctions.java
b/java/code/src/com/redhat/rhn/frontend/taglibs/RhnListTagFunctions.java
index 08fcd7a..d743e2c 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/RhnListTagFunctions.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/RhnListTagFunctions.java
@@ -36,4 +36,17 @@ public class RhnListTagFunctions {
public static boolean isExpandable(Object current) {
return current instanceof Expandable;
}
+
+ /**
+ * Quick check to see if the passed in object is expandable.
+ *
+ * @param current The object to be checked
+ * @return true if the current object is expandable
+ */
+ public static int getChildrenCount(Object current) {
+ if (!isExpandable(current)) {
+ return 0;
+ }
+ return ((Expandable)current).expand().size();
+ }
}
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/list/DataSetManipulator.java
b/java/code/src/com/redhat/rhn/frontend/taglibs/list/DataSetManipulator.java
index cb7c1f7..d5a7676 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/list/DataSetManipulator.java
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/list/DataSetManipulator.java
@@ -15,6 +15,7 @@
package com.redhat.rhn.frontend.taglibs.list;
+import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.util.DynamicComparator;
import com.redhat.rhn.common.util.MethodUtil;
import com.redhat.rhn.common.util.StringUtil;
@@ -59,6 +60,7 @@ public class DataSetManipulator {
private int alphaPosition = -1;
private boolean ascending = true;
private int unfilteredDataSize;
+ private boolean parentIsAnElement;
private String defaultSortAttribute;
private static final String IMG_FIRST = "/img/list-allbackward.gif";
@@ -85,15 +87,19 @@ public class DataSetManipulator {
* @param datasetIn dataset to be displayed
* @param requestIn HttpServletRequest of the caller
* @param listNameIn name of the list
+ * @param parentIsElement true of the parent value
+ * in the list should be considered as an element
+ * this is useful for tree like data
*/
public DataSetManipulator(int pageSizeIn, List datasetIn,
- HttpServletRequest requestIn, String listNameIn) {
+ HttpServletRequest requestIn, String listNameIn, boolean parentIsElement) {
pageSize = pageSizeIn;
dataset = datasetIn;
request = requestIn;
uniqueName = listNameIn;
totalDataSetSize = dataset.size();
unfilteredDataSize = dataset.size();
+ parentIsAnElement = parentIsElement;
}
private List expand(List data) {
@@ -163,7 +169,7 @@ public class DataSetManipulator {
* Returns the starting element index for a page (1 based)
* @return int
*/
- public int getPageStartIndex() {
+ private int getPageStartIndex() {
//no data ==> no start index...
if (getTotalDataSetSize() == 0) {
return 0;
@@ -174,30 +180,64 @@ public class DataSetManipulator {
if (startOffset < 0) {
startOffset = 0;
}
- return startOffset + 1;
+ List parentList = dataset.subList(0, startOffset);
+ List data = expand(parentList);
+ int ret = data.size() + 1;
+
+ if (!parentIsAnElement) {
+ ret = ret - parentList.size();
+ }
+ return ret;
}
/**
* Returns the ending element index for a page (1 based)
* @return int
*/
- public int getPageEndIndex() {
+ private int getPageEndIndex() {
int startOffset = getCurrentPageNumber() * pageSize;
if (startOffset < 0) {
startOffset = 0;
}
+
int endOffset = startOffset + pageSize;
if (endOffset > dataset.size()) {
endOffset = dataset.size();
}
- return endOffset;
+ List parentList = dataset.subList(0, endOffset);
+ List data = expand(parentList);
+
+ if (!parentIsAnElement) {
+ return data.size() - parentList.size();
+ }
+
+ return data.size();
+ }
+
+ private int getExpandedDataSize() {
+ if (!parentIsAnElement) {
+ return expand(dataset).size() - dataset.size();
+ }
+ return expand(dataset).size();
}
/**
+ * Returns the pagination message (1 - 2 of 3 for example)
+ * @return the pagination message
+ */
+ public String getPaginationMessage() {
+ LocalizationService ls = LocalizationService.getInstance();
+ return ls.getMessage("message.range", getPageStartIndex(),
+ getPageEndIndex(), getExpandedDataSize());
+
+ }
+
+
+ /**
* Determines the current page number based on URL params
* @return current page number
*/
- public int getCurrentPageNumber() {
+ private int getCurrentPageNumber() {
if (AlphaBarHelper.getInstance().isSelected(uniqueName, request)) {
int pos = findAlphaPosition();
@@ -240,6 +280,12 @@ public class DataSetManipulator {
}
/**
+ * Binds information pertaining to pagination to the request
+ */
+ public void bindPaginationInfo() {
+ request.setAttribute("pageNum",
String.valueOf(getCurrentPageNumber()));
+ }
+ /**
* Returns the pagination param (|<, <, >, >|) that was selected
* returns null if no pagination action was selected.
* @param request the http servlet request
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 8488e2a..6c5a265 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
@@ -83,6 +83,7 @@ public class ListTag extends BodyTagSupport {
private String refLinkKeyArg0;
private String title;
private boolean sortable;
+ private boolean parentIsElement;
/**
* method to let the list tag know
@@ -478,8 +479,7 @@ public class ListTag extends BodyTagSupport {
startTable();
HttpServletRequest request = (HttpServletRequest) pageContext
.getRequest();
- request.setAttribute("pageNum", String.valueOf(manip
- .getCurrentPageNumber()));
+ manip.bindPaginationInfo();
request.setAttribute("dataSize", String
.valueOf(pageData.size() + 1));
ListTagUtil.setCurrentCommand(pageContext, getUniqueName(),
@@ -586,7 +586,8 @@ public class ListTag extends BodyTagSupport {
setupPageData();
setPageSize();
manip = new DataSetManipulator(pageSize, pageData,
- (HttpServletRequest) pageContext.getRequest(), getUniqueName());
+ (HttpServletRequest) pageContext.getRequest(),
+ getUniqueName(), isParentAnElement());
int retval = BodyTagSupport.EVAL_BODY_INCLUDE;
emitId();
@@ -676,7 +677,7 @@ public class ListTag extends BodyTagSupport {
decoratorName = null;
title = null;
sortable = false;
-
+ parentIsElement = true;
super.release();
}
@@ -788,13 +789,7 @@ public class ListTag extends BodyTagSupport {
ListTagUtil.write(pageContext,
"<td valign=\"middle\"
class=\"list-infotext\">");
if (!isEmpty() && !hidePageNums) {
- Object[] range = new Integer[3];
- range[0] = new Integer(manip.getPageStartIndex());
- range[1] = new Integer(manip.getPageEndIndex());
- range[2] = new Integer(manip.getTotalDataSetSize());
- LocalizationService ls = LocalizationService.getInstance();
- String msg = ls.getMessage("message.range", range);
- ListTagUtil.write(pageContext, msg);
+ ListTagUtil.write(pageContext, manip.getPaginationMessage());
}
if (!manip.isListEmpty()) {
@@ -919,12 +914,29 @@ public class ListTag extends BodyTagSupport {
* @param value true or false
*/
public void setHidepagenums(String value) {
- if (value.equals("true") || value.equals("True")) {
- hidePageNums = true;
- }
+ hidePageNums = ListTagUtil.toBoolean(value);
}
/**
+ * if set to true, the parent in a tree setup will
+ * be considered as an element by itself
+ * @param value true or false
+ */
+ public void setParentiselement(String value) {
+ parentIsElement = ListTagUtil.toBoolean(value);
+ }
+
+ /**
+ * if set to true, the parent in a tree setup will
+ * be considered as an element by itself
+ * @return true if the parent itself is an element
+ */
+ public boolean isParentAnElement() {
+ return parentIsElement;
+ }
+
+
+ /**
*
* @return CSS ID for <table>
*/
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 7cb860d..ac05db5 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,8 @@ 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,
%s, '%s')";
+ "process_checkbox_clicked(this,'%s', this.form.%s, %s,
%s, '%s', %s)";
+ private static final String CHECK_ALL_SCRIPT = "process_check_all('%s',
%s, %s, %s)";
private String valueExpr;
private String selectExpr;
private String disabledExpr;
@@ -188,19 +189,14 @@ public class SelectableColumnTag extends TagSupport {
ListTagUtil.write(pageContext, " name=\"");
ListTagUtil.write(pageContext, makeSelectAllCheckboxName());
ListTagUtil.write(pageContext, "\" ");
- ListTagUtil.write(pageContext, "onclick=\"");
- ListTagUtil.write(pageContext, "process_check_all(");
- ListTagUtil.write(pageContext, "'");
-
- if (rhnSet != null) {
- ListTagUtil.write(pageContext, rhnSet);
- }
- ListTagUtil.write(pageContext, "', ");
- ListTagUtil.write(pageContext, "this.form." +
- ListTagUtil.makeSelectedItemsName(listName));
- ListTagUtil.write(pageContext, ", this.checked)");
-
- ListTagUtil.write(pageContext, "\" />");
+ ListTagUtil.write(pageContext, "onclick=\"");
+ String script = String.format(CHECK_ALL_SCRIPT,
+ StringUtils.defaultString(rhnSet),
+ "this.form." + ListTagUtil.
+ makeSelectedItemsName(listName),
"this.checked",
+ getIgnorableParentIds());
+ ListTagUtil.write(pageContext, script);
+ ListTagUtil.write(pageContext, "\" />");
}
private void renderCheckbox() throws JspException {
render(valueExpr);
@@ -249,6 +245,8 @@ public class SelectableColumnTag extends TagSupport {
String childIds = "[]";
String memberIds = "[]";
String parentId = "";
+ ListTag parentTag = (ListTag)
+ BodyTagSupport.findAncestorWithClass(this, ListTag.class);
if (RhnListTagFunctions.isExpandable(current)) {
childIds = getChildIds(current);
@@ -261,7 +259,8 @@ public class SelectableColumnTag extends TagSupport {
ListTagUtil.write(pageContext, " onclick=\"");
ListTagUtil.write(pageContext, String.format(CHECKBOX_CLICKED_SCRIPT,
rhnSet, makeSelectAllCheckboxName(),
- childIds, memberIds, parentId));
+ childIds, memberIds, parentId,
+ parentTag.isParentAnElement()));
ListTagUtil.write(pageContext, "\" ");
}
}
@@ -362,5 +361,27 @@ public class SelectableColumnTag extends TagSupport {
ListTag parent = (ListTag)
BodyTagSupport.findAncestorWithClass(this, ListTag.class);
return parent.getParentObject();
+ }
+
+ private String getIgnorableParentIds() {
+ ListTag parent = (ListTag)
+ BodyTagSupport.findAncestorWithClass(this, ListTag.class);
+ if (!parent.isParentAnElement()) {
+ StringBuilder buf = new StringBuilder();
+ for (Object current : parent.getPageData()) {
+ if (RhnListTagFunctions.isExpandable(current)) {
+ if (buf.length() > 0) {
+ buf.append(",");
+ }
+ buf.append("'");
+ buf.append(makeCheckboxId(ListTagHelper.getObjectId(current)));
+ buf.append("'");
+ }
+ }
+ buf.insert(0, "[");
+ buf.append("]");
+ return buf.toString();
+ }
+ return "[]";
}
}
diff --git
a/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/ExpansionDecorator.java
b/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/ExpansionDecorator.java
index 3198608..fa413b9 100644
---
a/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/ExpansionDecorator.java
+++
b/java/code/src/com/redhat/rhn/frontend/taglibs/list/decorators/ExpansionDecorator.java
@@ -33,7 +33,7 @@ public class ExpansionDecorator extends BaseListDecorator {
"style=\"cursor: pointer;\">Hide All</a>";
private static final String NEW_VAR_SCRIPT = "<script
type=\"text/javascript\">var " +
- "rowHash%s = new
Array();</script>";
+ "rowHash%s = new
Array();</script>";
private static final String LOAD_SCRIPT = "<script
type=\"text/javascript\">" +
"onLoadStuff(%s, '%s',
rowHash%s);</script>";
@@ -44,8 +44,16 @@ public class ExpansionDecorator extends BaseListDecorator {
@Override
public void beforeList() throws JspException {
ListTagUtil.write(pageContext, String.format(NEW_VAR_SCRIPT, listName));
- ListTagUtil.write(pageContext, String.format(SHOW_ALL_SCRIPT, listName,
listName));
-
+ }
+
+ /**
+ *
+ * {@inheritDoc}
+ */
+ @Override
+ public void beforeTopPagination() throws JspException {
+ ListTagUtil.write(pageContext, String.format(SHOW_ALL_SCRIPT,
+ listName, listName));
}
/**
diff --git a/java/code/src/com/redhat/rhn/frontend/taglibs/rhn-list.tld
b/java/code/src/com/redhat/rhn/frontend/taglibs/rhn-list.tld
index bc6ec20..16abb68 100644
--- a/java/code/src/com/redhat/rhn/frontend/taglibs/rhn-list.tld
+++ b/java/code/src/com/redhat/rhn/frontend/taglibs/rhn-list.tld
@@ -86,6 +86,12 @@
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
+ <attribute>
+ <name>parentiselement</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ </attribute>
+
<attribute>
<name>reflink</name>
<required>false</required>
@@ -311,5 +317,10 @@
<name>expandable</name>
<function-class>com.redhat.rhn.frontend.taglibs.RhnListTagFunctions</function-class>
<function-signature>boolean
isExpandable(java.lang.Object)</function-signature>
- </function>
+ </function>
+ <function>
+ <name>countChildren</name>
+
<function-class>com.redhat.rhn.frontend.taglibs.RhnListTagFunctions</function-class>
+ <function-signature>int
getChildrenCount(java.lang.Object)</function-signature>
+ </function>
</taglib>
diff --git a/java/code/webapp/WEB-INF/pages/systems/duplicate/duplicateIPList.jsp
b/java/code/webapp/WEB-INF/pages/systems/duplicate/duplicateIPList.jsp
index 50addb4..1c4fa92 100644
--- a/java/code/webapp/WEB-INF/pages/systems/duplicate/duplicateIPList.jsp
+++ b/java/code/webapp/WEB-INF/pages/systems/duplicate/duplicateIPList.jsp
@@ -22,6 +22,7 @@
<rl:listset name="DupesListSet" legend="system">
<rl:list
emptykey="nosystems.message"
+ parentiselement = "false"
<rl:rowrenderer name="ExpandableRowRenderer" />
@@ -44,7 +45,7 @@
<!-- Name Column -->
<rl:column headerkey="systemlist.jsp.system" filterattr="id">
- <rl:expandable
rendericon="true">${current.key}</rl:expandable>
+ <rl:expandable rendericon="true">${current.key}
<em>(${rl:countChildren(current)} systems)</em> </rl:expandable>
<rl:non-expandable
rendericon="true">${current.id}</rl:non-expandable>
</rl:column>
diff --git a/web/html/javascript/check_all.js b/web/html/javascript/check_all.js
index b5331b1..b422c0a 100644
--- a/web/html/javascript/check_all.js
+++ b/web/html/javascript/check_all.js
@@ -25,13 +25,37 @@ function check_all_on_page(form, set_label) {
}
var flag = eval("document.forms['" + form_name +
"'].checkall.checked");
var cboxes = eval("document.forms['" + form_name +
"'].items_selected");
- process_check_all(set_label, cboxes, flag);
+ process_check_all(set_label, cboxes, flag, []);
}
-function process_check_all(set_label, cboxes, flag) {
- update_server_set("ids", set_label, flag, process_group(set_label, cboxes,
flag));
+function process_check_all(set_label, cboxes, flag, ignorables_ids) {
+ var boxes = process_group(set_label, cboxes, flag);
+ var ignorables = ids_to_elements(ignorables_ids);
+ var includes = new Array();
+ for (var i = 0; i < boxes.length; i++) {
+ var include = true;
+ for (var j = 0; j < ignorables.length; j++) {
+ if (ignorables[j].value == boxes[i]) {
+ include = false;
+ break;
+ }
+ }
+ if (include) {
+ includes.push(boxes[i]);
+ }
+ }
+ update_server_set("ids", set_label, flag, includes);
+}
+
+function ids_to_elements(elem_ids) {
+ var elements = new Array();
+ for (var i = 0; i < elem_ids.length; i++) {
+ elements.push(document.getElementById(elem_ids[i]));
+ }
+ return elements;
}
+
function process_group(set_label, cboxes, flag) {
var i;
var changed = new Array();
@@ -62,7 +86,7 @@ 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, [], [],"", true);
}
@@ -79,9 +103,16 @@ function checkbox_clicked(thebox, set_label) {
* 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 ) {
+function process_checkbox_clicked(thebox, set_label, checkall, children, members,
parent_id, parentIsElement) {
var a = new Array();
- a.push(thebox.value);
+ if (parent_id == '') {
+ if(parentIsElement) {
+ a.push(thebox.value);
+ }
+ }
+ else {
+ a.push(thebox.value);
+ }
var checkboxes = new Array();
for (var i = 0; i < children.length; i++) {
@@ -95,11 +126,7 @@ function process_checkbox_clicked(thebox, set_label, checkall,
children, members
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);
- }
+ var boxes = ids_to_elements(members) ;
process_single_checkbox(boxes, parentBox);
}
var form_name = thebox.form.name;