diff --git a/js/functions.js b/js/functions.js index 313a015819..73d6cd09a5 100644 --- a/js/functions.js +++ b/js/functions.js @@ -4393,6 +4393,100 @@ function printPage() } } +/** + * Print button + */ +function copyToClipboard() +{ + var textArea = document.createElement("textarea"); + + // + // *** This styling is an extra step which is likely not required. *** + // + // Why is it here? To ensure: + // 1. the element is able to have focus and selection. + // 2. if element was to flash render it has minimal visual impact. + // 3. less flakyness with selection and copying which **might** occur if + // the textarea element is not visible. + // + // The likelihood is the element won't even render, not even a flash, + // so some of these are just precautions. However in IE the element + // is visible whilst the popup box asking the user for permission for + // the web page to copy to the clipboard. + // + + // Place in top-left corner of screen regardless of scroll position. + textArea.style.position = 'fixed'; + textArea.style.top = 0; + textArea.style.left = 0; + + // Ensure it has a small width and height. Setting to 1px / 1em + // doesn't work as this gives a negative w/h on some browsers. + textArea.style.width = '2em'; + textArea.style.height = '2em'; + + // We don't need padding, reducing the size if it does flash render. + textArea.style.padding = 0; + + // Clean up any borders. + textArea.style.border = 'none'; + textArea.style.outline = 'none'; + textArea.style.boxShadow = 'none'; + + // Avoid flash of white box if rendered for any reason. + textArea.style.background = 'transparent'; + + textArea.value = ''; + + var elementList = $('#serverinfo a'); + + elementList.each(function(){ + textArea.value += $(this).text().split(':')[1].trim() + '/'; + }); + textArea.value += '\t\t' + window.location.href; + textArea.value += '\n'; + + elementList = $('.notice,.success'); + + elementList.each(function(){ + textArea.value += $(this).clone().children().remove().end().text() + '\n\n'; + }); + + elementList = $('.sql pre'); + + elementList.each(function() { + textArea.value += $(this).text() + '\n\n'; + }); + + elementList = $('.table_results .column_heading a'); + + elementList.each(function() { + textArea.value += $(this).clone().children().remove().end().text() + '\t'; + }); + + textArea.value += '\n'; + elementList = $('tbody .odd,tbody .even'); + elementList.each(function() { + var childElementList = $(this).find('.data span') + childElementList.each(function(){ + textArea.value += $(this).clone().children().remove().end().text() + '\t'; + }); + textArea.value += '\n'; + }); + + document.body.appendChild(textArea); + + textArea.select(); + + try { + document.execCommand('copy'); + } catch (err) { + alert('Sorry! Unable to copy'); + } + + document.body.removeChild(textArea); +} + /** * Unbind all event handlers before tearing down a page */ diff --git a/js/sql.js b/js/sql.js index 76b4f08a83..90ff91a789 100644 --- a/js/sql.js +++ b/js/sql.js @@ -192,6 +192,16 @@ AJAX.registerOnload('sql.js', function () { .toggle($(this).val().length > 0); }).trigger('keyup'); + /** + * Attach Event Handler for 'Copy to clipbpard + */ + $(document).on('click', "#copyToClipBoard", function (event) { + event.preventDefault(); + + // Print the page + copyToClipboard(); + }); //end of Copy to Clipboard action + /** * Attach Event Handler for 'Print View' */ diff --git a/libraries/DisplayResults.php b/libraries/DisplayResults.php index ed84a8a055..ffc712f103 100644 --- a/libraries/DisplayResults.php +++ b/libraries/DisplayResults.php @@ -4987,6 +4987,29 @@ class DisplayResults return $results_operations_html; } + /** + * Get copy to clipboard links for results operations + * + * @return string $html + * + * @access private + */ + private function _getCopytoclipboardLinks() + { + $html = Util::linkOrButton( + '#', + Util::getIcon( + 'b_insrow.png', __('Copy to clip board'), true + ), + array('id' => 'copyToClipBoard'), + true, + true, + 'copy_to_clip_board' + ); + + return $html; + } + /** * Get printview links for results operations * @@ -5062,6 +5085,7 @@ class DisplayResults // Displays "printable view" link if required if ($displayParts['pview_lnk'] == '1') { $results_operations_html .= $this->_getPrintviewLinks(); + $results_operations_html .= $this->_getCopytoclipboardLinks(); } // end displays "printable view" // Export link