From 5779f860acf84e9410cc5a0cfa266023ccfe3d61 Mon Sep 17 00:00:00 2001 From: Lorenzo Millucci Date: Mon, 1 Feb 2021 08:54:05 +0100 Subject: [PATCH] [ErrorHandler] Add button to copy the path where error is thrown --- .../Resources/views/Profiler/base_js.html.twig | 17 +++++++++++++++++ .../Resources/assets/css/exception.css | 2 ++ .../Resources/assets/images/icon-copy.svg | 1 + .../Resources/assets/js/exception.js | 17 +++++++++++++++++ .../ErrorHandler/Resources/views/trace.html.php | 3 +++ 5 files changed, 40 insertions(+) create mode 100644 src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg diff --git a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig index 5ff45d44cbdca..97c75ee7d30bc 100644 --- a/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig +++ b/src/Symfony/Bundle/WebProfilerBundle/Resources/views/Profiler/base_js.html.twig @@ -38,6 +38,15 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') { }; } + if (navigator.clipboard) { + document.querySelectorAll('[data-clipboard-text]').forEach(function(element) { + removeClass(element, 'hidden'); + element.addEventListener('click', function() { + navigator.clipboard.writeText(element.getAttribute('data-clipboard-text')); + }) + }); + } + var request = function(url, onSuccess, onError, payload, options, tries) { var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); options = options || {}; @@ -705,6 +714,14 @@ if (typeof Sfjs === 'undefined' || typeof Sfjs.loadToolbar === 'undefined') { }); } + /* Prevents from disallowing clicks on "copy to clipboard" elements inside toggles */ + var copyToClipboardElements = toggles[i].querySelectorAll('span[data-clipboard-text]') + for (var k = 0; k < copyToClipboardElements.length; k++) { + addEventListener(copyToClipboardElements[k], 'click', function(e) { + e.stopPropagation(); + }); + } + toggles[i].setAttribute('data-processed', 'true'); } }, diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css b/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css index 5822ea2043eb4..a6e23cb6f073e 100644 --- a/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css +++ b/src/Symfony/Component/ErrorHandler/Resources/assets/css/exception.css @@ -227,6 +227,8 @@ header .container { display: flex; justify-content: space-between; } .trace-line a { color: var(--base-6); } .trace-line .icon { opacity: .4; position: absolute; left: 10px; top: 11px; } .trace-line .icon svg { fill: var(--base-5); height: 16px; width: 16px; } +.trace-line .icon.icon-copy { left: auto; top: auto; padding-left: 5px; display: none } +.trace-line:hover .icon.icon-copy:not(.hidden) { display: inline-block } .trace-line-header { padding-left: 36px; padding-right: 10px; } .trace-file-path, .trace-file-path a { color: var(--base-6); font-size: 13px; } diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg b/src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg new file mode 100644 index 0000000000000..844a4f99e3b02 --- /dev/null +++ b/src/Symfony/Component/ErrorHandler/Resources/assets/images/icon-copy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js b/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js index 0720a3a358aac..d22995b429c62 100644 --- a/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js +++ b/src/Symfony/Component/ErrorHandler/Resources/assets/js/exception.js @@ -30,6 +30,15 @@ if (typeof Sfjs === 'undefined') { }; } + if (navigator.clipboard) { + document.querySelectorAll('[data-clipboard-text]').forEach(function(element) { + removeClass(element, 'hidden'); + element.addEventListener('click', function() { + navigator.clipboard.writeText(element.getAttribute('data-clipboard-text')); + }) + }); + } + return { addEventListener: addEventListener, @@ -166,6 +175,14 @@ if (typeof Sfjs === 'undefined') { }); } + /* Prevents from disallowing clicks on "copy to clipboard" elements inside toggles */ + var copyToClipboardElements = toggles[i].querySelectorAll('span[data-clipboard-text]') + for (var k = 0; k < copyToClipboardElements.length; k++) { + addEventListener(copyToClipboardElements[k], 'click', function(e) { + e.stopPropagation(); + }); + } + toggles[i].setAttribute('data-processed', 'true'); } }, diff --git a/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php b/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php index 6b4261f3f4e15..8dfdb4ec8e849 100644 --- a/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php +++ b/src/Symfony/Component/ErrorHandler/Resources/views/trace.html.php @@ -25,6 +25,9 @@ (line ) +