Search in sources :

Example 1 with Field

use of io.jmix.ui.component.Field in project jmix by jmix-framework.

the class ValueBinder method bind.

public <V> ValueBinding<V> bind(HasValue<V> component, ValueSource<V> valueSource) {
    if (valueSource instanceof ApplicationContextAware) {
        ((ApplicationContextAware) valueSource).setApplicationContext(applicationContext);
    }
    ValueBindingImpl<V> binding = new ValueBindingImpl<>(component, valueSource);
    if (component instanceof Component.Editable) {
        ((Component.Editable) component).setEditable(!valueSource.isReadOnly());
    }
    if (valueSource instanceof EntityValueSource) {
        EntityValueSource entityValueSource = (EntityValueSource) valueSource;
        MetaPropertyPath metaPropertyPath = entityValueSource.getMetaPropertyPath();
        if (component instanceof Field) {
            initRequired((Field) component, metaPropertyPath);
            initBeanValidator((Field<?>) component, metaPropertyPath);
        }
        if (entityValueSource.isDataModelSecurityEnabled()) {
            UiEntityAttributeContext attributeContext = new UiEntityAttributeContext(metaPropertyPath);
            accessManager.applyRegisteredConstraints(attributeContext);
            if (component instanceof Component.Editable) {
                MetaClass metaClass = entityValueSource.getEntityMetaClass();
                boolean permittedIfEmbedded = true;
                if (entityValueSource instanceof ContainerValueSource) {
                    InstanceContainer<?> container = ((ContainerValueSource<?, ?>) entityValueSource).getContainer();
                    if (container instanceof Nested && metaClass != null && metadataTools.isJpaEmbeddable(metaClass)) {
                        String embeddedProperty = ((Nested) container).getProperty();
                        MetaClass masterMetaClass = ((Nested) container).getMaster().getEntityMetaClass();
                        UiEntityAttributeContext embeddedAttributeContext = new UiEntityAttributeContext(masterMetaClass, embeddedProperty);
                        accessManager.applyRegisteredConstraints(embeddedAttributeContext);
                        permittedIfEmbedded = embeddedAttributeContext.canModify();
                    }
                    if (permittedIfEmbedded && metaPropertyPath.length() > 1) {
                        for (MetaProperty property : metaPropertyPath.getMetaProperties()) {
                            if (metadataTools.isEmbedded(property)) {
                                UiEntityAttributeContext childAttributeContext = new UiEntityAttributeContext(property.getDomain(), property.getName());
                                accessManager.applyRegisteredConstraints(childAttributeContext);
                                if (!childAttributeContext.canModify()) {
                                    permittedIfEmbedded = false;
                                    break;
                                }
                            }
                        }
                    }
                }
                if (!attributeContext.canModify() || !permittedIfEmbedded) {
                    ((Component.Editable) component).setEditable(false);
                }
            }
            if (!attributeContext.canView()) {
                component.setVisible(false);
            }
        }
    }
    binding.bind();
    return binding;
}
Also used : EntityValueSource(io.jmix.ui.component.data.meta.EntityValueSource) ApplicationContextAware(org.springframework.context.ApplicationContextAware) UiEntityAttributeContext(io.jmix.ui.accesscontext.UiEntityAttributeContext) MetaPropertyPath(io.jmix.core.metamodel.model.MetaPropertyPath) Nested(io.jmix.ui.model.Nested) Field(io.jmix.ui.component.Field) MetaClass(io.jmix.core.metamodel.model.MetaClass) MetaProperty(io.jmix.core.metamodel.model.MetaProperty)

Example 2 with Field

use of io.jmix.ui.component.Field in project jmix by jmix-framework.

the class InputDialogFacetProvider method loadField.

@Nullable
protected Field<?> loadField(String paramId, Element element, ComponentLoader.ComponentContext context) {
    List<Element> elements = element.elements();
    if (elements.size() == 0) {
        return null;
    } else if (elements.size() > 1) {
        throw new GuiDevelopmentException(String.format("InputParameter '%s' element cannot contain " + "two or more custom field definitions", paramId), context);
    }
    Element customFieldElement = elements.get(0);
    ComponentLoader loader = getLayoutLoader(context).createComponent(customFieldElement);
    io.jmix.ui.component.Component component = loader.getResultComponent();
    // Check field type before loading attributes
    if (!(component instanceof Field)) {
        throw new GuiDevelopmentException(String.format("InputParameter '%s' custom field must implement " + "io.jmix.ui.component.Field", paramId), context);
    }
    loader.loadComponent();
    return ((Field<?>) component);
}
Also used : Field(io.jmix.ui.component.Field) Element(org.dom4j.Element) GuiDevelopmentException(io.jmix.ui.GuiDevelopmentException) ComponentLoader(io.jmix.ui.xml.layout.ComponentLoader) Nullable(javax.annotation.Nullable)

Aggregations

Field (io.jmix.ui.component.Field)2 MetaClass (io.jmix.core.metamodel.model.MetaClass)1 MetaProperty (io.jmix.core.metamodel.model.MetaProperty)1 MetaPropertyPath (io.jmix.core.metamodel.model.MetaPropertyPath)1 GuiDevelopmentException (io.jmix.ui.GuiDevelopmentException)1 UiEntityAttributeContext (io.jmix.ui.accesscontext.UiEntityAttributeContext)1 EntityValueSource (io.jmix.ui.component.data.meta.EntityValueSource)1 Nested (io.jmix.ui.model.Nested)1 ComponentLoader (io.jmix.ui.xml.layout.ComponentLoader)1 Nullable (javax.annotation.Nullable)1 Element (org.dom4j.Element)1 ApplicationContextAware (org.springframework.context.ApplicationContextAware)1