grid config persistence; slimmer persist keys
authorBill Erickson <berick@esilibrary.com>
Mon, 5 May 2014 18:11:10 +0000 (14:11 -0400)
committerBill Erickson <berick@esilibrary.com>
Mon, 5 May 2014 18:11:10 +0000 (14:11 -0400)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/templates/staff/cat/bucket/record/t_pending.tt2
Open-ILS/src/templates/staff/cat/bucket/record/t_search.tt2
Open-ILS/src/templates/staff/cat/bucket/record/t_view.tt2
Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2
Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2
Open-ILS/src/templates/staff/circ/patron/t_holds.tt2
Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2
Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2
Open-ILS/src/templates/staff/parts/t_autogrid.tt2
Open-ILS/web/js/ui/default/staff/services/grid.js

index bd68db5..13aee3e 100644 (file)
@@ -5,7 +5,7 @@
   auto-fields="true"
   items-provider="gridDataProvider"
   menu-label="[% l('Buckets') %]"
-  persist-key="eg.staff.cat.bucket.record.pending">
+  persist-key="cat.bucket.record.pending">
 
   [% INCLUDE 'staff/cat/bucket/record/t_grid_menu.tt2' %]
 
index 4afc58e..0117fbc 100644 (file)
@@ -32,7 +32,7 @@
   auto-fields="true"
   query="gridQuery"
   menu-label="[% l('Buckets') %]"
-  persist-key="eg.staff.cat.bucket.record.search">
+  persist-key="cat.bucket.record.search">
 
   [% INCLUDE 'staff/cat/bucket/record/t_grid_menu.tt2' %]
 
index c2bc94e..bdf6bfb 100644 (file)
@@ -5,7 +5,7 @@
   auto-fields="true"
   query="gridQuery"
   menu-label="[% l('Buckets') %]"
-  persist-key="eg.staff.cat.bucket.record.view">
+  persist-key="cat.bucket.record.view">
 
   [% INCLUDE 'staff/cat/bucket/record/t_grid_menu.tt2' %]
 
index 44564c6..2321f95 100644 (file)
@@ -5,7 +5,7 @@
   features="-display,-sort,-multisort"
   main-label="[% l('Items Checked In') %]"
   items-provider="gridDataProvider"
-  persist-key="eg.staff.circ.checkin">
+  persist-key="circ.checkin">
   <eg-grid-field label="[% ('Circ ID') %]"      path='payload.circ.id' visible></eg-grid-field>
   <eg-grid-field label="[% ('Barcode') %]"      path='copy_barcode' visible></eg-grid-field>
   <eg-grid-field label="[% l('Due Date') %]"    path='payload.circ.due_date' visible></eg-grid-field>
index 9a37949..5b44858 100644 (file)
@@ -39,7 +39,7 @@
   features="-display,-sort,-multisort"
   main-label="[% l('Checkouts') %]"
   items-provider="gridDataProvider"
-  persist-key="eg.staff.circ.patron.checkout">
+  persist-key="circ.patron.checkout">
   <eg-grid-field label="[% ('Barcode') %]"      path='copy_barcode' visible></eg-grid-field>
   <eg-grid-field label="[% ('Circ ID') %]"      path='payload.circ.id' visible></eg-grid-field>
   <eg-grid-field label="[% l('Due Date') %]"    path='payload.circ.due_date' visible></eg-grid-field>
index b18a3bb..983f566 100644 (file)
@@ -5,7 +5,7 @@
   features="-display,-sort,-multisort"
   main-label="[% l('Items On Hold') %]"
   items-provider="gridDataProvider"
-  persist-key="eg.staff.circ.patron.holds">
+  persist-key="circ.patron.holds">
   <eg-grid-field label="[% ('Hold ID') %]" path='hold.id' visible></eg-grid-field>
   <eg-grid-field label="[% ('Current Copy') %]" path='hold.current_copy.barcode' visible></eg-grid-field>
   <eg-grid-field label="[% l('Request Date') %]" path='hold.request_time' visible></eg-grid-field>
index 4b8e1b9..612c732 100644 (file)
@@ -6,7 +6,7 @@
   features="-display,-sort,-multisort"
   main-label="[% l('Items Checked Out') %]"
   items-provider="gridDataProvider"
-  persist-key="eg.staff.circ.patron.items_out">
+  persist-key="circ.patron.items_out">
   <eg-grid-field label="[% l('Circ ID') %]" path='id' visible></eg-grid-field>
   <eg-grid-field label="[% l('Barcode') %]" path='target_copy.barcode' visible></eg-grid-field>
   <eg-grid-field label="[% l('Due Date') %]" path='due_date' visible></eg-grid-field>
index 2166382..c3a3a96 100644 (file)
@@ -3,7 +3,7 @@
   features="-sort,-display,-multisort"
   main-label="[% l('Patron Search Results') %]"
   items-provider="patronSearchGridProvider"
