2022-11-24 00:53:32 +01:00
|
|
|
function confirmCopy(el, message) {
|
2023-03-19 21:43:38 +01:00
|
|
|
const hasIcon = !!el.innerHTML.match('icon-copy')
|
2023-11-20 02:45:43 +01:00
|
|
|
const confirmHTML = `<span class="text-success">${message}</span>`;
|
2023-03-19 21:43:38 +01:00
|
|
|
if (hasIcon) {
|
|
|
|
el.innerHTML = el.innerHTML.replace('#copy', '#checkmark');
|
2023-11-20 02:45:43 +01:00
|
|
|
} else {
|
2024-01-16 08:54:59 +01:00
|
|
|
const { width, height } = el.getBoundingClientRect();
|
2023-11-20 02:45:43 +01:00
|
|
|
el.dataset.clipboardInitial = el.innerHTML;
|
2024-01-16 08:54:59 +01:00
|
|
|
el.style.minWidth = width + 'px';
|
|
|
|
el.style.minHeight = height + 'px';
|
2023-11-20 02:45:43 +01:00
|
|
|
el.innerHTML = confirmHTML;
|
2023-03-19 21:43:38 +01:00
|
|
|
}
|
|
|
|
el.dataset.clipboardConfirming = true;
|
2023-01-09 16:38:03 +01:00
|
|
|
if (el.dataset.clipboardHandler) {
|
|
|
|
clearTimeout(parseInt(el.dataset.clipboardHandler));
|
|
|
|
}
|
|
|
|
const timeoutId = setTimeout(function () {
|
2023-03-19 21:43:38 +01:00
|
|
|
if (hasIcon) {
|
|
|
|
el.innerHTML = el.innerHTML.replace('#checkmark', '#copy');
|
2023-11-20 02:45:43 +01:00
|
|
|
} else if (el.innerHTML === confirmHTML) {
|
|
|
|
el.innerHTML = el.dataset.clipboardInitial;
|
2023-01-24 13:00:04 +01:00
|
|
|
}
|
2023-03-19 21:43:38 +01:00
|
|
|
delete el.dataset.clipboardConfirming;
|
2023-01-09 16:38:03 +01:00
|
|
|
el.dataset.clipboardHandler = null;
|
2022-01-12 16:23:50 +01:00
|
|
|
}, 2500);
|
2023-01-09 16:38:03 +01:00
|
|
|
el.dataset.clipboardHandler = timeoutId.toString();
|
2022-01-12 16:23:50 +01:00
|
|
|
}
|
|
|
|
|
2022-12-20 14:54:47 +01:00
|
|
|
window.copyToClipboard = async function (e, data) {
|
2022-01-12 16:23:50 +01:00
|
|
|
e.preventDefault();
|
2022-02-24 22:03:34 -08:00
|
|
|
const item = e.target.closest('[data-clipboard]') || e.target.closest('[data-clipboard-target]') || e.target;
|
2022-11-02 10:21:33 +01:00
|
|
|
const confirm = item.dataset.clipboardConfirmElement
|
2024-01-16 08:54:59 +01:00
|
|
|
? document.querySelector(item.dataset.clipboardConfirmElement) || item
|
2022-11-02 10:21:33 +01:00
|
|
|
: item.querySelector('[data-clipboard-confirm]') || item;
|
2022-11-24 00:53:32 +01:00
|
|
|
const message = confirm.getAttribute('data-clipboard-confirm') || 'Copied';
|
2022-12-20 14:54:47 +01:00
|
|
|
// Check compatibility and permissions:
|
|
|
|
// https://web.dev/async-clipboard/#security-and-permissions
|
|
|
|
let hasPermission = true;
|
|
|
|
if (navigator.clipboard && navigator.permissions) {
|
|
|
|
try {
|
|
|
|
const permissionStatus = await navigator.permissions.query({ name: 'clipboard-write', allowWithoutGesture: false });
|
|
|
|
hasPermission = permissionStatus.state === 'granted';
|
|
|
|
} catch (err) {}
|
|
|
|
}
|
|
|
|
if (navigator.clipboard && hasPermission) {
|
|
|
|
await navigator.clipboard.writeText(data);
|
|
|
|
confirmCopy(confirm, message);
|
2022-01-12 16:23:50 +01:00
|
|
|
} else {
|
|
|
|
const copyEl = document.createElement('textarea');
|
|
|
|
copyEl.style.position = 'absolute';
|
|
|
|
copyEl.style.opacity = '0';
|
|
|
|
copyEl.value = data;
|
|
|
|
document.body.appendChild(copyEl);
|
|
|
|
copyEl.select();
|
|
|
|
document.execCommand('copy');
|
|
|
|
copyEl.remove();
|
|
|
|
confirmCopy(confirm, message);
|
2020-10-13 09:58:46 +02:00
|
|
|
}
|
2022-01-12 16:23:50 +01:00
|
|
|
item.blur();
|
2020-10-13 09:58:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
window.copyUrlToClipboard = function (e) {
|
2021-07-27 19:52:57 +02:00
|
|
|
window.copyToClipboard(e, window.location)
|
2020-10-13 09:58:46 +02:00
|
|
|
}
|
2021-07-27 19:52:57 +02:00
|
|
|
|
2022-11-24 00:53:32 +01:00
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
delegate('click', '[data-clipboard]', function (e) {
|
2023-01-09 16:38:03 +01:00
|
|
|
const target = e.target.closest('[data-clipboard]');
|
|
|
|
const data = target.getAttribute('data-clipboard') || target.innerText || target.value;
|
2021-12-04 21:12:15 +01:00
|
|
|
window.copyToClipboard(e, data)
|
|
|
|
})
|
2022-11-24 00:53:32 +01:00
|
|
|
delegate('click', '[data-clipboard-target]', function (e) {
|
2023-01-09 16:38:03 +01:00
|
|
|
const selector = e.target.closest('[data-clipboard-target]').getAttribute('data-clipboard-target');
|
2021-12-04 21:12:15 +01:00
|
|
|
const target = document.querySelector(selector)
|
2023-01-09 16:38:03 +01:00
|
|
|
const data = target.innerText || target.value;
|
2021-12-04 21:12:15 +01:00
|
|
|
window.copyToClipboard(e, data)
|
2021-07-27 19:52:57 +02:00
|
|
|
})
|
|
|
|
})
|