Компонент GroupDataGrid

Компонент groupDataGrid — более функциональная версия базовой таблицы данных с широкими возможностями группировки строк. Он группирует строки по повторяющимся значениям колонки, объединяя их в сворачиваемые блоки, с поддержкой многоуровневой группировки и изменения порядка группировки перетаскиванием.

XML-элемент

groupDataGrid

Java-класс

GroupDataGrid

Атрибуты

Общие: id - aggregatable - columnReorderingAllowed - emptyStateText - enabled - selectionMode - visible

Привязка данных: dataContainer - metaClass

Размер: height - maxHeight - maxWidth - minHeight - minWidth - width

Позиция: alignSelf - colspan

Внешний вид: classNames - css - themeNames

Прочее: aggregationPosition - allRowsVisible - ariaLabel - columnRendering - detailsVisibleOnClick - dropMode - editorBuffered - focusShortcut - multiSort - multiSortOnShiftClickOnly - multiSortPriority - nestedNullBehavior - pageSize - rowsDraggable - sortByGroupEnabled - tabIndex

Обработчики

AttachEvent - BlurEvent - CellFocusEvent - CollapseEvent - ColumnReorderEvent - ColumnResizeEvent - DetachEvent - ExpandEvent - FocusEvent - GridDragEndEvent - GridDragStartEvent - GridDropEvent - GroupItemClickEvent - GroupItemDoubleClickEvent - GroupingChangedEvent - ItemClickEvent - ItemDoubleClickEvent - SelectionEvent - SortEvent - dataGenerator - dragFilter - dropFilter - enterPressHandler - groupPartNameGenerator - groupTooltipGenerator - itemSelectableProvider - partNameGenerator - tooltipGenerator

Элементы

groupBy - columnRef - columns - column - groupColumn - editorActionsColumn

Основы

Для начала работы установите дополнение, а затем добавьте компонент через палитру Add Component в Дизайнере экранов Studio.

groupdatagrid palette

В следующем примере клиенты группируются по значениям колонки Grade.

groupdatagrid basic
XML code
<view xmlns="http://jmix.io/schema/flowui/view" xmlns:groupg="http://jmix.io/schema/groupgrid/ui"
      title="msg://basicGroupGridView.title"> (1)
    <data>
        <collection id="customersDc"
                    class="com.company.groupdatagridex1.entity.Customer"
                    fetchPlan="_base">
            <loader id="customersDl">
                <query>
                    <![CDATA[select e from Customer e]]>
                </query>
            </loader>
        </collection>
    </data>
    <facets>
        <dataLoadCoordinator auto="true"/>
    </facets>
    <layout>
        <groupg:groupDataGrid id="customersGroupDataGrid"
                              dataContainer="customersDc"
                              minWidth="100px"
                              width="100%">
            <groupg:groupBy>
                <groupg:columnRef key="grade"/> (2)
            </groupg:groupBy>
            <groupg:columns>
                <groupg:groupColumn header="Grade"/> (3)
                <groupg:column property="firstName"/>
                <groupg:column property="lastName"/>
                <groupg:column property="email"/>
                <groupg:column property="country"/>
                <groupg:column property="grade"/>
            </groupg:columns>
        </groupg:groupDataGrid>
    </layout>
</view>
1 Если компонент добавляется вручную, а не через палитру Add Component, объявите пространство имён groupg.
2 Начальная группировка выполняется по свойству grade; можно добавить дополнительные уровни группировки.
3 Определение колонки группировки.

Привязка данных

Привязка данных — это связывание визуального компонента с контейнером данных. Чтобы связать компонент с данными, используйте атрибут dataContainer со ссылкой на контейнер коллекции. См. пример выше.

Элемент группы

Элементы группы — это специальные записи, создаваемые при группировке. Они отображаются как строки, содержащие только заголовок группы.

groupdatagrid group items

Для отображения элементов группы уровень привязки данных создаёт временный пустой экземпляр сущности или DTO. Этот экземпляр не добавляется в контейнер коллекции и существует только в памяти на время группировки.

Скрытие счётчика элементов группы

По умолчанию элементы группы отображают количество вложенных записей. Чтобы скрыть это число, используйте свойство displayItemCount элемента groupColumn.

groupdatagrid hide count

Многоуровневая группировка

