[missions] implemented search

This commit is contained in:
fkloft 2015-05-16 15:56:17 +02:00
parent c19106fd34
commit 5f79a56450
2 changed files with 76 additions and 0 deletions

View File

@ -160,3 +160,11 @@
width: 18px;
}
.plugin-mission-search-result-desc {
display: block;
max-height: 2em;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}

View File

@ -883,6 +883,72 @@ window.plugin.missions = {
}
},
onSearch: function(query) {
var self = this;
if(query.confirmed) {
this.loadMissionsInBounds(window.map.getBounds(), function(missions) {
self.addMissionsToQuery(query, missions);
});
}
var cachedMissions = Object.keys(this.cacheByMissionGuid).map(function(guid) {
return self.cacheByMissionGuid[guid].data;
});
self.addMissionsToQuery(query, cachedMissions);
},
addMissionsToQuery: function(query, missions) {
var term = query.term.toLowerCase();
missions.forEach(function(mission) {
if(mission.title.toLowerCase().indexOf(term) === -1
&& ((!mission.description) || mission.description.toLowerCase().indexOf(term) === -1)) {
return;
}
if(query.results.some(function(result) { return result.mission && (result.mission.guid == mission.guid); }))
// mission already in list (a cached mission may be found again via missions in bounds)
return;
var result = {
title: escapeHtmlSpecialChars(mission.title),
description: mission.description
? 'Recently viewed mission: <small class="plugin-mission-search-result-desc">' + escapeHtmlSpecialChars(mission.description) + '</small>'
: 'Mission in view',
icon: 'https://commondatastorage.googleapis.com/ingress.com/img/tm_icons/tm_cyan.png',
onSelected: this.onSearchResultSelected.bind(this),
mission: mission,
layer: null, // prevent a preview, we'll handle this
};
// mission may be a cached mission or contain the full details
if(mission.waypoints) {
var latlngs = mission.waypoints.filter(function(waypoint) {
return !!waypoint.portal;
}).map(function(waypoint) {
return [waypoint.portal.latE6/1E6, waypoint.portal.lngE6/1E6];
});
result.bounds = L.latLngBounds(latlngs)
}
if(mission.typeNum) {
result.icon = this.missionTypeImages[mission.typeNum] || this.missionTypeImages[0];
}
query.addResult(result);
}.bind(this));
},
onSearchResultSelected: function(result, event) {
if(result.bounds) {
map.fitBounds(result.bounds, {maxZoom: 17});
}
this.openMission(result.mission.guid);
return false;
},
setup: function() {
this.cacheByPortalGuid = {};
this.cacheByMissionGuid = {};
@ -923,6 +989,8 @@ window.plugin.missions = {
// window.addPortalHighlighter('Mission start point', this.highlight.bind(this));
window.addHook('portalSelected', this.onPortalSelected.bind(this));
window.addHook('search', this.onSearch.bind(this));
/*
I know iitc has portalAdded event but it is missing portalDeleted. So we have to resort to Object.observe
*/