浏览代码

[search] Load back the saved layout

Romain Rigaux 11 年之前
父节点
当前提交
f78c813

+ 6 - 3
apps/search/src/search/models.py

@@ -243,17 +243,20 @@ class Collection(models.Model):
   result = models.ForeignKey(Result)
   sorting = models.ForeignKey(Sorting)
 
-  _ATTRIBUTES = ['collection', 'autocomplete']
+  _ATTRIBUTES = ['collection', 'layout', 'autocomplete']
   ICON = '/search/static/art/icon_search_24.png'
 
   objects = CollectionManager()
 
   def get_c(self, user):
     props = self.properties_dict
+    print props
     if 'collection' not in props:
       props['collection'] = self.get_default(user)
-    
-    return json.dumps(props['collection'])
+    if 'layout' not in props:
+      props['layout'] = []    
+
+    return json.dumps(props)
 
   def get_default(self, user):      
     fields = self.fields_data(user)

+ 5 - 8
apps/search/src/search/templates/search2.mako

@@ -195,6 +195,7 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
     <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: draggableLine" title="${_('Line Chart')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha hcha-line-chart"></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>
+    <div class="draggable-widget" data-bind="draggable: draggableMap" title="${_('Count')}" rel="tooltip" data-placement="top"><a href="#"><i class="hcha tachometer"></i></a></div>
   </div>
   <div class="clearfix"></div>
 </div>
@@ -329,7 +330,7 @@ ${ commonheader(_('Search'), "search", user, "60px") | n,unicode }
   <div data-bind="visible: $root.isEditing" style="margin-bottom: 20px">
       ${_('Results type')}
       &nbsp;<a href="javascript: void(0)" data-bind="css:{'btn': true, 'btn-inverse': $root.collection.template.isGridLayout()}, click: function(){$root.collection.template.isGridLayout(true)}"><i class="fa fa-th"></i></a>
-      &nbsp;<a href="javascript: void(0)" data-bind="css:{'btn': true, 'btn-inverse': !$root.collection.template.isGridLayout()}, click: function(){$root.collection.template.isGridLayout(false)}"><i class="fa fa-magic"></i></a>
+      &nbsp;<a href="javascript: void(0)" data-bind="css:{'btn': true, 'btn-inverse': !$root.collection.template.isGridLayout()}, click: function(){$root.collection.template.isGridLayout(false)}"><i class="fa fa-code"></i></a>
   </div>
 
   <!-- ko if: $root.collection.template.isGridLayout() -->
@@ -545,13 +546,9 @@ $(document).ready(function () {
 
   viewModel = new SearchViewModel(${ collection.get_c(user) | n,unicode }, ${ query | n,unicode });
   ko.applyBindings(viewModel);
-  
-  % if not layout:
-    fullLayout();
-    viewModel.isEditing(true);
-    viewModel.columns()[0].rows()[0].addWidget(viewModel.draggableResultset());
-    viewModel.search();
-  % endif
+
+  //viewModel.isEditing(true);
+  viewModel.search();
 });
 
   function toggleGridFieldsSelection() {

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

@@ -67,7 +67,6 @@ def index(request):
   return render('search2.mako', request, {
     'collection': collection,
     'query': query,
-    'layout': {},
   })
 
 
@@ -118,10 +117,12 @@ def save(request):
   response = {'status': -1}  
   
   collection = json.loads(request.POST.get('collection', '{}')) # TODO perms decorator
+  layout = json.loads(request.POST.get('layout', '{}')) 
     
   if collection:
     hue_collection = Collection.objects.get(id=collection['id'])
     hue_collection.update_properties({'collection': collection})
+    hue_collection.update_properties({'layout': layout})
     # Todo update certain atttributes like, label, enabled...
     hue_collection.save()
     response['status'] = 0

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

@@ -161,6 +161,25 @@ function setLayout(colSizes) {
   viewModel.columns(_cols);
 }
 
+function loadLayout(viewModel, json_layout) {
+  var _columns = [];
+  
+  $(json_layout).each(function (cnt, json_col) { 
+	var _rows = [];
+    $(json_col.rows).each(function (rcnt, json_row) {
+      var row = new Row();
+      $(json_row.widgets).each(function (wcnt, widget) {
+    	row.addWidget(new Widget(widget.size, widget.name, widget.widgetType, widget.properties, widget.offset));
+      });
+      _rows.push(row);
+    });
+    var column = new Column(json_col.size, _rows);
+    _columns = _columns.concat(column);
+  });
+
+  viewModel.columns(_columns);
+}
+
 // End dashboard lib
 
 var Query = function (vm, query) {
@@ -230,7 +249,7 @@ var SearchViewModel = function (collection_json, query_json) {
   var self = this;
 
   // Models
-  self.collection = new Collection(self, collection_json);
+  self.collection = new Collection(self, collection_json.collection);
   self.query = new Query(self, query_json);
 
   // UI
@@ -243,7 +262,9 @@ var SearchViewModel = function (collection_json, query_json) {
   self.selectedFacet = ko.observable();
 
   self.previewColumns = ko.observable("");
-  self.columns = ko.observableArray([]); // aka 'layout'
+  self.columns = ko.observable({});
+  loadLayout(self, collection_json.layout);
+  
   self.isEditing = ko.observable(false);
   self.draggableFacet = ko.observable(new Widget(12, "Facet", "facet-widget"));
   self.draggableResultset = ko.observable(new Widget(12, "Results", "resultset-widget"));