Компонент поддерживает группировку по нескольким колонкам. Щёлкните значок колонки группировки, чтобы открыть диалог Group by, а затем добавьте или удалите колонки.

groupdatagrid multiple

Сортировка

Настройка сортировки такая же, как в dataGrid. Атрибут sortByGroupEnabled определяет, влияет ли сортировка на порядок групп.

Отключение группировки

Чтобы запретить пользователям группировку по определённой колонке, установите её свойству groupAllowed значение false. Это убирает колонку из диалога Group by. В примере ниже колонка Country не может быть сгруппирована:

groupdatagrid groupallowed
XML code
<groupg:groupDataGrid id="customersGroupDataGrid"
                      dataContainer="customersDc"
                      minWidth="100px"
                      width="100%">
    <groupg:groupBy>
        <groupg:columnRef key="grade"/>
    </groupg:groupBy>
    <groupg:columns>
        <groupg:groupColumn header="Grade"/>
        <groupg:column property="firstName"/>
        <groupg:column property="lastName"/>
        <groupg:column property="email"/>
        <groupg:column property="country" groupAllowed="false"/>
        <groupg:column property="grade"/>
    </groupg:columns>
</groupg:groupDataGrid>

Чтобы полностью отключить группировку для пользователей, установите displayColumnsGrouperOnIconClick="false" на элементе groupColumn.

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

Настраиваемая колонка группировки

Чтобы использовать нестандартное значение для группировки, опишите новое свойство группировки в контроллере экрана. В следующем примере вводится новое свойство группировки, объединяющее имя и фамилию.

Такое синтетическое свойство не сортируется автоматически. Чтобы включить сортировку, укажите свойства сортировки в дескрипторе свойства группировки с помощью .withSortProperties(…​).

groupdatagrid custom column
XML code
<groupg:groupDataGrid id="customersGroupDataGrid"
                      dataContainer="customersDc"
                      minWidth="100px"
                      width="100%">
    <groupg:columns>
        <groupg:groupColumn key="group" header="Full name"/> <!-- 1 -->
        <groupg:column key="fullName" header="Full name"/>
        <groupg:column property="email"/>
        <groupg:column property="country"/>
        <groupg:column property="grade"/>
    </groupg:columns>
</groupg:groupDataGrid>
Java code
@ViewComponent
private GroupDataGrid<Customer> customersGroupDataGrid;

@Subscribe
public void onInit(InitEvent event) {
    GroupDataGridItems<Customer> items = customersGroupDataGrid.getItems();

    if (items != null) {
        items.addGroupPropertyDescriptor( (1)
                new BaseGroupPropertyDescriptor<Customer>("fullName",
                        context -> context.getItem().getFirstName() + " " + context.getItem().getLastName())
                        .withSortProperties(List.of("firstName", "lastName"))); (2)

        customersGroupDataGrid.groupByKeys("fullName"); (3)
    }
}
@Supply(to = "customersGroupDataGrid.fullName", subject = "renderer") (4)
protected Renderer<Customer> supplyRendererToFullNameColumn() {
    return new TextRenderer<>(item -> item.getFirstName() + " " + item.getLastName());
}
1 Описывает новое свойство группировки, объединяющее firstName и lastName.
2 .withSortProperties(List.of("firstName", "lastName")) указывает компоненту, как сортировать синтетическое свойство.
3 Группировка по fullName по умолчанию.
4 Предоставляет запасной вариант отображения для колонки Full Name, когда она не участвует в группировке; без этого колонка будет отображаться пустой.

Экспорт в Excel

Функциональность экспорта предоставляется бесплатным дополнением Grid Export Actions, которое поддерживает все виды таблиц: groupDataGrid, dataGrid и treeDataGrid.

groupdatagrid export

Дополнение предоставляет три варианта экспорта. Они влияют как на охват данных, так и на формат итоговой таблицы:

  • Все строки — экспортирует все строки, разворачивая группировку в плоский список.

  • Текущая страница — экспортирует только видимые строки, сохраняя структуру группировки как в таблице.

  • Выбранные строки — экспортирует выбранные строки, разворачивая группировку в плоский список.

Оформление

Темы

Настройте темы с помощью свойства themeNames. Можно применять несколько тем одновременно. Темы такие же, как в dataGrid.

Иконка группировки

