Search code examples
liferaysearch-form

Liferay liferay-ui:search-toggle not showing (on search-form)


I'm trying to create a search form for my portlet. The portlet is an addressbook application, all dao and service build with service builder. I would like to give users a basic/advanced search form (like other on liferay, for example on "users and organizations" in control center.

I've implemented all logic and pages looking at liferay source code (6.1 GA1), but the search form is NOT showing up in any way, i'll put the code here.

in view.jsp:

<%
PortletURL portletURL = renderResponse.createRenderURL();
portletURL.setParameter("jspPage", "/html/addressbookportlet/view.jsp");
pageContext.setAttribute("portletURL", portletURL);
String portletURLString = portletURL.toString();
%>

<aui:form action="<%= portletURLString %>" method="get" name="fm">
    <liferay-portlet:renderURLParams varImpl="portletURL" />
    <aui:input name="isSearch" type="hidden" value="true" />
    <aui:input name="redirect" type="hidden" value="<%= portletURLString %>" />

    <liferay-ui:search-container 
        searchContainer="<%= new ABContactSearch(renderRequest, portletURL) %>"
    >

        <% 
        ABContactDisplayTerms displayTerms = (ABContactDisplayTerms)searchContainer.getDisplayTerms();
        ABContactSearchTerms searchTerms = (ABContactSearchTerms)searchContainer.getSearchTerms();

        Long societyId = GetterUtil.getLong(searchTerms.getSocietyId(),0);
        Long contactTypeId = GetterUtil.getLong(searchTerms.getContactTypeId(), 0);
        Long brandId = GetterUtil.getLong(searchTerms.getBrandId(),0);
        Long channelId = GetterUtil.getLong(searchTerms.getChannelId(),0);
        %>

        <liferay-ui:search-form 
            searchContainer="<%=searchContainer%>" 
            servletContext="<%= this.getServletConfig().getServletContext() %>" 
            showAddButton="true"
            page='<%= request.getContextPath() + "/html/addressbookportlet/contact_search_form.jsp" %>'
        />

        <liferay-ui:search-container-results>
            <%

                if (searchTerms.isAdvancedSearch()) {
                    results = AddressbookSearchUtil.searchAdvanced(scopes, searchTerms, searchTerms.isAndOperator(), searchContainer.getStart(), searchContainer.getEnd()); //, searchContainer.getOrderByComparator());
                    total = AddressbookSearchUtil.countAdvanced(scopes, searchTerms, searchTerms.isAndOperator());
                }
                else {
                    results = AddressbookSearchUtil.searchFullText(scopes, searchTerms.getKeywords(), searchContainer.getStart(), searchContainer.getEnd()); //, searchContainer.getOrderByComparator());
                    total = AddressbookSearchUtil.countFullText(scopes, searchTerms.getKeywords());
                }
                pageContext.setAttribute("results", results);
                pageContext.setAttribute("total", total);
            %>

        </liferay-ui:search-container-results>

        <liferay-ui:search-container-row
            className="it.mir4unicomm.addressbook.model.ABContact"
            escapedModel="<%= true %>"
            keyProperty="contactId"
            modelVar="abcontact"
        >

            <liferay-ui:search-container-column-text 
                title="Surname"
                property="surname"
            />

            <liferay-ui:search-container-column-text 
                title="Name"
                property="name"
            />

            <liferay-ui:search-container-column-text 
                title="Position"
                property="position"
            />

        </liferay-ui:search-container-row>

        <liferay-ui:search-iterator />
    </liferay-ui:search-container>
</aui:form>

contact_search_form.jsp:

<%@ include file="/html/addressbookportlet/init.jsp" %>

<%
the
ABContactDisplayTerms displayTerms = (ABContactDisplayTerms)searchContainer.getDisplayTerms();

List<ABSociety> societyList = ABSocietyLocalServiceUtil.getABSocieties(0, Integer.MAX_VALUE);
List<ABBrand> brandList = ABBrandLocalServiceUtil.getABBrands(0, Integer.MAX_VALUE);
List<ABContactType> contactTypeList = ABContactTypeLocalServiceUtil.getABContactTypes(0, Integer.MAX_VALUE);
List<ABChannel> channelList = ABChannelLocalServiceUtil.getABChannels(0, Integer.MAX_VALUE);
%>

<liferay-ui:search-toggle
    id="toggle_id_contact_search"
    displayTerms="<%= displayTerms %>"
    buttonLabel="search-contact"
