);
};
- service.get_locations = function(orgs) {
+ service.get_locations_by_org = function(orgs) {
return egCore.pcrud.search('acpl',
{owning_lib : orgs, deleted : 'f'},
{
);
};
+ service.fetch_locations = function(locs) {
+ return egCore.pcrud.search('acpl',
+ {id : locs},
+ {
+ flesh : 1,
+ flesh_fields : {
+ acpl : ['owning_lib']
+ },
+ order_by : { acpl : 'name' }
+ },
+ {atomic : true}
+ );
+ };
+
service.get_suffixes = function(org) {
return egCore.pcrud.search('acns',
{owning_lib : egCore.org.fullPath(org, true)},
'<div class="label label-danger" ng-if="empty_barcode">{{empty_barcode_string}}</div>'+
'</div>'+
'<div class="col-xs-3"><input class="form-control" type="number" min="1" ng-model="copy_number" ng-change="updateCopyNo()"/></div>'+
- '<div class="col-xs-3"><eg-basic-combo-box eg-disabled="record == 0" list="parts" selected="part"></eg-basic-combo-box></div>'+
+ '<div class="col-xs-3"><eg-basic-combo-box list="parts" selected="part"></eg-basic-combo-box></div>'+
'</div>',
scope: { focusNext: "=", copy: "=", callNumber: "=", index: "@", record: "@" },
'<div class="row">'+
'<div class="col-xs-2">'+
'<button aria-label="Delete" style="margin:-5px -15px; float:left;" ng-hide="callNumber.not_ephemeral" type="button" class="close" ng-click="removeCN()">×</button>' +
- '<select ng-disabled="record == 0" class="form-control" ng-model="classification" ng-change="updateClassification()" ng-options="cl.name() for cl in classification_list"/>'+
+ '<select class="form-control" ng-model="classification" ng-change="updateClassification()" ng-options="cl.name() for cl in classification_list"/>'+
'</div>'+
'<div class="col-xs-1">'+
- '<select ng-disabled="record == 0" class="form-control" ng-model="prefix" ng-change="updatePrefix()" ng-options="p.label() for p in prefix_list"/>'+
+ '<select class="form-control" ng-model="prefix" ng-change="updatePrefix()" ng-options="p.label() for p in prefix_list"/>'+
'</div>'+
'<div class="col-xs-2">'+
- '<input ng-disabled="record == 0" class="form-control" type="text" ng-change="updateLabel()" ng-model="label"/>'+
+ '<input class="form-control" type="text" ng-change="updateLabel()" ng-model="label"/>'+
'<div class="label label-danger" ng-if="empty_label">{{empty_label_string}}</div>'+
'</div>'+
'<div class="col-xs-1">'+
- '<select ng-disabled="record == 0" class="form-control" ng-model="suffix" ng-change="updateSuffix()" ng-options="s.label() for s in suffix_list"/>'+
+ '<select class="form-control" ng-model="suffix" ng-change="updateSuffix()" ng-options="s.label() for s in suffix_list"/>'+
'</div>'+
- '<div ng-hide="onlyVols" class="col-xs-1"><input ng-disabled="record == 0" class="form-control" type="number" ng-model="copy_count" min="{{orig_copy_count}}" ng-change="changeCPCount()"></div>'+
+ '<div ng-hide="onlyVols" class="col-xs-1"><input class="form-control" type="number" ng-model="copy_count" min="{{orig_copy_count}}" ng-change="changeCPCount()"></div>'+
'<div ng-hide="onlyVols" class="col-xs-5">'+
'<eg-vol-copy-edit record="{{record}}" ng-repeat="cp in copies track by idTracker(cp)" focus-next="focusNextBarcode" copy="cp" call-number="callNumber"></eg-vol-copy-edit>'+
'</div>'+
replace: true,
template:
'<div class="row">'+
- '<div class="col-xs-1"><eg-org-selector alldisabled="{{record == 0}}" selected="owning_lib" disable-test="cant_have_vols"></eg-org-selector></div>'+
- '<div class="col-xs-1"><input name="cn_count_lib{{lib}}" ng-disabled="record == 0" class="form-control" type="number" min="{{orig_cn_count}}" ng-model="cn_count" ng-change="changeCNCount()"/></div>'+
+ '<div class="col-xs-1"><eg-org-selector selected="owning_lib" disable-test="cant_have_vols"></eg-org-selector></div>'+
+ '<div class="col-xs-1"><input class="form-control" type="number" min="{{orig_cn_count}}" ng-model="cn_count" ng-change="changeCNCount()"/></div>'+
'<div class="col-xs-10">'+
'<eg-vol-row only-vols="onlyVols" record="{{record}}"'+
'ng-repeat="(cn,copies) in struct" '+
var newval = $scope.working[field];
if (typeof newval != 'undefined') {
+ delete $scope.working.MultiMap[field];
if (angular.isObject(newval)) { // we'll use the pkey
if (newval.id) newval = newval.id();
else if (newval.code) newval = newval.code();
}
$scope.working = {
+ MultiMap: {},
statcats: {},
statcats_multi: {},
statcat_filter: undefined
};
+ // Returns true if we are editing multiple copies and at least
+ // one field contains multiple values.
+ $scope.hasMulti = function() {
+ var keys = Object.keys($scope.working.MultiMap);
+ // for-loop for shortcut exit
+ for (var i = 0; i < keys.length; i++) {
+ if ($scope.working.MultiMap[keys[i]].length > 1) {
+ return true;
+ }
+ }
+ return false;
+ }
+
$scope.copyAlertUpdate = function (alerts) {
if (!$scope.in_item_select &&
$scope.workingGridControls &&
}
});
}
+ delete $scope.working.MultiMap[k];
});
egCore.hatch.setItem('cat.copy.last_template', n);
}
$scope.add_vols_copies = false;
$scope.is_fast_add = false;
+ // Generate some functions for selecting items by column value in the working grid
+ angular.forEach(
+ ['circulate','status','circ_lib','ref','location','opac_visible','circ_modifier','price',
+ 'loan_duration','cost','circ_as_type','deposit','holdable','deposit_amount','age_protect',
+ 'mint_condition','fine_level','floating'],
+ function (field) {
+ $scope['select_by_' + field] = function (x) {
+ $scope.workingGridControls.selectItemsByValue(field,x);
+ }
+ }
+ );
+
+ var truthy = /^t|1/;
+ $scope.labelYesNo = function (x) {
+ return truthy.test(x) ? egCore.strings.YES : egCore.strings.NO;
+ }
+
+ $scope.orgShortname = function (x) {
+ return egCore.org.get(x).shortname();
+ }
+
+ $scope.statusName = function (x) {
+ var s = $scope.status_list.filter(function(y) {
+ return y.id() == x;
+ });
+
+ return s[0].name();
+ }
+
+ $scope.locationName = function (x) {
+ var s = $scope.location_list.filter(function(y) {
+ return y.id() == x;
+ });
+
+ return $scope.i18n.ou_qualified_location_name(s[0]);
+ }
+
+ $scope.durationLabel = function (x) {
+ return [egCore.strings.SHORT, egCore.strings.NORMAL, egCore.strings.EXTENDED][-1 + x]
+ }
+
+ $scope.fineLabel = function (x) {
+ return [egCore.strings.LOW, egCore.strings.NORMAL, egCore.strings.HIGH][-1 + x]
+ }
+
+ $scope.circTypeValue = function (x) {
+ if (x === null) return egCore.strings.UNSET;
+ var s = $scope.circ_type_list.filter(function(y) {
+ return y.code() == x;
+ });
+
+ return s[0].value();
+ }
+
+ $scope.ageprotectName = function (x) {
+ if (x === null) return egCore.strings.UNSET;
+ var s = $scope.age_protect_list.filter(function(y) {
+ return y.id() == x;
+ });
+
+ return s[0].name();
+ }
+
+ $scope.floatingName = function (x) {
+ if (x === null) return egCore.strings.UNSET;
+ var s = $scope.floating_list.filter(function(y) {
+ return y.id() == x;
+ });
+
+ return s[0].name();
+ }
+
+ $scope.circmodName = function (x) {
+ if (x === null) return egCore.strings.UNSET;
+ var s = $scope.circ_modifier_list.filter(function(y) {
+ return y.code() == x;
+ });
+
+ return s[0].name();
+ }
+
egNet.request(
'open-ils.actor',
'open-ils.actor.anon_cache.get_value',
* All can be left out and a completely empty vol/copy combo will be vivicated.
*/
+ var promises = [];
angular.forEach(
data.raw,
function (proto) {
if (proto.fast_add) $scope.is_fast_add = true;
if (proto.callnumber) {
- return egCore.pcrud.retrieve('acn', proto.callnumber)
+ promises.push(egCore.pcrud.retrieve('acn', proto.callnumber)
.then(function(cn) {
var cp = new itemSvc.generateNewCopy(
cn,
}
itemSvc.addCopy(cp)
- });
+ }));
} else {
var cn = new egCore.idl.acn();
cn.id( --itemSvc.new_cn_id );
}
});
- return itemSvc.copies;
+ return $q.all(promises);
}
if (data.copies && data.copies.length)
}
}).then( function() {
- $scope.data = itemSvc;
- $scope.workingGridDataProvider.refresh();
+
+ return itemSvc.fetch_locations(
+ itemSvc.copies.map(function(cp){
+ return cp.location();
+ }).filter(function(e,i,a){
+ return a.lastIndexOf(e) === i;
+ })
+ ).then(function(list){
+ $scope.data = itemSvc;
+ $scope.location_list = list;
+ $scope.workingGridDataProvider.refresh();
+ });
+
});
$scope.can_save = false;
angular.forEach(Object.keys($scope.defaults.attributes), function (attr) {
var value_hash = {};
+ var value_list = [];
angular.forEach(item_list, function (item) {
if (item[attr]) {
var v = item[attr]()
if (v.id) v = v.id();
else if (v.code) v = v.code();
}
+ value_list.push(v);
value_hash[v] = 1;
}
});
+ $scope.working.MultiMap[attr] = value_list;
+
if (Object.keys(value_hash).length == 1) {
if (attr == 'circ_lib') {
$scope.working[attr] = egCore.org.get(item_list[0][attr]());
if ($scope.location_orgs.toString() != final_orgs.toString()) {
$scope.location_orgs = final_orgs;
if ($scope.location_orgs.length) {
- itemSvc.get_locations($scope.location_orgs).then(function(list){
+ itemSvc.get_locations_by_org($scope.location_orgs).then(function(list){
angular.forEach(list, function(l) {
$scope.location_cache[ ''+l.id() ] = l;
});
$scope.location_list = list;
- });
-
- $scope.statcat_filter_list = [];
- angular.forEach($scope.location_orgs, function (o) {
- $scope.statcat_filter_list.push(egCore.org.get(o));
- });
+ }).then(function() {
+ $scope.statcat_filter_list = [];
+ angular.forEach($scope.location_orgs, function (o) {
+ $scope.statcat_filter_list.push(egCore.org.get(o));
+ });
- itemSvc.get_statcats($scope.location_orgs).then(function(list){
- $scope.statcats = list;
- angular.forEach($scope.statcats, function (s) {
+ itemSvc.get_statcats($scope.location_orgs).then(function(list){
+ $scope.statcats = list;
+ angular.forEach($scope.statcats, function (s) {
- if (!$scope.working)
- $scope.working = { statcats_multi: {}, statcats: {}, statcat_filter: undefined};
- if (!$scope.working.statcats_multi)
- $scope.working.statcats_multi = {};
- if (!$scope.working.statcats)
- $scope.working.statcats = {};
+ if (!$scope.working)
+ $scope.working = { statcats_multi: {}, statcats: {}, statcat_filter: undefined};
+ if (!$scope.working.statcats_multi)
+ $scope.working.statcats_multi = {};
+ if (!$scope.working.statcats)
+ $scope.working.statcats = {};
- if (!$scope.in_item_select) {
- $scope.working.statcats[s.id()] = undefined;
- }
- createStatcatUpdateWatcher(s.id());
+ if (!$scope.in_item_select) {
+ $scope.working.statcats[s.id()] = undefined;
+ }
+ createStatcatUpdateWatcher(s.id());
+ });
+ $scope.in_item_select = false;
+ // do a refresh here to work around a race
+ // condition that can result in stat cats
+ // not being selected.
+ $scope.workingGridDataProvider.refresh();
});
- $scope.in_item_select = false;
- // do a refresh here to work around a race
- // condition that can result in stat cats
- // not being selected.
- $scope.workingGridDataProvider.refresh();
});
}
+ } else {
+ $scope.workingGridDataProvider.refresh();
}
}
-
- $scope.workingGridDataProvider.refresh();
});
$scope.statcat_visible = function (sc_owner) {
});
$scope.location_list = [];
- itemSvc.get_locations().then(function(list){
- $scope.location_list = list;
- });
createSimpleUpdateWatcher('location');
$scope.status_list = [];
}
});
} else {
- $timeout(function(){$window.close()});
+ $timeout(function(){
+ if (typeof BroadcastChannel != 'undefined') {
+ var bChannel = new BroadcastChannel("eg.holdings.update");
+ var bre_ids = cnList && cnList.length > 0 ? cnList.map(function(cn){ return Number(cn.record()) }) : [];
+ var cn_ids = cnList && cnList.length > 0 ? cnList.map(function(cn){ return cn.id() }) : [];
+ bChannel.postMessage({
+ copies : copy_ids,
+ volumes: cn_ids,
+ records: bre_ids
+ });
+ }
+
+ $window.close();
+ });
}
}
});
egCore.org.settings([
'ui.staff.require_initials.copy_notes'
]).then(function(set) {
- $scope.require_initials = Boolean(set['ui.staff.require_initials.copy_notes']);
+ $scope.require_initials_ous = Boolean(set['ui.staff.require_initials.copy_notes']);
});
+ $scope.are_initials_required = function() {
+ $scope.require_initials = $scope.require_initials_ous && ($scope.note.value.length > 0 || $scope.note.title.length > 0);
+ };
+
+ $scope.$watch('note.value.length', $scope.are_initials_required);
+ $scope.$watch('note.title.length', $scope.are_initials_required);
+
$scope.note_list = [];
if (copy_list.length == 1) {
$scope.note_list = copy_list[0].notes();
$scope.ok = function(note) {
- if ($scope.initials) {
- note.value = egCore.strings.$replace(
- egCore.strings.COPY_NOTE_INITIALS, {
- value : note.value,
- initials : $scope.initials,
- ws_ou : egCore.org.get(
- egCore.auth.user().ws_ou()).shortname()
+ if (note.value.length > 0 || note.title.length > 0) {
+ if ($scope.initials) {
+ note.value = egCore.strings.$replace(
+ egCore.strings.COPY_NOTE_INITIALS, {
+ value : note.value,
+ initials : $scope.initials,
+ ws_ou : egCore.org.get(
+ egCore.auth.user().ws_ou()).shortname()
+ });
+ }
+
+ angular.forEach(copy_list, function (cp) {
+ if (!angular.isArray(cp.notes())) cp.notes([]);
+ var n = new egCore.idl.acpn();
+ n.isnew(1);
+ n.creator(note.creator);
+ n.pub(note.pub ? 't' : 'f');
+ n.title(note.title);
+ n.value(note.value);
+ n.owning_copy(cp.id());
+ cp.notes().push( n );
});
}
- angular.forEach(copy_list, function (cp) {
- if (!angular.isArray(cp.notes())) cp.notes([]);
- var n = new egCore.idl.acpn();
- n.isnew(1);
- n.creator(note.creator);
- n.pub(note.pub);
- n.title(note.title);
- n.value(note.value);
- n.owning_copy(cp.id());
- cp.notes().push( n );
- });
-
$uibModalInstance.close();
}
{ order_by : { 'acpt' : ['label'] } }, { atomic: true }
).then(function(list) {
return list.map(function(item) {
- return item.label();
+ return item.label() + " (" + egCore.org.get(item.owner()).shortname() + ")";
});
});
}
$scope.clearWorking = function () {
angular.forEach($scope.working, function (v,k,o) {
+ $scope.working.MultiMap[k] = [];
if (!angular.isObject(v)) {
if (typeof v != 'undefined')
$scope.working[k] = undefined;
$scope.location_cache = {};
$scope.location_list = [];
- itemSvc.get_locations(
+ itemSvc.get_locations_by_org(
egCore.org.fullPath( egCore.auth.user().ws_ou(), true )
).then(function(list){
$scope.location_list = list;