eherve / mongoose-datatable

Server side dataTable request support for mongoose
MIT License
42 stars 29 forks source link

Default Boolean handler not works for false value #44

Closed frankisans closed 5 years ago

frankisans commented 8 years ago

Hi @eherve, The default booleanHandler returns false when filtering for 'false' value so the conditions field is undefined, maybe because no conditions is added:

// Default boolean handler
function(field, search) {
  var value;
  search.forEach(function(chunk) {
    if (/^true$/i.test(chunk)) {
      value = true;
    } else if (/^false$/i.test(chunk)) {
      value = value || false;
    }
  });
  return value == undefined ? undefined : value;
}

// addConditions in searchCriteria
function addConditions(searchCriteria, field, conjunctions, disjunctions) {
  var condition = ConditionBuilder.getGeneralSearch(field,
      searchCriteria.search, searchCriteria.options);
  if (condition) {
    var element = {};
    element[field.path] = condition;
    disjunctions.push(element);
  }
  condition = ConditionBuilder.getFieldSearch(field, searchCriteria.options);
  if (condition) {
    var element = {};
    element[field.path] = condition;
    conjunctions.push(element);
    if (field.arrayPath) addAggregate(searchCriteria, field, condition);
  }
}

I have overwrite the default boolean handler with my own version and works right. Just changed the last line to return {$in: [value]}

  options.handlers = {
    Boolean: function (field, search) {
      var value;
      search.forEach(function (chunk) {
        if (/^true$/i.test(chunk)) {
          value = true;
        } else if (/^false$/i.test(chunk)) {
          value = value || false;
        }
      });
      return value == undefined ? undefined : {$in: [value]};
    }
  };

Also if we want consider 'false' as 'not true' we can use this other version:

  options.handlers = {
    Boolean: function (field, search) {
      var value;
      search.forEach(function (chunk) {
        if (/^true$/i.test(chunk)) {
          value = true;
        } else if (/^false$/i.test(chunk)) {
          value = value || false;
        }
      });
      return value == undefined ? undefined : {$in: value ? [value] : [null, value]};
    }
  };

What do you think to include one of the proposed boolean handlers as the default?

eherve commented 5 years ago

The plugin in version 2.0.0 rewrite the handler