moving more code over from list, etc. to grid
authorBill Erickson <berick@esilibrary.com>
Mon, 28 Apr 2014 20:26:20 +0000 (16:26 -0400)
committerBill Erickson <berick@esilibrary.com>
Mon, 28 Apr 2014 20:26:20 +0000 (16:26 -0400)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/templates/staff/cat/bucket/record/index.tt2
Open-ILS/src/templates/staff/cat/bucket/record/t_grid_menu.tt2 [new file with mode: 0644]
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/web/js/ui/default/staff/cat/bucket/record/app.js
Open-ILS/web/js/ui/default/staff/services/grid.js

index 4ebfb1e..f92c4aa 100644 (file)
@@ -6,7 +6,6 @@
 %]
 
 [% BLOCK APP_JS %]
-<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/list.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/grid.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/services/ui.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/bucket/record/app.js"></script>
@@ -42,6 +41,21 @@ changing routes with each tab selection anyway.
 </ul>
 <div class="tab-content">
   <div class="tab-pane active">
+
+    <!-- bucket info header -->
+    <div class="row">
+      <div class="col-md-6">
+        [% INCLUDE 'staff/cat/bucket/record/t_bucket_info.tt2' %]
+      </div>
+    </div>
+
+    <!-- bucket not accessible warning -->
+    <div class="col-md-10 col-md-offset-1" ng-show="forbidden">
+      <div class="alert alert-warning">
+        [% l('The selected bucket "{{bucketId}}" is not visible to this login.') %]
+      </div>
+    </div>
+
     <div ng-view></div>
   </div>
 </div>
diff --git a/Open-ILS/src/templates/staff/cat/bucket/record/t_grid_menu.tt2 b/Open-ILS/src/templates/staff/cat/bucket/record/t_grid_menu.tt2
new file mode 100644 (file)
index 0000000..a2e2bde
--- /dev/null
@@ -0,0 +1,20 @@
+
+<!-- global grid menu displayed on every Bucket page -->
+<eg-grid-menu-item label="[% l('New Bucket') %]" 
+  handler="openCreateBucketDialog"></eg-grid-menu-item>
+
+<eg-grid-menu-item label="[% l('Edit Bucket') %]" 
+  handler="openEditBucketDialog"></eg-grid-menu-item>
+
+<eg-grid-menu-item label="[% l('Delete Bucket') %]" 
+  handler="openDeleteBucketDialog"></eg-grid-menu-item>
+
+<eg-grid-menu-item label="[% l('Shared Bucket') %]" 
+  handler="openSharedBucketDialog"></eg-grid-menu-item>
+
+<eg-grid-menu-item divider="true"></eg-grid-menu-item>
+
+<eg-grid-menu-item ng-repeat="bkt in bucketSvc.allBuckets" 
+  label="{{bkt.name()}}" handler-data="bkt" 
+  handler="loadBucketFromMenu"></eg-grid-menu-item>
+
index 64c0b03..bd68db5 100644 (file)
@@ -1,15 +1,3 @@
-<div class="row">
-  <div class="col-md-6">
-    [% INCLUDE 'staff/cat/bucket/record/t_bucket_info.tt2' %]
-  </div>
-</div>
-
-<div class="col-md-10 col-md-offset-1" ng-show="forbidden">
-  <div class="alert alert-warning">
-    [% l('The selected bucket "{{bucketId}}" is not visible to this login.') %]
-  </div>
-</div>
-
 <eg-grid
   ng-hide="forbidden"
   id-field="id"
   auto-fields="true"
   items-provider="gridDataProvider"
   menu-label="[% l('Buckets') %]"
-  persist-key="eg.staff.cat.bucket.record.view">
+  persist-key="eg.staff.cat.bucket.record.pending">
 
