From 9f5824fd41bc1f7ad9f30ccea317269258b8e176 Mon Sep 17 00:00:00 2001 From: pk Date: Sat, 29 Oct 2022 22:05:19 +0200 Subject: [PATCH] Add some helpers --- clipboard.js | 12 ++++++++++++ email-validator.js | 6 ++++++ upload-files.js | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 clipboard.js create mode 100644 email-validator.js create mode 100644 upload-files.js diff --git a/clipboard.js b/clipboard.js new file mode 100644 index 0000000..dfb6812 --- /dev/null +++ b/clipboard.js @@ -0,0 +1,12 @@ +export const clipboard = function(superClass) { + return class extends superClass { + copy(content) { + const txtEl = document.createElement('input'); + txtEl.type = 'hidden'; + document.body.appendChild(txtEl); + txtEl.value = content; + navigator.clipboard.writeText(content); + document.body.removeChild(txtEl); + } + }; +}; diff --git a/email-validator.js b/email-validator.js new file mode 100644 index 0000000..2811b74 --- /dev/null +++ b/email-validator.js @@ -0,0 +1,6 @@ +export const validateEmail = (control, value) => { + if (typeof value !== 'string') { + return false; + } + return value.toLowerCase().match(/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/) !== null; +} diff --git a/upload-files.js b/upload-files.js new file mode 100644 index 0000000..175e460 --- /dev/null +++ b/upload-files.js @@ -0,0 +1,43 @@ +export const upload = function(superClass) { + return class extends superClass { + /** + * Upload files to the backend + * + * @param {String} id An identifier send with the upload events to filter out the right upload if multiple onces are running. + * @param {Array} files List of files to upload + * @param {Object} opts Upload options + * @returns Promise + */ + uploadFiles(url, files, opts = {}) { + return new Promise((resolve, reject) => { + const request = new XMLHttpRequest(); + const formData = new FormData(); + + for (const key in opts) { + formData.append(key, opts[key]); + } + + request.open('POST', url, true); + request.addEventListener('readystatechange', () => { + if (request.readyState === 4) { + resolve(request); + } + }); + + request.upload.addEventListener('progress', e => { + this.dispatchEvent(new CustomEvent('upload-progress', { detail: { percent: ((e.loaded / e.total) * 100).toFixed(2) }, bubbles: true, composed: true })); + }); + + request.addEventListener('load', () => { + this.dispatchEvent(new CustomEvent('upload-finished', { detail: null, bubbles: true, composed: true })); + }); + + for (let i = 0; i < files.length; i++) { + formData.append(files[i].name, files[i]); + } + + request.send(formData); + }); + } + }; +};