Jelajahi Sumber

HUE-2332 [search] Filer widget can accept multiple values

Romain Rigaux 11 tahun lalu
induk
melakukan
7819bcd

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

@@ -450,6 +450,7 @@ def augment_solr_response(response, collection, query):
       if category == 'field' and response['facet_counts']['facet_fields']:
         name = facet['field']
         collection_facet = get_facet_field(category, name, collection['facets'])
+        print selected_values.get((facet['id'], name, category))
         counts = pairwise2(name, selected_values.get((facet['id'], name, category), []), response['facet_counts']['facet_fields'][name])
         if collection_facet['properties']['sort'] == 'asc':
           counts.reverse()
@@ -550,11 +551,7 @@ def _augment_pivot_2d(counts):
     for pivot in dimension['pivot']:
       count[pivot['value']] = pivot['count']
     for val in values:
-      if val in count:
-        c = {"count": count[val], "value": val, "cat": dimension['value']}
-      else:
-        c = {"count": 0, "value": val, "cat": dimension['value']}
-      augmented.append(c)
+      augmented.append({"count": count.get(val, 0), "value": val, "cat": dimension['value'], 'selected': False})
 
   return augmented
 

+ 30 - 36
apps/search/src/search/templates/search.mako

@@ -354,7 +354,7 @@ ${ dashboard.layout_skeleton() }
                 <!-- /ko -->
                 <!-- ko if: $data.selected -->
                   <span class="pointer" data-bind="click: function(){ $root.query.toggleFacet({facet: $data, widget_id: $parent.id()}) }">
-                    <strong data-bind="text: $data.value"></strong>
+                    <strong data-bind="text: ko.mapping.toJSON($data)"></strong>
                     <a class="pointer"><i class="fa fa-times"></i></a>
                   </span>
                 <!-- /ko -->
@@ -908,54 +908,48 @@ ${ dashboard.layout_skeleton() }
 <script type="text/html" id="filter-widget">
   <div data-bind="visible: $root.query.fqs().length == 0" style="margin-top: 10px">${_('There are currently no filters applied.')}</div>
   <div data-bind="foreach: { data: $root.query.fqs, afterRender: function(){ isLoading(false); } }">
-    <!-- ko if: $data.type() == 'field' -->
-    <div class="filter-box">
-      <!-- ko if: $data.filter().length > 0 && $data.filter()[0].exclude -->
-      <div class="title excluded">
-        <a href="javascript:void(0)" class="pull-right" data-bind="click: function(){ chartsUpdatingState(); viewModel.query.removeFilter($data); viewModel.search() }"><i class="fa fa-times"></i></a>
-        ${ _('excluded') }&nbsp;&nbsp;
-      </div>
-      <!-- /ko -->
-      <!-- ko ifnot: $data.filter().length > 0 && $data.filter()[0].exclude -->
+    <!-- ko if: $data.type() == 'field' -->    
+    <div class="filter-box">      
       <div class="title">
-        <a href="javascript:void(0)" class="pull-right" data-bind="click: function(){ chartsUpdatingState(); viewModel.query.removeFilter($data); viewModel.search() }"><i class="fa fa-times"></i></a>
+        <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.field"></span>
         &nbsp;
-      </div>
-      <!-- /ko -->
+      </div>      
       <div class="content">
-        <strong>${_('field')}</strong>:
-        <span data-bind="text: $data.field"></span>
-        <!-- ko if: $data.filter().length > 0  -->
+        <strong>${_('value')}</strong>
+        <span data-bind="text: $.map($.grep($data.filter(), function(f) { return ! f.exclude(); }), function(f) { return f.value(); }).join(', '); "></span>
         <br/>
         <strong>${_('value')}</strong>:
-        <span data-bind="text: $data.filter()[0].value"></span>
-        <!-- /ko -->
+        <span data-bind="text: $.map($.grep($data.filter(), function(f) { return f.exclude(); }), function(f) { return f.value(); }).join(', ');"></span>        
       </div>
-    </div>
+    </div>        
     <!-- /ko -->
+
     <!-- ko if: $data.type() == 'range' -->
     <div class="filter-box">
-      <!-- ko if: $data.filter().length > 0 && $data.filter()[0].exclude -->
-      <div class="title excluded">
-        <a href="javascript:void(0)" class="pull-right" data-bind="click: function(){ chartsUpdatingState(); viewModel.query.removeFilter($data); viewModel.search() }"><i class="fa fa-times"></i></a>
-        ${ _('excluded') }&nbsp;&nbsp;
-      </div>
-      <!-- /ko -->
-      <!-- ko ifnot: $data.filter().length > 0 && $data.filter()[0].exclude -->
-      <div class="title">
-        <a href="javascript:void(0)" class="pull-right" data-bind="click: function(){ chartsUpdatingState(); viewModel.query.removeFilter($data); viewModel.search() }"><i class="fa fa-times"></i></a>
+      <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.field"></span>
         &nbsp;
       </div>
-      <!-- /ko -->
       <div class="content">
-        <strong>${_('field')}</strong>:
-        <span data-bind="text: $data.field"></span>
-        <br/>
         <span data-bind="foreach: $data.properties" style="font-weight: normal">
-          <strong>${_('from')}</strong>: <span data-bind="text: $data.from"></span>
-          <br/>
-          <strong>${_('to')}</strong>: <span data-bind="text: $data.to"></span>
-        </span>
+          <!-- ko if: $.grep($parent.filter(), function(f) { return f.value() == $data.from() && ! f.exclude() }).length > 0 -->
+            <strong>${_('from')}</strong> <span data-bind="text: $data.from"></span>
+            <strong>${_('to')}</strong> <span data-bind="text: $data.to"></span>
+          <!-- /ko -->
+        </span>        
+        <br/>
+        <span data-bind="foreach: $data.properties" style="font-weight: normal"  class="excluded">
+          <!-- ko if: $.grep($parent.filter(), function(f) { return f.value() == $data.from() && f.exclude() }).length > 0 -->
+            <strong>${_('from')}</strong> <span data-bind="text: $data.from"></span>
+            <strong>${_('to')}</strong> <span data-bind="text: $data.to"></span>
+          <!-- /ko -->
+        </span>        
       </div>
     </div>
     <!-- /ko -->

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

@@ -151,7 +151,7 @@ var Query = function (vm, query) {
     _toggleSingleTermFacet(data, false);
   }
   self.removeSingleTermFacet = function(data) {
-	  _toggleSingleTermFacet(data, true);
+	_toggleSingleTermFacet(data, true);
   }
 
   self.selectRangeFacet = function (data) {

+ 4 - 4
desktop/libs/libsolr/src/libsolr/api.py

@@ -78,10 +78,10 @@ class SolrApi(object):
             f.append('%s%s:"%s"' % (exclude, fq['field'], value))
           else:
             f.append('%s{!field f=%s}%s' % (exclude, fq['field'], value))
-        if fq['id'].startswith('***single'): # Do not tag Single term fq
-          _params = ' '.join(f)
-        else:
-          _params ='{!tag=%s}' % fq['field'] + ' '.join(f)
+        #if fq['id'].startswith('***single'): # Do not tag Single term fq
+        #  _params = ' '.join(f)
+        #else:
+        _params ='{!tag=%s}' % fq['field'] + ' '.join(f)
         params += (('fq', urllib.unquote(utf_quoter(_params))),)
       elif fq['type'] == 'range':
         params += (('fq', '{!tag=%s}' % fq['field'] + ' '.join([urllib.unquote(