-  <!-- global menu -->
-  <eg-grid-menu-item label="[% l('New Bucket') %]" 
-    handler="openCreateBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Edit Bucket') %]" 
-    handler="openEditBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Delete Bucket') %]" 
-    handler="openDeleteBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Shared Bucket') %]" 
-    handler="openSharedBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item divider="true"></eg-grid-menu-item>
-  <eg-grid-menu-item ng-repeat="bkt in bucketSvc.allBuckets" 
-    label="{{bkt.name()}}" handler-data="bkt" 
-    handler="loadBucketFromMenu"></eg-grid-menu-item>
+  [% INCLUDE 'staff/cat/bucket/record/t_grid_menu.tt2' %]
 
   <!-- actions drop-down -->
   <eg-grid-action label="[% l('Add To Bucket') %]" 
     handler="addToBucket"></eg-grid-action>
+
   <eg-grid-action label="[% l('Clear List') %]" 
     handler="clearPendingList"></eg-grid-action>
 
 </eg-grid>
-
-<!--
-
-          <li ng-class="{disabled : !bucket() || !pageList.selectedItems().length}">
-            <a href="javascript:;" ng-click="addToBucket()">[% l('Add Selected To Bucket') %]</a>
-          </li>
-
-          <li ng-class="{disabled : !bucket() || !pageList.count()}">
-            <a href="javascript:;" ng-click="addToBucket(true)">[% l('Add All To Bucket') %]</a>
-          </li>
-
-          <li ng-class="{disabled : !pageList.count()}">
-            <a href="javascript:;" ng-click="pageList.reset()">[% l('Clear List') %]</a>
-          </li>
--->
-
index d5ad337..4afc58e 100644 (file)
@@ -1,16 +1,6 @@
-<div class="row">
-  <div class="col-md-6">
-    [% INCLUDE 'staff/cat/bucket/record/t_bucket_info.tt2' %]
-  </div>
-</div>
-
-<div class="col-md-10 col-md-offset-1" ng-show="forbidden">
-  <div class="alert alert-warning">
-    [% l('The selected bucket "{{bucketId}}" is not visible to this login.') %]
-  </div>
-</div>
-
 <br/>
+
+<!-- search bar -->
 <div class="row">
   <div class="col-md-6">
     <form ng-submit="search()">
   auto-fields="true"
   query="gridQuery"
   menu-label="[% l('Buckets') %]"
-  persist-key="eg.staff.cat.bucket.record.view">
+  persist-key="eg.staff.cat.bucket.record.search">
 
-  <!-- global menu -->
-  <eg-grid-menu-item label="[% l('New Bucket') %]" 
-    handler="openCreateBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Edit Bucket') %]" 
-    handler="openEditBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Delete Bucket') %]" 
-    handler="openDeleteBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Shared Bucket') %]" 
-    handler="openSharedBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item divider="true"></eg-grid-menu-item>
-  <eg-grid-menu-item ng-repeat="bkt in bucketSvc.allBuckets" 
-    label="{{bkt.name()}}" handler-data="bkt" 
-    handler="loadBucketFromMenu"></eg-grid-menu-item>
+  [% INCLUDE 'staff/cat/bucket/record/t_grid_menu.tt2' %]
 
   <!-- actions drop-down -->
   <eg-grid-action label="[% l('Add To Pending') %]"
     handler="addToPending"></eg-grid-action>
+
   <eg-grid-action label="[% l('Add To Bucket') %]" 
     handler="addToBucket"></eg-grid-action>
 
index 06fc8a7..c2bc94e 100644 (file)
@@ -1,16 +1,3 @@
-
-<div class="row">
-  <div class="col-md-6">
-    [% INCLUDE 'staff/cat/bucket/record/t_bucket_info.tt2' %]
-  </div>
-</div>
-
-<div class="col-md-10 col-md-offset-1" ng-show="forbidden">
-  <div class="alert alert-warning">
-    [% l('The selected bucket "{{bucketId}}" is not visible to this login.') %]
-  </div>
-</div>
-
 <eg-grid
   ng-hide="forbidden"
   id-field="id"
   menu-label="[% l('Buckets') %]"
   persist-key="eg.staff.cat.bucket.record.view">
 
