5 angular.module('egVolCopy',
6 ['ngRoute', 'ui.bootstrap', 'egCoreMod', 'egUiMod', 'egGridMod'])
8 .filter('boolText', function(){
14 .config(function($routeProvider, $locationProvider, $compileProvider) {
15 $locationProvider.html5Mode(true);
16 $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/); // grid export
19 delay : ['egStartup', function(egStartup) { return egStartup.go(); }]
22 $routeProvider.when('/cat/volcopy/:dataKey', {
23 templateUrl: './cat/volcopy/t_view',
24 controller: 'EditCtrl',
32 function(egCore , $q) {
35 tree : {}, // holds lib->cn->copy hash stack
36 copies : [] // raw copy list
39 // returns a promise resolved with the list of circ mods
40 service.get_classifications = function() {
42 return $q.when(egCore.env.acnc.list);
44 return egCore.pcrud.retrieveAll('acnc', null, {atomic : true})
45 .then(function(list) {
46 egCore.env.absorbList(list, 'acnc');
51 service.get_prefixes = function(org) {
53 return $q.when(egCore.env.acnp.list);
55 return egCore.pcrud.search('acnp',
56 {owning_lib : egCore.org.fullPath(org, true)},
58 ).then(function(list) {
59 egCore.env.absorbList(list, 'acnp');
65 service.get_suffixes = function(org) {
67 return $q.when(egCore.env.acns.list);
69 return egCore.pcrud.search('acns',
70 {owning_lib : egCore.org.fullPath(org, true)},
72 ).then(function(list) {
73 egCore.env.absorbList(list, 'acns');
79 service.get_statuses = function() {
81 return $q.when(egCore.env.ccs.list);
83 return egCore.pcrud.retrieveAll('ccs', {}, {atomic : true}).then(
85 egCore.env.absorbList(list, 'ccs');
92 service.bmp_parts = {};
93 service.get_parts = function(rec) {
94 if (service.bmp_parts[rec])
95 return $q.when(service.bmp_parts[rec]);
97 return egCore.pcrud.search('bmp',
100 ).then(function(list) {
101 service.bmp_parts[rec] = list;
110 acp : ['call_number','parts','location'],
111 acn : ['label_class','prefix','suffix']
115 service.addCopy = function (cp) {
117 var lib = cp.call_number().owning_lib();
118 var cn = cp.call_number().id();
120 // XXX need to change this data structure, likely...
121 if (!service.tree[lib]) service.tree[lib] = {};
122 if (!service.tree[lib][cn]) service.tree[lib][cn] = [];
124 service.tree[lib][cn].push(cp);
125 service.copies.push(cp);
128 service.fetchIds = function(idList) {
129 service.tree = {}; // clear the tree on fetch
130 service.copies = []; // clear the copy list on fetch
131 return egCore.pcrud.search('acp', { 'id' : idList }, service.flesh).then(null,null,
133 service.addCopy(copy);
141 .directive("egVolCopyEdit", function () {
147 '<div class="col-xs-6"><input type="text" ng-model="barcode" ng-change="updateBarcode()"/></div>'+
148 '<div class="col-xs-2"><input type="number" ng-model="copy_number" ng-change="updateCopyNo()"/></div>'+
149 '<div class="col-xs-4"><eg-basic-combo-box list="parts" selected="part"></eg-basic-combo-box></div>'+
152 scope: { copy: "=", callNumber: "=" },
153 controller : ['$scope','itemSvc',
154 function ( $scope , itemSvc ) {
155 $scope.new_part_id = 0;
157 $scope.updateBarcode = function () { $scope.copy.barcode($scope.barcode); $scope.copy.ischanged(1); };
158 $scope.updateCopyNo = function () { $scope.copy.copy_number($scope.copy_number); $scope.copy.ischanged(1); };
159 $scope.updatePart = function () {
160 var p = angular.filter($scope.part_list, function (x) {
161 return x.label() == $scope.part
163 if (p.length > 0) { // preexisting part
165 } else { // create one...
166 var part = new egCore.idl.bmp();
167 part.id( --$scope.new_part_id );
169 part.label( $scope.part );
170 part.record( $scope.callNumber.owning_lib() );
171 $scope.copy.parts([part]);
172 $scope.copy.ischanged(1);
176 $scope.barcode = $scope.copy.barcode();
177 $scope.copy_number = $scope.copy.copy_number();
179 if ($scope.copy.parts()) {
180 $scope.part = $scope.copy.parts()[0];
181 if ($scope.part) $scope.part = $scope.part.label();
185 $scope.part_list = [];
187 itemSvc.get_parts($scope.callNumber.record()).then(function(list){
188 $scope.part_list = list;
189 angular.forEach(list, function(p){ $scope.parts.push(p.label()) });
198 .directive("egVolRow", function () {
205 '<div class="col-xs-1">'+
206 '<select ng-model="classification" ng-options="cl.name() for cl in classification_list track by idTracker(cl)"/>'+
208 '<div class="col-xs-1">'+
209 '<select ng-model="prefix" ng-change="updatePrefix()" ng-options="p.label() for p in prefix_list track by idTracker(p)"/>'+
211 '<div class="col-xs-3"><input type="text" ng-change="updateLabel()" ng-model="label"/></div>'+
212 '<div class="col-xs-1">'+
213 '<select ng-model="suffix" ng-change="updateSuffix()" ng-options="s.label() for s in suffix_list track by idTracker(s)"/>'+
215 '<div class="col-xs-1"><input type="number" ng-model="copy_count" min="{{orig_copy_count}}" ng-change="changeCPCount()"></div>'+
216 '<div class="col-xs-5">'+
217 '<div class="container-fluid">'+
218 '<eg-vol-copy-edit ng-repeat="cp in copies track by idTracker(cp)" copy="cp" call-number="callNumber"></eg-vol-copy-edit>'+
223 scope: { copies: "=" },
224 controller : ['$scope','itemSvc','egCore',
225 function ( $scope , itemSvc , egCore ) {
226 $scope.new_cp_id = 0;
227 $scope.callNumber = $scope.copies[0].call_number();
229 $scope.idTracker = function (x) { if (x) return x.id() };
231 $scope.suffix_list = [];
232 itemSvc.get_suffixes($scope.callNumber.owning_lib()).then(function(list){
233 $scope.suffix_list = list;
235 $scope.updateSuffix = function () { $scope.callNumber.suffix($scope.suffix); $scope.callNumber.ischanged(1); };
237 $scope.prefix_list = [];
238 itemSvc.get_prefixes($scope.callNumber.owning_lib()).then(function(list){
239 $scope.prefix_list = list;
241 $scope.updatePrefix = function () { $scope.callNumber.prefix($scope.prefix); $scope.callNumber.ischanged(1); };
243 $scope.classification_list = [];
244 itemSvc.get_classifications().then(function(list){
245 $scope.classification_list = list;
247 $scope.updateClassification = function () { $scope.callNumber.label_class($scope.classification); $scope.callNumber.ischanged(1); };
249 $scope.classification = $scope.callNumber.label_class();
250 $scope.prefix = $scope.callNumber.prefix();
251 $scope.suffix = $scope.callNumber.suffix();
253 $scope.label = $scope.callNumber.label();
254 $scope.updateLabel = function () { $scope.callNumber.label($scope.label); $scope.callNumber.ischanged(1); };
256 $scope.copy_count = $scope.copies.length;
257 $scope.orig_copy_count = $scope.copy_count;
259 $scope.changeCPCount = function () {
260 while ($scope.copy_count > $scope.copies.length) {
261 var cp = new egCore.idl.acp();
262 cp.id( --$scope.new_cp_id );
264 cp.circ_lib( $scope.lib );
265 cp.call_number( $scope.callNumber );
266 $scope.copies.push( cp );
269 var how_many = $scope.copies.length - $scope.copy_count;
271 $scope.copies.splice($scope.copy_count,how_many);
272 $scope.callNumber.copies($scope.copies);
282 .directive("egVolEdit", function () {
288 '<div class="col-xs-1"><eg-org-selector selected="owning_lib" disableTest="cant_have_vols"></eg-org-selector></div>'+
289 '<div class="col-xs-1"><input type="number" min="{{orig_cn_count}}" ng-model="cn_count" ng-change="changeCNCount()"/></div>'+
290 '<div class="col-xs-10">'+
291 '<div class="container-fluid">'+
292 '<eg-vol-row ng-repeat="(cn,copies) in struct track by cn" copies="copies"></eg-vol-row>'+
297 scope: { struct: "=", lib: "@", record: "@" },
298 controller : ['$scope','itemSvc','egCore',
299 function ( $scope , itemSvc , egCore ) {
300 $scope.new_cn_id = 0;
301 $scope.first_cn = Object.keys($scope.struct)[0];
302 $scope.full_cn = $scope.struct[$scope.first_cn][0].call_number();
304 $scope.cn_count = Object.keys($scope.struct).length;
305 $scope.orig_cn_count = $scope.cn_count;
307 $scope.owning_lib = egCore.org.get($scope.lib);
309 $scope.cant_have_vols = function (id) { return !egCore.org.CanHaveVolumes(id); };
311 $scope.$watch('cn_count', function (n) {
312 var o = Object.keys($scope.struct).length;
313 if (n > o) { // adding
314 for (var i = o; o < n; o++) {
315 var cn = new egCore.idl.acn();
316 cn.id( --$scope.new_cn_id );
318 cn.owning_lib( $scope.owning_lib );
319 cn.record( $scope.full_cn.record() );
321 var cp = new egCore.idl.acp();
322 cp.id( --$scope.new_cp_id );
324 cp.circ_lib( $scope.owning_lib );
325 cp.call_number( cn );
327 $scope.struct[cn.id()] = [cp];
329 } else if (n < o) { // removing
330 var how_many = o - n;
333 .sort(function(a, b){return a-b})
335 for (var i = how_many; i > 0; i--) {
336 delete $scope.struct[list[i]];
349 .controller('EditCtrl',
350 ['$scope','$q','$routeParams','$location','$timeout','egCore','egNet','egGridDataProvider','itemSvc',
351 function($scope , $q , $routeParams , $location , $timeout , egCore , egNet , egGridDataProvider , itemSvc) {
353 $scope.show_vols = true;
354 $scope.show_copies = true;
356 $scope.idTracker = function (x) { if (x) return x.id() };
360 var dataKey = $routeParams.dataKey;
361 console.debug('dataKey: ' + dataKey);
363 if (dataKey && dataKey.length > 0) {
367 $scope.summaryRecord = null;
368 $scope.record_id = null;
371 $scope.workingGridDataProvider = egGridDataProvider.instance({
372 get : function(offset, count) {
373 //return provider.arrayNotifier(itemSvc.copies, offset, count);
374 return this.arrayNotifier(itemSvc.copies, offset, count);
378 $scope.workingGridControls = {};
382 'open-ils.actor.anon_cache.get_value',
383 dataKey, 'edit-these-copies'
384 ).then(function (data) {
386 if (data.hide_vols) $scope.show_vols = false;
387 if (data.hide_copies) $scope.show_copies = false;
389 $scope.record_id = data.record_id;
391 return itemSvc.fetchIds(data.copies);
392 }).then( function() {
393 $scope.data = itemSvc.tree;
394 $scope.workingGridDataProvider.refresh();
397 $scope.status_list = [];
398 itemSvc.get_statuses().then(function(list){
399 $scope.status_list = list;
401 $scope.updateWorkingStatus = function () {
403 $scope.workingGridControls.selectedItems(),
404 function (cp) { cp.status($scope.working.status.id()); cp.ischanged(1); }