Bläddra i källkod

[search] Multi select range facets

Romain Rigaux 11 år sedan
förälder
incheckning
9de47ca
3 ändrade filer med 33 tillägg och 24 borttagningar
  1. 2 1
      apps/search/src/search/api.py
  2. 2 2
      apps/search/src/search/models.py
  3. 29 21
      apps/search/static/js/search.ko.js

+ 2 - 1
apps/search/src/search/api.py

@@ -219,11 +219,12 @@ class SolrApi(object):
       if fq['type'] == 'field':        
         params += (('fq', ' '.join([urllib.unquote(utf_quoter('{!tag=%s}{!field f=%s}%s' % (fq['field'], fq['field'], _filter))) for _filter in fq['filter']])),)
       elif fq['type'] == 'range':
+        
         # Set end range if last range
 #        if fq['filter'].get('to'):
 #          model_facet = [facet for facet in collection['facets'] if facet['id'] == fq['id']][0]           
 #          fq['filter']['to'] = model_facet['properties']['end'] if model_facet else '*'
-        params += (('fq', urllib.unquote(utf_quoter('{!tag=%s}%s:[%s TO %s}' % (fq['field'], fq['field'], fq['properties']['from'], fq['properties']['to'])))),)
+          params += (('fq', '{!tag=%s}' % fq['field'] + ' '.join([urllib.unquote(utf_quoter('%s:[%s TO %s}' % (fq['field'], f['from'], f['to']))) for f in fq['properties']])),)
 
     if collection['template']['fieldsSelected'] and collection['template']['isGridLayout']:
       fields = collection['template']['fieldsSelected'] + [collection['idField']] if collection['idField'] else []

+ 2 - 2
apps/search/src/search/models.py

@@ -478,7 +478,7 @@ def augment_solr_response2(response, collection, query):
     for element in a:
       next(to, None)
       to_value = next(to, end)
-      pairs.append({'field': cat, 'from': element, 'value': next(a), 'to': to_value, 'selected': element == selected_values})
+      pairs.append({'field': cat, 'from': element, 'value': next(a), 'to': to_value, 'selected': element in selected_values})
     return pairs
 
   selected_values = dict([((fq['id'], fq['field'], fq['type']), fq['filter']) for fq in query['fqs']])
@@ -508,7 +508,7 @@ def augment_solr_response2(response, collection, query):
         collection_facet = get_facet_field(category, name, collection['facets'])
         counts = response['facet_counts']['facet_ranges'][name]['counts']
         end = response['facet_counts']['facet_ranges'][name]['end']
-        counts = range_pair(name, selected_values.get((facet['id'], name, 'range'), [''])[0], counts, end) # Single val selected
+        counts = range_pair(name, selected_values.get((facet['id'], name, 'range'), []), counts, end)
         if collection_facet['properties']['sort'] == 'asc':
           counts.reverse()
         facet = {

+ 29 - 21
apps/search/static/js/search.ko.js

@@ -201,7 +201,7 @@ var Query = function (vm, query) {
   self.multiqs = ko.computed(function () { // List of widgets supporting multiqs
     return [defaultMultiqGroup].concat(
         $.map($.grep(self.fqs(), function(fq, i) {
-            return fq.type() == 'field';
+            return fq.type() == 'field' || fq.type() == 'range';
         }), function(fq) { return {'id': fq.id(), 'label': fq.field()} })
       );
   });
@@ -275,33 +275,41 @@ var Query = function (vm, query) {
   }  
   
   self.selectRangeFacet = function (data) {
-    var fq = self.getFacetFilter(data.widget_id);
-    var unselect = fq != null && fq.id() == data.widget_id && data.force == undefined;
-  
-    // if range already in --> unselect
-    // if not: add
-    //var filter = self.getFacetFilter(data.widget_id);
-    //if (filter != null && filter.filter().indexOf(data.from) > -1) {
-    	//
-    //}
+    if (data.force != undefined) {
+      self.removeFilter(ko.mapping.fromJS({'id': data.widget_id}));
+    }
     
-    // if empty now or force
-    self.removeFilter(ko.mapping.fromJS({'id': data.widget_id}));
-  
-    if (! unselect) {
+	var fq = self.getFacetFilter(data.widget_id);
+	  
+    if (fq == null) {
       self.fqs.push(ko.mapping.fromJS({
-        'id': data.widget_id,
-        'field': data.cat,
-        'filter': [data.from],
-        'properties': {'from': data.from, 'to': data.to},
-        'type': 'range'
-      }));
+          'id': data.widget_id,
+          'field': data.cat,
+          'filter': [data.from],
+          'properties': [{'from': data.from, 'to': data.to}],
+          'type': 'range'
+      }));    	
+    } else {    
+      if (fq.filter().indexOf(data.from) > -1) { // Unselect
+    	fq.filter.remove(data.from);
+    	$.each(fq.properties(), function (index, prop) {
+    	  if (prop && prop.from() == data.from) {
+    	    fq.properties.remove(prop);
+    	  }
+    	});
+    	if (fq.filter().length == 0) {
+          self.removeFilter(ko.mapping.fromJS({'id': data.widget_id}));
+    	}    	 
+      } else {
+    	 fq.filter.push(data.from);
+    	 fq.properties.push(ko.mapping.fromJS({'from': data.from, 'to': data.to}));
+      }
     }
 
     if (data.no_refresh == undefined) {
       vm.search();
     }
-  };  
+  };
   
   self.removeFilter = function (data) { 
     $.each(self.fqs(), function (index, fq) {