Placeholders for tables and editable tables

Hello!
Can an editable table have a placeholder in a textField?
If yes, then how it can be set?

CUBA v6.10

Thanks.

Hi,

I can suggest two approaches:

  1. Create a generated column with field with input prompt instead of the default one, created by the default mechanism.
import com.company.sales.entity.Product;
import com.haulmont.cuba.gui.components.*;
import com.haulmont.cuba.gui.xml.layout.ComponentsFactory;

import javax.inject.Inject;
import java.util.Map;

public class ProductBrowse extends AbstractLookup {

    @Inject
    private GroupTable<Product> productsTable;
    @Inject
    private ComponentsFactory componentsFactory;

    @Override
    public void init(Map<String, Object> params) {
        productsTable.addGeneratedColumn("name", entity -> {
            TextField field = componentsFactory.createComponent(TextField.class);
            field.setDatasource(productsTable.getItemDatasource(entity), "name");
            field.setWidthFull();
            field.setInputPrompt("Enter Name");

            return field;
        });
    }
}
  1. Implement a custom pluggable component factory (see docs). The pluggable component factories mechanism extends the standard component creation procedure, i.e. you can make required changes application wide, e.g.:
import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.core.global.Messages;
import com.haulmont.cuba.gui.components.AbstractComponentGenerationStrategy;
import com.haulmont.cuba.gui.components.Component;
import com.haulmont.cuba.gui.components.ComponentGenerationContext;
import com.haulmont.cuba.gui.xml.layout.ComponentsFactory;
import org.springframework.core.Ordered;

import javax.annotation.Nullable;
import javax.inject.Inject;

@org.springframework.stereotype.Component(SalesComponentGenerationStrategy.NAME)
public class SalesComponentGenerationStrategy extends AbstractComponentGenerationStrategy implements Ordered {

    public static final String NAME = "sales_SalesComponentGenerationStrategy";

    @Inject
    public SalesComponentGenerationStrategy(Messages messages) {
        super(messages);
    }

    @Inject
    public void setComponentsFactory(ComponentsFactory componentsFactory) {
        this.componentsFactory = componentsFactory;
    }

    @Nullable
    @Override
    public Component createComponent(ComponentGenerationContext context) {
        // Create a component using the default implementation
        Component component = createComponentInternal(context);
        
        // If a component can have an input prompt
        if (component instanceof Component.HasInputPrompt) {
            MetaClass metaClass = context.getMetaClass();
            String property = context.getProperty();
            
            String propertyCaption = messages.getTools().getPropertyCaption(metaClass, property);

            ((Component.HasInputPrompt) component).setInputPrompt(propertyCaption);
        }
        return component;
    }

    @Override
    public int getOrder() {
        return 50;
    }
}

Regards,
Gleb

2 Likes

Hi, Gleb.
The first approach helped!
Many thanks for your help!