Фасеты

Фасеты - это невизуальные компоненты, которые добавляют дополнительное поведение к экрану или его компонентам.

Встроенные фасеты

Фреймворк предоставляет следующие фасеты:

Чтобы добавить какой-либо фасет на экран, используйте Jmix Studio.

Нажмите Add Component на панели действий, затем выберите раздел Facets и дважды кликните по выбранному элементу фасета.

add facet

Студия создаст элемент <facets>:

<facets>
    <settings auto="true"/>
</facets>

Вы можете просматривать и редактировать атрибуты фасета в Jmix Studio используя панель испектора Jmix UI.

Пользовательские фасеты

Приложения или дополнения могут предоставлять свои собственные фасеты. Чтобы создать пользовательский фасет, выполните следующие шаги:

  1. Создайте интерфейс, расширяющий io.jmix.flowui.facet.Facet.

  2. Создайте класс реализации на основе io.jmix.flowui.facet.impl.AbstractFacet.

  3. Зарегистрируйте фасет, используя FacetRegistrationBuilder (смотрите подробности ниже).

  4. Создайте XSD-схему для использования фасета в XML-дескрипторах экранов.

  5. Опционально создайте аннотированный интерфейс для добавления поддержки фасета на панели инспектора Jmix UI в дизайнере экранов Студии.

Классы DataLoadCoordinator и UrlQueryParametersFacet фреймворка могут быть хорошими примерами для создания фасета.

Регистрация пользовательского фасета

Механизм регистрации фасетов состоит из трех основных компонентов:

  • Реализация - класс, реализующий логику фасета.

  • Загрузчик (Loader) - класс, который читает конфигурацию фасета из XML и создает экземпляр фасета.

  • Тег (Tag) - имя XML-элемента, используемое для объявления фасета в экране.

Вы можете зарегистрировать новые комбинации фасетов, используя FacetRegistrationBuilder.

Пример регистрации пользовательского фасета таймера:

import io.jmix.flowui.facet.Timer;
import io.jmix.flowui.sys.registration.FacetRegistration;
import io.jmix.flowui.sys.registration.FacetRegistrationBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FacetConfiguration {
    @Bean
    public FacetRegistration extTimerFacet() {
        return FacetRegistrationBuilder.create(TimerExtImpl.class) (1)
                .replaceFacet(Timer.class) (2)
                .withFacetLoader("timer", TimerFacetExtLoader.class) (3)
                .build();
    }
}
1 Указывает класс, реализующий фасет.
2 Используется, если ваш фасет должен заменить существующий фасет фреймворка (например, стандартный Timer). Этот вызов заменяет все использования оригинального фасета в экранах вашей пользовательской реализацией.
3 Связывает XML-тег (например, "timer") с классом загрузчика. Загрузчик должен расширять io.jmix.flowui.xml.facet.loader.FacetLoader и знать, как создать фасет из XML.

Если ваш фасет не заменяет существующий, вы можете опустить replaceFacet() и просто предоставить загрузчик:

@Bean
    public FacetRegistration customTimerFacet() {
        return FacetRegistrationBuilder.create(TimerExtImpl.class)
                .withFacetLoader("customTimer", TimerFacetExtLoader.class)
                .build();
    }