%]
[% 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>
</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>
--- /dev/null
+
+<!-- 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>
+
-<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>
--->
-
-<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>
-
-<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>
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()}};
$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());
if (!id) return;
bucketSvc.viewList = [];
bucketSvc.allBuckets = []; // reset
+ bucketSvc.currentBucket = null;
$location.path(
'/cat/bucket/record/' + $scope.tab + '/' + id);
}
$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) {
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 = {};
- }
});
}
// 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) {
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 });
}])
$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
);
}
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');
+ }
});
}
};