Как реализовать сохранение пользовательских настроек композитного компонента?

Доброго дня!
Подскажите пожалуйста как реализовать сохранение пользовательских настроек компонента?

В CUBA мы добавляли композитный компонент помечали его интерфейсом HasSettings и реализовывали его методы applySettings(Element element) , saveSettings(Element element) и isSettingsEnabled.
Благодаря этому, вызовы методов контроллера saveSettings() и applySettings(), где размещался композитный компонент, сохраняли и применяли его настройки, без лишнего кода на стороне экранов.

Немного посёрфив не нашел похожего механизма, чтобы компонент экрана сам заботился о своих настройках без написания обработчиков событий ScreenSettingsFacet на всех экранах, где он расположен.

реализация компонента
import com.haulmont.cuba.gui.components.HasSettings

public class CompositeComponentExample extends CompositeComponent<HBoxLayout>
        implements CompositeWithCaption, CompositeWithDescription, CompositeWithIcon, CompositeWithContextHelp, HasSettings {

@Override
    public void applySettings(Element element) {
//some code
}

@Override
    public boolean saveSettings(Element element) {
//some code
}

Обстановка:

  • студия Jmix 2.1.3-233
  • версия Jmix 1.5.4
  • IntelliJ IDEA 2023.3.3 (Community Edition)

Сам я не пробовал, но в jmix как я понимаю нужно для вашего CompositeComponentExample создать SettingsBinder наследующий ComponentSettingsBinder, по примеру GenericFilterSettingsBinder или DataGridSettingsBinder

2 симпатии

Добрый день!

Как написал Ярослав, для своего компонента нужно создать:

  • Класс POJO, который будет хранить настройки компонента (и реализует Settings интерфейс)
  • Бин, реализующий ComponentSettingsBinder, который собственно и занимается применением настроек и их сохранением.

Написал небольшой демо проект. Приведу классы, которые нужно сделать:

Settings
public class CustomCompositeSettings implements Settings {

    private String id;

    private String value;

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void setId(String id) {
        this.id = id;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}
ComponentSettingsBinder
@org.springframework.stereotype.Component("CustomCompositeSettingsBinder")
public class CustomCompositeSettingsBinder
        implements ComponentSettingsBinder<CustomComposite, CustomCompositeSettings> {

    @Override
    public Class<? extends Component> getComponentClass() {
        return CustomComposite.class;
    }

    @Override
    public Class<? extends Settings> getSettingsClass() {
        return CustomCompositeSettings.class;
    }

    @Override
    public void applySettings(CustomComposite component, CustomCompositeSettings settings) {
        if (!Strings.isNullOrEmpty(settings.getValue())) {
            component.setValue(settings.getValue());
        }
    }

    @Override
    public boolean saveSettings(CustomComposite component, CustomCompositeSettings settings) {
        if (!Strings.isNullOrEmpty(component.getValue())) {
            settings.setValue(component.getValue());
            return true;
        }
        return false;
    }

    @Override
    public CustomCompositeSettings getSettings(CustomComposite component) {
        CustomCompositeSettings settings = new CustomCompositeSettings();
        settings.setId(component.getId().orElseThrow());
        settings.setValue(component.getValue());
        return settings;
    }
}

Сам проект: comp-setting.zip (119.9 КБ)

1 симпатия

Большое спасибо за развернутый ответ!
Эту реализацию вы предложили, скорее-всего для версии jmix 2+, мы пока мигрируем на jmix 1.5.
Вероятно по этому я не нахожу io.jmix.flowui.facet.settings.Settings. Прошу прощения, что не уточнил, что проект мигрировал с CUBA 7+.
Не могли бы вы подсказать, есть какое-то решение для версии jmix 1.5?

Для 1.5 всё тоже самое, только Settings в 1.5 называется - io.jmix.ui.settings.component.ComponentSettings.

Если есть сомнения, то смотрите на другие реализации настроек компонентов:

1 симпатия

Спасибо, коллеги!