ui-grid-core 0.1.7

Rust engine for ui-grid
Documentation
use crate::{
    constants::SortDirection,
    models::{GridColumnDef, GridOptions, GridRow, SortState},
    row_sorter::{compare_values, guess_sort_kind},
    utils::get_cell_value,
};

pub fn sort_grid_rows(
    rows: &[GridRow],
    columns: &[GridColumnDef],
    options: &GridOptions,
    sort_state: &SortState,
) -> Vec<GridRow> {
    if !options.enable_sorting || sort_state.direction == SortDirection::None {
        return rows.to_vec();
    }

    let Some(column_name) = &sort_state.column_name else {
        return rows.to_vec();
    };

    let Some(column) = columns
        .iter()
        .find(|column| column.name == *column_name && column.sortable && column.enable_sorting)
    else {
        return rows.to_vec();
    };

    let kind = guess_sort_kind(
        column,
        &rows
            .iter()
            .map(|row| row.entity.clone())
            .collect::<Vec<_>>(),
    );
    let mut sorted = rows.to_vec();
    sorted.sort_by(|left, right| {
        let left_value = get_cell_value(&left.entity, column);
        let right_value = get_cell_value(&right.entity, column);
        let ordering = compare_values(kind, &left_value, &right_value);
        if sort_state.direction == SortDirection::Desc {
            ordering.reverse()
        } else {
            ordering
        }
    });
    sorted
}