From 5c1655e6a1b523e564c8121e8df84ffcd6ddd901 Mon Sep 17 00:00:00 2001
From: Bill Erickson <berickxx@gmail.com>
Date: Mon, 6 Aug 2018 15:18:35 -0400
Subject: [PATCH] LP#1785681 Patron address copy to clipboard

Support copying formatted addresses to the clipboard in the browser
staff client, similar to the XUL client.  Action is performed via a new
link in the addresses section (next to "print") in the patron summary
sidebar.

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Garry Collum <gcollum@gmail.com>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
---
 Open-ILS/src/templates/staff/circ/patron/t_summary.tt2 | 18 ++++++++++++++++--
 Open-ILS/web/js/ui/default/staff/circ/patron/app.js    | 18 ++++++++++++++++++
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2 b/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
index c89a0075b3..6b16b66b10 100644
--- a/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
+++ b/Open-ILS/src/templates/staff/circ/patron/t_summary.tt2
@@ -181,12 +181,26 @@
         <fieldset>
           <legend ng-class="{'patron-summary-alert': addr.valid() == 'f'}">
             {{addr.address_type()}} 
-            <a href class="pad-horiz patron-summary-act-link" 
-              ng-click="print_address(addr)">[% l('(print)') %]</a>
+            (<a href class="patron-summary-act-link" 
+                ng-click="copy_address(addr)">[%- l('copy') -%]</a><a 
+                href class="patron-summary-act-link" 
+                ng-click="print_address(addr)">[%- l('/print') -%]</a>)
           </legend>
           <div>{{addr.street1()}} {{addr.street2()}}</div>
           <div>{{addr.city()}}, {{addr.state()}} {{addr.post_code()}}</div>
         </fieldset>
+        <textarea id="patron-address-copy-{{addr.id()}}" rows="2" 
+          style="visibility:hidden">[%- l(
+            '[_1] [_2] [_3]&#13;&#10;[_4] [_5]&#13;&#10;[_6], [_7] [_8]', 
+            '{{patron().first_given_name()}}',
+            '{{patron().second_given_name()}}',
+            '{{patron().family_name()}}',
+            '{{addr.street1()}}',
+            '{{addr.street2()}}',
+            '{{addr.city()}}',
+            '{{addr.state()}}',
+            '{{addr.post_code()}}') 
+          -%]</textarea>
       </div>
     </div>
   </div>
diff --git a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
index d37ed644f0..d007257e4f 100644
--- a/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
+++ b/Open-ILS/web/js/ui/default/staff/circ/patron/app.js
@@ -339,6 +339,24 @@ function($scope,  $q , $location , $filter , egCore , egNet , egUser , egAlertDi
         });
     }
 
+    $scope.copy_address = function(addr) {
+        // Alas, navigator.clipboard is not yet supported in FF and others.
+        var lNode = document.querySelector('#patron-address-copy-' + addr.id());
+
+        // Un-hide the textarea just long enough to copy its data.
+        // Using node.style instead of ng-show/ng-hide in hopes it 
+        // will be quicker, so the user never sees the textarea.
+        lNode.style.visibility = 'visible';
+        lNode.focus();
+        lNode.select();
+
+        if (!document.execCommand('copy')) {
+            console.error('Copy command failed');
+        }
+
+        lNode.style.visibility = 'hidden';
+    }
+
     $scope.toggle_expand_summary = function() {
         if ($scope.collapsePatronSummary) {
             $scope.collapsePatronSummary = false;
-- 
2.11.0