Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Richfaces column Filter: How to fire an event on intro key

I have a rich:extendedDataTable and I am using column filtering. I want the filter to be fired once the user enters the "intro" key, but in javascript there is no such event.

I want to do so because if I use events such as onkeyup I get too many requests and I have problems because of that. I'm using richfaces 3.3.0GA and facelets.

This is the component:

<ui:composition>
<a4j:form ajaxSingle="true" requestDelay="700">
    <rich:extendedDataTable id="tablePatients" value="#{user.patientsTab.patients}" var="patient" rows="20" 
        onRowMouseOver="this.style.backgroundColor='#F1F1F1'" onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
        <f:facet name="header">
            <h:outputText value="Patient List" />
        </f:facet>
        <rich:column label="#{msg.id}">
            <f:facet name="header">
                <h:outputText value="Id" />
            </f:facet>
            <h:outputText value="#{patient.id}" id="patientId" />
        </rich:column>
        <rich:column label="#{msg.name}"  sortable="true" filterBy="#{patient.profile.name}" filterEvent="onkeyup">
            <f:facet name="header">
                <h:outputText value="Name" />
            </f:facet>
            <h:outputText value="#{patient.profile.name}" id="name" style="#{patient.isUnrated? 'font-weight:bold':''}" />
        </rich:column >
        <rich:column label="#{msg.lastexamination}" sortable="true">
            <f:facet name="header">
                <h:outputText value="Last Examination" />
            </f:facet>
            <h:outputText value="#{patient.lastExaminationDate}" style="#{patient.isUnrated? 'font-weight:bold':''}" />
        </rich:column>
        <rich:column label="#{msg.action}">
            <f:facet name="header">
                <h:outputText value="#{msg.action}"></h:outputText></f:facet>
            <a4j:commandLink id="editlink" oncomplete="#{rich:component('patientPanel')}.show()" reRender="a4jPatientPanel">
                <h:graphicImage value="/images/icons/PNG-24/Add.png" style="border:0" />
                <f:setPropertyActionListener value="#{patient}" target="#{user.patientsTab.patientPanel.patient}" />
            </a4j:commandLink>
            <rich:toolTip for="editlink" value="Edit" />
        </rich:column>

        <f:facet name="footer">
            <rich:datascroller renderIfSinglePage="false" maxPages="5" />
        </f:facet>
    </rich:extendedDataTable>

    </a4j:form>

    <ui:include src="/pages/panels/patientPanel.xhtml" />
</ui:composition>
like image 355
pakore Avatar asked Feb 17 '10 10:02

pakore


2 Answers

Unfortunately, there is no easy way to customize this functionality. There are options to make it more usable, though:

  • <a4j:queue requestDelay="1000" ignoreDupResponce="true" /> - place this in your <a4j:form> or <a4j:region> and your onkeyup requests will be delayed and grouped. See richfaces demo page:

    • Setting ignoreDupResponces to true reduces the count of DOM updates on typing inside the input. (in initial state count of updates is equals to count of requests)
    • Disabling the queue causes fully asynchronous updates. Note that updates could appear not only in direct order and as a result you could get wrong string.
    • Setting request delay to greater value reduces the requests count on fast typing. (More similar requests are combined in the result)
  • I'm currently using the following alternative:

    <rich:dataTable (..some attributes..)
        onkeypress="if (event.keyCode == 13) {document.getElementById('formId:tableId:j_id70fsp').blur(); return false;} else {return true;}"
        ><!-- disabling submit-on-enter -->
        <rich:column label="#{msg.name}" sortable="true" 
           filterBy="#{patient.profile.name}" filterEvent="onblur">
    </rich:dataTable>
    

    Where you have to see the generated id for j_id70fsp. It is not guaranteed that it will remain such forever, though.

    And the result is that the column is filtered on pressing the enter key, which is fairly usable.

like image 146
Bozho Avatar answered Oct 01 '22 14:10

Bozho


Bozho is right, but instead of using getElementById I prefer using this script:

<rich:extendedDataTable onkeypress="
if (!event) { var event = window.event; }
if (event.keyCode == 13) {
    var targ;
    if (event.target) targ = event.target;
    else if (event.srcElement) targ = event.srcElement;
    if (targ.nodeType == 3) targ = targ.parentNode;
    if (targ) targ.blur();
    return false;
} else return true;">

It should work with FF, EI, Safari(the targ.nodeType == 3 thing).

like image 38
zephid Avatar answered Oct 01 '22 13:10

zephid