Компонент отображает + для свёрнутой группы и - для развёрнутой. Чтобы изменить иконки, добавьте нужные значки в таблицу стилей приложения. Замените значения content по умолчанию на коды нужных символов (например, e7c1 и e7bf из коллекции иконок шрифта Vaadin):

application.css
vaadin-grid-tree-toggle.jmix-group-toggle {
    &::part(toggle)::before {
        content: "\e7c1";
    }

    &[expanded]::part(toggle)::before {
        content: "\e7bf";
    }
}
groupdatagrid groupicon

Иконка колонки группировки

Иконка колонки группировки настраивается через атрибут groupIcon элемента groupColumn. Чтобы скрыть иконку, установите groupIconVisible в значение false.

Атрибуты

Общие атрибуты выполняют одну и ту же роль для всех компонентов. Ниже перечислены атрибуты, общие с dataGrid, и атрибуты, уникальные для groupDataGrid:

Имя

Описание

По умолчанию

aggregatable

Если true, включает агрегацию колонок. См. Агрегация данных.

false

columnReorderingAllowed

Если true, позволяет пользователям изменять порядок колонок.

false

emptyStateText

Текст, отображаемый при отсутствии данных в таблице. Чтобы удалить текущее содержимое пустого состояния, укажите null. См. Отображение при отсутствии данных.

selectionMode

Устанавливает режим выделения элементов. Допустимые значения: SINGLE, MULTI.

SINGLE

aggregationPosition

Если данные в компоненте aggregatable, определяет, отображается ли строка агрегации выше или ниже остальных строк. Возможные значения: TOP или BOTTOM. См. Агрегация данных.

BOTTOM

allRowsVisible

Если true, таблица отображает все строки одновременно без полос прокрутки, фактически отключая виртуальную прокрутку. Это означает, что вместо рендеринга только видимых строк и подгрузки дополнительных при прокрутке пользователем таблица отображает все строки в DOM одновременно.

Использование этой функции не рекомендуется при большом количестве элементов, так как это может вызвать проблемы с производительностью.

columnRendering

Задаёт режим рендеринга колонок. В режиме EAGER все колонки отображаются сразу, независимо от их видимости в области просмотра. В режиме LAZY ячейки отображаются только для колонок, находящихся в видимой области.

EAGER

detailsVisibleOnClick

Если true, позволяет раскрывать детализацию элементов по щелчку мыши.

true

dropMode

Определяет, где можно оставить перетаскиваемую строку. Возможные значения: BETWEEN, ON_TOP, ON_TOP_OR_BETWEEN, ON_GRID. Этот атрибут можно использовать, например, для изменения порядка строк и их перетаскивания между таблицами.

editorBuffered

Если true, активирует буферизированный режим встроенного редактирования, то есть пользователь должен подтверждать внесение изменений нажатием кнопки подтверждения. Этот режим также позволяет пользователям отменять изменения. В небуферизированном режиме изменения применяются без подтверждения.

false

multiSort

Если true, включает сортировку по нескольким колонкам.

false

multiSortOnShiftClickOnly

Если true, множественная сортировка активируется только при щелчке по заголовку колонки с удержанием клавиши Shift.

false

multiSortPriority

Определяет, добавляется ли выбранная колонка в конец или в начало списка отсортированных колонок. Возможные значения: PREPEND, APPEND.

PREPEND

nestedNullBehavior

Задаёт поведение при обработке вложенных свойств, цепочка которых может содержать значения null. Возможные значения: THROW, ALLOW_NULLS.

THROW

pageSize

Определяет размер страницы — количество элементов, получаемых от поставщика данных за один раз.

50

rowsDraggable

Если true, позволяет пользователям перетаскивать строки в таблице.

false

sortByGroupEnabled

Если true:

  • сортировка включена для колонки группировки;

  • сортировка по другим колонкам переставляет строки внутри каждой группы, но исходный порядок групп остаётся неизменным.

Если false:

  • сортировка для колонки группировки отключена;

  • сортировка по другим колонкам переставляет и сами группы соответствующим образом.

true

Обработчики

Общие обработчики настраиваются одинаково для всех компонентов. Ниже перечислены обработчики, общие с dataGrid, и обработчики, уникальные для groupDataGrid:

Чтобы сгенерировать заглушку обработчика в Jmix Studio, используйте вкладку Handlers панели инспектора Jmix UI, или команду Generate Handler, доступную на верхней панели контроллера экрана и через меню CodeGenerate (Alt+Insert / Cmd+N).

