Primefaces Lazytable, используя один компонент для разных критериев фильтрации - PullRequest
0 голосов
/ 06 марта 2020

У меня есть Бин, который возвращает «Заметки» для разных сущностей. Например, у меня могут быть Заметки для предложений, клиентов, счетов-фактур и т. Д. c.

Вместо того, чтобы создавать множество компонентов для различных объектов, я хочу иметь один компонент, который возвращает d ie правильных примечаний для каждого объекта. Я отправил на свою страницу JSF две информации "entityType" и "objectId" в компонент. С помощью этих двух параметров я могу отфильтровать свои данные в bean-компоненте

В настоящее время у меня есть следующий код, в этом примере для «ПРЕДЛОЖЕНИЕ»:

<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:pe="http://primefaces.org/ui/extensions"
    template="/WEB-INF/layout/portal/template.xhtml"
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions">

    <ui:define name="head" />
    <ui:define name="title">Page</ui:define>

    <ui:define name="content">


        <p:growl id="growl" showDetail="false" sticky="false" life="3000" />

        <div class="ui-g">
            <div class="ui-g-12">
                <div class="card card-w-title">


                    <p:tabView id="offerTab" dynamic="true" cache="false"
                        widgetVar="tabPanel">


                        <p:tab id="note"
                            disabled="#{offerEditController.modeOffer eq 'ADD'}">

                            <f:facet name="title">
                                <i class="fa fa-sticky-note Fs12 MarRight40"></i>
                                <h:outputText value=" Notizen" />
                            </f:facet>

                            <div class="EmptyBox10"></div>


                            <p:outputPanel id="notePanel">
                                <div class="ui-g ui-fluid">


                                    <div class="ui-g-12 ui-lg-5">

                                        <h:form id="noteForm"
                                            rendered="#{noteRequestByObjectController.init('OFFER', offerEditController.offer.id, offerEditController.offer.idHash)}">


                                            <p:dataTable id="noteListDatatable"
                                                value="#{noteRequestByObjectController.lazyModel}"
                                                var="note" widgetVar="noteTable" resizableColumns="false"
                                                multiViewState="false" selectionMode="single"
                                                selection="#{noteRequestByObjectController.selectedNote}"
                                                filteredValue="#{noteRequestByObjectController.filteredNote}"
                                                rows="50" pageLinks="10" paginatorPosition="bottom"
                                                lazy="true" paginator="true" reflow="true"
                                                currentPageReportTemplate="(Eintrag: {startRecord}-{endRecord} von {totalRecords}, Seite: {currentPage} von {totalPages})"
                                                paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                                                rowsPerPageTemplate="50,100,200"
                                                paginatorAlwaysVisible="false"
                                                emptyMessage="Kein Eintrag gefunden">


                                                <f:facet name="header">

                                                    <p:outputPanel id="functionalityPanel"
                                                        style="float:left; margin-top: -3px">

                                                        <p:commandButton value="Neu hinzufügen"
                                                            styleClass="green-btn White" icon="fa fa-plus-circle"
                                                            actionListener="#{noteRequestByObjectController.doCreateNew}"
                                                            update=":offerTab:noteForm:noteListDatatable, :offerTab:addNoteForm"
                                                            resetValues="true" ajax="true">
                                                        </p:commandButton>

                                                    </p:outputPanel>

                                                    <h:outputText id="overviewText"
                                                        value="Übersicht (#{noteRequestByObjectController.numberTotal})" />
                                                    <p:tooltip for="overviewText" position="top"
                                                        value="Die Gesamtzahl der Filterung" />


                                                </f:facet>


                                                <p:ajax event="rowSelect" ajax="true" immediate="true"
                                                    resetValues="true"
                                                    listener="#{noteRequestByObjectController.onSelectNote}"
                                                    update=":offerTab:noteForm, :offerTab:addNoteForm" />


                                                <p:column sortBy="#{note.createDate}" visible="true">

                                                    <f:facet name="header">
                                                        <h:outputText value="Create" />
                                                    </f:facet>


                                                        <h:outputText id="createDateInfo"
                                                            style="margin-left: 5px;" value="#{note.createDate}"
                                                            styleClass="Fright">
                                                            <f:converter converterId="prettyTimeCustomConverter" />
                                                        </h:outputText>


                                                </p:column>

                                            </p:dataTable>
                                        </h:form>
                                    </div>

                                </div>

                            </p:outputPanel>

                            <div class="EmptyBox20"></div>

                        </p:tab>

                    </p:tabView>

                </div>

            </div>
        </div>



    </ui:define>

