User:Polygnotus/Scripts/CategoryToClipboard.js: Difference between revisions

Content deleted Content added
No edit summary
No edit summary
Line 52:
function copyToClipboard(text) {
return new Promise((resolve, reject) => {
// CreateFirst atry temporarythe textareamodern elementClipboard API
constif textarea(navigator.clipboard =&& documentnavigator.createElement('textarea'clipboard.writeText); {
textarea.value = navigator.clipboard.writeText(text;)
.then(() => resolve(true))
// Make the textarea visible to ensure it works.catch(err on=> Firefox/Pop OS{
console.log("Clipboard API failed, trying execCommand...", err);
textarea.style.position = 'fixed';
// Fall back to execCommand method
textarea.style.top = '10px';
textarea.style.left = '10px' execCommandCopy();
textarea.style.width = '1px' });
textarea.style.height} =else '1px';{
// Try theIf Clipboard API asis not available, use fallbackexecCommand
textarea.style.padding = '0';
textarea.style.border = 'none' execCommandCopy();
textarea.style.outline = 'none';}
textarea.style.boxShadow = 'none';
textarea.style.background = 'transparent';
textarea.style.zIndex = '999999';
document.body.appendChildfunction execCommandCopy(textarea); {
// Create a completely invisible temporary textarea
// Focus and select theconst texttextarea = document.createElement('textarea');
textarea.focus()value = text;
textarea.select();
try {
// Use document.execCommand first as it's more reliable on Firefox/Linux
const success = document.execCommand('copy');
if// (success)Make {the textarea invisible but still selectable
textarea.style.position = 'fixed';
textarea.style.top = '10px-9999px';
textarea.style.boxShadowleft = 'none-9999px';
textarea.style.paddingopacity = '0';
textarea.setAttribute('readonly', ''); // Prevent mobile keyboard from appearing
document.body.removeChildappendChild(textarea);
// Select and try to copy
if (navigator.userAgent.indexOf('Firefox') !== -1 ||
navigator.clipboarduserAgent.writeText(text).then(indexOf('Linux') !=>= -1) {
// Special handling for Firefox on Linux/Pop OS
textarea.style.backgroundcontentEditable = 'transparent'true;
textarea.readOnly = }false;
});
// Handle iOS specifics
if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {
const range = document.createRange();
documentrange.body.removeChildselectNodeContents(textarea);
const closeButtonselection = documentwindow.createElementgetSelection('button');
resolveselection.removeAllRanges(true);
visibleTextareaselection.focusaddRange(range);
textarea.style.zIndex =setSelectionRange(0, '999999');
} else {
textarea.select();
}
try {
const success = document.execCommand('copy');
document.body.removeChild(textarea);
resolve(true);
} else if (navigator.clipboard &&if navigator.clipboard.writeText(success) {
// Try the Clipboard API as fallback
navigator.clipboard.writeText(text).then(() => {
document.body.removeChild(textarea);
resolve(true);
}).catch(err =>else {
document.body.removeChildreject(textareanew Error('Unable to copy to clipboard using execCommand'));
}
} catch (err) // Show the copy text in a visible textarea as last resort{
const visibleTextarea = document.createElement('textarea');
visibleTextarea.value = text;
visibleTextarea.style.position = 'fixed';
visibleTextarea.style.top = '50px';
visibleTextarea.style.left = '50px';
visibleTextarea.style.width = '80%';
visibleTextarea.style.height = '300px';
visibleTextarea.style.zIndex = '999999';
const closeButton = document.createElement('button');
closeButton.textContent = 'Close';
closeButton.style.position = 'fixed';
closeButton.style.top = '360px';
closeButton.style.left = '50px';
closeButton.style.zIndex = '999999';
closeButton.onclick = () => {
document.body.removeChild(visibleTextarea);
document.body.removeChild(closeButton);
};
document.body.appendChild(visibleTextarea);
document.body.appendChild(closeButton);
visibleTextarea.focus();
visibleTextarea.select();
resolve(true);
});
} else {
document.body.removeChild(textarea);
reject(new Error('Unable to copy to clipboard')err);
}
} catch (err) {
document.body.removeChild(textarea);
reject(err);
}
});