maxTextLength не работает для List в Table?

Выгружаю Transient List определенных сущностей, отображается их InstanceName, не срабатывает maxTextLength для данной колонки.
Данное свойство работает только для строки?
Разве в колонке не идёт преобразование к строке?

Добрый день, @gleb.gavrilenko!

Атрибут maxTextLength работает только с колонками, которые содержат значения с Attribute type = DATATYPE (Integer, String, Double и тп.). С колонками, которые содержат значения, являющиеся ссылками на связанные сущности (Attribute type = ASSOCIATION or COMPOSITION), атрибут maxTextLength не будет работать.

С уважением,
Глеб

Можете сделать собственную реализацию AbbreviatedCollectionFormatter:

  • AbbreviatedCollectionFormatter
@SuppressWarnings("rawtypes")
@Component
public class AbbreviatedCollectionFormatter implements BiFunction<Collection, Integer, String> {

    @Inject
    protected MetadataTools metadataTools;

    @SuppressWarnings("unchecked")
    @Override
    public String apply(Collection collection, Integer maxTextLength) {
        if (collection == null) {
            return StringUtils.EMPTY;
        }

        String value = (String) collection.stream()
                .map(metadataTools::format)
                .collect(Collectors.joining(", "));

        if (value.length() > maxTextLength + MAX_TEXT_LENGTH_GAP) {
            return StringUtils.abbreviate(value, maxTextLength);
        } else {
            return value;
        }
    }
}
  • XML дескриптор (атрибут products - коллекция)
<groupTable id="ordersTable"
            width="100%"
            dataContainer="ordersDc">
    <actions>
        <action id="create" type="create"/>
        <action id="edit" type="edit"/>
        <action id="remove" type="remove"/>
    </actions>
    <columns>
        <column id="number"/>
        <column id="products"/>
    </columns>
    <rowsCount/>
    <buttonsPanel id="buttonsPanel"
                  alwaysVisible="true">
        <button id="createBtn" action="ordersTable.create"/>
        <button id="editBtn" action="ordersTable.edit"/>
        <button id="removeBtn" action="ordersTable.remove"/>
    </buttonsPanel>
</groupTable>
  • Контроллер экрана
@UiController("sample_Order.browse")
@UiDescriptor("order-browse.xml")
@LookupComponent("ordersTable")
@LoadDataBeforeShow
public class OrderBrowse extends StandardLookup<Order> {
    @Inject
    protected MetadataTools metadataTools;
    @Inject
    protected DynamicAttributesTools dynamicAttributesTools;
    @Inject
    protected AbbreviatedCollectionFormatter formatter;

    @Inject
    protected GroupTable<Order> ordersTable;

    @Subscribe
    protected void onBeforeShow(BeforeShowEvent event) {
        AbbreviatedCellClickListener abbreviatedCellClickListener =
                new AbbreviatedCellClickListener(ordersTable, dynamicAttributesTools, metadataTools);
        Table.Column<?> column = ordersTable.getColumn("products");
        column.setMaxTextLength(10);

        column.addClickListener(clickEvent ->
                abbreviatedCellClickListener.onClick(clickEvent.getItem(), clickEvent.getSource().getStringId()));

        column.setFormatter(products ->
                formatter.apply((Collection) products, column.getMaxTextLength()));

        ordersTable.setStyleProvider((Order entity, String property) -> {
            if ("products".equals(property)) {
                int maxTextLength = column.getMaxTextLength();
                String value = formatter.apply(entity.getProducts(), maxTextLength);

                if (value != null && value.endsWith("...")) {
                    return "c-table-cell-textcut";
                } else {
                    return "c-table-clickable-text";
                }
            }
            return null;
        });
    }
}

С уважением,
Глеб

1 симпатия