|  | @@ -155,6 +155,39 @@ class DateFilter {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class StringFilter {
 | 
	
		
			
				|  |  | +  constructor() {
 | 
	
		
			
				|  |  | +    this._dep = new Tracker.Dependency();
 | 
	
		
			
				|  |  | +    this.subField = ''; // Prevent name mangling in Filter
 | 
	
		
			
				|  |  | +    this._filter = '';
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  set(str) {
 | 
	
		
			
				|  |  | +    this._filter = str;
 | 
	
		
			
				|  |  | +    this._dep.changed();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  reset() {
 | 
	
		
			
				|  |  | +    this._filter = '';
 | 
	
		
			
				|  |  | +    this._dep.changed();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  _isActive() {
 | 
	
		
			
				|  |  | +    this._dep.depend();
 | 
	
		
			
				|  |  | +    return this._filter !== '';
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  _getMongoSelector() {
 | 
	
		
			
				|  |  | +    this._dep.depend();
 | 
	
		
			
				|  |  | +    return {$regex : this._filter, $options: 'i'};
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  _getEmptySelector() {
 | 
	
		
			
				|  |  | +    this._dep.depend();
 | 
	
		
			
				|  |  | +    return {$regex : this._filter, $options: 'i'};
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // Use a "set" filter for a field that is a set of documents uniquely
 | 
	
		
			
				|  |  |  // identified. For instance `{ labels: ['labelA', 'labelC', 'labelD'] }`.
 | 
	
		
			
				|  |  |  // use "subField" for searching inside object Fields.
 | 
	
	
		
			
				|  | @@ -611,9 +644,9 @@ Filter = {
 | 
	
		
			
				|  |  |    archive: new SetFilter(),
 | 
	
		
			
				|  |  |    hideEmpty: new SetFilter(),
 | 
	
		
			
				|  |  |    dueAt: new DateFilter(),
 | 
	
		
			
				|  |  | +  title: new StringFilter(),
 | 
	
		
			
				|  |  |    customFields: new SetFilter('_id'),
 | 
	
		
			
				|  |  |    advanced: new AdvancedFilter(),
 | 
	
		
			
				|  |  | -  lists: new AdvancedFilter(), // we need the ability to filter list by name as well
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    _fields: [
 | 
	
		
			
				|  |  |      'labelIds',
 | 
	
	
		
			
				|  | @@ -622,6 +655,7 @@ Filter = {
 | 
	
		
			
				|  |  |      'archive',
 | 
	
		
			
				|  |  |      'hideEmpty',
 | 
	
		
			
				|  |  |      'dueAt',
 | 
	
		
			
				|  |  | +    'title',
 | 
	
		
			
				|  |  |      'customFields',
 | 
	
		
			
				|  |  |    ],
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -636,8 +670,7 @@ Filter = {
 | 
	
		
			
				|  |  |        _.any(this._fields, fieldName => {
 | 
	
		
			
				|  |  |          return this[fieldName]._isActive();
 | 
	
		
			
				|  |  |        }) ||
 | 
	
		
			
				|  |  | -      this.advanced._isActive() ||
 | 
	
		
			
				|  |  | -      this.lists._isActive()
 | 
	
		
			
				|  |  | +      this.advanced._isActive()
 | 
	
		
			
				|  |  |      );
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -682,7 +715,7 @@ Filter = {
 | 
	
		
			
				|  |  |      if (includeEmptySelectors) selectors.push(emptySelector);
 | 
	
		
			
				|  |  |      if (this.advanced._isActive())
 | 
	
		
			
				|  |  |        selectors.push(this.advanced._getMongoSelector());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      return {
 | 
	
		
			
				|  |  |        $or: selectors,
 | 
	
		
			
				|  |  |      };
 | 
	
	
		
			
				|  | @@ -702,7 +735,6 @@ Filter = {
 | 
	
		
			
				|  |  |        const filter = this[fieldName];
 | 
	
		
			
				|  |  |        filter.reset();
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    this.lists.reset();
 | 
	
		
			
				|  |  |      this.advanced.reset();
 | 
	
		
			
				|  |  |      this.resetExceptions();
 | 
	
		
			
				|  |  |    },
 |