Кастомная агрегация в group table

Алексей Телерман добавил(а) 1 нед. назад
С ответом

Доброго времени суток!

Возможно ли как-то реализовать свой механизм агрегации значений в Group Table?

Как пример: в первой строке имя пользователя, во второй - этапы выполнения задач, в третей - задачи. По первой и второй строке выполняется группировка. Тогда в результате мы имеем запись примерно такого вида: "Тестов Тест (8)", где 8 - это количество всех задач на всех этапах. Мне же нужно, чтобы вместо всех задач, считались, допустим, только активные (атрибут сущности).

Заранее спасибо!

Комментарии (2)

фото
2

Здравствуйте,

Вы можете использовать подход с назначением компоненту GroupPropertyValueFormatter. К сожалению, этот API не документирован и может быть удалён или сильно изменён в будущем.

Например, в стандартном экране списка клиентов мы можем реализовать это так:

public class ClientBrowse extends AbstractLookup {
    @Inject
    private GroupTable<Client> clientsTable;
    @Inject
    private MetadataTools metadataTools;
    @Inject
    private GroupDatasource<Client, UUID> clientsDs;

    @Override
    public void init(Map<String, Object> params) {
        super.init(params);

        // получить реализацию Vaadin компонента из CUBA компонента
        CubaGroupTable groupTable = clientsTable.unwrap(CubaGroupTable.class);

        // назначить свой форматтер для ячеек групп
        groupTable.setGroupPropertyValueFormatter((groupId, value) -> {
            @SuppressWarnings("unchecked")
            GroupInfo<MetaPropertyPath> groupInfo = (GroupInfo<MetaPropertyPath>) groupId;
            MetaPropertyPath propertyPath = groupInfo.getProperty();

            // получить стандартное строковое представление атрибута, по которому группируем
            String formattedValue = metadataTools.format(value, propertyPath.getMetaProperty());

            // получить стандартный счётчик элементов группы, здесь вы можете вычислить другое значение
            // например, используя clientsDs.getGroupItemIds(groupInfo) и фильтрацию полученной коллекции Id
            int defaultCount = clientsDs.getGroupItemsCount(groupInfo);
            return String.format("%s - (%d)", formattedValue == null ? "" : formattedValue, defaultCount);
        });
    }
}

фото
1

Спасибо большое!