web-dev-qa-db-fra.com

DataTable clearFilter () ne fonctionne pas correctement

J'ai un JSF compliqué qui contient dataTable avec filtre dans chacune des colonnes. Afin de m'assurer que le bouton Générer récupérera d'abord toutes les données, j'ai besoin d'effacer tous les filtres lorsque l'utilisateur appuie sur le bouton.

J'essaie d'utiliser onclick mais je ne pouvais pas voir le blockUI. J'essaye aussi de terminer (ajax) mais encore une fois il ne fonctionnait pas correctement avec tous les autres éléments (blockUI, message). J'ai décidé d'essayer d'effacer les filtres via le serveur mais seul dataTable.reset () fonctionne.

Je n'ai plus d'idées pour nettoyer les filtres ???

Cette API fonctionne-t-elle?

Apprécier ton aide

Merci

<h:panelGrid columns="1" style="width: 100%">
    <p:panel id="vt-panel">
        <h:panelGrid columns="5" cellpadding="2" >  
            <h:outputText value="Start Date"  />
            <p:calendar id="vt-start" value="#{vtRepBean.startDate}" binding="#{startDateComponent}" maxlength="9" size="9" pattern="dd-MMM-yy" title="dd-MMM-yy" required="true" maxdate="#{vtRepBean.endDate}">
                <p:ajax event="dateSelect" listener="#{vtRepBean.handleStartDateSelect}" update=":mainForm:vt-end"/>
            </p:calendar>
            <h:outputText value="End Date"  />
            <p:calendar id="vt-end" value="#{vtRepBean.endDate}" maxlength="9" size="9" pattern="dd-MMM-yy" title="dd-MMM-yy" required="true" mindate="#{vtRepBean.startDate}">
                <p:ajax event="dateSelect" listener="#{vtRepBean.handleEndDateSelect}" update=":mainForm:vt-start"/>
            </p:calendar>
            <p:commandButton
                id="genVtBtn"
                value="Generate"
                actionListener="#{vtRepBean.handleVTGenerateButton}"
                update=":mainForm:vt-panel,:mainForm:vt-panel-table">
            </p:commandButton>
        </h:panelGrid>
    </p:panel>
</h:panelGrid> 
<p:growl id="vt_message" showDetail="true" autoUpdate="true"/>
<h:panelGroup id="vt-panel-table">
    <p:dataTable id="vtDataTable"
                 widgetVar="vtWidget"
                 var="reportObject"
                 value="#{vtRepBean.reportObjectsList}"
                 rendered="#{vtRepBean.renderVTReport}"
                 filteredValue="#{vtRepBean.filteredVTList}"
                 paginator="true"
                 paginatorPosition="bottom"
                 paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                 rowsPerPageTemplate="50,100,200"
                 rows="50"
                 style="width: 100%"> 
        <p:columnGroup type="header"> 
            <p:row>  
                <p:column colspan="5" headerText="VT request"/> 
                <p:column colspan="1" headerText="Dis" /> 
            </p:row>  
            <p:row>  
                <p:column headerText="CREATE DATE" sortBy="#{reportObject.log.createDate}" filterBy="#{reportObject.log.createDate}" filterMatchMode="contains"/>  
                <p:column headerText="IP" sortBy="#{reportObject.log.ip}" filterBy="#{reportObject.log.ip}" filterMatchMode="contains"/>    
            </p:row>
        </p:columnGroup>
        <p:column >  
            <h:outputText value="#{reportObject.log.createDate}"/>  
        </p:column>
        <p:column >  
            <h:outputText value="#{reportObject.log.ip}"/>  
        </p:column>    
    </p:dataTable>
    <p:commandLink rendered="#{vtRepBean.renderVTReport}" ajax="false" onclick="PrimeFaces.monitorDownload(showStatus, hideStatus)">  
        <p:graphicImage value="resources/images/Excel.png" title="Excel" style="border-color: white"/>  
        <p:dataExporter id="xlsReport"
                        type="xls" 
                        target="vtDataTable"
                        fileName="VTReport"
                        postProcessor="#{vtRepBean.postProcessXLS}"/>
    </p:commandLink>
</h:panelGroup>
<p:blockUI widgetVar="blockVTPanel" trigger="genvtBtn" block="vt-panel">
    <div class="disable-scroll">
        <p:graphicImage value="resources/images/ajax-loader.gif"/> 
    </div>
</p:blockUI>
     DataTable dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("mainForm:vtDecomDataTable");
        if (!dataTable.getFilters().isEmpty()) {
            logger.info("dataTable.getFilters().isEmpty() :" + dataTable.getFilters().isEmpty());

            dataTable.getFilters().clear();// not working
            dataTable.getFilteredValue().clear();// not working
            dataTable.setFilteredValue(null);// not working
            dataTable.setFilters(null);// not working
            dataTable.setFilterMetadata(null);// not working 

            dataTable.reset();// working 

            RequestContext requestContext = RequestContext.getCurrentInstance();
            requestContext.update("mainForm:vtDecomDataTable");

        }
16
angus

C'est ainsi que j'ai résolu mon problème.

 RequestContext requestContext = RequestContext.getCurrentInstance();
 requestContext.execute("PF('widget_orderDataTable').clearFilters()");

J'espère que son aide.

17
angus

Pour effacer toutes les entrées des filtres, vous pouvez le faire par javascript:

<p:commandButton onclick="PF('vtWidget').clearFilters()" />

vtWidget est le widgetVar du datatable.

Fondamentalement, clearFilters() effacera les champs pour vous et appellera filter(), et la fonction de filtre mettra à jour votre table de données, qui à son tour videra la liste filtrée.

Remarque: Cela ne fonctionnerait que si les filtres étaient inputText. Si vous avez des composants personnalisés, vous devez implémenter votre propre clear en fonction des composants que vous avez.

Parfois, si vous avez des composants personnalisés, vous devez vider la liste filtrée manuellement, comme vous l'avez fait dans les commentaires!

28
Hatem Alimam

Pour effacer les filtres personnalisés, vous pouvez utiliser des primefaces resetInput , ainsi que clearFilters () discuté dans d'autres réponses, et une méthode actionListener personnalisée. Voir les extraits de code ci-dessous:

<p:dataTable id="dataTable" widgetVar="dataTable"
    value="#{bean.listOfObjects}" var="object">

<p:commandButton value="Clear All Filters"
    onclick="PF('dataTable').clearFilters()" 
    actionListener="#{controller.clearAllFilters}"
    update="dataTable">
    <p:resetInput target="dataTable" />
</p:commandButton>

Controller.Java

public void clearAllFilters() {

    DataTable dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("form:dataTable");
    if (!dataTable.getFilters().isEmpty()) {
        dataTable.reset();

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.update("form:dataTable");
    }
}

J'espère que cela aidera quiconque cherche à effacer les filtres personnalisés.

15
aveyD

Pour Primefaces 7 et supérieur, utilisez les éléments suivants:

public void clearAllFilters() {

    DataTable dataTable = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent("form:dataTable");
    if (!dataTable.getFilters().isEmpty()) {
        dataTable.reset();

        PrimeFaces.current().ajax().update("form:dataTable");
    }
}
1
jMarcel