<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/user.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/eframe.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/services/date.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/patrons.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/billing.js"></script>
<script src="[% ctx.media_prefix %]/js/ui/default/staff/circ/services/circ.js"></script>
[% INCLUDE 'staff/circ/share/circ_strings.tt2' %]
grid-controls="gridControls"
items-provider="patronSearchGridProvider"
persist-key="circ.patron.search">
+
+ <eg-grid-menu-item handler="merge_patrons"
+ disabled="need_two_selected"
+ label="[% l('Merge Patrons') %]"></eg-grid-menu-item>
+
<eg-grid-field label="[% ('ID') %]" path='id' visible></eg-grid-field>
<eg-grid-field label="[% ('Card') %]" path='card.barcode' visible></eg-grid-field>
<eg-grid-field label="[% ('Profile') %]" path='profile.name' visible></eg-grid-field>
<div class="col-md-5">[% l('Profile') %]</div>
<div class="col-md-7">{{patron().profile().name()}}</div>
</div>
+ <div class="row" ng-if="show_name()">
+ <div class="col-md-5">[% l('ID') %]</div>
+ <div class="col-md-7">{{patron().id()}}</div>
+ </div>
+ <div class="row" ng-if="show_name()">
+ <div class="col-md-5">[% l('Name') %]</div>
+ <div class="col-md-7">
+ [% l('[_1], [_2] [_3]',
+ '{{patron().family_name()}}',
+ '{{patron().first_given_name()}}',
+ '{{patron().second_given_name()}}') %]
+ </div>
+ </div>
<div class="row">
<div class="col-md-5">[% l('Home Library') %]</div>
<div class="col-md-7">{{patron().home_ou().shortname()}}</div>
.controller('PatronSearchCtrl',
['$scope','$q','$routeParams','$timeout','$window','$location','egCore',
'$filter','egUser', 'patronSvc','egGridDataProvider','$document',
+ 'egPatronMerge',
function($scope, $q, $routeParams, $timeout, $window, $location, egCore,
- $filter, egUser, patronSvc , egGridDataProvider , $document) {
+ $filter, egUser, patronSvc , egGridDataProvider , $document,
+ egPatronMerge) {
$scope.initTab('search');
$scope.focusMe = true;
// force the grid to load the url-based search on page load
provider.refresh();
}
+
+ $scope.need_two_selected = function() {
+ var items = $scope.gridControls.selectedItems();
+ return (items.length == 2) ? false : true;
+ }
+ $scope.merge_patrons = function() {
+ var items = $scope.gridControls.selectedItems();
+ if (items.length != 2) return false;
+
+ var patron_ids = [];
+ angular.forEach(items, function(i) {
+ patron_ids.push(i.id());
+ });
+ egPatronMerge.do_merge(patron_ids).then(function() {
+ // ensure that we're not drawing from cached
+ // resuts, as a successful merge just deleted a
+ // record
+ delete patronSvc.lastSearch;
+ $scope.gridControls.refresh();
+ });
+ }
}])
--- /dev/null
+angular.module('egCoreMod')
+
+.factory('egPatronMerge',
+ ['$uibModal','$q','egCore',
+function($uibModal , $q , egCore) {
+
+ var service = {};
+
+ service.do_merge = function(patron_ids) {
+ var deferred = $q.defer();
+ $uibModal.open({
+ templateUrl: './circ/share/t_merge_patrons',
+ size: 'lg',
+ windowClass: 'eg-wide-modal',
+ controller:
+ ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
+ $scope.lead_id = 0;
+ $scope.patron_ids = patron_ids;
+ $scope.ok = function() {
+ $uibModalInstance.close({ lead_id : $scope.lead_id });
+ }
+ $scope.cancel = function () { $uibModalInstance.dismiss() }
+ }]
+ }).result.then(function (args) {
+ if (args.lead_id == 0) return;
+ var sub_id = (args.lead_id == patron_ids[0]) ?
+ patron_ids[1] :
+ patron_ids[0];
+ egCore.net.request(
+ 'open-ils.actor',
+ 'open-ils.actor.user.merge',
+ egCore.auth.token(),
+ args.lead_id,
+ [ sub_id ]
+ ).then(function(resp) {
+ var evt = egCore.evt.parse(resp);
+ if (evt) {
+ console.debug(evt);
+ deferred.reject(evt);
+ return;
+ } else {
+ deferred.resolve();
+ }
+ });
+ });
+ return deferred.promise;
+ }
+
+ return service;
+
+}])
+
+.directive('egPatronSummary', ['egUser','patronSvc', function(egUser, patronSvc) {
+ return {
+ restrict : 'E',
+ transclude: true,
+ templateUrl : './circ/patron/t_summary',
+ scope : {
+ patronId : '='
+ },
+ controller : [
+ '$scope','egCore',
+ function($scope , egCore) {
+ var user;
+ var user_stats;
+ egUser.get($scope.patronId).then(function(u) {
+ user = u;
+ patronSvc.localFlesh(user);
+ });
+ patronSvc.getUserStats($scope.patronId).then(function(s) {
+ user_stats = s;
+ });
+ $scope.patron = function() {
+ return user;
+ }
+ $scope.patron_stats = function() {
+ return user_stats;
+ }
+
+ // needed because this directive shares a template with
+ // the patron summary in circ app, but the circ app
+ // displays the patron name elsewhere.
+ $scope.show_name = function() {
+ return true;
+ }
+ }
+ ]
+ }
+}]);