From ad68671e80013a3b66d7644635316a9d468328ed Mon Sep 17 00:00:00 2001 From: Bill Erickson Date: Mon, 5 May 2014 14:11:10 -0400 Subject: [PATCH] grid config persistence; slimmer persist keys Signed-off-by: Bill Erickson --- .../staff/cat/bucket/record/t_pending.tt2 | 2 +- .../templates/staff/cat/bucket/record/t_search.tt2 | 2 +- .../templates/staff/cat/bucket/record/t_view.tt2 | 2 +- .../staff/circ/checkin/t_checkin_table.tt2 | 2 +- .../src/templates/staff/circ/patron/t_checkout.tt2 | 2 +- .../src/templates/staff/circ/patron/t_holds.tt2 | 2 +- .../templates/staff/circ/patron/t_items_out.tt2 | 2 +- .../staff/circ/patron/t_search_results.tt2 | 2 +- Open-ILS/src/templates/staff/parts/t_autogrid.tt2 | 4 + Open-ILS/web/js/ui/default/staff/services/grid.js | 120 +++++++++++++++++---- 10 files changed, 111 insertions(+), 29 deletions(-) diff --git a/Open-ILS/src/templates/staff/cat/bucket/record/t_pending.tt2 b/Open-ILS/src/templates/staff/cat/bucket/record/t_pending.tt2 index bd68db5556..13aee3e9f3 100644 --- a/Open-ILS/src/templates/staff/cat/bucket/record/t_pending.tt2 +++ b/Open-ILS/src/templates/staff/cat/bucket/record/t_pending.tt2 @@ -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' %] diff --git a/Open-ILS/src/templates/staff/cat/bucket/record/t_search.tt2 b/Open-ILS/src/templates/staff/cat/bucket/record/t_search.tt2 index 4afc58eeb7..0117fbc421 100644 --- a/Open-ILS/src/templates/staff/cat/bucket/record/t_search.tt2 +++ b/Open-ILS/src/templates/staff/cat/bucket/record/t_search.tt2 @@ -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' %] diff --git a/Open-ILS/src/templates/staff/cat/bucket/record/t_view.tt2 b/Open-ILS/src/templates/staff/cat/bucket/record/t_view.tt2 index c2bc94e390..bdf6bfb5a1 100644 --- a/Open-ILS/src/templates/staff/cat/bucket/record/t_view.tt2 +++ b/Open-ILS/src/templates/staff/cat/bucket/record/t_view.tt2 @@ -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' %] diff --git a/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 b/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 index 44564c6a51..2321f95b25 100644 --- a/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 +++ b/Open-ILS/src/templates/staff/circ/checkin/t_checkin_table.tt2 @@ -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"> diff --git a/Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2 index 9a3794997c..5b44858208 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_checkout.tt2 @@ -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"> diff --git a/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 index b18a3bb522..983f566b12 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_holds.tt2 @@ -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"> diff --git a/Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2 index 4b8e1b9a29..612c732de7 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_items_out.tt2 @@ -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"> diff --git a/Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2 index 21663828b6..c3a3a96f11 100644 --- a/Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2 +++ b/Open-ILS/src/templates/staff/circ/patron/t_search_results.tt2 @@ -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"> diff --git a/Open-ILS/src/templates/staff/parts/t_autogrid.tt2 b/Open-ILS/src/templates/staff/parts/t_autogrid.tt2 index 26d3eb6741..bdea007c42 100644 --- a/Open-ILS/src/templates/staff/parts/t_autogrid.tt2 +++ b/Open-ILS/src/templates/staff/parts/t_autogrid.tt2 @@ -115,6 +115,10 @@ [% l('Configure Columns') %] +
  • + + [% l('Save Columns') %] +
  • [% l('Show All Columns') %] diff --git a/Open-ILS/web/js/ui/default/staff/services/grid.js b/Open-ILS/web/js/ui/default/staff/services/grid.js index 48439714a2..742e4921de 100644 --- a/Open-ILS/web/js/ui/default/staff/services/grid.js +++ b/Open-ILS/web/js/ui/default/staff/services/grid.js @@ -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. + $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. 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, -- 2.11.0