From d1428f68f0b7c84910d1262cf9ce9413bd4b3141 Mon Sep 17 00:00:00 2001 From: Stephane Bisson Date: Tue, 31 Jan 2017 10:41:23 -0500 Subject: [PATCH] Expand RC filters search to include desc and group title Bug: T156215 Change-Id: Ieb1c30d8403fcdf2e4d236211affdbb6199f84f6 --- .../dm/mw.rcfilters.dm.FiltersViewModel.js | 27 ++++++- .../dm.FiltersViewModel.test.js | 81 +++++++++++-------- 2 files changed, 70 insertions(+), 38 deletions(-) diff --git a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js index d1b7925c02..3c4ed4b9d1 100644 --- a/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js +++ b/resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js @@ -583,23 +583,42 @@ /** * Find items whose labels match the given string * - * @param {string} str Search string + * @param {string} query Search string * @return {Object} An object of items to show * arranged by their group names */ - mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( str ) { + mw.rcfilters.dm.FiltersViewModel.prototype.findMatches = function ( query ) { var i, + groupTitle, result = {}, items = this.getItems(); // Normalize so we can search strings regardless of case - str = str.toLowerCase(); + query = query.toLowerCase(); + + // item label starting with the query string for ( i = 0; i < items.length; i++ ) { - if ( items[ i ].getLabel().toLowerCase().indexOf( str ) > -1 ) { + if ( items[ i ].getLabel().toLowerCase().indexOf( query ) === 0 ) { result[ items[ i ].getGroup() ] = result[ items[ i ].getGroup() ] || []; result[ items[ i ].getGroup() ].push( items[ i ] ); } } + + if ( $.isEmptyObject( result ) ) { + // item containing the query string in their label, description, or group title + for ( i = 0; i < items.length; i++ ) { + groupTitle = this.getGroup( items[ i ].getGroup() ).getTitle(); + if ( + items[ i ].getLabel().toLowerCase().indexOf( query ) > -1 || + items[ i ].getDescription().toLowerCase().indexOf( query ) > -1 || + groupTitle.toLowerCase().indexOf( query ) > -1 + ) { + result[ items[ i ].getGroup() ] = result[ items[ i ].getGroup() ] || []; + result[ items[ i ].getGroup() ].push( items[ i ] ); + } + } + } + return result; }; diff --git a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js index 62d247aeba..998817d792 100644 --- a/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js +++ b/tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js @@ -102,7 +102,7 @@ var matches, definition = { group1: { - title: 'Group 1', + title: 'Group 1 title', type: 'send_unselected_if_any', filters: [ { @@ -118,7 +118,7 @@ ] }, group2: { - title: 'Group 2', + title: 'Group 2 title', type: 'send_unselected_if_any', filters: [ { @@ -128,46 +128,59 @@ }, { name: 'group2filter2', - label: 'Group 2: Filter 2', + label: 'xGroup 2: Filter 2', description: 'Description of Filter 2 in Group 2' } ] } }, - model = new mw.rcfilters.dm.FiltersViewModel(); + testCases = [ + { + query: 'group', + expectedMatches: { + group1: [ 'group1filter1', 'group1filter2' ], + group2: [ 'group2filter1' ] + }, + reason: 'Finds filters starting with the query string' + }, + { + query: 'filter 2 in group', + expectedMatches: { + group1: [ 'group1filter2' ], + group2: [ 'group2filter2' ] + }, + reason: 'Finds filters containing the query string in their description' + }, + { + query: 'title', + expectedMatches: { + group1: [ 'group1filter1', 'group1filter2' ], + group2: [ 'group2filter1', 'group2filter2' ] + }, + reason: 'Finds filters containing the query string in their group title' + } + ], + model = new mw.rcfilters.dm.FiltersViewModel(), + extractNames = function ( matches ) { + var result = {}; + Object.keys( matches ).forEach( function ( groupName ) { + result[ groupName ] = matches[ groupName ].map( function ( item ) { + return item.getName(); + } ); + } ); + return result; + }; model.initializeFilters( definition ); - matches = model.findMatches( 'group 1' ); - assert.equal( - matches.group1.length, - 2, - 'findMatches finds correct group with correct number of results' - ); - - assert.deepEqual( - matches.group1.map( function ( item ) { return item.getName(); } ), - [ 'group1filter1', 'group1filter2' ], - 'findMatches finds the correct items within a single group' - ); - - matches = model.findMatches( 'filter 1' ); - assert.ok( - matches.group1.length === 1 && matches.group2.length === 1, - 'findMatches finds correct number of results in multiple groups' - ); - - assert.deepEqual( - [ - matches.group1.map( function ( item ) { return item.getName(); } ), - matches.group2.map( function ( item ) { return item.getName(); } ) - ], - [ - [ 'group1filter1' ], - [ 'group2filter1' ] - ], - 'findMatches finds the correct items within multiple groups' - ); + testCases.forEach( function ( testCase ) { + matches = model.findMatches( testCase.query ); + assert.deepEqual( + extractNames( matches ), + testCase.expectedMatches, + testCase.reason + ); + } ); matches = model.findMatches( 'foo' ); assert.ok( -- 2.20.1