multiFilter method

Iterable<T> multiFilter(
  1. List<Field<T>> fields
)

Implementation

Iterable<T> multiFilter(List<Field<T>> fields) {
  var filteredFields = fields.where((element) => element.filter!.isSet).toList();

  if (filteredFields.length == 0) //
    return this;

  var list = this.where((item) {
    var result = true;

    for (var i = 0; i < filteredFields.length; ++i) {
      var filteredField = filteredFields[i];

      var value = filteredField.fieldDefForSortFilter == null //
          ? filteredField.fieldDefinition(item)
          : filteredField.fieldDefForSortFilter!(item);

      var filter = filteredField.filter!;

      //can't filter for nulls
      if (value == null) {
        result = false;
      } else {
        if (filter is FilterFieldString && value is String && filter.isSet) {
          var _value = removeDiacritics(value);
          var searchText = removeDiacritics(filter.searchText!);

          if (searchText.trim() != "") {
            if (filter.stringFilterType == eStringFilterType.equals) {
              result = _value.toLowerCase() == searchText.toLowerCase() && result;
            } else if (filter.stringFilterType == eStringFilterType.contains) {
              result = _value.toLowerCase().contains(searchText.toLowerCase()) && result;
            } else if (filter.stringFilterType == eStringFilterType.startsWith) {
              result = _value.toLowerCase().startsWith(searchText.toLowerCase()) && result;
              // print("'${_value.toLowerCase()}' '${searchText.toLowerCase()}' $result");
            } else if (filter.stringFilterType == eStringFilterType.endsWith) {
              result = _value.toLowerCase().endsWith(searchText.toLowerCase()) && result;
            } else {
              throw Exception("unexpected eStringFilterType");
            }
          }
        }

        if (filter is FilterFieldNum && value is num && filter.isSet) {
          if (filter.numFilterType == eNumFilterType.equals) {
            result = filter.filter1 == null || value == filter.filter1 && result;
          } else if (filter.numFilterType == eNumFilterType.contains) {
            result = filter.filter1 == null || value.toString().toLowerCase().contains(filter.filter1.toString().toLowerCase()) && result;
          } else if (filter.numFilterType == eNumFilterType.gt) {
            result = filter.filter1 == null || value > filter.filter1! && result;
          } else if (filter.numFilterType == eNumFilterType.lt) {
            result = filter.filter1 == null || value < filter.filter1! && result;
          } else if (filter.numFilterType == eNumFilterType.between) {
            var from = filter.filter1 ?? -2e53;
            var to = filter.filter2 ?? 2e53;
            result = (value >= from && value <= to) && result;
          } else {
            throw Exception("unexpected eStringFilterType");
          }
        }
      }
    }

    return result;
  }).toList();

  return list;
}