>
    <aui:fieldset>

        <aui:input name="<%= ABContactDisplayTerms.SURNAME %>" size="20" value="<%= displayTerms.getSurname() %>" />

        <aui:input name="<%= ABContactDisplayTerms.NAME %>" size="20" value="<%= displayTerms.getName() %>" />

        <aui:input name="<%= ABContactDisplayTerms.POSITION %>" size="20" value="<%= displayTerms.getPosition() %>" />

        <aui:input name="<%= ABContactDisplayTerms.DETAIL_VALUE %>" size="20" value="<%= displayTerms.getDetailValue() %>" />

    </aui:fieldset>
</liferay-ui:search-toggle>

<c:if test="<%= windowState.equals(WindowState.MAXIMIZED) %>">
    <aui:script>
        Liferay.Util.focusFormField(document.<portlet:namespace />fm.<portlet:namespace /><%= ABContactDisplayTerms.SURNAME %>);
        Liferay.Util.focusFormField(document.<portlet:namespace />fm.<portlet:namespace /><%= ABContactDisplayTerms.KEYWORDS %>);
    </aui:script>
</c:if>meDisplay.setIncludeServiceJs(true);
ABContactSearch searchContainer = (ABContactSearch)request.getAttribute("liferay-ui:search:searchContainer");

ABContactDisplayTerm.java:

public class ABContactDisplayTerms extends DisplayTerms {

    public static final String NAME = "name";

    public static final String SURNAME = "surname";

    public static final String POSITION = "position";

    public static final String SOCIETY_ID = "societyId";

    public static final String CONTACT_TYPE_ID = "contactTypeId";

    public static final String BRAND_ID = "brandId";

    public static final String CHANNEL_ID = "channelId";

    public static final String DETAIL_VALUE = "detailValue";


    protected String name;
    protected String surname;
    protected String position;
    protected Long societyId;
    protected Long contactTypeId;
    protected Long brandId;
    protected Long channelId;
    protected String detailValue;

    public ABContactDisplayTerms(PortletRequest portletRequest) {
        super(portletRequest);

        name = ParamUtil.getString(portletRequest, NAME);
        surname = ParamUtil.getString(portletRequest, SURNAME);
        position = ParamUtil.getString(portletRequest, POSITION);
        societyId = ParamUtil.getLong(portletRequest, SOCIETY_ID);
        contactTypeId = ParamUtil.getLong(portletRequest, CONTACT_TYPE_ID);
        brandId = ParamUtil.getLong(portletRequest, BRAND_ID);
        channelId = ParamUtil.getLong(portletRequest, CHANNEL_ID);
        detailValue = ParamUtil.getString(portletRequest, DETAIL_VALUE);
    }


    public String getName() {
        return name;
    }

    public String getSurname() {
        return surname;
    }

    public String getPosition() {
        return position;
    }

    public Long getSocietyId() {
        return societyId;
    }

    public Long getContactTypeId() {
        return contactTypeId;
    }

    public Long getBrandId() {
        return brandId;
    }

    public Long getChannelId() {
        return channelId;
    }

    public String getDetailValue() {
        return detailValue;
    }

}

and finally ABContactSearch.java

public class ABContactSearch extends SearchContainer<ABContact> {

    private static Log _log = LogFactoryUtil.getLog(ABContactSearch.class);

    static List<String> headerNames = new ArrayList<String>();
    static Map<String, String> orderableHeaders = new HashMap<String, String>();

    static {
        headerNames.add("name");
        headerNames.add("surname");
        headerNames.add("position");
        headerNames.add("society");
        headerNames.add("contact-type");
        headerNames.add("channel");
        headerNames.add("brand");
        headerNames.add("detail-value");

        orderableHeaders.put("name", "name");
        orderableHeaders.put("surname", "surname");
        orderableHeaders.put("society", "society");
        orderableHeaders.put("contact-type", "contact-type");
    }

    public static final String EMPTY_RESULTS_MESSAGE = "no-contacts-were-found";


