Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
update search screen
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Jun 9, 2015
1 parent af5a4cc commit a773abf
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 20 deletions.
@@ -1,14 +1,14 @@
package org.zanata.action;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;

import javax.faces.model.DataModel;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import org.apache.commons.lang.StringUtils;
import org.apache.lucene.queryParser.ParseException;
Expand All @@ -21,26 +21,32 @@
import org.zanata.dao.ProjectDAO;
import org.zanata.model.HAccount;
import org.zanata.model.HProject;
import org.zanata.security.ZanataIdentity;

import com.google.common.collect.Lists;
import org.zanata.ui.AbstractAutocomplete;
import org.zanata.ui.AbstractListFilter;
import org.zanata.ui.InMemoryListFilter;
import org.zanata.util.ServiceLocator;

/**
* This will search both projects and people.
*/
@Name("projectSearch")
@Name("zanataSearch")
@Scope(ScopeType.CONVERSATION)
@AutoCreate
public class ProjectSearch implements Serializable {
public class ZanataSearch implements Serializable {

private static final long serialVersionUID = 1L;

private final static int DEFAULT_PAGE_SIZE = 30;

private final boolean includeObsolete = false;

@In
private ProjectDAO projectDAO;

@Getter
private ProjectAutocomplete projectAutocomplete = new ProjectAutocomplete();
private ProjectUserAutocomplete autocomplete = new ProjectUserAutocomplete();

private QueryProjectPagedListDataModel queryProjectPagedListDataModel =
new QueryProjectPagedListDataModel(DEFAULT_PAGE_SIZE);
Expand Down Expand Up @@ -72,7 +78,7 @@ public boolean isUserNull() {
}
}

private class ProjectAutocomplete extends
private class ProjectUserAutocomplete extends
AbstractAutocomplete<SearchResult> {

private ProjectDAO projectDAO =
Expand All @@ -92,7 +98,6 @@ public List<SearchResult> suggest() {
}
try {
String searchQuery = getQuery().trim();
boolean includeObsolete = false;
List<HProject> searchResult =
projectDAO.searchProjects(searchQuery,
INITIAL_RESULT_COUNT, 0, includeObsolete);
Expand Down Expand Up @@ -128,4 +133,45 @@ public void setQuery(String query) {
super.setQuery(query);
}
}

@Getter
private final AbstractListFilter<HProject> projectTabProjectFilter =
new InMemoryListFilter<HProject>() {

private ProjectDAO projectDAO = ServiceLocator.instance()
.getInstance(ProjectDAO.class);

@Override
protected List<HProject> fetchAll() {
if(StringUtils.isEmpty(getAutocomplete().getQuery())) {
return Collections.emptyList();
}
try {
return projectDAO
.searchProjects(getAutocomplete().getQuery(), -1, 0,
includeObsolete);
} catch (ParseException pe) {
return Collections.emptyList();
}
}

@Override
protected boolean include(HProject elem, String filter) {
return StringUtils.containsIgnoreCase(elem.getSlug(), filter) ||
StringUtils.containsIgnoreCase(elem.getName(), filter);
}
};

public int getTotalProjectCount() {
try {
return projectDAO.getQueryProjectSize(getAutocomplete().getQuery(),
includeObsolete);
} catch (ParseException pe) {
return 0;
}
}

public int getTotalUserCount() {
return 0;
}
}
5 changes: 4 additions & 1 deletion zanata-war/src/main/java/org/zanata/dao/ProjectDAO.java
Expand Up @@ -258,7 +258,10 @@ public List<HProject> searchProjects(@Nonnull String searchQuery,
int maxResult, int firstResult, boolean includeObsolete)
throws ParseException {
FullTextQuery query = buildSearchQuery(searchQuery, includeObsolete);
return query.setMaxResults(maxResult).setFirstResult(firstResult)
if(maxResult > 0) {
query.setMaxResults(maxResult);
}
return query.setFirstResult(firstResult)
.getResultList();
}

Expand Down
1 change: 1 addition & 0 deletions zanata-war/src/main/resources/messages.properties
Expand Up @@ -85,6 +85,7 @@ jsf.Login=Log In
jsf.Signup=Sign up
jsf.Menu=Menu
jsf.Account=Account
jsf.Users=Users

#--- Authentication Messages ---
jsf.auth.KerberosNotice.label=It looks like you don't have a valid Kerberos ticket. <strong>Please log in with your Kerberos credentials.</strong>
Expand Down
2 changes: 1 addition & 1 deletion zanata-war/src/main/webapp/WEB-INF/pages.xml
Expand Up @@ -17,7 +17,7 @@

<!-- Project Search -->
<page view-id="/search.xhtml">
<param name="query" value="#{projectSearch.projectAutocomplete.query}" />
<param name="query" value="#{zanataSearch.autocomplete.query}" />
<action execute="#{breadcrumbs.clear}" />
<action
execute="#{breadcrumbs.addLocation('', msgs['jsf.SearchProjects'])}" />
Expand Down
6 changes: 3 additions & 3 deletions zanata-war/src/main/webapp/WEB-INF/template/banner.xhtml
Expand Up @@ -32,7 +32,7 @@
#{msgs['jsf.Search']}
</label>

<zanata:autocomplete actionBean="#{projectSearch.projectAutocomplete}"
<zanata:autocomplete actionBean="#{zanataSearch.autocomplete}"
maxlength="100" minlength="1" id="projectAutocomplete"
fetchValue="#{result.project.slug}"
placeholder="#{msgs['jsf.Search']}"
Expand All @@ -54,8 +54,8 @@

<s:link view="/search.xhtml" rendered="#{result.isProjectNull() and result.isUserNull()}">
<i class="i i--search"></i> Search Zanata for
'#{projectSearch.projectAutocomplete.query}'
<f:param name="query" value="#{projectSearch.projectAutocomplete.query}"/>
'#{zanataSearch.autocomplete.query}'
<f:param name="query" value="#{zanataSearch.autocomplete.query}"/>
</s:link>

</zanata:autocomplete>
Expand Down
136 changes: 128 additions & 8 deletions zanata-war/src/main/webapp/search.xhtml
Expand Up @@ -6,18 +6,139 @@
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
template="./WEB-INF/template/template_2x.xhtml">
xmlns:a4j="http://richfaces.org/a4j"
xmlns:zanata="http://java.sun.com/jsf/composite/zanata"
template="/WEB-INF/template/template.xhtml">

<ui:define
name="page_title">#{msgs.format('jsf.SearchResultsForProjectSearch',
projectSearch.projectAutocomplete.query)}</ui:define>
zanataSearch.autocomplete.query)}</ui:define>
<ui:define name="center_content">
<h1>#{msgs.format('jsf.projectSearch.searchQuery.title',
projectSearch.projectAutocomplete.query)}</h1>
<div class="g--centered" id="search-page">
<div class="g__item l--constrain-large l--push-bottom-half">
<p class="txt--meta l--push-all-0">
#{msgs.format('jsf.projectSearch.searchQuery.title', zanataSearch.autocomplete.query)}
</p>

