Pārlūkot izejas kodu

[search] Adding bar char widget

Romain Rigaux 11 gadi atpakaļ
vecāks
revīzija
1cf0fa2

+ 23 - 2
apps/search/src/search/templates/search2.mako

@@ -194,7 +194,7 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
     <div class="draggable-widget" data-bind="draggable: draggableFacet" title="${_('Text Facet')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-sort-amount-asc"></i></a></div>    
     <div class="draggable-widget" data-bind="draggable: draggablePie" title="${_('Pie Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-pie-chart"></i></a></div>
     <div class="draggable-widget" data-bind="draggable: draggableHit" title="${_('Hit Count')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-tachometer"></i></a></div>
-    <div class="draggable-widget" data-bind="draggable: draggableArea" title="${_('Bar Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-bar-chart"></i></a></div>
+    <div class="draggable-widget" data-bind="draggable: draggableBar" title="${_('Bar Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-bar-chart"></i></a></div>
     <div class="draggable-widget" data-bind="draggable: draggableHistogram" title="${_('Timeline')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-long-arrow-right"></i></a></div>
     <div class="draggable-widget" data-bind="draggable: draggableLine" title="${_('Filter Bar')}" rel="tooltip" data-placement="top"><a href="#"><i class="fa fa-filter"></i></a></div>
     <div class="draggable-widget" data-bind="draggable: draggableMap" title="${_('Map')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-map-chart"></i></a></div>    
@@ -462,7 +462,28 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
 </script>
 
 <script type="text/html" id="bar-widget">
-  This is the bar widget
+  <!-- ko ifnot: $root.getFacetFromQuery(id) -->
+    <a data-bind="click: showAddFacetModal" class="btn" href="javascript:void(0)"><i class="fa fa-plus"></i></a>
+  <!-- /ko -->
+
+  <!-- ko if: $root.getFacetFromQuery(id) -->
+  <div class="row-fluid" data-bind="with: $root.getFacetFromQuery(id)">
+    <div data-bind="visible: $root.isEditing, with: $root.collection.getFacetById($parent.id())" style="margin-bottom: 20px">      
+      ${ _('Label') }: <input type="text" data-bind="value: label" />
+      <br/>      
+      ${ _('Field') }: <input type="text" data-bind="value: field" />
+      <br/>
+      ${ _('Start') }: <input type="text" data-bind="value: properties.start" />
+      ${ _('End') }: <input type="text" data-bind="value: properties.end" />
+      ${ _('Gap') }: <input type="text" data-bind="value: properties.gap" />
+    </div>  
+
+    <a href="javascript:void(0)"><i class="fa fa-plus"></i></a>
+    <a href="javascript:void(0)"><i class="fa fa-minus"></i></a>
+
+    <div data-bind="barChart: {data: counts, field: field, transformer: barChartDataTransformer, onClick: function(d){viewModel.query.selectFacet({count: d.y,selected: false,value: d.x,cat: field})}}" />
+  </div>
+  <!-- /ko -->
 </script>
 
 <script type="text/html" id="pie-widget">

+ 36 - 32
apps/search/src/search/views.py

@@ -17,6 +17,7 @@
 
 import json
 import logging
+import numbers
 
 from datetime import datetime
 from time import mktime
@@ -475,50 +476,57 @@ def index_fields_dynamic(request, collection_id):
 # TODO security
 def new_facet(request, collection_id):  
   result = {'status': -1, 'message': 'Error'}
-
-  solr_query = {}
   
   try:
-    hue_collection = Collection.objects.get(id=collection_id) # security + optional if no id
-    solr_query['collection'] = hue_collection.name
+    collection = json.loads(request.POST.get('collection', '{}')) # TODO perms decorator
     
     facet_id = request.POST['id']
     facet_label = request.POST['label']
     facet_field = request.POST['field']
     widget_type = request.POST['widget_type']
+    properties = {}
     
     if widget_type == 'hit-widget':
       facet_type = 'query'
     elif widget_type == 'histogram-widget':
       facet_type = 'range'
+    elif widget_type == 'bar-widget':
+      facet_type = 'range'
     else:
       facet_type = 'field'      
 
