GroupTable expand/collapse выбранной "ветки" сгруппированных записей

Ситуация такая. Имеем например 3и колонки, по которым в GroupTable сгруппированы записи и много–много записей в таблице.
Все записи свёрнуты, в самой левой колонке, из трёх, несколько группировок. Мы хотим сделать не expandAll, который пройдётся по всем GroupInfo(группировкам), а по экшену раскрыть конкретную одну группировку и(!) все группировки по группирующим колонкам правее, которые “входят” в эту группировку.

тут при первом взгляде не понятно за что зацепиться -

  1. в экшен не возможно получить GroupInfo, группировку, на которой вызван экшен для expand, соответственно и записи ещё никакие не выбраны, так как они свёрнуты, - чтобы вычислить GroupInfo.

  2. как просто вычислить другие 2е колонки, по которым всё сгруппировано и как раскрыть именно те GroupInfo, которые соотносятся с корневой, на которой был клик. просто по списку колонок в таблице? или есть более разумный подход?

  3. нужен ключ к пониманию как вообще получить “иерархию” или какую-то связанность между GroupInfo или колонками, группирующими строки таблицы.

интересны любые мысли по разбору как это сделать.

1 симпатия

Добрый день!

1 - Так и есть, нельзя получить никакую информацию о группировке, пока пользователь не выберет строку.

2-3) К сожалению, нет API для обработки expand/collapse группировки. Вся логика хранения иерархии группировок находится в интерфейсе GroupTableItems или в его реализации ContainerGroupTableItems. Там же есть и методы hasChildren()/getChildren().
Если вам подходит вариант, когда пользователь сам раскрывает группировку, то можно написать свой слушатель и дальше реагировать на группировку.

Для этого нужно расширить компонент GroupTableImpl и переопределить createTableDataContainer(). Например:

public class ExtGroupTableImpl<E> extends GroupTableImpl<E> {

    @Override
    protected TableDataContainer<E> createTableDataContainer(TableItems<E> tableItems) {
        return new ExtGroupTableContainer((GroupTableItems) tableItems, this);
    }

    public class ExtGroupTableContainer extends AggregatableGroupTableDataContainer {

        public ExtGroupTableContainer(GroupTableItems tableSource, TableItemsEventsDelegate dataEventsDelegate) {
            super(tableSource, dataEventsDelegate);
        }

        @Override
        public void expand(Object id) {
            super.expand(id);

           if (isGroup(id)) {
              // fire some event
           }
        }
    }
}

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

И регистрация компонента (по сути замена оригинала):

@Bean
public ComponentRegistration extGroupTable() {
    return ComponentRegistrationBuilder.create(GroupTable.NAME)
            .withComponentClass(ExtGroupTableImpl.class)
            .build();
}
1 симпатия