Multiple category search added to Advanced Search screen

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2079 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2006-01-06 14:48:24 +00:00
parent af2c1603cf
commit acd5d24c62
3 changed files with 118 additions and 41 deletions

View File

@@ -23,8 +23,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.component.UISelectBoolean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import org.alfresco.config.ConfigService;
@@ -42,12 +45,15 @@ import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.CachingDateFormat;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.MapNode;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.config.ClientConfigElement;
import org.alfresco.web.config.ClientConfigElement.CustomProperty;
import org.alfresco.web.data.IDataContainer;
import org.alfresco.web.data.QuickSort;
import org.alfresco.web.ui.common.component.UIPanel.ExpandedEvent;
import org.alfresco.web.ui.repo.component.UICategorySelector;
import org.alfresco.web.ui.repo.component.UISearchCustomProperties;
/**
@@ -181,19 +187,20 @@ public class AdvancedSearchBean
}
/**
* @return Returns the category.
* Returns the properties for current categories JSF DataModel
*
* @return JSF DataModel representing the current categories to search against
*/
public NodeRef getCategory()
public DataModel getCategoriesDataModel()
{
return this.category;
}
/**
* @param category The category to set.
*/
public void setCategory(NodeRef category)
{
this.category = category;
if (this.categoriesDataModel == null)
{
this.categoriesDataModel = new ListDataModel();
}
this.categoriesDataModel.setWrappedData(this.categories);
return this.categoriesDataModel;
}
/**
@@ -212,22 +219,6 @@ public class AdvancedSearchBean
this.locationChildren = locationChildren;
}
/**
* @return Returns true to search category children, false for just the specified category.
*/
public boolean getCategoryChildren()
{
return this.categoryChildren;
}
/**
* @param categoryChildren True to search category children, false for just the specified category.
*/
public void setCategoryChildren(boolean categoryChildren)
{
this.categoryChildren = categoryChildren;
}
/**
* @return Returns the createdDateFrom.
*/
@@ -511,7 +502,8 @@ public class AdvancedSearchBean
this.lookin = LOOKIN_ALL;
this.contentType = null;
this.location = null;
this.category = null;
this.locationChildren = false;
this.categories = new ArrayList<Node>(2);
this.title = null;
this.description = null;
this.author = null;
@@ -650,10 +642,16 @@ public class AdvancedSearchBean
}
// category path search
if (this.category != null)
if (this.categories.size() != 0)
{
search.setCategories(new String[]{SearchContext.getPathFromSpaceRef(
new NodeRef(Repository.getStoreRef(), this.category.getId()), this.categoryChildren)});
String[] paths = new String[this.categories.size()];
for (int i=0; i<paths.length; i++)
{
Node category = this.categories.get(i);
boolean includeChildren = (Boolean)category.getProperties().get("includeChildren");
paths[i] = SearchContext.getPathFromSpaceRef(category.getNodeRef(), includeChildren);
}
search.setCategories(paths);
}
// content type restriction
@@ -672,6 +670,41 @@ public class AdvancedSearchBean
return outcome;
}
/**
* Action handler called when the Add button is pressed to add the current Category selection
*/
public void addCategory(ActionEvent event)
{
UICategorySelector selector = (UICategorySelector)event.getComponent().findComponent("catSelector");
UISelectBoolean chkChildren = (UISelectBoolean)event.getComponent().findComponent("chkCatChildren");
NodeRef categoryRef = (NodeRef)selector.getValue();
if (categoryRef != null)
{
//final boolean incChildren = chkChildren.isSelected();
Node categoryNode = new MapNode(categoryRef);
categoryNode.getProperties().put("includeChildren", chkChildren.isSelected());
/*categoryNode.addPropertyResolver("includeChildren", new NodePropertyResolver() {
public Object get(Node node) {
return incChildren;
};
});*/
this.categories.add(categoryNode);
}
}
/**
* Action handler called when the Remove button is pressed to remove a category
*/
public void removeCategory(ActionEvent event)
{
Node node = (Node)this.categoriesDataModel.getRowData();
if (node != null)
{
this.categories.remove(node);
}
}
/**
* @return ClientConfigElement
*/
@@ -795,7 +828,10 @@ public class AdvancedSearchBean
private NodeRef location = null;
/** categories to search */
private NodeRef category = null;
private List<Node> categories = new ArrayList<Node>(2);
/** datamodel for table of categories to search */
private DataModel categoriesDataModel = null;
/** title attribute to search */
private String title = null;
@@ -818,9 +854,6 @@ public class AdvancedSearchBean
/** true to search location children as well as location */
private boolean locationChildren = true;
/** true to search category children as well as category */
private boolean categoryChildren = true;
/** author (creator) attribute to search */
private String author = null;