-  <!-- global menu -->
-  <eg-grid-menu-item label="[% l('New Bucket') %]" 
-    handler="openCreateBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Edit Bucket') %]" 
-    handler="openEditBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Delete Bucket') %]" 
-    handler="openDeleteBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item label="[% l('Shared Bucket') %]" 
-    handler="openSharedBucketDialog"></eg-grid-menu-item>
-  <eg-grid-menu-item divider="true"></eg-grid-menu-item>
-  <eg-grid-menu-item ng-repeat="bkt in bucketSvc.allBuckets" 
-    label="{{bkt.name()}}" handler-data="bkt" 
-    handler="loadBucketFromMenu"></eg-grid-menu-item>
+  [% INCLUDE 'staff/cat/bucket/record/t_grid_menu.tt2' %]
 
   <!-- actions drop-down -->
   <eg-grid-action label="[% l('Remove Selected Records') %]" 
     handler="detachRecords"></eg-grid-action>
+
   <eg-grid-action label="[% l('Export Records') %]" 
     handler="openExportBucketDialog"></eg-grid-action>
 
index cbc598e..9e0b6fa 100644 (file)
@@ -15,8 +15,9 @@
 angular.module('egCatRecordBuckets', 
     ['ngRoute', 'ui.bootstrap', 'egCoreMod', 'egUiMod', 'egGridMod'])
 
