Skip to main content

ui_grid_core/
sorting.rs

1use crate::{
2    constants::SortDirection,
3    models::{GridColumnDef, GridOptions, GridRow, SortState},
4    row_sorter::{compare_values, guess_sort_kind},
5    utils::get_cell_value,
6};
7
8pub fn sort_grid_rows(
9    rows: &[GridRow],
10    columns: &[GridColumnDef],
11    options: &GridOptions,
12    sort_state: &SortState,
13) -> Vec<GridRow> {
14    if !options.enable_sorting || sort_state.direction == SortDirection::None {
15        return rows.to_vec();
16    }
17
18    let Some(column_name) = &sort_state.column_name else {
19        return rows.to_vec();
20    };
21
22    let Some(column) = columns
23        .iter()
24        .find(|column| column.name == *column_name && column.sortable && column.enable_sorting)
25    else {
26        return rows.to_vec();
27    };
28
29    let kind = guess_sort_kind(
30        column,
31        &rows
32            .iter()
33            .map(|row| row.entity.clone())
34            .collect::<Vec<_>>(),
35    );
36    let mut sorted = rows.to_vec();
37    sorted.sort_by(|left, right| {
38        let left_value = get_cell_value(&left.entity, column);
39        let right_value = get_cell_value(&right.entity, column);
40        let ordering = compare_values(kind, &left_value, &right_value);
41        if sort_state.direction == SortDirection::Desc {
42            ordering.reverse()
43        } else {
44            ordering
45        }
46    });
47    sorted
48}