Skip to content

Commit

Permalink
Refactor copy button event handler (#29379)
Browse files Browse the repository at this point in the history
Use "closest" instead of "for-loop"
  • Loading branch information
wxiaoguang authored Feb 25, 2024
1 parent b616f66 commit 736c98b
Showing 1 changed file with 17 additions and 24 deletions.
41 changes: 17 additions & 24 deletions web_src/js/features/clipboard.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,30 @@ import {clippie} from 'clippie';
const {copy_success, copy_error} = window.config.i18n;

// Enable clipboard copy from HTML attributes. These properties are supported:
// - data-clipboard-text: Direct text to copy, has highest precedence
// - data-clipboard-text: Direct text to copy
// - data-clipboard-target: Holds a selector for a <input> or <textarea> whose content is copied
// - data-clipboard-text-type: When set to 'url' will convert relative to absolute urls
export function initGlobalCopyToClipboardListener() {
document.addEventListener('click', (e) => {
let target = e.target;
// In case <button data-clipboard-text><svg></button>, so we just search
// up to 3 levels for performance
for (let i = 0; i < 3 && target; i++) {
let text = target.getAttribute('data-clipboard-text');
document.addEventListener('click', async (e) => {
const target = e.target.closest('[data-clipboard-text], [data-clipboard-target]');
if (!target) return;

if (!text && target.getAttribute('data-clipboard-target')) {
text = document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
}
e.preventDefault();

if (text && target.getAttribute('data-clipboard-text-type') === 'url') {
text = toAbsoluteUrl(text);
}

if (text) {
e.preventDefault();

(async() => {
const success = await clippie(text);
showTemporaryTooltip(target, success ? copy_success : copy_error);
})();
let text;
if (target.hasAttribute('data-clipboard-text')) {
text = target.getAttribute('data-clipboard-text');
} else {
text = document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
}

break;
}
if (text && target.getAttribute('data-clipboard-text-type') === 'url') {
text = toAbsoluteUrl(text);
}

target = target.parentElement;
if (text) {
const success = await clippie(text);
showTemporaryTooltip(target, success ? copy_success : copy_error);
}
});
}

0 comments on commit 736c98b

Please sign in to comment.