Управление событиями onClick или onSucess из bean-компонентов (простых лиц)? - PullRequest
1 голос
/ 10 июля 2019

Мне нужно показать in another tab сгенерированный отчет методом бина (bean.generateReporte()). И показать сообщение, когда отчет не может быть сгенерирован (данные не найдены в соответствии с критериями).

мой первый код в .xhtml был :

<p:commandButton id="printDeliveryList" label="Generate Delivery List" styleClass="btn-success"
     style="float:left" icon="fa fa-print" 
     action="#{bean.generateReporte()}"
     onclick="this.form.target = '_blank'"
     ajax="false"
 />

Я читал этот вопрос Как предотвратить выполнение commandButton действия, когда метод onclick возвращает false и этот вопрос Как вызвать функцию JS по нажатию кнопки JSF и заблокировать перезагрузку страницы / навигацию? и этот пост https://www.adictosaltrabajo.com/2011/09/14/primefaces-client-side-ajax-events/ И эта документация https://www.primefaces.org/showcase/ui/misc/requestContext.xhtml

Я думал о onsuccess событии.

Вот мой код позже ....

В сторону bean у меня есть:

public void generateReporte() {
    // blabla
    if (success) {
        addGeneratedToCallback(true);
    } else {
        addGeneratedToCallback(false);
    }
}

private void addGeneratedToCallback(boolean value) {
    PrimeFaces.current().ajax().addCallbackParam("generated", value);
}

На стороне .xhtml

<script type="text/javascript">
    function handleComplete(xhr, status, args) {
        if (args.validationFailed) {
            PrimeFaces.debug("Validation Failed");
        } else {
            if (args.generated) {
                // open a new tab in the browser
                //window.open(this.form.target = '_blank');
                form.target = '_blank';
            } else {
                // show message
            }
        }
    }
</script>


<p:commandButton id="printListaEntrega" label="Generar Lista de Entrega" styleClass="btn-success"
                 style="float:left" icon="fa fa-print" 
                 action="#{bean.generateReporte()}"
                 ajax="false"
                 oncomplete="handleComplete(xhr, status, args)"
                 />

Результат моего кода

С ajax="false" Я получил это, когдаГенерация отчета невозможна. enter image description here

Когда я удаляю ajax="false" из p:commandButton и отчет генерируется, я получил. (Не открывать новыйвкладка в браузере и не могу загрузить отчет) enter image description here

Можно ли установить условную ajax="bean.someMethodOrProperty"?

1 Ответ

0 голосов
/ 11 июля 2019

В .xhtml

<p:commandButton id="printDeliveryList" label="Generate Delivery List" styleClass="btn-success"
                 style="float:left" icon="fa fa-print" 
                 action="#{bean.generateReport()}"
                 oncomplete="if (args &amp;&amp; !args.validationFailed) {PF('download').jq.click();PF('openNewTab').jq.click() }"
                 />
<p:commandButton widgetVar="download" styleClass="ui-helper-hidden" 
                 action="#{bean.downloadFile()}" ajax="false" />
<p:commandButton widgetVar="openNewTab" styleClass="ui-helper-hidden" 
                 action="#{bean.openInNewTab()}" 
                 onclick="this.form.target = '_blank'" ajax="false" />

в бобе

public void generateReport() {
    // blabla
    if (success) {
        bytesToBeDownload = getBytesOfReport();
        nameOfFile = getNameOfReport() + ".pdf";
    } else {
        Faces.validationFailed();
    }
}


public void downloadFile() {
    try {
        // byte[] bytesToBeDownload = ....
        org.omnifaces.util.Faces.sendFile(bytesToBeDownload, nameOfFile, true);
    } catch (IOException e) {
        //Exception handling
    }
}


public void openInNewTab() {
    try {
        byte[] bytes = bytesToBeDownload;
        ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length);
        baos.write(bytes, 0, bytes.length);
        buildResponse(baos, "application/pdf");
    } catch (Exception e) {
        //Exception handling
    }
}


private static void buildResponse(ByteArrayOutputStream out, String contentType) {

    ByteArrayInputStream input = null;
    BufferedOutputStream output = null;

    try {

        input = new ByteArrayInputStream(out.toByteArray());
        int bufferSize = out.toByteArray().length;

        FacesUtils.getHttpServletResponse().reset();
        FacesUtils.getHttpServletResponse().setHeader("Content-Type", contentType);
        FacesUtils.getHttpServletResponse().setHeader("Content-Length", String.valueOf(bufferSize));
        output = new BufferedOutputStream(FacesUtils.getHttpServletResponse().getOutputStream(), bufferSize);

        byte[] buffer = new byte[bufferSize];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        output.flush();

    } catch (Exception ex) {
        //Exception handling
    } finally {
        try {
            output.close();
            input.close();
        } catch (Exception ex) {
        //Exception handling
        }
    }
    FacesUtils.getFacesContext().responseComplete();
}
...