跳到正文

DataGrid

本页译自英文。 阅读英文页面

DataGrid 显示来自 action 的行,该 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 105Piece₺83.6937
S-0002Coffee beans 110Liter₺162.8874
S-0003Olive oil 115Kg₺242.07111
S-0004Honey 120Piece₺321.2628
S-0005Hazelnuts 125Liter₺400.4565
S-0006Dried apricots 130Kg₺479.64102
S-0007Cheese 135Piece₺558.8319
S-0008Bulgur 140Liter₺638.0256
平均值 ₺1,212.16求和 7,140

点击表头排序,在筛选框中输入内容进行筛选,拖动表头可移动列,拖动其边缘可调整列宽。合计涵盖所有经过筛选的行,而不仅是当前页。

action

#[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::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)使单元格成为运行某个 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>):危险、警告或成功样式的行。
  • .exportable():将筛选后的行导出为 CSV,由服务器以流方式输出。

DataGrid 参考涵盖了已保存的视图、主从明细、分组、树形数据、就地编辑、单元格导航、复制和粘贴、列虚拟化以及无障碍。