-.config(function($routeProvider, $locationProvider) {
+.config(function($routeProvider, $locationProvider, $compileProvider) {
     $locationProvider.html5Mode(true);
+    $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/); // grid export
 
     var resolver = {delay : function(egStartup) {return egStartup.go()}};
 
@@ -251,18 +252,11 @@ function($scope,  $location,  $q,  $timeout,  $modal,
                 $scope.tab + '/' + encodeURIComponent(id));
     }
 
-    // TODO: grid selected items..
-    $scope.addToBucket = function(all) {
-        /** TODO: open-ils.actor.container.item.create almost works
-         * with batches, but not quite ... */
-
-        var items = all ? $scope.pageList.items : 
-            $scope.pageList.selectedItems();
-        if (items.length == 0) return;
-
+    $scope.addToBucket = function(recs) {
+        if (recs.length == 0) return;
         bucketSvc.bucketNeedsRefresh = true;
 
-        angular.forEach(items,
+        angular.forEach(recs,
             function(rec) {
                 var item = new egIDL.cbrebi();
                 item.bucket(bucketSvc.currentBucket.id());
@@ -300,6 +294,7 @@ function($scope,  $location,  $q,  $timeout,  $modal,
                     if (!id) return;
                     bucketSvc.viewList = [];
                     bucketSvc.allBuckets = []; // reset
+                    bucketSvc.currentBucket = null;
                     $location.path(
                         '/cat/bucket/record/' + $scope.tab + '/' + id);
                 }
@@ -410,7 +405,12 @@ function($scope,  $routeParams,  egAuth,  egNet,  egIDL,  bucketSvc) {
     $scope.setTab('search');
     $scope.focusMe = true;
     var idQueryHash = {};
-    $scope.gridQuery = function() { return idQueryHash }
+    $scope.gridQuery = function() { 
+        if (bucketSvc.queryRecords.length)
+            return {id : bucketSvc.queryRecords};
+        else 
+            return {};
+    }
 
     // add selected items directly to the pending list
     $scope.addToPending = function(recs) {
@@ -432,13 +432,10 @@ function($scope,  $routeParams,  egAuth,  egNet,  egIDL,  bucketSvc) {
                 limit : 500 // meh
             }, bucketSvc.queryString, true
         ).then(function(resp) {
+            bucketSvc.queryRecords = 
+                resp.ids.map(function(id){return id[0]});
+        })['finally'](function() {
             $scope.searchInProgress = false;
-            bucketSvc.queryRecords = resp.ids.map(function(id){return id[0]});
-            if (bucketSvc.queryRecords.length) {
-                idQueryHash = {id : bucketSvc.queryRecords};
-            } else {
-                idQueryHash = {};
-            }
         });
     }
 
@@ -491,23 +488,21 @@ function($scope,  $q , $routeParams,  bucketSvc) {
 
     // idQuery contents will change with each bucket loaded
     // as the query changes, the grid will notice and refresh itself
-    var idQueryHash = {};
-    $scope.gridQuery = function() { return idQueryHash }
+    $scope.gridQuery = function() { 
+        if (bucketSvc.currentBucket) {
+            var ids = bucketSvc.currentBucket.items().map(
+                function(i){return i.target_biblio_record_entry()}
+            );
+            if (ids.length) return {id : ids};
+        }
+        return {};
+    }
 
     function drawBucket() {
-        bucketSvc.bucketNeedsRefresh = true; // meh about this..
-        return bucketSvc.fetchBucket($scope.bucketId).then(
-            function(bucket) {
-                ids = bucket.items().map(
-                    function(i){return i.target_biblio_record_entry()}
-                );
-                if (ids.length) {
-                    idQueryHash = {id : ids};
-                } else {
-                    idQueryHash = {}; // avoid empty array query errors
-                }
-            }
-        );
+        if (!$scope.bucketId ||
+            bucketSvc.bucketRefreshLevel($scope.bucketId) == 2) 
+            return $q.when();
+        return bucketSvc.fetchBucket($scope.bucketId);
     }
 
     $scope.detachRecords = function(records) {
@@ -522,18 +517,10 @@ function($scope,  $q , $routeParams,  bucketSvc) {
                 promises.push(bucketSvc.detachRecord(item[0].id()));
         });
 
+        bucketSvc.bucketNeedsRefresh = true;
         return $q.all(promises).then(drawBucket);
     }
 
-    // avoid re-fetching the records for a bucket if the bucket
-    // is already loaded and we are navigating back to the 
-    // view tab.
-    if ($scope.bucketId && (
-            bucketSvc.bucketRefreshLevel($scope.bucketId) == 1 ||
-            bucketSvc.currentBucket.items().length == 0) ) {
-
-        drawBucket()['catch'](
-            function() { $scope.forbidden = true }
-        );
-    }
+    // fetch the bucket;  on error show the not-allowed message
+    drawBucket()['catch'](function() { $scope.forbidden = true });
 }])
index 46a5c78..6f444f1 100644 (file)
@@ -130,7 +130,11 @@ angular.module('egGridMod',
 
                     $scope.$watch(
                         function() { return $scope.query() }, 
-                        function() { grid.collect() },
+                        function(newVal, oldVal) { 
+                            // hmm, why is this check necessary?
+                            if (!angular.equals(newVal, oldVal))
+                                grid.collect() 
+                        },
                         true // object comparison
                     );
                 }
@@ -912,14 +916,19 @@ angular.module('egGridMod',
                 egGridCtrl.dragColumn = attrs.column;
                 egGridCtrl.dragType = attrs.dragType || 'move'; // or resize
                 egGridCtrl.colResizeDir = 0;
-                angular.element(e.target).addClass(
-                    'eg-grid-column-move-handle-active');
+
+                if (egGridCtrl.dragType == 'move') {
+                    // style the column getting moved
+                    angular.element(e.target).addClass(
+                        'eg-grid-column-move-handle-active');
+                }
             });
 
             element.bind('dragend', function(e) {
-                if (egGridCtrl.dragType == 'move')
+                if (egGridCtrl.dragType == 'move') {
                     angular.element(e.target).removeClass(
                         'eg-grid-column-move-handle-active');
+                }
             });
         }
     };