Вопрос по разделению отчётов и условия активности кнопки

jmix 1.6.2
здравствуйте!
на экране уже была кнопка отчёта:

у этой кнопки настроено условие активности:

if (selected.stream().findFirst().get().getNaryadNumber() == null
|| selected.stream().findFirst().get().getNaryadNumber().isEmpty()) {
noticeDocumentsTableBtn.setEnabled(false);
} else {
noticeDocumentsTableBtn.setEnabled(true);
}
всё работало корректно, пока на экране был только один отчёт.

теперь на этот же экран добавлен ещё один отчёт (через редактор отчётов), и при нажатии на кнопку «печать» система предлагает выбрать нужный отчёт из списка.

проблема в том, что текущее условие (setEnabled) распространяется на оба отчёта, а нужно, чтобы оно действовало только для первого (старого) отчёта.

подскажите, как можно сделать, чтобы:
условие активности применялось только к одному конкретному отчёту;
либо чтобы можно было разделить отчёты на две разные кнопки («печать отчёта 1» и «печать отчёта 2») на одном экране;
либо как-то задать разные условия активности для разных отчётов.

буду благодарна за пример, где это можно настроить в конфигурации экрана, в коде кнопки или в параметрах отчёта.

Здравствуйте, Екатерина!

Давайте разбираться…

проблема в том, что текущее условие (setEnabled) распространяется на оба отчёта, а нужно, чтобы оно действовало только для первого (старого) отчёта.

Вот один из способов решения вашей проблемы:
Можно отвязать вашу кнопку запуска отчёта от Action (полагаю, в вашем случае, это io.jmix.reportsui.action.list.ListPrintFormAction) и реализовать обработчик события по нажатию на эту кнопку. Т.к. у вас всего два отчёта, то не составит труда, задать каждому из них уникальный код. Он потребуется для запуска отчёта из контроллера экрана по условию.

    <button id="printReportBtn" icon="PRINT"/>

Объявление кнопки для печати в xml файле контроллера экрана.

image
Задание системного кода для отчёта.

На кнопку запуска отчёта (в примере ниже - printReportBtn), можно повесить обработчик (Handler) и перенести условие, которое использовалось для задания активности кнопки, внутрь этого обработчика. Сам отчёт будет запускаться по уникальному коду для нужного вам отчёта, с помощью механизма запуска отчётов в Ui: UiReportRunner.

Пример:

    @Subscribe("printReportBtn")
    public void onPrintReportBtnClick(final Button.ClickEvent event) {
        // Уникальный system code для запуска отчёта 1 (старый отчёт)
        final String orderReportCode1 = "report-code-1";
        // Уникальный system code для запуска отчёта 2 (новый отчёт)
        final String orderReportCode2 = "report-code-2";

        Order selected = ordersTable.getSingleSelected();
        if (selected != null) {
            // Если номера нет, запускаем отчёт 2
            if (selected.getNumber() == null) {
                uiReportRunner.byReportCode(orderReportCode2)
                        .addParam("entity", selected)
                        .runAndShow();
            } else {
            // Или запускаем отчёт 1
                uiReportRunner.byReportCode(orderReportCode1)
                        .addParam("entity", selected)
                        .runAndShow();
            }
        }
    }

После нажатия на кнопку запуска отчёта (в моём примере - с иконкой принтера), нужно будет просто подтвердить запуск (нажать Run report). Больше ничего делать не нужно: все параметры для запуска уже проставлены в коде. Однако, вы сможете их изменить прямо в диалоговом окошке, при запуске.

image

Если вас не устроит предложенный вариант, таким же способом можно повесить на каждую кнопку по отчёту и запускать их по отдельности (по уникальному system code). Условия активности кнопок можете задать произвольные.

С уважением,
Дмитрий