Перейти к содержимому

DataGrid

Эта страница переведена с английского. Читать страницу на английском

DataGrid показывает строки из действия (action), которое принимает DataQuery и возвращает Page<E>. Разбиение на страницы, сортировка, фильтры и итоги выполняются на сервере, поэтому таблица на миллион строк стоит браузеру столько же, сколько таблица на сто.

Таблица

DataGrid::of(search_samples)
    .paging(Paging::pages(8))
    .column(Sample::code).width(110).filter()
    .column(Sample::name).flex(1).filter()
    .column(Sample::unit).width(120).filter().badge(|u| match u {
        Unit::Piece => Tone::Neutral,
        Unit::Kg => Tone::Info,
        Unit::Liter => Tone::Brand,
    })
    .column(Sample::price).width(150).avg()
    .column(Sample::stock).width(150).sum().progress(120)
    .column(Sample::active).width(100).check_icon()
    .row_style(|s| match s.stock {
        0 => Some(RowStyle::Danger),
        1..=9 => Some(RowStyle::Warning),
        _ => None,
    })
CodeNameUnitPriceStockActive
S-0001Green tea 105Piece83,69 ₺37
S-0002Coffee beans 110Liter162,88 ₺74
S-0003Olive oil 115Kg242,07 ₺111
S-0004Honey 120Piece321,26 ₺28
S-0005Hazelnuts 125Liter400,45 ₺65
S-0006Dried apricots 130Kg479,64 ₺102
S-0007Cheese 135Piece558,83 ₺19
S-0008Bulgur 140Liter638,02 ₺56
Среднее 1 212,16 ₺Сумма 7 140

Сортируйте щелчком по заголовку, вводите текст в поле фильтра, перетаскивайте заголовок, чтобы переместить колонку, или её край, чтобы изменить размер. Итоги охватывают все отфильтрованные строки, а не только страницу.

Действие

#[action(permission = "stock.product.read")]
pub async fn search_samples(q: DataQuery, store: SampleStore) -> Result<Page<Sample>> {
    Ok(q.apply(store.all()?))
}

DataQuery::apply фильтрует, сортирует, считает итоги и разбивает на страницы Vec в памяти, что подходит для небольших списков и тестов. Хранилище на базе базы данных читает тот же DataQuery (страница, сортировка, фильтры, итоги) и отвечает с помощью SQL; см. Данные и базы данных.

Разбиение на страницы

PagingПрименение
Paging::pages(n)Нумерованные страницы, по умолчанию 50 строк
Paging::infinite(n)Подгружает строки при прокрутке
Paging::virtual_scroll()Очень большие списки; на странице только видимые строки
Paging::none()Короткие списки, умещающиеся на одной странице

Сервер ограничивает размер страницы, что бы ни просил клиент.

Колонки

ВызовРезультат
.width(px), .flex(n)Фиксированная ширина или доля свободной ширины
.filter()Поле фильтра, подходящее типу: текст, диапазон чисел, диапазон дат, список выбора
.sum(), .avg(), .min(), .max()Итоги в нижней строке. sum для текстовой колонки не компилируется
.badge(|v| tone)Показывает значение как цветной бейдж
.progress(max)Полоса от 0 до max
.check_icon()Галочка для true
.link(|row| effect)Делает ячейку ссылкой, запускающей эффект
.pin_start(), .hidden()Закреплена в начале или скрыта, пока пользователь её не покажет
.editable()Редактируется на месте, сохраняется через .edit_with(action)

Строки

  • .on_open(|row| effect): двойной щелчок или Enter на строке.
  • .row_action(label, action, |row| input): кнопка на каждой строке.
  • .bulk_action(label, action, M::id): выполняется над выбранными строками.
  • .row_menu(|row| ContextMenu): контекстное меню строки по правому щелчку.
  • .row_style(|row| Option<RowStyle>): строки danger, warning или success.
  • .exportable(): экспорт отфильтрованных строк в CSV, потоком с сервера.

Справочник DataGrid охватывает сохранённые представления, master detail, группировку, древовидные данные, редактирование на месте, навигацию по ячейкам, копирование и вставку, виртуализацию колонок и доступность.