Bläddra i källkod

[search] Backend for marker map filtering

Romain Rigaux 10 år sedan
förälder
incheckning
66755df209

+ 27 - 1
apps/search/src/search/static/search/js/search.ko.js

@@ -211,7 +211,7 @@ var Query = function (vm, query) {
       }
     }
 
-    if (vm.selectedQDefinition() != null){
+    if (vm.selectedQDefinition() != null) {
       vm.selectedQDefinition().hasChanged(true);
     }
 
@@ -282,6 +282,32 @@ var Query = function (vm, query) {
     }
   };
 
+  self.selectMapRegionFacet = function (data) {
+    self.removeFilter(ko.mapping.fromJS({'id': data.widget_id, 'dontZoomOut': true}));
+
+    console.log(ko.mapping.toJSON(data));
+    
+      self.fqs.push(ko.mapping.fromJS({
+          'id': data.widget_id,
+          'field': data.lat,
+          'lat': data.lat,
+          'lon': data.lon,
+          'filter': [{'exclude': false, 'value': data.bounds}],
+          'type': 'map',
+          'properties': {
+              'lat_sw': data.bounds._southWest.lat, 'lon_sw': data.bounds._southWest.lng,
+              'lat_ne': data.bounds._northEast.lat, 'lon_ne': data.bounds._northEast.lng
+          }
+      }));
+
+    if (vm.selectedQDefinition() != null) {
+      vm.selectedQDefinition().hasChanged(true);
+    }
+
+    self.start(0);
+    vm.search();
+  };
+  
   function getFilterByField(field) {
     var _fq = null;
     $.each(self.fqs(), function (index, fq) {

+ 28 - 1
apps/search/src/search/templates/search.mako

@@ -1443,6 +1443,33 @@ ${ dashboard.layout_skeleton() }
       </div>
     </div>
     <!-- /ko -->
+
+    <!-- ko if: $data.type() == 'map' -->
+    <div class="filter-box">
+      <div class="title">
+        <a href="javascript:void(0)" class="pull-right" data-bind="click: function(){ chartsUpdatingState(); $root.query.removeFilter($data); $root.search() }">
+          <i class="fa fa-times"></i>
+        </a>
+        <span data-bind="text: $data.lat"></span>, <span data-bind="text: $data.lon"></span>
+        &nbsp;
+      </div>
+      <div class="content">
+        <strong>${_('selected')}</strong>
+        <span class="label label-info">
+          [
+          <span class="label label-info" style="margin-left: 4px" data-bind="text: $data.properties.lat_sw, attr: {'title': '${ _('Latitude South West') }'"></span>
+          <span class="label label-info" style="margin-left: 4px" data-bind="text: $data.properties.lon_sw, attr: {'title': '${ _('Longitude South West') }'"></span>
+          ]
+          ${ _("TO") } 
+          [
+          <span class="label label-info" style="margin-left: 4px" data-bind="text: $data.properties.lat_ne, attr: {'title': '${ _('Latitude North East') }'"></span>
+          <span class="label label-info" style="margin-left: 4px" data-bind="text: $data.properties.lon_ne, attr: {'title': '${ _('Longitude North East') }'"></span>
+          ]
+        </span>
+      </div>
+    </div>
+    <!-- /ko -->    
+    
   </div>
   <div class="clearfix"></div>
   <div class="widget-spinner" data-bind="visible: isLoading() &&  $root.query.fqs().length > 0">
@@ -1543,7 +1570,7 @@ ${ dashboard.layout_skeleton() }
 
     <div data-bind="leafletMapChart: {showMoveCheckbox: true, moveCheckboxLabel: '${ _('Search as I move the map') }', visible: $root.hasRetrievedResults() && $root.collection.template.leafletmapOn(), isLoading: isLoading(), datum: {counts: $root.response()},
       transformer: leafletMapChartDataTransformer,
-      onRegionChange: function(bounds){ alert(ko.toJSON(bounds, null, 2)); alert(getSolrURL(bounds)) },
+      onRegionChange: function(bounds){ $root.query.selectMapRegionFacet({widget_id: id(), 'bounds': ko.toJS(bounds, null, 2), lat: $root.collection.template.leafletmap.latitudeField(), lon: $root.collection.template.leafletmap.longitudeField()}); console.log(getSolrURL(bounds)) },
       onComplete: function(){ var widget = viewModel.getWidgetById(id()); if (widget != null) { widget.isLoading(false)}; } }">
     </div>
   </div>

+ 6 - 0
desktop/libs/libsolr/src/libsolr/api.py

@@ -225,6 +225,12 @@ class SolrApi(object):
         params += (('fq', '{!tag=%(id)s}' % fq + ' '.join([urllib.unquote(
                     utf_quoter('%s%s:[%s TO %s}' % ('-' if field['exclude'] else '', fq['field'], f['from'] if fq['is_up'] else '*', '*' if fq['is_up'] else f['from'])))
                                                           for field, f in zip(fq['filter'], fq['properties'])])),)
+      elif fq['type'] == 'map':
+        _keys = fq.copy()
+        _keys.update(fq['properties'])
+        params += (('fq', '{!tag=%(id)s}' % fq + urllib.unquote(
+                    utf_quoter('%(lat)s:[%(lat_sw)s TO %(lat_ne)s} %(lon)s:[%(lon_sw)s TO %(lon_ne)s}' % _keys))),)
+
     return params
 
   def query(self, collection, query):