    public ABContactSearch(PortletRequest portletRequest, PortletURL iteratorURL) {
        super(
            portletRequest, new ABContactDisplayTerms(portletRequest),
            new ABContactSearchTerms(portletRequest), DEFAULT_CUR_PARAM,
            DEFAULT_DELTA, iteratorURL, headerNames, EMPTY_RESULTS_MESSAGE);

        ABContactDisplayTerms displayTerms = (ABContactDisplayTerms)getDisplayTerms();

        iteratorURL.setParameter(
                ABContactDisplayTerms.NAME, displayTerms.getName());
        iteratorURL.setParameter(
                ABContactDisplayTerms.SURNAME, displayTerms.getSurname());
        iteratorURL.setParameter(
                ABContactDisplayTerms.POSITION, displayTerms.getPosition());
        iteratorURL.setParameter(
                ABContactDisplayTerms.DETAIL_VALUE, displayTerms.getDetailValue());
        iteratorURL.setParameter(
                ABContactDisplayTerms.SOCIETY_ID, String.valueOf(displayTerms.getSocietyId()));
        iteratorURL.setParameter(
                ABContactDisplayTerms.CONTACT_TYPE_ID, String.valueOf(displayTerms.getContactTypeId()));
        iteratorURL.setParameter(
                ABContactDisplayTerms.BRAND_ID, String.valueOf(displayTerms.getBrandId()));
        iteratorURL.setParameter(
                ABContactDisplayTerms.CHANNEL_ID, String.valueOf(displayTerms.getChannelId()));

        try {
            String orderByCol = ParamUtil.getString(
                portletRequest, "orderByCol", "surname");
            String orderByType = ParamUtil.getString(
                portletRequest, "orderByType", "asc");

//          OrderByComparator orderByComparator =
//              UsersAdminUtil.getUserOrderByComparator(
//                  orderByCol, orderByType);

            setOrderableHeaders(orderableHeaders);
            setOrderByCol(orderByCol);
            setOrderByType(orderByType);
//          setOrderByComparator(orderByComparator);
        }
        catch (Exception e) {
            _log.error(e.getMessage());
            _log.debug(e.getMessage(), e);
        }
    }

}

the search container itself is working good, as the base search is performed by default with empty string, but the "search form" is not showing. I've tryed to put some debug messages on contact_search_form.jsp but none of them are printed into console. It seems the file is not being found or processed by the taglib..

Any help would be appreciated!


