Răsfoiți Sursa

HUE-2783 [search] Save search definitions model part

Romain Rigaux 10 ani în urmă
părinte
comite
1380fdb

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

@@ -502,6 +502,9 @@ class Collection2(object):
         properties['facets'] = []
         properties['facets_form'] = {'field': '', 'mincount': 1, 'limit': 5}
 
+    if 'qdefinitions' not in props['collection']:
+      props['collection']['qdefinitions'] = []
+
     return json.dumps(props)
 
   def get_default(self, user, name):

+ 32 - 0
apps/search/src/search/static/search/js/search.ko.js

@@ -524,6 +524,7 @@ var Collection = function (vm, collection) {
   self.template.rows.extend({rateLimit: {timeout: 1500, method: "notifyWhenChangesStop"}});
 
   self.fields = ko.mapping.fromJS(collection.fields);
+  self.qdefinitions = ko.mapping.fromJS(collection.qdefinitions);
 
   self.availableFacetFields = ko.computed(function() {
     return self.fields();
@@ -531,6 +532,37 @@ var Collection = function (vm, collection) {
 
   self.selectedDocument = ko.observable({});
 
+  self.addQDefinition = function() {
+    self.qdefinitions.push(
+      ko.mapping.fromJS({
+        'name': 'new name',
+        'id': UUID(),
+        'data': ko.mapping.toJSON(vm.query)
+      })
+    );
+  };
+
+  self.removeQDefinition = function (qdef) {
+    $.each(self.qdefinitions(), function (index, qdefinition) {
+      if (qdefinition.id() == qdef.id()) {
+        self.qdefinitions.remove(qdefinition);
+        return false;
+      }
+    });
+  }
+  
+  self.loadQDefinition = function(qdefinition) {
+	var qdef = ko.mapping.fromJSON(qdefinition.data());
+
+	vm.query.uuid(qdef.uuid());
+	vm.query.qs(qdef.qs());
+	vm.query.fqs(qdef.fqs());
+	vm.query.start(qdef.start());
+	vm.query.selectedMultiq(qdef.selectedMultiq());
+
+	vm.search();
+  }
+ 
   self.addFacet = function (facet_json) {
     self.removeFacet(function(){return facet_json.widget_id});
     logGA('add_facet/' + facet_json.widgetType);

+ 38 - 1
apps/search/src/search/templates/search.mako

@@ -50,6 +50,10 @@ ${ commonheader(_('Search'), "search", user, "80px") | n,unicode }
         data-bind="css: {'btn': true}, visible: columns().length != 0">
       <i class="fa fa-cog"></i>
     </a>
+    <a class="btn pointer" title="${ _('Query Definitions') }" rel="tooltip" data-placement="bottom" data-toggle="modal" data-target="#qdefinitionsDemiModal"
+        data-bind="css: {'btn': true}, visible: columns().length != 0">
+      <i class="fa fa-bookmark-o"></i>
+    </a>
     <span data-bind="visible: columns().length != 0">&nbsp;&nbsp;</span>
 
     <a class="btn pointer" title="${ _('Share search definition') }" rel="tooltip" data-placement="bottom" data-bind="click: showShareModal, css: {'btn': true}, visible: columns().length != 0, enable: $root.collection.id() != null">
@@ -1595,6 +1599,38 @@ ${ dashboard.layout_skeleton() }
   <div><a class="pointer demi-modal-chevron" data-dismiss="modal"><i class="fa fa-chevron-up"></i></a></div>
 </div>
 
+<div id="qdefinitionsDemiModal" class="demi-modal fade" data-backdrop="false">
+  <a href="javascript: void(0)" data-dismiss="modal" class="pull-right" style="margin: 10px"><i class="fa fa-times"></i></a>
+  <div class="modal-body">
+    <div class="row-fluid">
+      <div class="span12">
+        <form class="form-horizontal">
+          <fieldset>
+            <legend><i class="fa fa-bookmark-o"></i> ${ _('Query definitions') }</legend>
+            <div class="control-group" data-bind="foreach: $root.collection.qdefinitions">
+              <label class="control-label" for="settingsdescription">${ _('Definition') }</label>
+              <div class="controls">
+                <span data-bind="text: ko.mapping.toJSON(name)"></span>
+                <span data-bind="text: ko.mapping.toJSON(data), click: $root.collection.loadQDefinition"></span>
+                <a href="javascript: void(0)" data-bind="click: $root.collection.removeQDefinition">
+                  <i class="fa fa-times"></i>
+                </a>
+              </div>
+              </br>
+            </div>
+          </fieldset>
+
+          <button title="${ _('Click on this button to add the field') }" class="btn plus-btn" data-bind="click: $root.collection.addQDefinition">
+            <i class="fa fa-plus"></i>
+          </button>
+        </form>
+      </div>
+    </div>
+
+  </div>
+  <div><a class="pointer demi-modal-chevron" data-dismiss="modal"><i class="fa fa-chevron-up"></i></a></div>
+</div>
+
 
 <script type="text/html" id="time-filter">
   <span data-bind="visible: $root.availableDateFields().length > 0" >
@@ -2239,7 +2275,8 @@ $(document).ready(function () {
     {
       value: "bar",
       label: "${ _('Bars')}"
-  }]);
+    }
+  ]);
 
   ko.applyBindings(viewModel);