diff --git a/app/javascript/elements/download_button.js b/app/javascript/elements/download_button.js new file mode 100644 index 00000000..a51138e7 --- /dev/null +++ b/app/javascript/elements/download_button.js @@ -0,0 +1,38 @@ +import { target, targetable } from '@github/catalyst/lib/targetable' + +export default targetable(class extends HTMLElement { + static [target.static] = ['defaultButton', 'loadingButton'] + + connectedCallback () { + this.addEventListener('click', () => this.downloadFiles()) + } + + toggleState () { + this.defaultButton?.classList?.toggle('hidden') + this.loadingButton?.classList?.toggle('hidden') + } + + downloadFiles () { + if (!this.dataset.src) return + + this.toggleState() + + fetch(this.dataset.src).then((response) => response.json()).then((urls) => { + urls.forEach((url) => { + fetch(url).then(async (resp) => { + const blobUrl = URL.createObjectURL(await resp.blob()) + const link = document.createElement('a') + + link.href = blobUrl + link.setAttribute('download', resp.headers.get('content-disposition').split('"')[1]) + + link.click() + + URL.revokeObjectURL(url) + }) + }) + }).finally(() => { + this.toggleState() + }) + } +}) diff --git a/app/javascript/form.js b/app/javascript/form.js index 020e1757..6c2e7dd0 100644 --- a/app/javascript/form.js +++ b/app/javascript/form.js @@ -1,7 +1,9 @@ import { createApp, reactive } from 'vue' import Form from './submission_form/form' +import DownloadButton from './elements/download_button' +window.customElements.define('download-button', DownloadButton) window.customElements.define('submission-form', class extends HTMLElement { connectedCallback () { this.appElem = document.createElement('div') diff --git a/app/views/submit_form/completed.html.erb b/app/views/submit_form/completed.html.erb index 09e72f28..6bd556f7 100644 --- a/app/views/submit_form/completed.html.erb +++ b/app/views/submit_form/completed.html.erb @@ -29,7 +29,16 @@