Bläddra i källkod

[search] Smarter line chart

Romain Rigaux 11 år sedan
förälder
incheckning
48a351b

+ 20 - 4
apps/search/src/search/api.py

@@ -55,16 +55,23 @@ def _guess_range_facet(widget_type, solr_api, collection, facet_field, propertie
     stats_json = solr_api.stats(collection['name'], [facet_field])
     stat_facet = stats_json['stats']['stats_fields'][facet_field]
     
+    # to refactor
     if isinstance(stat_facet['min'], numbers.Number):
       stats_min = int(stat_facet['min']) # if field is float, cast as float isinstance(y, float)
       stats_max = int(stat_facet['max'])
       if start is None:
-        start, _ = _round_number_range(stats_min)
+        if widget_type == 'line-widget':
+          start, _ = _round_thousand_range(stats_min)
+        else:        
+          start, _ =  _round_number_range(stats_min)
       if end is None:
-        _, end = _round_number_range(stats_max)        
+        if widget_type == 'line-widget':
+          _, end = _round_thousand_range(stats_max)
+        else:
+          _, end = _round_number_range(stats_max)        
       
       if gap is None:
-        gap = (end - start) / SLOTS
+        gap = int((end - start) / SLOTS)
       if gap < 1:
         gap = 1
     elif 'T' in stat_facet['min']:
@@ -132,13 +139,22 @@ def _round_date_range(tm):
 
 def _round_number_range(n):
   if n <= 10:
-    return n, n
+    return n, n + 1
   else:
     i = int(log(n, 10))
     end = round(n, -i)
     start = end - 10 ** i
     return start, end 
 
+def _round_thousand_range(n):
+  if n <= 10:
+    return 0, 0
+  else:
+    i = int(log(n, 10))
+    start = 10 ** i
+    end = 10 ** (i + 1)
+    return start, end 
+
 def _guess_gap(solr_api, collection, facet_field, start=None, end=None):
   properties = {}
   _guess_range_facet('range-widget', solr_api, collection, facet_field, properties, start=start, end=end)

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

@@ -147,12 +147,12 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
                        <i class="hcha hcha-bar-chart"></i>
          </a>
     </div>
-    <div data-bind="css: { 'draggable-widget': true, 'disabled': !availableDraggableChart() },
-                    draggable: {data: draggableLine(), isEnabled: availableDraggableChart, 
+    <div data-bind="css: { 'draggable-widget': true, 'disabled': !availableDraggableNumbers() },
+                    draggable: {data: draggableLine(), isEnabled: availableDraggableNumbers, 
                     options: {'start': function(event, ui){lastWindowScrollPosition = $(window).scrollTop();$('.card-body').slideUp('fast');},
                               'stop': function(event, ui){$('.card-body').slideDown('fast', function(){$(window).scrollTop(lastWindowScrollPosition)});}}}"
          title="${_('Line')}" rel="tooltip" data-placement="top">
-         <a data-bind="style: { cursor: $root.availableDraggableChart() ? 'move' : 'default' }">
+         <a data-bind="style: { cursor: $root.availableDraggableNumbers() ? 'move' : 'default' }">
                        <i class="hcha hcha-line-chart"></i>
          </a>
     </div>

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

@@ -403,7 +403,7 @@ var Collection = function (vm, collection) {
 
   self.availableFacetFields = ko.computed(function() {
     var facetFieldNames = $.map(self.facets(), function(facet) {
-	  return facet.field(); //filter out text_general
+	  return facet.field(); //filter out text_general, __version__
     });
     return $.grep(self.fields(), function(field) {
       return facetFieldNames.indexOf(field.name()) == -1;
@@ -508,7 +508,15 @@ var Collection = function (vm, collection) {
 	return _fields;	  
   });
   self.template.availableWidgetFields = ko.computed(function() {
-    return self.template.fieldsModalType() == 'histogram-widget'? vm.availableDateFields() : self.availableFacetFields();
+    if (self.template.fieldsModalType() == 'histogram-widget') {
+      return vm.availableDateFields();	
+    }
+    else if (self.template.fieldsModalType() == 'line-widget') {
+      return vm.availableNumberFields();
+    }
+    else {
+      return self.availableFacetFields();
+    }
   });
   self.template.availableWidgetFieldsNames = ko.computed(function() {
 	return $.map(self.template.availableWidgetFields(), function(field){
@@ -752,7 +760,9 @@ var NewTemplate = function (vm, initial) {
 };
 
 
-var DATE_TYPE = ['date', 'tdate'];
+var DATE_TYPES = ['date', 'tdate'];
+var NUMBER_TYPES = ['int', 'tint', 'long', 'tlong', 'float', 'tfloat'];
+
 
 var SearchViewModel = function (collection_json, query_json, initial_json) {
   var self = this;
@@ -810,7 +820,10 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
   self.draggableFilter = ko.observable(new Widget(12, UUID(), "Filter Bar", "filter-widget"));  
 
   self.availableDateFields = ko.computed(function() {
-    return $.grep(self.collection.availableFacetFields(), function(field) { return DATE_TYPE.indexOf(field.type()) != -1; });
+    return $.grep(self.collection.availableFacetFields(), function(field) { return DATE_TYPES.indexOf(field.type()) != -1; });
+  });
+  self.availableNumberFields = ko.computed(function() {
+    return $.grep(self.collection.availableFacetFields(), function(field) { return NUMBER_TYPES.indexOf(field.type()) != -1; });
   });
   
   function getWidgets(equalsTo) {
@@ -827,6 +840,10 @@ var SearchViewModel = function (collection_json, query_json, initial_json) {
 	return getWidgets(function(widget){ return widget.widgetType() == 'histogram-widget'; }).length == 0 &&
 	  self.availableDateFields().length > 0;
   });
+  self.availableDraggableNumbers = ko.computed(function() {
+	return getWidgets(function(widget){ return widget.widgetType() == 'line-widget'; }).length == 0 &&
+	  self.availableNumberFields().length > 0;
+  });
   self.availableDraggableChart = ko.computed(function() {
     return self.collection.availableFacetFields().length > 0;
   });