X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/257a7038788d7ce6183c946cf37ab2d27d114100..refs/pull/5239/head:/resources/js/services/clipboard.js diff --git a/resources/js/services/clipboard.js b/resources/js/services/clipboard.js index 6e59270a9..5f73c3020 100644 --- a/resources/js/services/clipboard.js +++ b/resources/js/services/clipboard.js @@ -1,4 +1,3 @@ - export class Clipboard { /** @@ -21,7 +20,7 @@ export class Clipboard { * @return {boolean} */ containsTabularData() { - const rtfData = this.data.getData( 'text/rtf'); + const rtfData = this.data.getData('text/rtf'); return rtfData && rtfData.includes('\\trowd'); } @@ -30,8 +29,7 @@ export class Clipboard { * @return {Array} */ getImages() { - const types = this.data.types; - const files = this.data.files; + const {types} = this.data; const images = []; for (const type of types) { @@ -41,18 +39,35 @@ export class Clipboard { } } - for (const file of files) { - if (file.type.includes('image')) { - images.push(file); - } - } + const imageFiles = this.getFiles().filter(f => f.type.includes('image')); + images.push(...imageFiles); return images; } -} -export function copyTextToClipboard(text) { - return navigator.clipboard.writeText(text); + /** + * Get the files included in the clipboard data. + * @return {File[]} + */ + getFiles() { + const {files} = this.data; + return [...files]; + } + } -export default Clipboard; \ No newline at end of file +export async function copyTextToClipboard(text) { + if (window.isSecureContext && navigator.clipboard) { + await navigator.clipboard.writeText(text); + return; + } + + // Backup option where we can't use the navigator.clipboard API + const tempInput = document.createElement('textarea'); + tempInput.style = 'position: absolute; left: -1000px; top: -1000px;'; + tempInput.value = text; + document.body.appendChild(tempInput); + tempInput.select(); + document.execCommand('copy'); + document.body.removeChild(tempInput); +}