module InputTable.Updates.SortRows exposing (run) import InputTable.Model exposing (..) run : { rows : List (Row rowData), sorting : Sorting } -> { id : String, subType : ColumnSubType rowData, hasNumericalValues : Bool } -> { rows : List (Row rowData), sorting : Sorting } run { rows, sorting } { id, subType, hasNumericalValues } = let ( newRows, newSorting ) = case subType of DisplayColumn subType -> sortComparable (Maybe.withDefault subType.get subType.getSortVal) LinkColumn subType -> sortComparable subType.get TextColumn subType -> sortComparable subType.get DropdownColumn subType -> sortComparable subType.get MenuDropdownColumn subType -> sortComparable subType.get SubDropdownColumn subType -> sortComparable (subType.get >> convertSubDropdownToString) CheckboxColumn subType -> sortComparable (subType.get >> converBoolToString) SideBarButtonColumn subType -> sortComparable subType.get convertSubDropdownToString ( choice, subChoice ) = choice ++ (Maybe.withDefault "" subChoice) converBoolToString bool = if bool then "1" else "0" sortComparable get = let applySorting = sortByVal hasNumericalValues rows get in case sorting of Asc currentSortId -> if currentSortId == id then ( applySorting False, Desc id ) else ( applySorting True, Asc id ) _ -> ( applySorting True, Asc id ) in { rows = newRows, sorting = newSorting } sortByVal : Bool -> List (Row rowData) -> (rowData -> String) -> Bool -> List (Row rowData) sortByVal hasNumericalValues rows getVal ascending = let comparator row1 row2 = let getInt = getVal >> String.toFloat >> Result.withDefault 0 comparisonResult = if hasNumericalValues then compare (getInt row1.data) (getInt row2.data) else compare (getVal row1.data) (getVal row2.data) in case comparisonResult of LT -> LT GT -> GT EQ -> (compare row1.id row2.id) in if ascending then List.sortWith comparator rows else rows |> List.sortWith comparator |> List.reverse