View File

@@ -295,10 +295,10 @@ public final class SearchContext implements Serializable
query = attributeQuery + " AND (" + query + ')';
}
// match entire query against specified Space path
// match entire query against any specified paths
if (pathQuery != null)
{
query = pathQuery + " AND (" + query + ')';
query = "(" + pathQuery + ") AND (" + query + ')';
}
if (logger.isDebugEnabled())
@@ -308,7 +308,7 @@ public final class SearchContext implements Serializable
}
/**
* Generate a search XPATH pointing to the specified node Id, optionally return an XPATH
* Generate a search XPATH pointing to the specified node, optionally return an XPATH
* that includes the child nodes.
*
* @param id Of the node to generate path too
@@ -364,7 +364,7 @@ public final class SearchContext implements Serializable
}
/**
* @param categories The categories to set.
* @param categories The categories to set as a list of search XPATHs
*/
public void setCategories(String[] categories)
{

View File

@@ -189,15 +189,59 @@
<table cellpadding="2" cellspacing="2" border="0">
<tr>
<td style="padding-left:8px;padding-top:8px">
<r:categorySelector label="#{msg.select_category_prompt}" value="#{AdvancedSearchBean.category}" styleClass="selector" id="catSelector" />
<r:categorySelector id="catSelector" label="#{msg.select_category_prompt}" styleClass="selector" />
</td>
</tr>
<tr>
<td style="padding-left:4px">
<h:selectBooleanCheckbox value="#{AdvancedSearchBean.categoryChildren}" id="chkCategory" />
<h:selectBooleanCheckbox id="chkCatChildren" />
<span style="vertical-align:20%"><h:outputText value="#{msg.include_sub_categories}" id="incCats" /></span>
</td>
</tr>
<tr>
<td style="padding-left:4px">
<h:commandButton id="btnAddCat" value="#{msg.add_to_list_button}" actionListener="#{AdvancedSearchBean.addCategory}" styleClass="wizardButton" />
</td>
</tr>
<tr>
<td style="padding-left:4px">
<h:dataTable value="#{AdvancedSearchBean.categoriesDataModel}" var="row" id="catTable"
rowClasses="selectedItemsRow,selectedItemsRowAlt"
styleClass="selectedItems" headerClass="selectedItemsHeader"
cellspacing="0" cellpadding="4"
rendered="#{AdvancedSearchBean.categoriesDataModel.rowCount != 0}">
<h:column id="col1">
<f:facet name="header">
<h:outputText value="#{msg.category}" id="tblCatNameHead" />
</f:facet>
<h:outputText value="#{row.name}" id="tblCatName" />
</h:column>
<h:column id="col2">
<f:facet name="header">
<h:outputText value="#{msg.include_sub_categories}" id="tblCatIncHead" />
</f:facet>
<h:outputText value="#{row.includeChildren}" id="tblCatInc" >
<a:convertBoolean/>
</h:outputText>
</h:column>
<h:column id="col3">
<a:actionLink actionListener="#{AdvancedSearchBean.removeCategory}" image="/images/icons/delete.gif"
value="#{msg.remove}" showLink="false" style="padding-left:6px" id="tblCatAdd" />
</h:column>
</h:dataTable>
<a:panel id="no-items" rendered="#{AdvancedSearchBean.categoriesDataModel.rowCount == 0}">
<table cellspacing='0' cellpadding='2' border='0' class='selectedItems'>
<tr>
<td colspan='2' class='selectedItemsHeader'><h:outputText id="no-items-category" value="#{msg.category}" /></td>
</tr>
<tr>
<td class='selectedItemsRow'><h:outputText id="no-items-msg" value="#{msg.no_selected_items}" /></td>
</tr>
</table>
</a:panel>
</td>
</tr>
</table>
</a:panel>