-  persist-key="eg.staff.circ.patron.search">
+  persist-key="circ.patron.search">
   <eg-grid-field label="[% ('ID') %]" path='id' visible></eg-grid-field>
   <eg-grid-field label="[% ('Card') %]" path='card.barcode' visible></eg-grid-field>
   <eg-grid-field label="[% ('Last Name') %]" path='family_name' visible sortable multisortable></eg-grid-field>
index 26d3eb6..bdea007 100644 (file)
         <span class="glyphicon glyphicon-wrench"></span>
         [% l('Configure Columns') %]
       </a></li>
+      <li><a href='' ng-click="saveConfig()">
+        <span class="glyphicon glyphicon-floppy-save"></span>
+        [% l('Save Columns') %]
+      </a></li>
       <li><a href='' ng-click="showAllColumns()">
         <span class="glyphicon glyphicon-resize-full"></span>
         [% l('Show All Columns') %]
index 4843971..742e492 100644 (file)
@@ -79,10 +79,10 @@ angular.module('egGridMod',
         },
 
         controller : [
-                    '$scope','egIDL','egAuth','egNet', 'egGridFlatDataProvider',
-                    'egGridColumnsProvider','$filter','$window','egHatch',
-            function($scope,  egIDL,  egAuth,  egNet,  egGridFlatDataProvider,  
-                     egGridColumnsProvider , $filter , $window , egHatch) {
+                    '$scope','$q','egCore','egGridFlatDataProvider',
+                    'egGridColumnsProvider','$filter','$window',
+            function($scope,  $q , egCore,  egGridFlatDataProvider,  
+                     egGridColumnsProvider , $filter , $window) {
 
             var grid = this;
 
@@ -137,7 +137,6 @@ angular.module('egGridMod',
                     defaultToNoMultiSort : (features.indexOf('-multisort') > -1)
                 });
 
-                $scope.columns = grid.columnsProvider.columns;
                 $scope.showAllColumns = function() {
                     grid.columnsProvider.showAllColumns();
                 }
@@ -146,9 +145,9 @@ angular.module('egGridMod',
                 }
 
                 if ($scope.autoFields) {
-                    grid.indexField = egIDL.classes[grid.idlClass].pkey;
+                    grid.indexField = egCore.idl.classes[grid.idlClass].pkey;
                     if (grid.autoLabel)
-                        $scope.mainLabel = egIDL.classes[grid.idlClass].label;
+                        $scope.mainLabel = egCore.idl.classes[grid.idlClass].label;
                     grid.columnsProvider.compileAutoColumns();
                     delete $scope.autoFields;
                 }
@@ -195,7 +194,85 @@ angular.module('egGridMod',
                     }
                 }
     
-                grid.compileSort();
+                grid.loadConfig().then(function() { 
+                    // link columns to scope after loadConfig(), since it
+                    // replaces the columns array.
+                    $scope.columns = grid.columnsProvider.columns;
+                });
+            }
+
+            // save the columns configuration (position, sort, width) to
+            // eg.grid.<persist-key>
+            $scope.saveConfig = function() {
+                if (!grid.persistKey) {
+                    console.warn(
+                        "Cannot save settings without a grid persist-key");
+                    return;
+                }
+                var conf = grid.columnsProvider.columns.map(
+                    function(col) {
+                        var c = {
+                            name : col.name,
+                            flex : col.flex,
+                        };
+                        // preserve prefs space by only storing values that
+                        // are non-default
+                        if (Number(col.sort)) c.sort = Number(col.sort);
+                        if (Boolean(col.visible)) c.visible = true;
+                        return c;
+                    }
+                );
+
+                egCore.hatch.setItem('eg.grid.' + grid.persistKey, conf)
+                .then(function() { 
+                    // Save operation performed from the grid configuration UI.
+                    // Hide the configuration UI and re-draw w/ sort applied
+                    if ($scope.showGridConf) 
+                        $scope.toggleConfDisplay();
+                });
+            }
+
+            // load the columns configuration (position, sort, width) from
+            // eg.grid.<persist-key> and apply the loaded settings to the
+            // columns on our columnsProvider
+            grid.loadConfig = function() {
+                if (!grid.persistKey) return $q.when();
+
+                return egCore.hatch.getItem('eg.grid.' + grid.persistKey)
+                .then(function(conf) {
+                    if (!conf) return;
+
+                    var columns = grid.columnsProvider.columns;
+                    var new_cols = [];
+
+                    angular.forEach(conf, function(col) {
+                        var grid_col = columns.filter(
+                            function(c) {return c.name == col.name})[0];
+
+                        if (!grid_col) {
+                            // saved column does not match a column in the 
+                            // current grid.  skip it.
+                            return;
+                        }
+
+                        grid_col.flex = col.flex;
+                        grid_col.sort = col.sort || 0;
+                        grid_col.visible = col.visible || false;
+                        new_cols.push(grid_col);
+                    });
+
+                    // check for new columns which are not yet expressed
+                    // within the saved configuration and tack them onto
+                    // the end of the columns list
+                    angular.forEach(columns, function(col) {
+                        var found = conf.filter(
+                            function(c) {return (c.name == col.name)})[0];
+                        if (!found) new_cols.push(col);
+                    });
+
+                    grid.columnsProvider.columns = new_cols;
+                    grid.compileSort();
+                });
             }
 
             $scope.onContextMenu = function($event) {
@@ -496,6 +573,7 @@ angular.module('egGridMod',
                 // the columns array, then force a page refresh
                 grid.columnsProvider.columns.splice(srcIdx, 1);
                 grid.columnsProvider.columns.splice(targetIdx, 0, srcCol);
+                console.log(JSON.stringify(grid.columnsProvider.columns,'',2));
                 $scope.$apply(); 
             }
 
@@ -529,7 +607,7 @@ angular.module('egGridMod',
             }
 
             $scope.printCSV = function() {
-                egHatch.print('text/plain', grid.generateCSV())
+                egCore.hatch.print('text/plain', grid.generateCSV())
                 .then(function() { console.debug('print complete') });
             }
 
@@ -652,7 +730,7 @@ angular.module('egGridMod',
     };
 })
 
