Метод setVisible(boolean visible) не скрывает поля в formLayout при значении labelPosition=ASIDE

В версии 2.0 происходит следующее: при задании в xml-дескрипторе атрибута текстового поля visible=false поле скрывается в экране и даже при явном задании в слушателе onBeforeShow textField.setVisible(true) не отображается.
При этом в обратном порядке, если не указывать в xml-дескрипторе параметр visible, но указать в методе onBeforeShow setVisible(false), то скрывается только само поле, при этом его название (label) остаётся.
Предполагалось использование этого компонента для сокрытия поля, если его значение == null (это просто для справки).
При этом, если не ставить параметр labelPosition в formLayout (т.е. =TOP по умолчанию), то всё работает корректно, поле пропадает полностью и все остальные поля сдвигаются наверх (если не поиграться с colsplan).

В версии 2.1 куда более интересная фишка, если указываешь в formLayout в xml-дескрипторе параметр labelPosition=ASIDE, то все поля подчеркиваются с предупреждением:

Jmix: labelsPositions="ASIDE" property has effect only for <formItem> child

Соответственно если пойти по предложенному пути и обернуть поле в (при чем это надо каждое поле обернуть), то происходит ровно тоже самое что в версии 2.0.

Это какой-то баг или так задумано?

Здравствуйте!

В версии 2.0, при загрузке из XML компонента, который лежит в форме - производилось неявное оборачивание компонента в FormItem по следующей логике:

  • Если formLayout имеет значение labelPosition=ASIDE, то компонент оборачивается в FormItem для того, чтобы корректно работал лейбл. Так описано в документации Vaadin: Form Layout | Components | Vaadin Docs
  • Если formLayout имеет значение labelPosition=TOP, то компонент будет добавлен в formLayout напрямую через метод add(Component)

В версии 2.1 мы приняли решение избавиться от такой неявной обёртки и явно предоставляем тот API, который предоставляет Vaadin. Теперь Вы можете как явно указать обёртку formItem, так и добавить компоненты напрямую в форму. Еще раз напомню, что обёртка formItem нужна для того, чтобы управлять лейблом компонента в контексте formLayout.

Таким образом, если вы хотите взаимодействовать со свойствами enabled и visible для компонента в форме, вы должны назначать эти свойства для соответствующего formItem.

Вы можете использовать formItem как обычный компонент, инжектируя его в контроллер, или устанавливая ему свойства в XML.
Также вы можете использовать методы io.jmix.flowui.kit.component.ComponentUtils#setVisible и io.jmix.flowui.kit.component.ComponentUtils#setEnabled для того, чтобы одновременно менять видимость для компонента и его formItem.

Чуть больше информации о мотивации такого решения и особенностях реализации Вы можете найти по ссылке на тикет: Redesign FormLayout component · Issue #2201 · jmix-framework/jmix · GitHub

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