From 25ed9017de82bf589c76b047f104c68b61069450 Mon Sep 17 00:00:00 2001 From: Dario Milicic Date: Thu, 7 Aug 2014 16:56:23 +0200 Subject: [PATCH] Modified the toolbar image upload button so it correctly uploads images to ELOG. Changed the response content type to application/json so the client won't have to parse the response to JSON. --- scripts/ckeditor-config.js | 1 - scripts/ckeditor/plugins/dndfiles | 2 +- .../ckeditor/plugins/image2/dialogs/image2.js | 55 +++++++++++++++++- scripts/load-ckeditor.js | 21 +++++++ src/elogd.c | 2 +- src/git-revision.h | 2 +- .../UserInterfaceState.xcuserstate | Bin 34568 -> 34609 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 16 +++++ 8 files changed, 92 insertions(+), 7 deletions(-) diff --git a/scripts/ckeditor-config.js b/scripts/ckeditor-config.js index 4a7b47e1..288377de 100755 --- a/scripts/ckeditor-config.js +++ b/scripts/ckeditor-config.js @@ -8,5 +8,4 @@ CKEDITOR.editorConfig = function( config ) { // config.language = 'fr'; // config.uiColor = '#AADC6E'; config.extraPlugins = 'abbr,timestamp,dndfiles,eqneditor'; - config.filebrowserUploadUrl = "./" }; diff --git a/scripts/ckeditor/plugins/dndfiles b/scripts/ckeditor/plugins/dndfiles index bc15610a..e339fdcd 160000 --- a/scripts/ckeditor/plugins/dndfiles +++ b/scripts/ckeditor/plugins/dndfiles @@ -1 +1 @@ -Subproject commit bc15610a6c29370d2ca1b4ddfd15a3692dabbabc +Subproject commit e339fdcd88b87ae2f742d68a48ad3b3197418dd3 diff --git a/scripts/ckeditor/plugins/image2/dialogs/image2.js b/scripts/ckeditor/plugins/image2/dialogs/image2.js index c1b70dca..be1c7037 100755 --- a/scripts/ckeditor/plugins/image2/dialogs/image2.js +++ b/scripts/ckeditor/plugins/image2/dialogs/image2.js @@ -9,6 +9,7 @@ 'use strict'; + CKEDITOR.dialog.add( 'image2', function( editor ) { // RegExp: 123, 123px, empty string "" @@ -526,7 +527,6 @@ CKEDITOR.dialog.add( 'image2', function( editor ) { }, { id: 'Upload', - hidden: true, filebrowser: 'uploadButton', label: lang.uploadTab, elements: [ @@ -539,8 +539,57 @@ CKEDITOR.dialog.add( 'image2', function( editor ) { { type: 'fileButton', id: 'uploadButton', - filebrowser: 'info:src', - label: "uploadaj ovde", + onLoad: function( a ) { + CKEDITOR.document.getById( this.domId ).on( 'click', function() { + + // grab the file(s) from the file input tag and upload it using AJAX + var dialog = this.getDialog(); + var files = dialog.getContentElement("Upload", "upload").getInputElement().$.files; + var formData = new FormData(); + formData.append('drop-count', files.length); // number of files being uploaded + for (var i = 0; i < files.length; i++) { + formData.append('next_attachment', parent.next_attachment); + formData.append('encoding', "HTML"); + formData.append('attfile', files[i]); + formData.append('acmd', "Upload"); // Command for the server to recognize this as an ajax upload + } + + var URL = '/' + parent.logbook + '/upload.html?next_attachment=' + parent.next_attachment; + + $.ajax({ + xhr: function() + { + var xhr = new window.XMLHttpRequest(); + + //Upload progress + xhr.upload.addEventListener("progress", function(evt){ + if (evt.lengthComputable) { + var percentComplete = evt.loaded / evt.total; + //Do something with upload progress + // console.log(percentComplete); + } + }, false); + + return xhr; + }, + contentType: false, + processData: false, + type: 'POST', + url: URL, + data: formData, + success: function(data) { + dialog.getContentElement( 'info', 'src' ).setValue( data.attachments[0].fullName ); + }, + fail: function() { + console.log("error"); + } + }); + + // Do not call the built-in click command + return false; + }, this ); + }, + label: lang.btnUpload, 'for': [ 'Upload', 'upload' ] } ] diff --git a/scripts/load-ckeditor.js b/scripts/load-ckeditor.js index 1b04ce95..434cd852 100755 --- a/scripts/load-ckeditor.js +++ b/scripts/load-ckeditor.js @@ -22,5 +22,26 @@ $(document).ready(function() { ev.editor.commands.save.exec = overridecmd.exec; }); + // There is a default listener on the submit button that we + // need to get rid off in order to get custom upload working + CKEDITOR.on('dialogDefinition', function (ev) { + // Take the dialog name and its definition from the event data. + var dialogName = ev.data.name; + var dialogDefinition = ev.data.definition; + + // Check if the definition is from the dialog we're + // interested in (the 'image2' dialog). + if ( dialogName == 'image2' ) { + + var dialogObj = dialogDefinition.dialog; + dialogObj.on("show", function() { + // replace the submit function with something useless + dialogObj.getContentElement( 'Upload', 'upload' ).submit = function() { + return false; + }; + }); + } + }); + CKEDITOR.replace('Text'); }); \ No newline at end of file diff --git a/src/elogd.c b/src/elogd.c index aaabfed8..f7717026 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -26349,7 +26349,7 @@ void show_uploader_json(LOGBOOK *lbs) } if (!getcfg("global", "charset", charset, sizeof(charset))) strcpy(charset, DEFAULT_HTTP_CHARSET); - rsprintf("Content-Type: text/plain;charset=%s\r\n\r\n", charset); + rsprintf("Content-Type: application/json;charset=%s\r\n\r\n", charset); long attch_count = strtol(getparam("drop-count"), NULL, 10); diff --git a/src/git-revision.h b/src/git-revision.h index c21a104b..694fbc1b 100644 --- a/src/git-revision.h +++ b/src/git-revision.h @@ -1 +1 @@ -#define GIT_REVISION "Thu Jul 31 17:01:04 2014 +0200 - a883408" +#define GIT_REVISION "Wed Aug 6 15:19:55 2014 +0200 - d05e601" diff --git a/xcode/elogd.xcodeproj/project.xcworkspace/xcuserdata/dmilicic.xcuserdatad/UserInterfaceState.xcuserstate b/xcode/elogd.xcodeproj/project.xcworkspace/xcuserdata/dmilicic.xcuserdatad/UserInterfaceState.xcuserstate index 71f5faf3cf1f97702ac39b216e50e2a383277853..10050792bad99a6330d2de87e9abe0c01a326619 100644 GIT binary patch delta 14359 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 delta 14648 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 + + + +