Баг в enabled кнопках на disabled layout

Jmix version: 2.3.4
Jmix Studio plugin version: 2.3.3-242
IntelliJ version: IntelliJ IDEA 2024.2.4 (Ultimate Edition)

Здравствуйте!
Наблюдается странное поведение при “включении” компонента (в примере кнопка) в “выключенном” контейнере.

Тестовый пример:

Дескриптор

<hbox width="100%" margin="false">
  <button id="tglLayoutBtn" text="toggle layout"/>
  <button id="tglTestBtn" text="toggle button"/>
</hbox>
<flexLayout id="buttonLayout">
  <button id="testBtn" text="test"/>
</flexLayout>

Контроллер

@Subscribe(id = "tglLayoutBtn", subject = "clickListener")
public void onTglLayoutBtnClick(final ClickEvent<JmixButton> event) {
  boolean layoutEnabled = buttonLayout.isEnabled();
  buttonLayout.setEnabled(!layoutEnabled);
  event.getSource().setText("layout is "+(!layoutEnabled?"enabled":"disabled"));
}

@Subscribe(id = "tglTestBtn", subject = "clickListener")
public void onTglTestBtnClick(final ClickEvent<JmixButton> event) {
  boolean btnEnabled = testBtn.isEnabled();
  testBtn.setEnabled(!btnEnabled);
  event.getSource().setText("testBtn is "+(!btnEnabled?"enabled":"disabled"));
}

@Subscribe(id = "testBtn", subject = "clickListener")
public void onTestBtnClick(final ClickEvent<JmixButton> event) {
  notifications.show("Test Click!");
}

Когда контейнер переключен в disable, а кнопка в enable она отображается как действующая, но события нажатия не отрабатывают. При этом еще и ломается событие на кнопке tglTestBtn которая находится в другом контейнере.
Поведение мягко говоря странное.

Владимир, добрый день!
Благодарим за обращение.
Поведение, действительно, странное.
Я зарегистрировал данную ошибку.

Хорошего дня!

1 симпатия

Баг всё еще актуален.
Для тех кто с ним столкнулся нашел решение для случаев, когда событие клика активной кнопки в не активном контейнере будет работать. Для этого событие придется регистрировать в ручную, например, в onInit:

public void onInit(final InitEvent event) {
testBtn.getElement()
  .addEventListener("click", e -> {
    notifications.show("Test click");
    })
  .setDisabledUpdateMode(DisabledUpdateMode.ALWAYS);
}

Метод setDisabledUpdateMode позволяет задать способ обработки событий от элемента ДОМ который StateNode.isEnabled() == false (в текущей реализации возвращает состояние родителя если сам компонент активен)