فهرست منبع

[search] Split facet range and sort order buttons

Romain Rigaux 11 سال پیش
والد
کامیت
37a9cd3021

+ 25 - 20
apps/search/src/search/models.py

@@ -470,20 +470,25 @@ def augment_solr_response2(response, collection, query):
       pairs.append({'cat': cat, 'value': element, 'count': next(a), 'selected': element in selected_values})
     return pairs
 
-  def range_pair(cat, selected_values, iterable, end):
-    # counts":["0",17430,"1000",1949,"2000",671,"3000",404,"4000",243,"5000",165],"gap":1000,"start":0,"end":6000}
+  def range_pair(cat, selected_values, iterable, end, facet):
+    # e.g. counts":["0",17430,"1000",1949,"2000",671,"3000",404,"4000",243,"5000",165],"gap":1000,"start":0,"end":6000}
     pairs = []
     a, to = itertools.tee(iterable)
     next(to, None)
     for element in a:
       next(to, None)
-      pairs.append({'field': cat, 'from': element, 'value': next(a), 'to': next(to, end), 'selected': element == selected_values})
+      to_value = next(to, end)
+      if facet['widgetType'] == 'pie-widget':        
+        label = '%s - %s ' % (element, to_value)
+      else:
+        label = element
+      pairs.append({'field': cat, 'from': label, 'value': next(a), 'to': to_value, 'selected': element == selected_values})
     return pairs
 
   selected_values = dict([((fq['id'], fq['field'], fq['type']), fq['filter']) for fq in query['fqs']])
 
   if response and response.get('facet_counts'):
-    # [{u'field': u'sun', u'type': u'query', u'id': u'67b43a63-ed22-747b-47e8-b31aad1431ea', u'label': u'sun'}
+    # e.g. [{u'field': u'sun', u'type': u'query', u'id': u'67b43a63-ed22-747b-47e8-b31aad1431ea', u'label': u'sun'}
     for facet in collection['facets']:
       category = facet['type']
 
@@ -503,22 +508,22 @@ def augment_solr_response2(response, collection, query):
         }
         normalized_facets.append(facet)
       elif category == 'range' and response['facet_counts']['facet_ranges']:
-          name = facet['field']
-          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'), {}).get('from', None), counts, end)
-          if collection_facet['properties']['sort'] == 'asc':
-            counts.reverse()
-          facet = {
-            'id': collection_facet['id'],
-            'field': name,
-            'type': category,
-            'label': collection_facet['label'],
-            'counts': counts,
-            'extraSeries': []
-          }
-          normalized_facets.append(facet)
+        name = facet['field']
+        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'), {}).get('from', None), counts, end, facet)
+        if collection_facet['properties']['sort'] == 'asc':
+          counts.reverse()
+        facet = {
+          'id': collection_facet['id'],
+          'field': name,
+          'type': category,
+          'label': collection_facet['label'],
+          'counts': counts,
+          'extraSeries': []
+        }
+        normalized_facets.append(facet)
       elif category == 'query' and response['facet_counts']['facet_queries']:
         for name, value in response['facet_counts']['facet_queries'].iteritems():
           collection_facet = get_facet_field(category, name, collection['facets'])

+ 7 - 3
apps/search/src/search/templates/search2.mako

@@ -243,9 +243,13 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
       <!-- /ko -->
       <span>
         <span data-bind="text: label" style="font-weight: bold"></span>
-        <a href="javascript: void(0)" class="btn btn-loading" data-bind="click: $root.collection.toggleFacet" data-loading-text="...">      
-          <i class="fa" data-bind="css: { 'fa-sort-alpha-asc': properties.sort() == 'desc' && type() != 'range', 'fa-sort-alpha-desc': properties.sort() == 'asc' && type() != 'range', 'fa-sort-numeric-desc': properties.sort() == 'desc' && type() == 'range', 'fa-sort-numeric-asc': properties.sort() == 'asc' && type() == 'range' }"></i>
-        </a>  
+        
+        <a href="javascript: void(0)" class="btn btn-loading" data-bind="visible: properties.canRange, click: $root.collection.toggleRangeFacet" data-loading-text="...">
+          <i class="fa" data-bind="css: { 'fa-arrows-h': type() == 'range', 'fa-bars': type() == 'field' }"></i>
+        </a>
+        <a href="javascript: void(0)" class="btn btn-loading" data-bind="click: $root.collection.toggleSortFacet" data-loading-text="...">          
+          <i class="fa" data-bind="css: { 'fa-caret-down': properties.sort() == 'desc', 'fa-caret-up': properties.sort() == 'asc' }"></i>
+        </a>
       </span>
     </div>
     <div data-bind="with: $root.collection.getFacetById($parent.id())">

+ 3 - 1
apps/search/src/search/views.py

@@ -491,7 +491,6 @@ def get_timeline(request):
     qdata = json.loads(request.POST.get('qdata', '{}'))
     multiQ = request.POST.get('multiQ', 'query')
     
-    
     if multiQ == 'query':
       label = qdata['q'] 
       query['qs'] = [qdata]
@@ -534,6 +533,9 @@ def new_facet(request):
     properties = {
       'sort': 'desc',
       'canRange': False,
+      'stacked': False,
+      'limit': 10,
+      'mincount': 0
     }
     
     solr_api = SolrApi(SOLR_URL.get(), request.user)

+ 20 - 22
apps/search/static/js/search.ko.js

@@ -445,32 +445,30 @@ var Collection = function (vm, collection) {
    vm.search();
   };
   
-  self.toggleFacet = function (facet_field, event) {
-  vm.query.removeFilter(ko.mapping.fromJS({'id': facet_field.id})); // Reset filter query
-  var hasChanged = false;
-  
-    if (facet_field.properties.canRange()) {
-     if (facet_field.type() == 'field' && facet_field.properties.sort() == 'asc') {
-     facet_field.type('range');
-     hasChanged = true;
-     } else if (facet_field.type() == 'range' && facet_field.properties.sort() == 'desc') {
-      facet_field.type('field')
-       hasChanged = true;
-       }
-    }
-
-    if (! hasChanged) {
-      if (facet_field.properties.sort() == 'desc') {
-        facet_field.properties.sort('asc');
-      } else {
-        facet_field.properties.sort('desc');
-      }   
-    }
+  self.toggleSortFacet = function (facet_field, event) {
+    if (facet_field.properties.sort() == 'desc') {
+      facet_field.properties.sort('asc');
+    } else {
+      facet_field.properties.sort('desc');
+    }   
    
     $(event.target).button('loading');
     vm.search();
   };
-  
+
+  self.toggleRangeFacet = function (facet_field, event) {
+    vm.query.removeFilter(ko.mapping.fromJS({'id': facet_field.id})); // Reset filter query
+ 
+    if (facet_field.type() == 'field') {
+       facet_field.type('range');
+     } else if (facet_field.type() == 'range') {
+        facet_field.type('field')
+     }
+   
+    $(event.target).button('loading');
+    vm.search();
+  };  
+
   self.selectTimelineFacet = function (data) { // alert(ko.mapping.toJSON(facet)); 
   var facet = self.getFacetById(data.widget_id);