<div class="tabs--lined js-tabs">
<ul class="tabs__nav js-tabs-nav">
<li>
<a id="projects_tab"
href="#{request.contextPath}/search/#{zanataSearch.autocomplete.query}/projects"
class="js-url-mod" data-content="#projects">
<i class="i i--project"></i>
<span class="is-hidden--s i__text--right">
#{msgs['jsf.Projects']}
</span>
<s:span styleClass="txt--neutral" id="projects-size">
#{zanataSearch.getTotalProjectCount()}
</s:span>
</a>
</li>
<li>
<a id="users_tab"
href="#{request.contextPath}/search/#{zanataSearch.autocomplete.query}/users"
class="js-url-mod" data-content="#users">
<i class="i i--users"></i>
<span class="is-hidden--s i__text--right">
#{msgs['jsf.Users']}
</span>
<s:span styleClass="txt--neutral" id="users-size">
#{zanataSearch.getTotalUserCount()}
</s:span>
</a>
</li>
</ul>

<ul class="tabs__content panels__container js-tabs-content l--push-top-1">
<li id="projects">
<div class="panels--2">
<div class="panels__panel panel">
<div class="panels__panel__header panel__header">
<h2 class="panel__heading">#{msgs['jsf.Projects']}</h2>
</div>

<div class="panel__sub-header js-reveal">
<zanata:list-filter status="projectTab-projectsLoader"
listId="search-project_form"
placeholder="#{msgs['jsf.project.search.placeholder']}"
iconClass="i--project"
render="search-project_form, projectTabProjectFilterBottom-pager, projectTabProjectFilterBottom-page-info"
id="projectTabProjectFilter"
actionBean="#{zanataSearch.projectTabProjectFilter}"/>
</div>

