Эта страница переведена с английского. Читать страницу на английском
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,
})| Code | Name | Unit | Price | Stock | Active |
|---|---|---|---|---|---|
| S-0001 | Green tea 105 | Piece | 83,69 ₺ | 37 | |
| S-0002 | Coffee beans 110 | Liter | 162,88 ₺ | 74 | |
| S-0003 | Olive oil 115 | Kg | 242,07 ₺ | 111 | |
| S-0004 | Honey 120 | Piece | 321,26 ₺ | 28 | |
| S-0005 | Hazelnuts 125 | Liter | 400,45 ₺ | 65 | |
| S-0006 | Dried apricots 130 | Kg | 479,64 ₺ | 102 | |
| S-0007 | Cheese 135 | Piece | 558,83 ₺ | 19 | |
| S-0008 | Bulgur 140 | Liter | 638,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, группировку, древовидные данные, редактирование на месте, навигацию по ячейкам, копирование и вставку, виртуализацию колонок и доступность.