diff --git a/ayanova/src/api/gzapi.js b/ayanova/src/api/gzapi.js index 49cb9cd7..e25017d9 100644 --- a/ayanova/src/api/gzapi.js +++ b/ayanova/src/api/gzapi.js @@ -263,14 +263,22 @@ export default { ///////////////////////////// // Attachment download URL // - downloadUrl(fileId) { + downloadUrl(fileId, ctype) { //http://localhost:7575/api/v8/Attachment/download/100?t=sssss - return this.APIUrl( + //Ctype is optional and is the MIME content type, used to detect image urls at client for drag and drop ops + //in wiki but ignored by server + + let url = "Attachment/download/" + - fileId + - "?t=" + - window.$gz.store.state.downloadToken - ); + fileId + + "?t=" + + window.$gz.store.state.downloadToken; + + if (ctype && ctype.includes("image")) { + url += "&i=1"; + } + + return this.APIUrl(url); }, ///////////////////////////// // REPLACE END OF URL diff --git a/ayanova/src/api/gzutil.js b/ayanova/src/api/gzutil.js index 44f7307c..c52c0337 100644 --- a/ayanova/src/api/gzutil.js +++ b/ayanova/src/api/gzutil.js @@ -267,6 +267,9 @@ export default { // @return {string} A new string with the spliced substring. stringSplice: function(source, start, delCount, newSubStr) { if (source == null || source == "") { + if (newSubStr) { + return newSubStr; + } return ""; } return ( @@ -339,6 +342,10 @@ export default { ); return "fa-file"; } + + if (!mimeType) { + mimeType = ""; + } mimeType = mimeType.toLowerCase(); let iconFromExtension = extensions[extension]; @@ -355,6 +362,15 @@ export default { // "gzutil:iconForFile -> No icon for file:" + fileName + " Mime:" + mimeType // ); return "fa-file"; + }, + /////////////////////////////////////////////// + // attempt to detect image extension name + // + isImageURI: function(uri) { + if (!uri) { + return false; + } + return this.iconForFile(uri, "") == "fa-file-image"; } /** diff --git a/ayanova/src/components/attachment-control.vue b/ayanova/src/components/attachment-control.vue index 80b73a73..cc70ad86 100644 --- a/ayanova/src/components/attachment-control.vue +++ b/ayanova/src/components/attachment-control.vue @@ -235,7 +235,7 @@ export default { ret.push({ id: o.id, concurrencyToken: o.concurrencyToken, - url: window.$gz.api.downloadUrl(o.id), + url: window.$gz.api.downloadUrl(o.id,o.contentType), name: o.displayFileName, date: window.$gz.locale.utcDateToShortDateAndTimeLocalized( o.lastModified, diff --git a/ayanova/src/components/wiki-control.vue b/ayanova/src/components/wiki-control.vue index 653ca607..b8f069b5 100644 --- a/ayanova/src/components/wiki-control.vue +++ b/ayanova/src/components/wiki-control.vue @@ -828,36 +828,53 @@ export default { } else { //maybe an url? let url = ev.dataTransfer.getData("text"); + let isImageUrl = false; + console.log(ev.dataTransfer); + //todo: use alternate to "text" to look for url specifically + //if not an url then can just drop as plain text + //todo: handle both internal and external urls in the same block, because the only diff is the url itself, the rest is identical + if (url) { //Attachment? if (url.includes("Attachment/download/")) { //it's an attachment url so fixup accordingly - //DROP:Possible url http://localhost:7575/api/v8.0/Attachment/download/4?t=CYs1xUgjdyaWmcq8rXlPpNNSaKpiMt8Xhi7mKRGeg8o wiki-control.vue:826 - //cow(.*)milk + //i paramter added by gzapi::downloadUrl function + isImageUrl = url.includes("&i="); let m = url.match(/Attachment\/download\/(.*)\?t=/); if (m.length > 1) { url = "[ATTACH:" + m[1] + "]"; } else { url = null; } - if (url != null) { - //insert into textarea - let txt = this.getSelectedText(); - if (txt) { + } else { + //External url, sniff out if it's an image + isImageUrl = window.$gz.util.isImageURI(url); + } + if (url != null) { + //insert into textarea + let txt = this.getSelectedText(); + if (txt) { + if (isImageUrl) { this.replaceSelectedText( "![" + txt + "](" + url + ' "' + txt + '") \n' + txt //keep original selected text otherwise it will vanish ); } else { - this.replaceSelectedText("![](" + url + ")"); + //regular url not image + this.replaceSelectedText( + "[" + txt + "](" + url + ' "' + txt + '")\n' + ); + } + } else { + //No selected text + if (isImageUrl) { + this.replaceSelectedText("![](" + url + ")\n"); + } else { + //regular no text non image url + this.replaceSelectedText("<" + url + ">\n"); } - //trigger dirty change - this.handleInput(this.localVal); } - console.log("processed url:", url); - } else { - //External url - //todo: this - console.log("STUB: Handle external url drop"); + //trigger dirty change + this.handleInput(this.localVal); } //handle accordingly