Filter set global defaults for collapsable and collapsed properties

Hello Jmix team,

I’m in need of setting a global default for collapsable = true and collapsed=true properties of the Filter component.
Is this even possible and how can I achieve it?

Thanks!
Konstantin

Hi Konstantin,

Yes it’s possible.

First, create your own FilterLoader:

package com.company.demo.ui;

import io.jmix.ui.component.Collapsable;
import io.jmix.ui.xml.layout.loader.FilterLoader;
import org.dom4j.Element;

public class MyFilterLoader extends FilterLoader {

    @Override
    protected void loadCollapsible(Collapsable component, Element element, boolean defaultCollapsable) {
        // use desired defaults
        component.setCollapsable(true);
        component.setExpanded(false);
    }
}

Second, create your LoaderConfig:

package com.company.demo.ui;

import io.jmix.core.JmixOrder;
import io.jmix.ui.xml.layout.ComponentLoader;
import io.jmix.ui.xml.layout.LoaderConfig;
import org.dom4j.Element;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.annotation.Nullable;

@Component
@Order(JmixOrder.HIGHEST_PRECEDENCE - 10) // before framework's loaders
public class MyLoaderConfig implements LoaderConfig {

    @Override
    public boolean supports(Element element) {
        return "filter".equals(element.getName());
    }

    @Override
    public Class<? extends ComponentLoader> getLoader(Element element) {
        if ("filter".equals(element.getName())) {
            return MyFilterLoader.class;
        }
        return null;
    }

    @Nullable
    @Override
    public Class<? extends ComponentLoader> getFragmentLoader(Element root) {
        return null;
    }

    @Nullable
    @Override
    public Class<? extends ComponentLoader> getWindowLoader(Element root) {
        return null;
    }
}

That’s it - all filters will have the parameters you set in your loader.

This way you can override loading of any UI components from XML.

Regards,
Konstantin