My Bean: - Содержит функцию init и функцию для загрузки Заметок из Базы данных:

   @ViewScoped
@Named
public class NoteRequestByObjectController extends LazyDataModel<Note>
        implements SelectableDataModel<Note>, Serializable {

    private static final long serialVersionUID = 2815796004558360299L;
    private final Logger LOGGER = LoggerFactory.getLogger(NoteRequestByObjectController.class);

    @EJB
    private NoteService noteService;

    @Inject
    private LoginBean loginBean;

    private List<Note> filteredNote;
    private List<Note> selectedNoteList = new ArrayList<Note>();
    private LazyDataModel<Note> lazyModel;
    private List<Note> list;

    private Note selectedNote;
    private List<Boolean> toogleList;
    private List<ObjectForSearchList> searchList = new ArrayList<ObjectForSearchList>();
    private int numberTotal = 0;

    public enum ModeNote {
        EDIT, ADD
    };

    private ModeNote mode;

    private String entityType;
    private String visibleType;
    private Long objectId;
    private String objectIdHash;

    private boolean startLoad = false;

    /**
     * Init
     */
    public boolean init(String currentEntityType, Long currentObjectId, String currentObjectIdHash) {

        try {

            entityType = currentEntityType;

            objectId = currentObjectId;
            objectIdHash = currentObjectIdHash;

            if (objectId == null || objectIdHash == null)
                return true;

            lazyModel = null;

            // SearchList
            initSearchList();

            findNote();

            selectedNote = new Note();
            mode = ModeNote.ADD;
            startLoad = true;

            LOGGER.info("END init");
            return true;
        }

        catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
        }

        return false;
    }

    /**
     * Die eigentliche Suche
     */
    public void findNote() {

        LOGGER.info("START findNote");

        lazyModel = null;

        if (lazyModel == null) {
            lazyModel = new LazyDataModel<Note>() {

                @Override
                public List<Note> load(int startingAt, int maxPerPage, String sortField, SortOrder sortOrder,
                        Map<String, Object> filters) {

                    try {
                        list = noteService.findAllNoteLazyLoading(searchList, startingAt, maxPerPage, sortField,
                                sortOrder, filters);

                        numberTotal = noteService.countNoteRowsLazyLoading(searchList);
                        lazyModel.setRowCount(numberTotal);
                    } catch (NoteNotFoundException e) {
                        lazyModel.setRowCount(0);
                        numberTotal = 0;
                    } catch (Exception e) {
                        lazyModel.setRowCount(0);
                        numberTotal = 0;
                    }
                    return list;
                }

                @Override
                public Note getRowData(String rowKey) {
                    if (list != null && !list.isEmpty())
                        for (Note note : list) {
                            String s = "Note [id=" + note.getId() + "]";
                            if (s.equals(rowKey))
                                return note;
                        }
                    return null;
                }

                @Override
                public Object getRowKey(Note note) {
                    return note;
                }
            };

        }
    }

Код работает, и я получил для каждой отдельной сущности и его ID правильные Заметки для этого объекта.

Но моя проблема в том, что если я загляну в Журнал. Функция init () вызывается несколько раз. Есть ли какое-либо возможное решение для этого сценария, чтобы избежать использования множества Бинов для каждой сущности (Клиент, Предложение, Счет и т. Д. c. И т. c.)

Большое спасибо

1 Ответ

0 голосов
/ 06 марта 2020

У вас есть метод init в атрибуте rendered формы, поэтому каждый раз, когда JSF оценивает необходимость отображения формы, он вызывает метод init.

Вы можете поместить свой метод init в viewAction, примерно так:

<f:view ....>

    <f:metadata>
        <f:viewAction action="#{noteRequestByObjectController.init('OFFER', offerEditController.offer.id, offerEditController.offer.idHash)}"/>
    </f:metadata>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...