Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 18 additions & 1 deletion modules/presets/collection.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ export function presetCollection(collection) {
return index === 0;
}

function presetInSearchTerm(presetText) {
if (presetText.length === 0) {
return false;
}
const index = value.indexOf(presetText.toLowerCase().trim());
return index === 0 || value[index - 1] === ' ';
}

function sortPresets(nameProp, aliasesProp) {
return function sortNames(a, b) {
let aCompare = a[nameProp]();
Expand Down Expand Up @@ -168,6 +176,13 @@ export function presetCollection(collection) {
Object.keys(a.tags).some(key => leading(key + '=' + a.tags[key]))));
}

// also match cases where preset string is inside searched term
const presetsInValues = searchable
.filter(a => ([a.searchName()].concat(a.searchAliases(), a.terms(), a.searchNameStripped(), a.searchAliasesStripped())).some(presetInSearchTerm));

const presetsInValuesViaSuggested = suggestions
.filter(a => ([a.searchName()].concat(a.searchAliases(), a.terms(), a.searchNameStripped(), a.searchAliasesStripped())).some(presetInSearchTerm));

let results = leadingNames.concat(
leadingSuggestions,
leadingNamesStripped,
Expand All @@ -178,7 +193,9 @@ export function presetCollection(collection) {
similarName,
similarSuggestions,
similarTerms,
leadingTagKeyValues
leadingTagKeyValues,
presetsInValues,
presetsInValuesViaSuggested
).slice(0, MAXRESULTS - 1);

if (geometry) {
Expand Down
10 changes: 10 additions & 0 deletions test/spec/presets/collection.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,5 +136,15 @@ describe('iD.presetCollection', function() {
var result = c.search('landuse=grass', 'area').collection;
expect(result.indexOf(p.grass1)).to.eql(0); // 1. 'Grass' (by tag key=value)
});

it('returns matches also when search term has a long unexpected prefix', function() {
var result = c.search('private grill', 'point').matchGeometry('point').collection;
expect(result.indexOf(p.grill), 'Grill').to.eql(0);
});

it('returns matches also when search term has a very long unexpected prefix', function() {
var result = c.search('very private and secret mysterious grill', 'point').matchGeometry('point').collection;
expect(result.indexOf(p.grill), 'Grill').to.eql(0);
});
});
});