<a4j:status name="projectTab-projectsLoader">
<f:facet name="start">
<zanata:loader/>
</f:facet>
</a4j:status>

<h:form id="search-project_form" styleClass="l--push-bottom-1">
<s:div styleClass="l--pad-all-half" rendered="#{zanataSearch.getTotalProjectCount() ge 0 and empty zanataSearch.projectTabProjectFilter.currentPage}">
<p class="txt--meta">#{msgs['jsf.search.NoResult']}</p>
</s:div>

<s:fragment
rendered="#{not empty zanataSearch.projectTabProjectFilter.currentPage}">
<ul class="list--slat">
<ui:repeat value="#{zanataSearch.projectTabProjectFilter.currentPage}"
var="project">
<li class="l--pad-all-half">
<a href="#{request.contextPath}/projects/view/#{project.slug}">
<div class="list__item">
<div class="list__item__info">
<h3 class="list__title">#{project.name}</h3>
<div class="list__item__meta">
<span>
<i class="txt--neutral i i--version" title="#{msgs['jsf.Versions']}"></i> #{project.projectIterations.size}
</span>
<span class="l--pad-left-half">
<i class="txt--neutral i i--clock" title="#{msgs['jsf.CreationDate']}"></i> #{project.creationDate}
</span>
</div>
</div>
</div>
</a>
</li>
</ui:repeat>
</ul>
</s:fragment>

</h:form>

<zanata:list-filter status="projectTab-projectsLoader"
listId="search-project_form"
placeholder="#{msgs['jsf.language.search.placeholder']}"
iconClass="i--language" bottomPanel="true"
render="search-project_form, projectTabProjectFilter-pager, projectTabProjectFilter-page-info"
id="projectTabProjectFilterBottom"
actionBean="#{zanataSearch.projectTabProjectFilter}"/>

</div>
</div>
</li>

<li id="users">

</li>
</ul>
</div>
</div>
</div>








<h1>#{msgs.format('jsf.projectSearch.searchQuery.title', zanataSearch.autocomplete.query)}</h1>
<h:form>
<div style="text-align: center">
<rich:dataScroller renderIfSinglePage="false" for="searchResults"
page="#{projectSearch.projectPagedListDataModel.scrollerPage}" id="scroller"
page="#{zanataSearch.projectPagedListDataModel.scrollerPage}" id="scroller"
fastControls="hide" render="scroller, searchResults">
<f:facet name="first">
<h:outputText value="" styleClass="icon-to-start"/>
Expand Down Expand Up @@ -54,8 +175,8 @@
</div>

<rich:dataTable id="searchResults" columnsWidth="200px,200px,80px"
rows="#{projectSearch.projectPagedListDataModel.pageSize}"
value="#{projectSearch.getProjectPagedListDataModel()}" var="project">
rows="#{zanataSearch.projectPagedListDataModel.pageSize}"
value="#{zanataSearch.getProjectPagedListDataModel()}" var="project">
<rich:column>
<f:facet name="header">#{msgs['jsf.ProjectName']}</f:facet>
<s:link id="project" value="#{project.name}" propagation="none"
Expand All @@ -76,7 +197,6 @@
</rich:column>
</rich:dataTable>
</h:form>

</ui:define>

</ui:composition>

0 comments on commit a773abf

Please sign in to comment.