webstaff: implement Merge Selected Records from record bucket
authorGalen Charlton <gmc@esilibrary.com>
Wed, 9 Sep 2015 22:56:08 +0000 (22:56 +0000)
committerJason Stephenson <jstephenson@mvlc.org>
Mon, 14 Sep 2015 19:44:21 +0000 (15:44 -0400)
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>
Open-ILS/src/templates/staff/cat/bucket/record/index.tt2
Open-ILS/src/templates/staff/cat/bucket/record/t_edit_lead_record.tt2 [new file with mode: 0644]
Open-ILS/src/templates/staff/cat/bucket/record/t_merge_records.tt2 [new file with mode: 0644]
Open-ILS/src/templates/staff/cat/bucket/record/t_view.tt2
Open-ILS/web/js/ui/default/staff/cat/bucket/record/app.js

index 2c45eff..7b399c1 100644 (file)
@@ -8,6 +8,10 @@
 [% BLOCK APP_JS %]
 <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/marcrecord.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/record.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/tagtable.js"></script>
+<script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/services/marcedit.js"></script>
 <script src="[% ctx.media_prefix %]/js/ui/default/staff/cat/bucket/record/app.js"></script>
 <script>
   angular.module('egCoreMod').run(['egStrings', function(s) {
diff --git a/Open-ILS/src/templates/staff/cat/bucket/record/t_edit_lead_record.tt2 b/Open-ILS/src/templates/staff/cat/bucket/record/t_edit_lead_record.tt2
new file mode 100644 (file)
index 0000000..60f3a09
--- /dev/null
@@ -0,0 +1,16 @@
+<div>
+  <div class="modal-header">
+    <button type="button" class="close"
+      ng-click="cancel()" aria-hidden="true">&times;</button>
+    <h4 class="modal-title">[% l('Edit Lead Record') %]</h4>
+  </div>
+  <div class="modal-body">
+    <eg-marc-edit-record dirty-flag="dirty_flag" record-id="record_id"
+                         record-type="bre" />
+  </div>
+  <div class="modal-footer">
+    <input type="submit" ng-click="ok()"
+        class="btn btn-primary" value="[% l('Done') %]"/>
+    <button class="btn btn-warning" ng-click="cancel()">[% l('Cancel') %]</button>
+  </div>
+</div>
diff --git a/Open-ILS/src/templates/staff/cat/bucket/record/t_merge_records.tt2 b/Open-ILS/src/templates/staff/cat/bucket/record/t_merge_records.tt2
new file mode 100644 (file)
index 0000000..e25220a
--- /dev/null
@@ -0,0 +1,40 @@
+<div>
+  <div class="modal-header">
+    <button type="button" class="close"
+      ng-click="cancel()" aria-hidden="true">&times;</button>
+    <h4 class="modal-title">[% l('Merge records?') %]</h4>
+  </div>
+  <div class="modal-body">
+      <div class="row">
+          <div class="col-xs-6">
+            <h4>[% l('Lead record') %]</h4>
+            <div ng-if="lead_id">
+               <button class="btn btn-default btn-sm" ng-click="edit_lead()">[% l('Edit') %]</button>
+               <eg-record-html record-id="lead_id"></eg-record-html>
+            </div>
+            <div ng-if="!lead_id">
+                [% l('Please select a lead record from the right...') %]
+            </div>
+          </div>
+          <div class="col-xs-6">
+            <h4>[% l('Records to merge into lead') %]</h4>
+            <accordion>
+              <accordion-group ng-repeat="rec in records">
+                <accordion-heading>
+                    [% l('Record [_1]', '{{rec.id}}') %] <i class="pull-right glyphicon" ng-class="{'glyphicon-chevron-down': status.open, 'glyphicon-chevron-right': !status.open}"></i>
+                </accordion-heading>
+                <button class="btn btn-default btn-sm" ng-click="use_as_lead(rec)">[% l('Use as lead record') %]</button>
+                <button class="btn btn-default btn-sm" ng-click="drop(rec)">[% l('Remove from consideration') %]</button>
+                <eg-record-html record-id="rec.id"></eg-record-html>
+              </accordion-group>
+            </accordian>
+          </div>
+      </div>
+  </div>
+  <div class="modal-footer">
+    <input type="submit" ng-click="ok()"
+        ng-class="{disabled : !lead_id || records.length < 1 }"
+        class="btn btn-primary" value="[% l('Merge') %]"/>
+    <button class="btn btn-warning" ng-click="cancel()">[% l('Cancel') %]</button>
+  </div>
+</div>
index 9ff16bf..599dab1 100644 (file)
@@ -19,6 +19,9 @@
   <eg-grid-action label="[% l('Delete Selected Records from Catalog') %]" 
     handler="deleteRecordsFromCatalog"></eg-grid-action>
 
+  <eg-grid-action label="[% l('Merge Selected Records') %]" 
+    handler="openRecordMergeDialog"></eg-grid-action>
+
   <eg-grid-action label="[% l('Export Records') %]" 
     handler="openExportBucketDialog"></eg-grid-action>
 
index 4f780fd..98a73d6 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 angular.module('egCatRecordBuckets', 
-    ['ngRoute', 'ui.bootstrap', 'egCoreMod', 'egUiMod', 'egGridMod'])
+    ['ngRoute', 'ui.bootstrap', 'egCoreMod', 'egUiMod', 'egGridMod', 'egMarcMod'])
 
 .config(function($routeProvider, $locationProvider, $compileProvider) {
     $locationProvider.html5Mode(true);
@@ -534,6 +534,73 @@ function($scope,  $q , $routeParams,  bucketSvc, egCore, $window,
         );
     }
 
+    // opens the record merge dialog
+    $scope.openRecordMergeDialog = function(records) {
+        $modal.open({
+            templateUrl: './cat/bucket/record/t_merge_records',
+            size: 'lg',
+            controller:
+                ['$scope', '$modalInstance', function($scope, $modalInstance) {
+                $scope.records = [];
+                $scope.lead_id = 0;
+                angular.forEach(records, function(rec) {
+                    $scope.records.push({ id : rec.id });
+                });
+                $scope.ok = function() {
+                    $modalInstance.close({
+                        lead_id : $scope.lead_id,
+                        records : $scope.records
+                    });
+                }
+                $scope.cancel = function () { $modalInstance.dismiss() }
+                $scope.use_as_lead = function(rec) {
+                    if ($scope.lead_id) {
+                        $scope.records.push({ id : $scope.lead_id });
+                    }
+                    $scope.lead_id = rec.id;
+                    $scope.drop(rec);
+                }
+                $scope.drop = function(rec) {
+                    angular.forEach($scope.records, function(val, i) {
+                        if (rec == $scope.records[i]) {
+                            $scope.records.splice(i, 1);
+                        }
+                    });
+                }
+                $scope.edit_lead = function() {
+                    var lead_id = $scope.lead_id;
+                    $modal.open({
+                        templateUrl: './cat/bucket/record/t_edit_lead_record',
+                        size: 'lg',
+                        controller:
+                            ['$scope', '$modalInstance', function($scope, $modalInstance) {
+                            $scope.focusMe = true;
+                            $scope.record_id = lead_id;
+                            $scope.dirty_flag = false;
+                            $scope.ok = function() { $modalInstance.close() }
+                            $scope.cancel = function () { $modalInstance.dismiss() }
+                        }]
+                    }).result.then(function() {
+                        // TODO: need a way to force a refresh of the egRecordHtml, as
+                        // the record ID does not change
+                    });
+                };
+            }]
+        }).result.then(function (args) {
+            if (!args.lead_id) return;
+            if (!args.records.length) return;
+            egCore.net.request(
+                'open-ils.cat',
+                'open-ils.cat.biblio.records.merge',
+                egCore.auth.token(),
+                args.lead_id,
+                args.records.map(function(val) { return val.id; })
+            ).then(function() {
+                drawBucket();
+            });
+        });
+    }
+
     $scope.showAllRecords = function() {
         // TODO: maybe show selected would be better?
         // TODO: probably want to set a limit on the number of