-.factory('egGridColumnsProvider', ['egIDL', function(egIDL) {
+.factory('egGridColumnsProvider', ['egCore', function(egCore) {
 
     function ColumnsProvider(args) {
         var cols = this;
@@ -697,7 +775,7 @@ angular.module('egGridMod',
 
         cols.compileAutoColumns = function() {
 
-            var idl_class = egIDL.classes[cols.idlClass];
+            var idl_class = egCore.idl.classes[cols.idlClass];
 
             angular.forEach(
                 idl_class.fields.sort(
@@ -710,7 +788,7 @@ angular.module('egGridMod',
                         // as the display field for the columns.
                         // flattener will take care of the fleshing.
                         if (field['class']) {
-                            var selector_field = egIDL.classes[field['class']].fields
+                            var selector_field = egCore.idl.classes[field['class']].fields
                                 .filter(function(f) { return Boolean(f.selector) })[0];
                             if (selector_field) {
                                 field.path = field.name + '.' + selector_field.selector;
@@ -776,7 +854,7 @@ angular.module('egGridMod',
         // finds the IDL field from the dotpath, using the columns
         // idlClass as the base.
         cols.idlFieldFromPath = function(dotpath) {
-            var class_obj = egIDL.classes[cols.idlClass];
+            var class_obj = egCore.idl.classes[cols.idlClass];
             var path_parts = dotpath.split(/\./);
 
             // for() == early exit
@@ -798,7 +876,7 @@ angular.module('egGridMod',
                 if (idl_field && idl_field['class'] && (
                     idl_field.datatype == 'link' || 
                     idl_field.datatype == 'org_unit')) {
-                    class_obj = egIDL.classes[idl_field['class']];
+                    class_obj = egCore.idl.classes[idl_field['class']];
                 } else {
                     if (path_idx < (path_parts.length - 1)) {
                         // we ran out of classes to hop through before
@@ -824,8 +902,8 @@ angular.module('egGridMod',
  * meet the needs of each individual grid.
  */
 .factory('egGridDataProvider', 
-           ['$q','$timeout','$filter','egNet','egAuth','egIDL',
-    function($q , $timeout , $filter , egNet , egAuth , egIDL) {
+           ['$q','$timeout','$filter','egCore',
+    function($q , $timeout , $filter , egCore) {
 
         function GridDataProvider(args) {
             var gridData = this;
@@ -896,7 +974,7 @@ angular.module('egGridMod',
                     }
 
                     cls = obj.classname;
-                    if (cls && (clsobj = egIDL.classes[cls])) {
+                    if (cls && (clsobj = egCore.idl.classes[cls])) {
                         idlField = clsobj.fields.filter(
                             function(f) { return f.name == step })[0];
                         obj = obj[step]();
@@ -927,8 +1005,8 @@ angular.module('egGridMod',
 // Factory service for egGridDataManager instances, which are
 // responsible for collecting flattened grid data.
 .factory('egGridFlatDataProvider', 
-           ['$q','egNet','egAuth','egGridDataProvider',
-    function($q , egNet , egAuth , egGridDataProvider) {
+           ['$q','egCore','egGridDataProvider',
+    function($q , egCore , egGridDataProvider) {
 
         return {
             instance : function(args) {
@@ -951,10 +1029,10 @@ angular.module('egGridMod',
                         }
                     );
 
-                    return egNet.request(
+                    return egCore.net.request(
                         'open-ils.fielder',
                         'open-ils.fielder.flattened_search',
-                        egAuth.token(), provider.idlClass, 
+                        egCore.auth.token(), provider.idlClass, 
                         queryFields, query,
                         {   sort : provider.sort,
                             limit : count,