-    SLOTS = 50            
-    
-    stats_json = SolrApi(SOLR_URL.get(), request.user).stats(hue_collection.name, [facet_field])
-    
-    if 'T' in stats_json['stats']['stats_fields'][facet_field]['min']:
-      stats_min = int(stats_json['stats']['stats_fields'][facet_field]['min']) # if field is int, cast as int
-      stats_max = int(float(stats_json['stats']['stats_fields'][facet_field]['max']))
-      gap = (stats_max - stats_min) / SLOTS
-    else:
-      stats_min = stats_json['stats']['stats_fields'][facet_field]['min']
-      stats_max = stats_json['stats']['stats_fields'][facet_field]['max']
-      difference = (mktime(datetime.strptime(stats_max, '%Y-%m-%dT%H:%M:%SZ').timetuple()) - mktime(datetime.strptime(stats_min, '%Y-%m-%dT%H:%M:%SZ').timetuple())) / SLOTS
-
-      if difference < 1:
-        unit = 'SECONDS'
-      elif difference < 60:
-        unit = 'MINUTES'
-      elif difference < 3600:
-        unit = 'HOURS'
-      elif difference < 3600 * 24:
-        unit = 'DAYS'
+    if facet_type == 'range':
+      SLOTS = 50            
+      
+      stats_json = SolrApi(SOLR_URL.get(), request.user).stats(collection['name'], [facet_field])
+      
+      if isinstance(stats_json['stats']['stats_fields'][facet_field]['min'], numbers.Number):
+        stats_min = int(stats_json['stats']['stats_fields'][facet_field]['min']) # if field is int, cast as int
+        stats_max = int(stats_json['stats']['stats_fields'][facet_field]['max'])
+        gap = (stats_max - stats_min) / SLOTS
       else:
-        unit = 'MONTHS'
+        stats_min = stats_json['stats']['stats_fields'][facet_field]['min']
+        stats_max = stats_json['stats']['stats_fields'][facet_field]['max']
+        difference = (mktime(datetime.strptime(stats_max, '%Y-%m-%dT%H:%M:%SZ').timetuple()) - mktime(datetime.strptime(stats_min, '%Y-%m-%dT%H:%M:%SZ').timetuple())) / SLOTS
+  
+        if difference < 1:
+          unit = 'SECONDS'
+        elif difference < 60:
+          unit = 'MINUTES'
+        elif difference < 3600:
+          unit = 'HOURS'
+        elif difference < 3600 * 24:
+          unit = 'DAYS'
+        else:
+          unit = 'MONTHS'
+  
+        gap = '+1' + unit      
 
-      gap = '+1' + unit      
+      properties = {
+        'start': stats_min,
+        'end': stats_max,
+        'gap': gap,
+      }
         
     result['message'] = ''
     result['facet'] = {
@@ -526,11 +534,7 @@ def new_facet(request, collection_id):
       'label': facet_label,
       'field': facet_field,
       'type': facet_type,
-      'properties': {
-          'start': stats_min,
-          'end': stats_max,
-          'gap': gap,
-      }
+      'properties': properties
     }
     result['status'] = 0
   except Exception, e:

+ 3 - 2
apps/search/static/js/search.ko.js

@@ -233,6 +233,7 @@ var Collection = function (vm, collection) {
 
   self.addFacet = function (facet_json) {
     $.post("/search/template/" + self.id + "/new_facet", {
+    	"collection": ko.mapping.toJSON(self),
         "id": facet_json.widget_id,
         "label": facet_json.name,
         "field": facet_json.name,
@@ -254,7 +255,7 @@ var Collection = function (vm, collection) {
   self.removeFacet = function (widget_id) {
     $.each(self.facets(), function (index, facet) {	
       if (facet.id() == widget_id()) {
-        self.facets.remove(facet);
+        self.facets.remove(facet); 
         return false;
       }
     });
@@ -348,7 +349,7 @@ var SearchViewModel = function (collection_json, query_json) {
   self.draggableFacet = ko.observable(new Widget(12, UUID(), "Facet", "facet-widget"));
   self.draggableResultset = ko.observable(new Widget(12, UUID(), "Results", "resultset-widget"));
   self.draggableHistogram = ko.observable(new Widget(12, UUID(), "Histogram", "histogram-widget"));
-  self.draggableArea = ko.observable(new Widget(12, UUID(), "Area Chart", "area-widget"));
+  self.draggableBar = ko.observable(new Widget(12, UUID(), "Bar Chart", "bar-widget"));
   self.draggableMap = ko.observable(new Widget(12, UUID(), "Map", "map-widget"));
   self.draggableLine = ko.observable(new Widget(12, UUID(), "Line Chart", "line-widget"));
   self.draggablePie = ko.observable(new Widget(12, UUID(), "Pie Chart", "pie-widget"));