From f84b69dee5ff4da3e521e2e06be5512671286f80 Mon Sep 17 00:00:00 2001
From: Muthukrishnanmatriot
 <76949556+muthukrishnanmatriot@users.noreply.github.com>
Date: Mon, 27 Sep 2021 15:13:01 +0530
Subject: [PATCH] TMSS-997 - updated the code for copy to clipboard function

---
 .../tmss_webapp/src/layout/_overrides.scss    |  4 +--
 .../tmss_webapp/src/show.error.details.js     | 31 +++++++++++++++++--
 2 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss b/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss
index d2f3d46ba9d..cbb4d51872c 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss
+++ b/SAS/TMSS/frontend/tmss_webapp/src/layout/_overrides.scss
@@ -199,6 +199,7 @@
 } 
 .p-growl {
     z-index: 3000 !important;
+    width: 40em;
 }
 .viewtable .p-hidden-accessible {
     position: relative;
@@ -282,9 +283,8 @@ In Excel View the for Accordion  background color override
     padding-left: 10px;
     background-color: black;
     margin-left: -3px;
-}
+} 
 .show_error {
-    width: 40em;
     margin-left: 67em;
     height: auto !important;
 }
diff --git a/SAS/TMSS/frontend/tmss_webapp/src/show.error.details.js b/SAS/TMSS/frontend/tmss_webapp/src/show.error.details.js
index 33f2ead8eca..9745e914eaa 100644
--- a/SAS/TMSS/frontend/tmss_webapp/src/show.error.details.js
+++ b/SAS/TMSS/frontend/tmss_webapp/src/show.error.details.js
@@ -1,5 +1,6 @@
 import React, {Component} from 'react';
 import UIConstants from './utils/ui.constants';
+import { Growl } from 'primereact/components/growl/Growl';
 
 export class ShowErrorDetails extends Component {
     constructor(props) {
@@ -9,6 +10,7 @@ export class ShowErrorDetails extends Component {
             showDetails: false
         }
         this.showHideErrorDetails = this.showHideErrorDetails.bind(this);
+        this.copyErrorDetailsToClipboard = this.copyErrorDetailsToClipboard.bind(this);
     }
 
     /**
@@ -30,23 +32,48 @@ export class ShowErrorDetails extends Component {
         }
     }
 
+    /**
+     * Copy the error details to clipboard
+     */
+    async copyErrorDetailsToClipboard() {
+        try {
+            const queryOpts = { name: 'clipboard-write', allowWithoutGesture: true };
+            await navigator.permissions.query(queryOpts);
+            await navigator.clipboard.writeText(this.props.response.request.response);
+        }   catch(error) {
+            try{
+                const elem = document.createElement('textarea');
+                elem.value = this.props.response.request.response;
+                document.body.appendChild(elem);
+                elem.select();
+                document.execCommand('copy');
+                document.body.removeChild(elem);
+            } catch (error) {
+                this.growl.show({severity: 'error', summary: 'Warning', detail: 'Unable to copy the data to clipboard'});
+            }
+        }
+        this.growl.show({severity: 'success', summary: '', detail: 'Error details is copied to clipboard'});
+    }
+
     render() {
         const httpStatusMsg = UIConstants.httpStatusMessages[this.props.response.status];
         const data = httpStatusMsg? httpStatusMsg.detail: '';
         var message = '['+this.props.response.status+'] '+JSON.stringify(this.props.response.statusText)+ ' ['+data+']';
         return (
             <div>
+                 <Growl ref={(el) => this.growl = el} />
                 <div>
                     {message}
                 </div>
                 <div>
                     <div className="show_error_hide" >
                         <a href='#' onClick={this.showHideErrorDetails} > {this.state.buttonLabel} </a>
+                        <a href='#' onClick={this.copyErrorDetailsToClipboard} style={{marginLeft: '1em'}} title="Copy the error details to clipboard" > <i class="fas fa-copy"></i> </a>
                     </div>
                     {this.state.showDetails &&
                         <div>
-                            <p style={{fontWeight: 'bold'}}> Error Details: </p>
-                            <div className="show_error_details" >
+                            <p style={{fontWeight: 'bold'}}> Error Details:</p>
+                            <div id="showError" className="show_error_details" >
                                 {this.props.response.request.response}
                             </div>
                         </div>
-- 
GitLab