From 37205039fc83707edc8079d0884d4c12953e80b1 Mon Sep 17 00:00:00 2001 From: silverwind Date: Sun, 30 May 2021 21:15:57 +0200 Subject: Replace clipboard.js with async clipboard api (#15899) Use async clipboard api [1] over this dependency, saving around 10kB bundle size before minify while delivering the same functionality. The issue comment button works but does not have a popup indication. We could add some toast-style notifications in the future to fix that but I think it's out of scope of this PR. [1] https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/writeText --- web_src/js/features/clipboard.js | 52 ++++++++++++++++++++++++++-------------- 1 file changed, 34 insertions(+), 18 deletions(-) (limited to 'web_src/js/features/clipboard.js') diff --git a/web_src/js/features/clipboard.js b/web_src/js/features/clipboard.js index 32eff981b8..12486a208d 100644 --- a/web_src/js/features/clipboard.js +++ b/web_src/js/features/clipboard.js @@ -1,22 +1,38 @@ -export default async function initClipboard() { - const els = document.querySelectorAll('.clipboard'); - if (!els || !els.length) return; +const selector = '[data-clipboard-target], [data-clipboard-text]'; - const {default: ClipboardJS} = await import(/* webpackChunkName: "clipboard" */'clipboard'); +// TODO: replace these with toast-style notifications +function onSuccess(btn) { + if (!btn.dataset.content) return; + $(btn).popup('destroy'); + btn.dataset.content = btn.dataset.success; + $(btn).popup('show'); + btn.dataset.content = btn.dataset.original; +} +function onError(btn) { + if (!btn.dataset.content) return; + $(btn).popup('destroy'); + btn.dataset.content = btn.dataset.error; + $(btn).popup('show'); + btn.dataset.content = btn.dataset.original; +} - const clipboard = new ClipboardJS(els); - clipboard.on('success', (e) => { - e.clearSelection(); - $(e.trigger).popup('destroy'); - e.trigger.dataset.content = e.trigger.dataset.success; - $(e.trigger).popup('show'); - e.trigger.dataset.content = e.trigger.dataset.original; - }); +export default async function initClipboard() { + for (const btn of document.querySelectorAll(selector) || []) { + btn.addEventListener('click', async () => { + let text; + if (btn.dataset.clipboardText) { + text = btn.dataset.clipboardText; + } else if (btn.dataset.clipboardTarget) { + text = document.querySelector(btn.dataset.clipboardTarget)?.value; + } + if (!text) return; - clipboard.on('error', (e) => { - $(e.trigger).popup('destroy'); - e.trigger.dataset.content = e.trigger.dataset.error; - $(e.trigger).popup('show'); - e.trigger.dataset.content = e.trigger.dataset.original; - }); + try { + await navigator.clipboard.writeText(text); + onSuccess(btn); + } catch { + onError(btn); + } + }); + } } -- cgit v1.2.3