Эх сурвалжийг харах

HUE-1567 [search] Add support for a default sort order

You can now choose which fields to include in the default sorting order
Fields can be reordered as well
Enrico Berti 12 жил өмнө
parent
commit
7493d17

+ 4 - 1
apps/search/src/search/models.py

@@ -177,7 +177,10 @@ class Sorting(models.Model):
           ('sort', client_query.get('sort')),
         )
       elif data_dict.get('fields'):
-        fields = ['%s %s' % (field['field'], field['asc'] and 'asc' or 'desc') for field in data_dict.get('fields')]
+        fields = []
+        for field in data_dict.get('fields'):
+          if field['include']:
+            fields.append('%s %s' % (field['field'], field['asc'] and 'asc' or 'desc'))
         params += (
           ('sort', ','.join(fields)),
         )

+ 19 - 10
apps/search/src/search/templates/admin_collection_sorting.mako

@@ -50,7 +50,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
           </div>
           <h3>${_('Sorting')}</h3>
           ${_('Specify on which fields and order the results are sorted by default.')}
-          ${_('The sorting is a combination of the fields, from left to right.')}
+          ${_('The sorting is a combination of the "Default sorting" fields, from left to right.')}
           <span data-bind="visible: ! isEnabled()"><strong>${_('Sorting is currently disabled.')}</strong></span>
         </div>
       </div>
@@ -59,11 +59,12 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
         <div data-bind="visible: sortingFields().length == 0" style="padding-left: 10px;margin-bottom: 20px">
           <em>${_('There are currently no fields defined.')}</em>
         </div>
-        <div data-bind="foreach: sortingFields">
-          <div class="bubble">
+        <div data-bind="sortable: sortingFields">
+          <div class="bubble" style="cursor: move">
+            <i class="icon-move"></i>
             <strong><span data-bind="editable: label"></span></strong>
             <span style="color:#666;font-size: 12px">
-              (<span data-bind="text: field"></span> <i class="icon-arrow-up" data-bind="visible: asc() == true"></i><i class="icon-arrow-down" data-bind="visible: asc() == false"></i> <span data-bind="editable: order"></span> )
+              (<span data-bind="text: field"></span> <i class="icon-arrow-up" data-bind="visible: asc() == true"></i><i class="icon-arrow-down" data-bind="visible: asc() == false"></i> <span data-bind="editable: order"></span>, <input type="checkbox" data-bind="checked: include" style="margin-top:0" /> ${_('Default sorting')} )
             </span>
             <a class="btn btn-small" data-bind="click: $root.removeSortingField"><i class="icon-trash"></i></a>
           </div>
@@ -79,6 +80,9 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
             <button id="newFieldAsc" type="button" data-bind="css: {'active': newFieldAscDesc() == 'asc', 'btn': true}"><i class="icon-arrow-up"></i></button>
             <button id="newFieldDesc" type="button" data-bind="css: {'active': newFieldAscDesc() == 'desc', 'btn': true}"><i class="icon-arrow-down"></i></button>
           </div>
+          <label class="checkbox" style="display: inline">
+            <input id="newFieldInclude" type="checkbox" style="float:none;margin-left:0;margin-top: -2px;margin-right: 4px"  data-bind="checked: newFieldIncludeInSorting" /> ${_('Include in default sorting')}
+          </label>
           <br/>
           <br/>
           <a class="btn" data-bind="click: $root.addSortingField"><i class="icon-plus-sign"></i> ${_('Add to Sorting')}</a>
@@ -115,20 +119,21 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
   }
 </style>
 
-
+<script src="/search/static/js/knockout-sortable.min.js" type="text/javascript" charset="utf-8"></script>
 <script src="/static/ext/js/jquery/plugins/jquery-ui-draggable-droppable-sortable-1.8.23.min.js"></script>
 
 <script type="text/javascript">
 
-  var SortingField = function (field, label, asc) {
+  var SortingField = function (field, label, asc, include) {
     var _field = {
       field: field,
       label: ko.observable(label),
       asc: ko.observable(asc),
-      order: ko.observable(asc ? "ASC" : "DESC")
+      order: ko.observable(asc ? "ASC" : "DESC"),
+      include: ko.observable(include)
     };
     _field.label.subscribe(function (newValue) {
-      if ($().trim(newValue) == "") {
+      if ($.trim(newValue) == "") {
         _field.label(f.field);
       }
     });
@@ -140,6 +145,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
         _field.asc(true);
       }
     });
+
     return _field;
   }
 
@@ -150,7 +156,7 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
     self.isEnabled = ko.observable(${ hue_collection.sorting.data | n,unicode }.properties.is_enabled);
 
     self.sortingFields = ko.observableArray(ko.utils.arrayMap(${ hue_collection.sorting.data | n,unicode }.fields, function (obj) {
-      return new SortingField(obj.field, obj.label, obj.asc);
+      return new SortingField(obj.field, obj.label, obj.asc, obj.include);
     }));
 
     self.sortingFieldsList = ko.observableArray(${ hue_collection.fields(user) | n,unicode });
@@ -163,6 +169,8 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
     self.newFieldLabel = ko.observable("");
     self.newFieldAscDesc = ko.observable("asc");
 
+    self.newFieldIncludeInSorting = ko.observable(true);
+
     self.removeSortingField = function (field) {
       self.sortingFields.remove(field);
       self.sortingFieldsList.sort();
@@ -175,9 +183,10 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
       if (self.newFieldLabel() == ""){
         self.newFieldLabel(self.newFieldSelect());
       }
-      self.sortingFields.push(new SortingField(self.newFieldSelect(), self.newFieldLabel(), self.newFieldAscDesc() == "asc"));
+      self.sortingFields.push(new SortingField(self.newFieldSelect(), self.newFieldLabel(), self.newFieldAscDesc() == "asc", self.newFieldIncludeInSorting()));
       self.newFieldLabel("");
       self.newFieldAscDesc("asc");
+      self.newFieldIncludeInSorting(true);
       self.isEnabled(true);
     };
 

+ 14 - 0
apps/search/src/search/templates/search.mako

@@ -300,6 +300,20 @@ ${ commonheader(_('Search'), "search", user, "40px") | n,unicode }
         $("<option>").attr("value", item.label).text(item.label).data("field", item.field).data("asc", item.asc).appendTo($(".sort-by"));
       });
       var activeSorting = "${solr_query.get("sort", "")}";
+      if (activeSorting == ""){
+        // if the default sorting is just on one field, select that one
+        var _defaultSorting = "";
+        var _defaultSortingCnt = 0;
+        $.each(sortingData.fields, function (index, item) {
+          if (item.include) {
+            _defaultSorting = item.label;
+            _defaultSortingCnt++;
+          }
+        });
+        if (_defaultSortingCnt == 1){
+          $(".sort-by").val(_defaultSorting);
+        }
+      }
       if (activeSorting != "" && activeSorting.indexOf(" ") > -1) {
         $.each(sortingData.fields, function (index, item) {
           if (item.field == activeSorting.split(" ")[0] && item.asc == (activeSorting.split(" ")[1] == "asc")) {