diff options
author | silverwind <me@silverwind.io> | 2021-05-30 21:15:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-05-30 20:15:57 +0100 |
commit | 37205039fc83707edc8079d0884d4c12953e80b1 (patch) | |
tree | ff4adbd4ce4f6f56c5166758e2e21144d91faa1f /web_src | |
parent | 36dce0e457d99ae22530f606ce296ef4946b257b (diff) | |
download | gitea-37205039fc83707edc8079d0884d4c12953e80b1.tar.gz gitea-37205039fc83707edc8079d0884d4c12953e80b1.zip |
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
Diffstat (limited to 'web_src')
-rw-r--r-- | web_src/js/features/clipboard.js | 52 |
1 files changed, 34 insertions, 18 deletions
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); + } + }); + } } |