diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bdaea33..6f671268 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.0.0 (not yet released) * CHANGED: Remove page template (#265) * FIXED: Name mismatches in attached files (#1584) +* FIXED: Unable to paste attachments from clipboard (#1589) ## 1.7.8 (2025-06-30) * FIXED: Duplicate attachment for every comment (#1577) diff --git a/js/privatebin.js b/js/privatebin.js index 000dc232..c6d2c772 100644 --- a/js/privatebin.js +++ b/js/privatebin.js @@ -628,6 +628,17 @@ jQuery.PrivateBin = (function($, RawDeflate) { baseUri = null; }; + /** + * check if bootstrap5 object detected + * + * @name Helper.isBootstrap5 + * @returns {Boolean} + */ + me.isBootstrap5 = function () + { + return typeof bootstrap !== 'undefined'; + }; + return me; })(); @@ -3421,16 +3432,17 @@ jQuery.PrivateBin = (function($, RawDeflate) { function addClipboardEventHandler() { $(document).on('paste', function (event) { const items = (event.clipboardData || event.originalEvent.clipboardData).items; - const lastItem = items[items.length - 1]; - if (lastItem.kind === 'file') { - if (TopNav.isAttachmentReadonly()) { - event.stopPropagation(); - event.preventDefault(); - return false; - } else { - readFileData(lastItem.getAsFile()); - } + const files = [...items] + .filter(item => item.kind === 'file') + .map(item => item.getAsFile()); + + if (TopNav.isAttachmentReadonly()) { + event.stopPropagation(); + event.preventDefault(); + return false; } + + readFileData(files); }); } @@ -4631,7 +4643,11 @@ jQuery.PrivateBin = (function($, RawDeflate) { // visually indicate file uploaded const $attachDropdownToggle = $attach.children('.dropdown-toggle'); if ($attachDropdownToggle.attr('aria-expanded') === 'false') { - $attachDropdownToggle.click(); + if (Helper.isBootstrap5()) { + new bootstrap.Dropdown($attachDropdownToggle).toggle(); + } else { + $attachDropdownToggle.click(); + } } $fileWrap.addClass('highlight'); setTimeout(function () { diff --git a/js/test/Helper.js b/js/test/Helper.js index 6308fdc0..a9ae41ab 100644 --- a/js/test/Helper.js +++ b/js/test/Helper.js @@ -316,5 +316,18 @@ describe('Helper', function () { return $.PrivateBin.Helper.formatBytes(1234567) === '1.18 MiB'; }); }); + + + describe('isBootstrap5', function () { + jsc.property('Bootstrap 5 has been detected', function () { + global.bootstrap = {}; + return $.PrivateBin.Helper.isBootstrap5() === true; + }); + + jsc.property('Bootstrap 5 has not been detected', function () { + delete global.bootstrap; + return $.PrivateBin.Helper.isBootstrap5() === false; + }); + }); }); diff --git a/lib/Configuration.php b/lib/Configuration.php index 31b2920a..db171b01 100644 --- a/lib/Configuration.php +++ b/lib/Configuration.php @@ -118,7 +118,7 @@ class Configuration 'js/kjua-0.9.0.js' => 'sha512-CVn7af+vTMBd9RjoS4QM5fpLFEOtBCoB0zPtaqIDC7sF4F8qgUSRFQQpIyEDGsr6yrjbuOLzdf20tkHHmpaqwQ==', 'js/legacy.js' => 'sha512-UxW/TOZKon83n6dk/09GsYKIyeO5LeBHokxyIq+r7KFS5KMBeIB/EM7NrkVYIezwZBaovnyNtY2d9tKFicRlXg==', 'js/prettify.js' => 'sha512-puO0Ogy++IoA2Pb9IjSxV1n4+kQkKXYAEUtVzfZpQepyDPyXk8hokiYDS7ybMogYlyyEIwMLpZqVhCkARQWLMg==', - 'js/privatebin.js' => 'sha512-lP3oQM8eZ6HNCUUZC2HvmNTO3RRNw7WPCCWbVVr0e9DHvgprYr6tYtDYzmWdpD6rzjHOgekHhFMO8LIO9ufyug==', + 'js/privatebin.js' => 'sha512-9X1Ns+w/WPlWde118Mbl1UFDPsFmBcXK2zr6ny7oDOuZMVP1hFCPzXjKbC+59xDQW0Q+NmyT4NC6/5B6UzkkDw==', 'js/purify-3.2.6.js' => 'sha512-zqwL4OoBLFx89QPewkz4Lz5CSA2ktU+f31fuECkF0iK3Id5qd3Zpq5dMby8KwHjIEpsUgOqwF58cnmcaNem0EA==', 'js/rawinflate-0.3.js' => 'sha512-g8uelGgJW9A/Z1tB6Izxab++oj5kdD7B4qC7DHwZkB6DGMXKyzx7v5mvap2HXueI2IIn08YlRYM56jwWdm2ucQ==', 'js/showdown-2.1.0.js' => 'sha512-WYXZgkTR0u/Y9SVIA4nTTOih0kXMEd8RRV6MLFdL6YU8ymhR528NLlYQt1nlJQbYz4EW+ZsS0fx1awhiQJme1Q==',