webstaff: teach serials grid how to resort on status, date expected, and date received
authorGalen Charlton <gmc@equinoxinitiative.org>
Wed, 14 Jun 2017 16:33:07 +0000 (12:33 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Wed, 14 Jun 2017 16:33:07 +0000 (12:33 -0400)
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Open-ILS/src/templates/staff/serials/t_view_items_grid.tt2
Open-ILS/web/js/ui/default/staff/serials/directives/view-items-grid.js
Open-ILS/web/js/ui/default/staff/serials/services/core.js

index 36f6bb2..acbb8e0 100644 (file)
@@ -83,9 +83,9 @@
     <eg-grid-field label="[% l('Issuance') %]" path="issuance.label" visible></eg-grid-field>
     <eg-grid-field label="[% l('Barcode') %]" path="unit.barcode" visible></eg-grid-field>
     <eg-grid-field label="[% l('Publication Date') %]" path="issuance.date_published" visible>{{item.issuance.date_published|date:'shortDate'}}</eg-grid-field>
-    <eg-grid-field label="[% l('Status') %]" path="status" visible></eg-grid-field>
-    <eg-grid-field label="[% l('Date Expected') %]" path="date_expected" visible>{{item.date_expected|date:'shortDate'}}</eg-grid-field>
-    <eg-grid-field label="[% l('Date Received') %]" path="date_received" visible>{{item.date_received|date:'shortDate'}}</eg-grid-field>
+    <eg-grid-field label="[% l('Status') %]" path="status" sortable visible></eg-grid-field>
+    <eg-grid-field label="[% l('Date Expected') %]" path="date_expected" sortable visible>{{item.date_expected|date:'shortDate'}}</eg-grid-field>
+    <eg-grid-field label="[% l('Date Received') %]" path="date_received" sortable visible>{{item.date_received|date:'shortDate'}}</eg-grid-field>
     <eg-grid-field label="[% l('Holding Type') %]" path="issuance.holding_type" visible></eg-grid-field>
     <eg-grid-field label="[% l('Route To') %]" path="stream.routing_label"></eg-grid-field>
     <eg-grid-field label="[% l('Receiving Template') %]" path="stream.distribution.receive_unit_template.name" visible></eg-grid-field>
index 2f7e298..a9f8d68 100644 (file)
@@ -38,20 +38,49 @@ function($scope , $q , egSerialsCoreSvc , egCore , egGridDataProvider , orderByF
         activateItem : function (item) { } // TODO
     };
 
+    function compileSort(sort) {
+        if (sort && angular.isArray(sort) && sort.length == 1) {
+            if (angular.isObject(sort[0])) {
+                for (key in sort[0]) {
+                    return {
+                        'class'   : 'sitem',
+                        field     :  key,
+                        direction : sort[0][key]
+                    };
+                }
+            } else {
+                return { 'class': 'sitem', field: sort[0] };
+            }
+        }
+    }
+    var current_sort = [];
     $scope.itemGridProvider = egGridDataProvider.instance({
         get : function(offset, count) {
             var self = this;
-            if (egSerialsCoreSvc.itemList.length >= offset + count) { // if there's anything on the requested page, notify
+            if (angular.equals(current_sort, self.sort) && egSerialsCoreSvc.itemList.length >= offset + count) { // if there's anything on the requested page, notify
                 return self.arrayNotifier(egSerialsCoreSvc.itemList, offset, count);
             } else { // else try to fetch another page
-                return egSerialsCoreSvc.fetchItemsForSubPaged(
-                    $scope.ssubId,
-                    _paging_filter,
-                    egSerialsCoreSvc.itemList.length,
-                    count + offset - egSerialsCoreSvc.itemList.length
-                ).then(function() {
-                    return self.arrayNotifier(egSerialsCoreSvc.itemList, offset, count);
-                });
+                if (angular.equals(current_sort, self.sort)) {
+                    return egSerialsCoreSvc.fetchItemsForSubPaged(
+                        $scope.ssubId,
+                        _paging_filter,
+                        egSerialsCoreSvc.itemList.length,
+                        count + offset - egSerialsCoreSvc.itemList.length,
+                        compileSort(self.sort)
+                    ).then(function() {
+                        return self.arrayNotifier(egSerialsCoreSvc.itemList, offset, count);
+                    });
+                } else {
+                    current_sort = self.sort;
+                    return egSerialsCoreSvc.fetchItemsForSub(
+                        $scope.ssubId,
+                        _paging_filter,
+                        null,
+                        compileSort(self.sort)
+                    ).then(function() {
+                        return self.arrayNotifier(egSerialsCoreSvc.itemList, offset, count);
+                    });
+                }
             }
         }
     });
index ec10939..8ace6ab 100644 (file)
@@ -194,16 +194,17 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm
         });
     }
 
-    service.fetchItemsForSubPaged = function(subId,filter,offset,limit) {
+    service.fetchItemsForSubPaged = function(subId,filter,offset,limit,sort) {
         return service.fetchItemsForSub(
             subId,
             filter,
-            { limit : limit, offset : offset, paging : true }
+            { limit : limit, offset : offset, paging : true },
+            sort
         );
     }
 
     // Creates an inverted tree from item to sub
-    service.fetchItemsForSub = function(subId,filter,options) {
+    service.fetchItemsForSub = function(subId,filter,options,sort) {
         var deferred = $q.defer(); // side-effects only, otherwise the grid is wonky
 
         if (!filter) filter = {};
@@ -233,6 +234,11 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm
                 sitem : ['issuance','editor','creator','unit','url']
             }
         });
+        if (sort) {
+            angular.extend(options, {
+                order_by : [sort]
+            });
+        }
 
         egCore.pcrud.search(
             'sitem', filter, options,
@@ -283,7 +289,11 @@ function(egCore , orderByFilter , $q , $filter , $uibModal , ngToast , egConfirm
             });
 
             // ... then sort it
-            service.itemList = orderByFilter(hashList, ['"issuance.date_published"', '"stream.distribution.holding_lib.name"', '"id"']);
+            if (sort) {
+                service.itemList = hashList;
+            } else {
+                service.itemList = orderByFilter(hashList, ['"issuance.date_published"', '"stream.distribution.holding_lib.name"', '"id"']);
+            }
             deferred.resolve();
         });