Solution

  • My 100% work example, where using liferay-ui: search-container, liferay-ui: search-form and liferay-ui: search-toggle:

    My 100% work example, where using liferay-ui: search-container, liferay-ui: search-form and liferay-ui: search-toggle: view.jsp:

    <%@ include file="/init.jsp" %>
    
    
    <%
    PortletURL portletURL = renderResponse.createRenderURL();
    portletURL.setParameter("mvcPath", "/html/view.jsp");
    pageContext.setAttribute("portletURL", portletURL);
    
    %>  
    
    <aui:form name="searchForm" action="<%= portletURL.toString() %>" method="post">
    
        <liferay-ui:search-container searchContainer="<%= new UserSearch(renderRequest, portletURL) %>" >
            <aui:input disabled="<%= true %>" name="usersRedirect" type="hidden" value="<%= portletURL.toString() %>" />
    
            <%
            UserSearchTerms searchTerms = (UserSearchTerms)searchContainer.getSearchTerms();
            UserDisplayTerms displayTerms = (UserDisplayTerms)searchContainer.getDisplayTerms();
    
            long organizationId = searchTerms.getOrganizationId();
            long userGroupId = searchTerms.getUserGroupId();
    
            Organization organization = null;
    
            if (organizationId > 0) {
                try {
                    organization = OrganizationLocalServiceUtil.getOrganization(organizationId);
                }
                catch (NoSuchOrganizationException nsoe) {
                }
            }
    
            UserGroup userGroup = null;
    
            if (userGroupId > 0) {
                try {
                    userGroup = UserGroupLocalServiceUtil.getUserGroup(userGroupId);
                }
                catch (NoSuchUserGroupException nsuge) {
                }
            }
            %>
    
            <c:if test="<%= organization != null %>">
                <aui:input name="<%= UserDisplayTerms.ORGANIZATION_ID %>" type="hidden" value="<%= organization.getOrganizationId() %>" />
    
                <h3><%= HtmlUtil.escape(LanguageUtil.format(pageContext, "users-of-x", organization.getName())) %></h3>
            </c:if>
    
            <c:if test="<%= userGroup != null %>">
                <aui:input name="<%= UserDisplayTerms.USER_GROUP_ID %>" type="hidden" value="<%= userGroup.getUserGroupId() %>" />
    
                <h3><%= LanguageUtil.format(pageContext, "users-of-x", HtmlUtil.escape(userGroup.getName())) %></h3>
            </c:if>
    
    
            <liferay-ui:search-form
                page="/html/user_search.jsp"
                searchContainer="<%= searchContainer %>"
                servletContext="<%= this.getServletConfig().getServletContext() %>"
            />
    
    
            <%
            LinkedHashMap userParams = new LinkedHashMap();
    
            if (organizationId > 0) {
                userParams.put("usersOrgs", new Long(organizationId));
            }
    
            if (userGroupId > 0) {
                userParams.put("usersUserGroups", new Long(userGroupId));
            }
            %>
    
            <liferay-ui:search-container-results>
                <c:choose>
                    <c:when test="<%= GetterUtil.getBoolean(PropsUtil.get(PropsKeys.USERS_INDEXER_ENABLED)) && GetterUtil.getBoolean(PropsUtil.get(PropsKeys.USERS_SEARCH_WITH_INDEX)) %>">
                        <%@ include file="/html/user_search_results_index.jspf" %>
                    </c:when>
                    <c:otherwise>
                        <%@ include file="/html/user_search_results_database.jspf" %>
                    </c:otherwise>
                </c:choose>
            </liferay-ui:search-container-results>
    
            <liferay-ui:search-container-row
                className="com.liferay.portal.model.User"
                escapedModel="<%= true %>"
                keyProperty="userId"
                modelVar="curUser"
                rowIdProperty="screenName"
            >
                <liferay-portlet:renderURL varImpl="rowURL" windowState="<%= WindowState.MAXIMIZED.toString() %>">
                    <portlet:param name="mvcPath" value="/html/user_display.jsp" />
                    <portlet:param name="redirect" value="<%= searchContainer.getIteratorURL().toString() %>" />
                    <portlet:param name="userId" value="<%= String.valueOf(curUser.getUserId()) %>" />
                </liferay-portlet:renderURL>
    
                <%@ include file="/html/search_columns.jspf" %>
            </liferay-ui:search-container-row>
    
            <c:if test="<%= (organization != null) || (userGroup != null) %>">
                <br />
            </c:if>
    
            <c:if test="<%= organization != null %>">
                <aui:input name="<%= UserDisplayTerms.ORGANIZATION_ID %>" type="hidden" value="<%= organization.getOrganizationId() %>" />
    
                <liferay-ui:message key="filter-by-organization" />: <%= HtmlUtil.escape(organization.getName()) %><br />
            </c:if>
    
            <c:if test="<%= userGroup != null %>">
                <aui:input name="<%= UserDisplayTerms.USER_GROUP_ID %>" type="hidden" value="<%= userGroup.getUserGroupId() %>" />
    
                <liferay-ui:message key="filter-by-user-group" />: <%= HtmlUtil.escape(userGroup.getName()) %><br />
            </c:if> 
    
            <div class="separator"><!-- --></div>
    
            <liferay-ui:search-iterator />
        </liferay-ui:search-container>
    </aui:form>
    

    user_search.jsp:

    <%@ include file="/init.jsp" %>
    
    <%
    UserSearch searchContainer = (UserSearch)request.getAttribute("liferay-ui:search:searchContainer");
    
    UserDisplayTerms displayTerms = (UserDisplayTerms)searchContainer.getDisplayTerms();
    %>
    
    <liferay-ui:search-toggle
        buttonLabel="search"
        displayTerms="<%= displayTerms %>"
        id="toggle_id_user_search"
    >
        <aui:fieldset>
            <aui:input name="<%= displayTerms.FIRST_NAME %>" size="20" type="text" value="<%= displayTerms.getFirstName() %>" />
    
            <aui:input name="<%= displayTerms.MIDDLE_NAME %>" size="20" type="text" value="<%= displayTerms.getMiddleName() %>" />
    
            <aui:input name="<%= displayTerms.LAST_NAME %>" size="20" type="text" value="<%= displayTerms.getLastName() %>" />
    
            <aui:input name="<%= displayTerms.SCREEN_NAME %>" size="20" type="text" value="<%= displayTerms.getScreenName() %>" />
    
            <aui:input name="<%= displayTerms.EMAIL_ADDRESS %>" size="20" type="text" value="<%= displayTerms.getEmailAddress() %>" />
        </aui:fieldset>
    </liferay-ui:search-toggle>
    

    user_search_results_index.jspf:

    <%@ page import="com.liferay.portal.kernel.search.Hits" %>
    <%@ page import="com.liferay.portal.kernel.search.Sort" %>
    <%@ page import="com.liferay.portal.kernel.search.SortFactoryUtil" %>
    <%@ page import="com.liferay.portlet.usersadmin.util.UsersAdminUtil" %>
    
    <%
    userParams.put("expandoAttributes", searchTerms.getKeywords());
    
    Sort sort = SortFactoryUtil.getSort(User.class, searchContainer.getOrderByCol(), searchContainer.getOrderByType());
    
    while (true) {
        Hits hits = null;
    
        if (searchTerms.isAdvancedSearch()) {
            hits = UserLocalServiceUtil.search(company.getCompanyId(), searchTerms.getFirstName(), searchTerms.getMiddleName(), searchTerms.getLastName(), searchTerms.getScreenName(), searchTerms.getEmailAddress(), searchTerms.getStatus(), userParams, searchTerms.isAndOperator(), searchContainer.getStart(), searchContainer.getEnd(), sort);
        }
        else {
            hits = UserLocalServiceUtil.search(company.getCompanyId(), searchTerms.getKeywords(), searchTerms.getStatus(), userParams, searchContainer.getStart(), searchContainer.getEnd(), sort);
        }
    
        Tuple tuple = UsersAdminUtil.getUsers(hits);
    
        boolean corruptIndex = (Boolean)tuple.getObject(1);
    
        if (!corruptIndex) {
            results = (List<User>)tuple.getObject(0);
            total = hits.getLength();
    
            break;
        }
    }
    
    pageContext.setAttribute("results", results);
    pageContext.setAttribute("total", total);
    %>
    

    user_search_results_database.jspf:

    <%
    if (searchTerms.isAdvancedSearch()) {
        results = UserLocalServiceUtil.search(company.getCompanyId(), searchTerms.getFirstName(), searchTerms.getMiddleName(), searchTerms.getLastName(), searchTerms.getScreenName(), searchTerms.getEmailAddress(), searchTerms.getStatus(), userParams, searchTerms.isAndOperator(), searchContainer.getStart(), searchContainer.getEnd(), searchContainer.getOrderByComparator());
        total = UserLocalServiceUtil.searchCount(company.getCompanyId(), searchTerms.getFirstName(), searchTerms.getMiddleName(), searchTerms.getLastName(), searchTerms.getScreenName(), searchTerms.getEmailAddress(), searchTerms.getStatus(), userParams, searchTerms.isAndOperator());
    }
    else {
        results = UserLocalServiceUtil.search(company.getCompanyId(), searchTerms.getKeywords(), searchTerms.getStatus(), userParams, searchContainer.getStart(), searchContainer.getEnd(), searchContainer.getOrderByComparator());
        total = UserLocalServiceUtil.searchCount(company.getCompanyId(), searchTerms.getKeywords(), searchTerms.getStatus(), userParams);
    }
    
    pageContext.setAttribute("results", results);
    pageContext.setAttribute("total", total);
    %> 
    

    user_display.jsp:

    <%@ include file="/init.jsp" %>
    
    <%
    String backURL = ParamUtil.getString(request, "redirect");
    
    portletDisplay.setURLBack(backURL);
    
    long userId = ParamUtil.getLong(request, "userId");
    %>
    
    <liferay-ui:user-display
        displayStyle="<%= 2 %>"
        userId="<%= userId %>"
    />
    

    search_columns.jspf:

    <liferay-ui:search-container-column-text
        href="<%= rowURL %>"
        name="first-name"
        orderable="<%= true %>"
        property="firstName"
    />
    
    <liferay-ui:search-container-column-text
        href="<%= rowURL %>"
        name="last-name"
        orderable="<%= true %>"
        property="lastName"
    />
    
    <liferay-ui:search-container-column-text
        href="<%= rowURL %>"
        name="screen-name"
        orderable="<%= true %>"
        property="screenName"
    />
    
    <liferay-ui:search-container-column-text
        href="<%= rowURL %>"
        name="organizations"
    >
        <liferay-ui:write bean="<%= curUser %>" property="organizations" />
    </liferay-ui:search-container-column-text>
    

    UserSearch.java:

    package kz.b2e.kudos.portal.searchuser.search;
    
    import com.liferay.portal.kernel.dao.search.SearchContainer;
    import com.liferay.portal.kernel.log.Log;
    import com.liferay.portal.kernel.log.LogFactoryUtil;
    import com.liferay.portal.kernel.util.JavaConstants;
    import com.liferay.portal.kernel.util.OrderByComparator;
    import com.liferay.portal.kernel.util.ParamUtil;
    import com.liferay.portal.kernel.util.Validator;
    import com.liferay.portal.kernel.workflow.WorkflowConstants;
    import com.liferay.portal.model.User;
    import com.liferay.portal.util.PortletKeys;
    import com.liferay.portlet.PortalPreferences;
    import com.liferay.portlet.PortletPreferencesFactoryUtil;
    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.portlet.PortletConfig;
    import javax.portlet.PortletRequest;
    import javax.portlet.PortletURL;
    
    
    public class UserSearch extends SearchContainer<User> {
    
        static List<String> headerNames = new ArrayList<String>();
        static Map<String, String> orderableHeaders = new HashMap<String, String>();
    
        static {
            headerNames.add("first-name");
            headerNames.add("last-name");
            headerNames.add("screen-name");
            //headerNames.add("email-address");
            headerNames.add("job-title");
            headerNames.add("organizations");
    
            orderableHeaders.put("first-name", "first-name");
            orderableHeaders.put("last-name", "last-name");
            orderableHeaders.put("screen-name", "screen-name");
            //orderableHeaders.put("email-address", "email-address");
            orderableHeaders.put("job-title", "job-title");
        }
    
        public static final String EMPTY_RESULTS_MESSAGE = "no-users-were-found";
    
        public UserSearch(PortletRequest portletRequest, PortletURL iteratorURL) {
            this(portletRequest, DEFAULT_CUR_PARAM, iteratorURL);
        }
    
        public UserSearch(
            PortletRequest portletRequest, String curParam,
            PortletURL iteratorURL) {
    
            super(
                portletRequest, new UserDisplayTerms(portletRequest),
                new UserSearchTerms(portletRequest), curParam, DEFAULT_DELTA,
                iteratorURL, headerNames, EMPTY_RESULTS_MESSAGE);
    
            PortletConfig portletConfig =
                (PortletConfig)portletRequest.getAttribute(
                    JavaConstants.JAVAX_PORTLET_CONFIG);
    
            UserDisplayTerms displayTerms = (UserDisplayTerms)getDisplayTerms();
            UserSearchTerms searchTerms = (UserSearchTerms)getSearchTerms();
    
            String portletName = portletConfig.getPortletName();
    
            if (!portletName.equals(PortletKeys.USERS_ADMIN)) {
                displayTerms.setStatus(WorkflowConstants.STATUS_APPROVED);
                searchTerms.setStatus(WorkflowConstants.STATUS_APPROVED);
            }
    
            iteratorURL.setParameter(
                UserDisplayTerms.STATUS, String.valueOf(displayTerms.getStatus()));
    
            iteratorURL.setParameter(
                UserDisplayTerms.EMAIL_ADDRESS, displayTerms.getEmailAddress());
            iteratorURL.setParameter(
                UserDisplayTerms.FIRST_NAME, displayTerms.getFirstName());
            iteratorURL.setParameter(
                UserDisplayTerms.LAST_NAME, displayTerms.getLastName());
            iteratorURL.setParameter(
                UserDisplayTerms.MIDDLE_NAME, displayTerms.getMiddleName());
            iteratorURL.setParameter(
                UserDisplayTerms.ORGANIZATION_ID,
                String.valueOf(displayTerms.getOrganizationId()));
            iteratorURL.setParameter(
                UserDisplayTerms.ROLE_ID, String.valueOf(displayTerms.getRoleId()));
            iteratorURL.setParameter(
                UserDisplayTerms.SCREEN_NAME, displayTerms.getScreenName());
            iteratorURL.setParameter(
                UserDisplayTerms.USER_GROUP_ID,
                String.valueOf(displayTerms.getUserGroupId()));
    
            try {
                PortalPreferences preferences =
                    PortletPreferencesFactoryUtil.getPortalPreferences(
                        portletRequest);
    
                String orderByCol = ParamUtil.getString(
                    portletRequest, "orderByCol");
                String orderByType = ParamUtil.getString(
                    portletRequest, "orderByType");
    
                if (Validator.isNotNull(orderByCol) &&
                    Validator.isNotNull(orderByType)) {
    
                    preferences.setValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-col", orderByCol);
                    preferences.setValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-type",
                        orderByType);
                }
                else {
                    orderByCol = preferences.getValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-col", "last-name");
                    orderByType = preferences.getValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-type", "asc");
                }
    
                OrderByComparator orderByComparator =
                    UsersAdminUtil.getUserOrderByComparator(
                        orderByCol, orderByType);
    
                setOrderableHeaders(orderableHeaders);
                setOrderByCol(orderByCol);
                setOrderByType(orderByType);
                setOrderByComparator(orderByComparator);
            }
            catch (Exception e) {
                _log.error(e);
            }
        }
    
        private static Log _log = LogFactoryUtil.getLog(UserSearch.class);
    
    }
    

    UserSearchTerms.java:

    package kz.b2e.kudos.portal.searchuser.search;
    
    import com.liferay.portal.kernel.dao.search.SearchContainer;
    import com.liferay.portal.kernel.log.Log;
    import com.liferay.portal.kernel.log.LogFactoryUtil;
    import com.liferay.portal.kernel.util.JavaConstants;
    import com.liferay.portal.kernel.util.OrderByComparator;
    import com.liferay.portal.kernel.util.ParamUtil;
    import com.liferay.portal.kernel.util.Validator;
    import com.liferay.portal.kernel.workflow.WorkflowConstants;
    import com.liferay.portal.model.User;
    import com.liferay.portal.util.PortletKeys;
    import com.liferay.portlet.PortalPreferences;
    import com.liferay.portlet.PortletPreferencesFactoryUtil;
    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.portlet.PortletConfig;
    import javax.portlet.PortletRequest;
    import javax.portlet.PortletURL;
    
    
    public class UserSearch extends SearchContainer<User> {
    
        static List<String> headerNames = new ArrayList<String>();
        static Map<String, String> orderableHeaders = new HashMap<String, String>();
    
        static {
            headerNames.add("first-name");
            headerNames.add("last-name");
            headerNames.add("screen-name");
            //headerNames.add("email-address");
            headerNames.add("job-title");
            headerNames.add("organizations");
    
            orderableHeaders.put("first-name", "first-name");
            orderableHeaders.put("last-name", "last-name");
            orderableHeaders.put("screen-name", "screen-name");
            //orderableHeaders.put("email-address", "email-address");
            orderableHeaders.put("job-title", "job-title");
        }
    
        public static final String EMPTY_RESULTS_MESSAGE = "no-users-were-found";
    
        public UserSearch(PortletRequest portletRequest, PortletURL iteratorURL) {
            this(portletRequest, DEFAULT_CUR_PARAM, iteratorURL);
        }
    
        public UserSearch(
            PortletRequest portletRequest, String curParam,
            PortletURL iteratorURL) {
    
            super(
                portletRequest, new UserDisplayTerms(portletRequest),
                new UserSearchTerms(portletRequest), curParam, DEFAULT_DELTA,
                iteratorURL, headerNames, EMPTY_RESULTS_MESSAGE);
    
            PortletConfig portletConfig =
                (PortletConfig)portletRequest.getAttribute(
                    JavaConstants.JAVAX_PORTLET_CONFIG);
    
            UserDisplayTerms displayTerms = (UserDisplayTerms)getDisplayTerms();
            UserSearchTerms searchTerms = (UserSearchTerms)getSearchTerms();
    
            String portletName = portletConfig.getPortletName();
    
            if (!portletName.equals(PortletKeys.USERS_ADMIN)) {
                displayTerms.setStatus(WorkflowConstants.STATUS_APPROVED);
                searchTerms.setStatus(WorkflowConstants.STATUS_APPROVED);
            }
    
            iteratorURL.setParameter(
                UserDisplayTerms.STATUS, String.valueOf(displayTerms.getStatus()));
    
            iteratorURL.setParameter(
                UserDisplayTerms.EMAIL_ADDRESS, displayTerms.getEmailAddress());
            iteratorURL.setParameter(
                UserDisplayTerms.FIRST_NAME, displayTerms.getFirstName());
            iteratorURL.setParameter(
                UserDisplayTerms.LAST_NAME, displayTerms.getLastName());
            iteratorURL.setParameter(
                UserDisplayTerms.MIDDLE_NAME, displayTerms.getMiddleName());
            iteratorURL.setParameter(
                UserDisplayTerms.ORGANIZATION_ID,
                String.valueOf(displayTerms.getOrganizationId()));
            iteratorURL.setParameter(
                UserDisplayTerms.ROLE_ID, String.valueOf(displayTerms.getRoleId()));
            iteratorURL.setParameter(
                UserDisplayTerms.SCREEN_NAME, displayTerms.getScreenName());
            iteratorURL.setParameter(
                UserDisplayTerms.USER_GROUP_ID,
                String.valueOf(displayTerms.getUserGroupId()));
    
            try {
                PortalPreferences preferences =
                    PortletPreferencesFactoryUtil.getPortalPreferences(
                        portletRequest);
    
                String orderByCol = ParamUtil.getString(
                    portletRequest, "orderByCol");
                String orderByType = ParamUtil.getString(
                    portletRequest, "orderByType");
    
                if (Validator.isNotNull(orderByCol) &&
                    Validator.isNotNull(orderByType)) {
    
                    preferences.setValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-col", orderByCol);
                    preferences.setValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-type",
                        orderByType);
                }
                else {
                    orderByCol = preferences.getValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-col", "last-name");
                    orderByType = preferences.getValue(
                        PortletKeys.USERS_ADMIN, "users-order-by-type", "asc");
                }
    
                OrderByComparator orderByComparator =
                    UsersAdminUtil.getUserOrderByComparator(
                        orderByCol, orderByType);
    
                setOrderableHeaders(orderableHeaders);
                setOrderByCol(orderByCol);
                setOrderByType(orderByType);
                setOrderByComparator(orderByComparator);
            }
            catch (Exception e) {
                _log.error(e);
            }
        }
    
        private static Log _log = LogFactoryUtil.getLog(UserSearch.class);
    
    }
    

    UserDisplayTerms.java

    package kz.b2e.kudos.portal.searchuser.search;
    
    import com.liferay.portal.kernel.dao.search.DisplayTerms;
    import com.liferay.portal.kernel.util.GetterUtil;
    import com.liferay.portal.kernel.util.ParamUtil;
    import com.liferay.portal.kernel.util.Validator;
    import com.liferay.portal.kernel.workflow.WorkflowConstants;
    
    import javax.portlet.PortletRequest;
    
    
    public class UserDisplayTerms extends DisplayTerms {
    
        public static final String EMAIL_ADDRESS = "emailAddress";
    
        public static final String FIRST_NAME = "firstName";
    
        public static final String LAST_NAME = "lastName";
    
        public static final String MIDDLE_NAME = "middleName";
    
        public static final String ORGANIZATION_ID = "organizationId";
    
        public static final String ROLE_ID = "roleId";
    
        public static final String SCREEN_NAME = "screenName";
    
        public static final String STATUS = "status";
    
        public static final String USER_GROUP_ID = "userGroupId";
    
        public UserDisplayTerms(PortletRequest portletRequest) {
            super(portletRequest);
    
            String statusString = ParamUtil.getString(portletRequest, STATUS);
    
            if (Validator.isNotNull(statusString)) {
                status = GetterUtil.getInteger(statusString);
            }
    
            emailAddress = ParamUtil.getString(portletRequest, EMAIL_ADDRESS);
            firstName = ParamUtil.getString(portletRequest, FIRST_NAME);
            lastName = ParamUtil.getString(portletRequest, LAST_NAME);
            middleName = ParamUtil.getString(portletRequest, MIDDLE_NAME);
            organizationId = ParamUtil.getLong(portletRequest, ORGANIZATION_ID);
            roleId = ParamUtil.getLong(portletRequest, ROLE_ID);
            screenName = ParamUtil.getString(portletRequest, SCREEN_NAME);
            userGroupId = ParamUtil.getLong(portletRequest, USER_GROUP_ID);
        }
    
        public String getEmailAddress() {
            return emailAddress;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public String getMiddleName() {
            return middleName;
        }
    
        public long getOrganizationId() {
            return organizationId;
        }
    
        public long getRoleId() {
            return roleId;
        }
    
        public String getScreenName() {
            return screenName;
        }
    
        public int getStatus() {
            return status;
        }
    
        public long getUserGroupId() {
            return userGroupId;
        }
    
        public boolean isActive() {
            if (status == WorkflowConstants.STATUS_APPROVED) {
                return true;
            }
            else {
                return false;
            }
        }
    
        public void setStatus(int status) {
            this.status = status;
        }
    
        protected String emailAddress;
        protected String firstName;
        protected String lastName;
        protected String middleName;
        protected long organizationId;
        protected long roleId;
        protected String screenName;
        protected int status;
        protected long userGroupId;
    
    }