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}