multisort method

Iterable<T> multisort(
  1. List<Field<T>> sortedFields
)

Implementation

Iterable<T> multisort(List<Field<T>> sortedFields) {
  if (sortedFields.length == 0) //
    return this;

  int compare(fn_fieldDef<T> fieldDef, SortField sort, T a, T b) {
    var valueA = fieldDef(a);
    var valueB = fieldDef(b);

    if (valueA == null && valueB == null) //
      return 0;

    if (valueA == null) //
      return 1;

    if (valueB == null) //
      return -1;

    int result;
    if (valueA is String && valueB is String) {
      var valA = removeDiacritics(valueA);
      var valB = removeDiacritics(valueB);
      result = valA.toUpperCase().compareTo(valB.toUpperCase());
    } else //
      result = valueA.compareTo(valueB);

    if (!sort.isAscending) //
      return result * -1;

    return result;
  }

  int sortall(T a, T b) {
    int i = 0;
    int? result;

    var sortedFields2 = sortedFields.where((element) => element.sort != null).toList();

    while (i < sortedFields2.length) {
      var field = sortedFields2[i];

      result = compare(field.fieldDefinition, field.sort!, a, b);

      if (result != 0) //
        break;
      i++;
    }
    return result ?? 0;
  }

  final list = this.toList();

  list.sort((a, b) => sortall(a, b));

  return list;
}