Компонент 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

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

Чтобы запретить пользователям группировку по определённому столбцу, установите его свойству 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().

Настраиваемый столбец группировки

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

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")));

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

Атрибуты

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

Название

Описание

Значение по умолчанию

aggregatable

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

false

columnReorderingAllowed

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

false

emptyStateText

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

selectionMode

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

SINGLE

aggregationPosition

Определяет положение строки с агрегированными данными. Допустимые значения: TOP (вверху) или BOTTOM (внизу). Подробнее смотрите раздел Агрегация данных.

BOTTOM

allRowsVisible

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

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

columnRendering

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

EAGER

detailsVisibleOnClick

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

true

dropMode

Определяет, в каких строках возможно выполнение операции перетаскивания (drop). Допустимые значения: 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

Обработчики

В Jmix существует множество общих обработчиков, которые настраиваются одинаково для всех компонентов. Ниже перечислены обработчики, общие с 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 - событие окончания перетаскивания строк в таблице данных. Соответствует событию DOM grid-dragend.

GridDragStartEvent

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

GridDropEvent

com.vaadin.flow.component.grid.dnd.GridDropEvent - представляет событие перетаскивания (drop), которое возникает на самой таблице данных или на её строках. Соответствует событию 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

Позволяет задавать, какие именно строки могут быть целями для операции перетаскивания (drop targets).

enterPressHandler

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

groupPartNameGenerator

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

groupTooltipGenerator

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

itemSelectableProvider

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

partNameGenerator

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

tooltipGenerator

Функция создает всплывающие подсказки (tooltip) для ячеек столбца на основе заданных условий. Смотрите рабочий пример в живой демонстрации.

Элементы

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

groupBy

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

columnRef

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

columns

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

column

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

groupColumn

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