Имя

Описание

CellFocusEvent

com.vaadin.flow.component.grid.CellFocusEvent срабатывает при фокусировке ячейки таблицы. Соответствует DOM-событию grid-cell-focus.

CollapseEvent

Срабатывает при свёртывании группы.

ColumnReorderEvent

com.vaadin.flow.component.grid.ColumnReorderEvent срабатывает при изменении порядка колонок таблицы. Соответствует DOM-событию column-reorder-all-columns.

ColumnResizeEvent

com.vaadin.flow.component.grid.ColumnResizeEvent срабатывает при изменении пользователем ширины колонки. Соответствует DOM-событию column-drag-resize.

ExpandEvent

Срабатывает при развёртывании группы.

GridDragEndEvent

com.vaadin.flow.component.grid.dnd.GridDragEndEvent — событие завершения перетаскивания строк dataGrid. Соответствует DOM-событию grid-dragend.

GridDragStartEvent

com.vaadin.flow.component.grid.dnd.GridDragStartEvent — событие начала перетаскивания строк dataGrid. Соответствует DOM-событию grid-dragstart.

GridDropEvent

com.vaadin.flow.component.grid.dnd.GridDropEvent — событие сброса, происходящее в таблице данных или её строках. Соответствует DOM-событию grid-drop.

GroupItemClickEvent

Срабатывает при щелчке по строке, соответствующей элементу группы.

GroupItemDoubleClickEvent

Срабатывает при двойном щелчке по строке, соответствующей элементу группы.

GroupingChangedEvent

Срабатывает при изменении группировки — добавлении или удалении колонок.

ItemClickEvent

com.vaadin.flow.component.grid.ItemClickEvent срабатывает при щелчке по элементу таблицы. Соответствует DOM-событию item-click.

ItemDoubleClickEvent

com.vaadin.flow.component.grid.ItemDoubleClickEvent срабатывает при двойном щелчке по элементу таблицы. Соответствует DOM-событию item-double-click.

SelectionEvent

Событие выбора, унифицирующее доступ к событию выбора для компонентов с множественным и одиночным выбором (в том числе когда требуется только один выбранный элемент).

SortEvent

com.vaadin.flow.data.event.SortEvent — событие, описывающее изменение сортировки в DataProvider. Отправляется реализациями SortNotifier.

dataGenerator

Добавляет генератор данных для таблицы. Если генератор уже добавлен, ничего не делает. См. интерфейс com.vaadin.flow.data.provider.HasDataGenerators.

dragFilter

Позволяет определить, какие строки можно перетаскивать, вместо включения этой возможности для всех строк с помощью rowsDraggable.

dropFilter

Позволяет определить, какие строки являются допустимыми целями для сброса.

enterPressHandler

Обрабатывает событие нажатия пользователем клавиши Enter.

groupPartNameGenerator

Генерирует части имён CSS-классов для элементов группы на основе заданных условий. Позволяет настраивать внешний вид элементов группы.

groupTooltipGenerator

Создаёт всплывающую подсказку для группы на основе заданных условий.

itemSelectableProvider

Задаёт предикат для проверки, может ли пользователь выбрать или снять выбор с конкретного элемента таблицы. Предикат получает экземпляр элемента и должен возвращать true, если пользователь может изменить состояние выбора этого элемента, и false в противном случае.

partNameGenerator

Генерирует части имён CSS-классов для ячеек на основе заданных условий. Позволяет настраивать внешний вид ячеек в зависимости от отображаемых данных.

tooltipGenerator

Создаёт всплывающую подсказку для ячейки колонки на основе заданных условий. См. интерактивный пример.

Элементы

Чтобы добавить элемент к выбранному компоненту, нажмите кнопку Add в панели инспектора Jmix UI.

groupBy

Элемент groupBy содержит один или несколько элементов columnRef, определяющих, по каким колонкам выполняется группировка.

columnRef

Элемент columnRef определяет колонку, используемую для группировки.

columns

Элемент columns содержит отдельные элементы column и задаёт набор атрибутов, общих для этих колонок.

column

Элемент column описывает отдельную колонку. Атрибуты, заданные для конкретной column, имеют приоритет над атрибутами, заданными для columns.

groupColumn

Элемент groupColumn описывает колонку, используемую для группировки, и её относительное положение среди других колонок. Атрибут key является обязательным.