From 36c33cfaa90f0fb940be211d1ed1553610068bd4 Mon Sep 17 00:00:00 2001 From: Christopher Zenzel Date: Sun, 20 Sep 2015 09:19:33 -0400 Subject: [PATCH 1/3] Add File Uploads to Jingo using Multer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add file uploads to Jingo using Multer. You must create an “uploads” directory within your repository root to support uploads using this branch. --- lib/app.js | 35 +++++++++++++++++++++++++++++++ package.json | 1 + public/css/style.css | 3 +++ public/img/upload_16.png | Bin 0 -> 1302 bytes public/js/app.js | 16 ++++++++++++-- public/vendor/jquery.form.min.js | 11 ++++++++++ routes/misc.js | 16 ++++++++++++++ views/create.jade | 3 +++ views/edit.jade | 3 +++ views/mixins/form.jade | 1 + views/upload.jade | 13 ++++++++++++ views/upload_status.jade | 1 + 12 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 public/img/upload_16.png create mode 100644 public/vendor/jquery.form.min.js create mode 100644 views/upload.jade create mode 100644 views/upload_status.jade diff --git a/lib/app.js b/lib/app.js index beac9945..f282ba7b 100644 --- a/lib/app.js +++ b/lib/app.js @@ -23,6 +23,7 @@ var express = require("express"), gravatar = require("gravatar"), passport = require("passport"), methodOverride = require("method-override"), + multer = require("multer"), flash = require("express-flash"); var app; @@ -179,6 +180,40 @@ module.exports.initialize = function (config) { } } + // File Uploads + var upload = multer({ dest: app.locals.config.get("application").repository + '/uploads/' }); + + app.use('/uploads', express.static(app.locals.config.get("application").repository + '/uploads')); + + app.post('/uploadFile', upload.single('wiki_file'), function (req, res, next) { + if (!res.locals.user) { + return; + } + + var file_name = req.file.originalname; + var rep_file = app.locals.config.get("application").repository + '/uploads/' + file_name; + + var temp_file = req.file.path; + var output_msg = ""; + + var fs = require('fs'); + + fs.unlink(rep_file, function(err) { + }); + + fs.readFile(temp_file, function(err, data) { + fs.writeFile(rep_file, data, function(err) { + fs.unlink(temp_file, function() { + var git_msg = req.body.file_message; + Git.add(rep_file, git_msg, req.user.asGitAuthor, function(err) { + }); + output_msg = 'File uploaded to:
/uploads/' + file_name + '
'; + res.render('upload_status', {message: output_msg}); + }); + }); + }); + }); + app.all("/pages/*", requireAuthentication); if (!app.locals.config.get("authorization").anonRead) { diff --git a/package.json b/package.json index 0569a369..4335912c 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "passport-local": "^1.0.0", "semver": "^2.3.2", "serve-favicon": "^2.1.7", + "multer": "*", "transliteration": "^0.1.1" }, "devDependencies": { diff --git a/public/css/style.css b/public/css/style.css index 105fdf95..cb6dea30 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -503,6 +503,9 @@ ul.doc-list > li .message { .toolbar li.preview span { background-image:url(../img/preview_16.png); } +.toolbar li.upload span { + background-image:url(../img/upload_16.png); +} .toolbar.fullscreen { position: fixed; diff --git a/public/img/upload_16.png b/public/img/upload_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5e848bebaf3cd7ce26c7cbd97c1aab61546ff98f GIT binary patch literal 1302 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pn}txArU1JzCKpT`MG+DDfvmMdKI|^K-CNkHWgMtW^QUpqC!P(PF}H9 zg{=};g%ywu64qBz04piUwpEJo4N!2-FG^J~)icpEP_pAvP*AWbN=dT{a&d!d2l8x{ zGD=Dctn~HE%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij^UTz|3(;Elw`V zEGWs$&r<-Io0ybeT4JlD1hNPYpzh2qfLoMT4D}VzfBF@P1^R}12Kv}Em1L$NoQI+d zBm>a~_7%i38(`2_ITxiSmgEDT`Z{Y|wuIVxUZuq^rWM6h#?U}vb&saV$-}m{4?4fgpZSxqCW_Uziz2UT0 zr{#Wf>RRdUZJ-nyhi%s!}#_V4wi@A5&PA)B*Q*PpW z=WS{F|DytnGu3bH?*yJz*OtwU zm-aj+wS5)O+Rfj4`5IgH_nV7U#W*=mm?*U=glCU}m;U|tylIx23zmJ&n8MI`CFFXW zUrWpD-!@-LcU*`$^l=)`Wo;q(VBfV(8K!KvmOQgdoaVOkwtaBT-76Y7p1JF`aqhbH zcJZAz3lcBhd9KD-v);Hk&Um}Yh}u^JKuCZ5M9;lvsr%cBaii~g&w;* zZK+)IP;Xs|6#xDs8$O%H1che4wTw$V8YZ^U=-HvHnN6p+?@jorVy-)t?c%qT;-ASn zALkuRw^(7qw(zlnQP08yu|C%)S>5L5o3c~VD&w)Ap1Y9mZCkfhJbIrb{EIJ`zd2ze zm^tfO=a)q@lG+NFem=#2Aan)yTsgK~HAiM1wCX=#7q)E|0y!ftWTP)w^^wSUVT zf5!>)I9iMUS(_LBC_Wp}wB=KSF8iB}Tl1g(RS8adwUwJueOmt--v^zA^XBWG{q?oi zt2+Ipww9{*trG##kN;P$$tk^dE$+>yKWlqW-C6ohviooUDfRR^pFB2Q6hX`elN z%M{|5$@=&`-S4<;=aPqSOYOeDiMGt^sF~{=ufK0kkw$#_Y_qnq>p#s!5BIRindpau O3M)@nKbLh*2~7Y_h!Q*i literal 0 HcmV?d00001 diff --git a/public/js/app.js b/public/js/app.js index b10dab51..e103e7e1 100644 --- a/public/js/app.js +++ b/public/js/app.js @@ -187,6 +187,13 @@ $('form.edit').submit(); }, + upload: function() { + $("#upload").modal({keyboard: true, show: true, backdrop: false}); + $.get("/misc/upload", function(data) { + $("#upload .modal-body").html(data).get(0).scrollTop = 0; + }); + }, + toggleFullscreen: function () { var isFullscreen = Jingo.cmInstance.getOption("fullScreen"); @@ -201,10 +208,12 @@ $toolbar = $("
    "); $toolbar.append("
  • \ +
  • \
  • \ -
").insertBefore($("form.edit textarea:first").closest("div")); +
  • \ + ").insertBefore($("form.edit textarea:first").closest("div")); - $("ul.toolbar").on("click", "span", function () { + $("ul.toolbar").on("click", "span", function() { if (this.parentNode.className == "info") { Jingo.markdownSyntax(); } @@ -215,6 +224,9 @@ if (this.parentNode.className == "fullscreen") { Jingo.toggleFullscreen(); } + if (this.parentNode.className == "upload") { + Jingo.upload(); + } }); }, diff --git a/public/vendor/jquery.form.min.js b/public/vendor/jquery.form.min.js new file mode 100644 index 00000000..7321a3b0 --- /dev/null +++ b/public/vendor/jquery.form.min.js @@ -0,0 +1,11 @@ +/*! + * jQuery Form Plugin + * version: 3.51.0-2014.06.20 + * Requires jQuery v1.5 or later + * Copyright (c) 2014 M. Alsup + * Examples and documentation at: http://malsup.com/jquery/form/ + * Project repository: https://github.com/malsup/form + * Dual licensed under the MIT and GPL licenses. + * https://github.com/malsup/form#copyright-and-license + */ +!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e("undefined"!=typeof jQuery?jQuery:window.Zepto)}(function(e){"use strict";function t(t){var r=t.data;t.isDefaultPrevented()||(t.preventDefault(),e(t.target).ajaxSubmit(r))}function r(t){var r=t.target,a=e(r);if(!a.is("[type=submit],[type=image]")){var n=a.closest("[type=submit]");if(0===n.length)return;r=n[0]}var i=this;if(i.clk=r,"image"==r.type)if(void 0!==t.offsetX)i.clk_x=t.offsetX,i.clk_y=t.offsetY;else if("function"==typeof e.fn.offset){var o=a.offset();i.clk_x=t.pageX-o.left,i.clk_y=t.pageY-o.top}else i.clk_x=t.pageX-r.offsetLeft,i.clk_y=t.pageY-r.offsetTop;setTimeout(function(){i.clk=i.clk_x=i.clk_y=null},100)}function a(){if(e.fn.ajaxSubmit.debug){var t="[jquery.form] "+Array.prototype.join.call(arguments,"");window.console&&window.console.log?window.console.log(t):window.opera&&window.opera.postError&&window.opera.postError(t)}}var n={};n.fileapi=void 0!==e("").get(0).files,n.formdata=void 0!==window.FormData;var i=!!e.fn.prop;e.fn.attr2=function(){if(!i)return this.attr.apply(this,arguments);var e=this.prop.apply(this,arguments);return e&&e.jquery||"string"==typeof e?e:this.attr.apply(this,arguments)},e.fn.ajaxSubmit=function(t){function r(r){var a,n,i=e.param(r,t.traditional).split("&"),o=i.length,s=[];for(a=0;o>a;a++)i[a]=i[a].replace(/\+/g," "),n=i[a].split("="),s.push([decodeURIComponent(n[0]),decodeURIComponent(n[1])]);return s}function o(a){for(var n=new FormData,i=0;i').val(m.extraData[d].value).appendTo(w)[0]:e('').val(m.extraData[d]).appendTo(w)[0]);m.iframeTarget||v.appendTo("body"),g.attachEvent?g.attachEvent("onload",s):g.addEventListener("load",s,!1),setTimeout(t,15);try{w.submit()}catch(h){var x=document.createElement("form").submit;x.apply(w)}}finally{w.setAttribute("action",i),w.setAttribute("enctype",c),r?w.setAttribute("target",r):f.removeAttr("target"),e(l).remove()}}function s(t){if(!x.aborted&&!F){if(M=n(g),M||(a("cannot access response document"),t=k),t===D&&x)return x.abort("timeout"),void S.reject(x,"timeout");if(t==k&&x)return x.abort("server abort"),void S.reject(x,"error","server abort");if(M&&M.location.href!=m.iframeSrc||T){g.detachEvent?g.detachEvent("onload",s):g.removeEventListener("load",s,!1);var r,i="success";try{if(T)throw"timeout";var o="xml"==m.dataType||M.XMLDocument||e.isXMLDoc(M);if(a("isXml="+o),!o&&window.opera&&(null===M.body||!M.body.innerHTML)&&--O)return a("requeing onLoad callback, DOM not available"),void setTimeout(s,250);var u=M.body?M.body:M.documentElement;x.responseText=u?u.innerHTML:null,x.responseXML=M.XMLDocument?M.XMLDocument:M,o&&(m.dataType="xml"),x.getResponseHeader=function(e){var t={"content-type":m.dataType};return t[e.toLowerCase()]},u&&(x.status=Number(u.getAttribute("status"))||x.status,x.statusText=u.getAttribute("statusText")||x.statusText);var c=(m.dataType||"").toLowerCase(),l=/(json|script|text)/.test(c);if(l||m.textarea){var f=M.getElementsByTagName("textarea")[0];if(f)x.responseText=f.value,x.status=Number(f.getAttribute("status"))||x.status,x.statusText=f.getAttribute("statusText")||x.statusText;else if(l){var p=M.getElementsByTagName("pre")[0],h=M.getElementsByTagName("body")[0];p?x.responseText=p.textContent?p.textContent:p.innerText:h&&(x.responseText=h.textContent?h.textContent:h.innerText)}}else"xml"==c&&!x.responseXML&&x.responseText&&(x.responseXML=X(x.responseText));try{E=_(x,c,m)}catch(y){i="parsererror",x.error=r=y||i}}catch(y){a("error caught: ",y),i="error",x.error=r=y||i}x.aborted&&(a("upload aborted"),i=null),x.status&&(i=x.status>=200&&x.status<300||304===x.status?"success":"error"),"success"===i?(m.success&&m.success.call(m.context,E,"success",x),S.resolve(x.responseText,"success",x),d&&e.event.trigger("ajaxSuccess",[x,m])):i&&(void 0===r&&(r=x.statusText),m.error&&m.error.call(m.context,x,i,r),S.reject(x,"error",r),d&&e.event.trigger("ajaxError",[x,m,r])),d&&e.event.trigger("ajaxComplete",[x,m]),d&&!--e.active&&e.event.trigger("ajaxStop"),m.complete&&m.complete.call(m.context,x,i),F=!0,m.timeout&&clearTimeout(j),setTimeout(function(){m.iframeTarget?v.attr("src",m.iframeSrc):v.remove(),x.responseXML=null},100)}}}var c,l,m,d,p,v,g,x,y,b,T,j,w=f[0],S=e.Deferred();if(S.abort=function(e){x.abort(e)},r)for(l=0;l'),v.css({position:"absolute",top:"-1000px",left:"-1000px"})),g=v[0],x={aborted:0,responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){},abort:function(t){var r="timeout"===t?"timeout":"aborted";a("aborting upload... "+r),this.aborted=1;try{g.contentWindow.document.execCommand&&g.contentWindow.document.execCommand("Stop")}catch(n){}v.attr("src",m.iframeSrc),x.error=r,m.error&&m.error.call(m.context,x,r,t),d&&e.event.trigger("ajaxError",[x,m,r]),m.complete&&m.complete.call(m.context,x,r)}},d=m.global,d&&0===e.active++&&e.event.trigger("ajaxStart"),d&&e.event.trigger("ajaxSend",[x,m]),m.beforeSend&&m.beforeSend.call(m.context,x,m)===!1)return m.global&&e.active--,S.reject(),S;if(x.aborted)return S.reject(),S;y=w.clk,y&&(b=y.name,b&&!y.disabled&&(m.extraData=m.extraData||{},m.extraData[b]=y.value,"image"==y.type&&(m.extraData[b+".x"]=w.clk_x,m.extraData[b+".y"]=w.clk_y)));var D=1,k=2,A=e("meta[name=csrf-token]").attr("content"),L=e("meta[name=csrf-param]").attr("content");L&&A&&(m.extraData=m.extraData||{},m.extraData[L]=A),m.forceSync?o():setTimeout(o,10);var E,M,F,O=50,X=e.parseXML||function(e,t){return window.ActiveXObject?(t=new ActiveXObject("Microsoft.XMLDOM"),t.async="false",t.loadXML(e)):t=(new DOMParser).parseFromString(e,"text/xml"),t&&t.documentElement&&"parsererror"!=t.documentElement.nodeName?t:null},C=e.parseJSON||function(e){return window.eval("("+e+")")},_=function(t,r,a){var n=t.getResponseHeader("content-type")||"",i="xml"===r||!r&&n.indexOf("xml")>=0,o=i?t.responseXML:t.responseText;return i&&"parsererror"===o.documentElement.nodeName&&e.error&&e.error("parsererror"),a&&a.dataFilter&&(o=a.dataFilter(o,r)),"string"==typeof o&&("json"===r||!r&&n.indexOf("json")>=0?o=C(o):("script"===r||!r&&n.indexOf("javascript")>=0)&&e.globalEval(o)),o};return S}if(!this.length)return a("ajaxSubmit: skipping submit process - no element selected"),this;var u,c,l,f=this;"function"==typeof t?t={success:t}:void 0===t&&(t={}),u=t.type||this.attr2("method"),c=t.url||this.attr2("action"),l="string"==typeof c?e.trim(c):"",l=l||window.location.href||"",l&&(l=(l.match(/^([^#]+)/)||[])[1]),t=e.extend(!0,{url:l,success:e.ajaxSettings.success,type:u||e.ajaxSettings.type,iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank"},t);var m={};if(this.trigger("form-pre-serialize",[this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-pre-serialize trigger"),this;if(t.beforeSerialize&&t.beforeSerialize(this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSerialize callback"),this;var d=t.traditional;void 0===d&&(d=e.ajaxSettings.traditional);var p,h=[],v=this.formToArray(t.semantic,h);if(t.data&&(t.extraData=t.data,p=e.param(t.data,d)),t.beforeSubmit&&t.beforeSubmit(v,this,t)===!1)return a("ajaxSubmit: submit aborted via beforeSubmit callback"),this;if(this.trigger("form-submit-validate",[v,this,t,m]),m.veto)return a("ajaxSubmit: submit vetoed via form-submit-validate trigger"),this;var g=e.param(v,d);p&&(g=g?g+"&"+p:p),"GET"==t.type.toUpperCase()?(t.url+=(t.url.indexOf("?")>=0?"&":"?")+g,t.data=null):t.data=g;var x=[];if(t.resetForm&&x.push(function(){f.resetForm()}),t.clearForm&&x.push(function(){f.clearForm(t.includeHidden)}),!t.dataType&&t.target){var y=t.success||function(){};x.push(function(r){var a=t.replaceTarget?"replaceWith":"html";e(t.target)[a](r).each(y,arguments)})}else t.success&&x.push(t.success);if(t.success=function(e,r,a){for(var n=t.context||this,i=0,o=x.length;o>i;i++)x[i].apply(n,[e,r,a||f,f])},t.error){var b=t.error;t.error=function(e,r,a){var n=t.context||this;b.apply(n,[e,r,a,f])}}if(t.complete){var T=t.complete;t.complete=function(e,r){var a=t.context||this;T.apply(a,[e,r,f])}}var j=e("input[type=file]:enabled",this).filter(function(){return""!==e(this).val()}),w=j.length>0,S="multipart/form-data",D=f.attr("enctype")==S||f.attr("encoding")==S,k=n.fileapi&&n.formdata;a("fileAPI :"+k);var A,L=(w||D)&&!k;t.iframe!==!1&&(t.iframe||L)?t.closeKeepAlive?e.get(t.closeKeepAlive,function(){A=s(v)}):A=s(v):A=(w||D)&&k?o(v):e.ajax(t),f.removeData("jqxhr").data("jqxhr",A);for(var E=0;Ec;c++)if(d=u[c],f=d.name,f&&!d.disabled)if(t&&o.clk&&"image"==d.type)o.clk==d&&(a.push({name:f,value:e(d).val(),type:d.type}),a.push({name:f+".x",value:o.clk_x},{name:f+".y",value:o.clk_y}));else if(m=e.fieldValue(d,!0),m&&m.constructor==Array)for(r&&r.push(d),l=0,h=m.length;h>l;l++)a.push({name:f,value:m[l]});else if(n.fileapi&&"file"==d.type){r&&r.push(d);var v=d.files;if(v.length)for(l=0;li;i++)r.push({name:a,value:n[i]});else null!==n&&"undefined"!=typeof n&&r.push({name:this.name,value:n})}}),e.param(r)},e.fn.fieldValue=function(t){for(var r=[],a=0,n=this.length;n>a;a++){var i=this[a],o=e.fieldValue(i,t);null===o||"undefined"==typeof o||o.constructor==Array&&!o.length||(o.constructor==Array?e.merge(r,o):r.push(o))}return r},e.fieldValue=function(t,r){var a=t.name,n=t.type,i=t.tagName.toLowerCase();if(void 0===r&&(r=!0),r&&(!a||t.disabled||"reset"==n||"button"==n||("checkbox"==n||"radio"==n)&&!t.checked||("submit"==n||"image"==n)&&t.form&&t.form.clk!=t||"select"==i&&-1==t.selectedIndex))return null;if("select"==i){var o=t.selectedIndex;if(0>o)return null;for(var s=[],u=t.options,c="select-one"==n,l=c?o+1:u.length,f=c?o:0;l>f;f++){var m=u[f];if(m.selected){var d=m.value;if(d||(d=m.attributes&&m.attributes.value&&!m.attributes.value.specified?m.text:m.value),c)return d;s.push(d)}}return s}return e(t).val()},e.fn.clearForm=function(t){return this.each(function(){e("input,select,textarea",this).clearFields(t)})},e.fn.clearFields=e.fn.clearInputs=function(t){var r=/^(?:color|date|datetime|email|month|number|password|range|search|tel|text|time|url|week)$/i;return this.each(function(){var a=this.type,n=this.tagName.toLowerCase();r.test(a)||"textarea"==n?this.value="":"checkbox"==a||"radio"==a?this.checked=!1:"select"==n?this.selectedIndex=-1:"file"==a?/MSIE/.test(navigator.userAgent)?e(this).replaceWith(e(this).clone(!0)):e(this).val(""):t&&(t===!0&&/hidden/.test(a)||"string"==typeof t&&e(this).is(t))&&(this.value="")})},e.fn.resetForm=function(){return this.each(function(){("function"==typeof this.reset||"object"==typeof this.reset&&!this.reset.nodeType)&&this.reset()})},e.fn.enable=function(e){return void 0===e&&(e=!0),this.each(function(){this.disabled=!e})},e.fn.selected=function(t){return void 0===t&&(t=!0),this.each(function(){var r=this.type;if("checkbox"==r||"radio"==r)this.checked=t;else if("option"==this.tagName.toLowerCase()){var a=e(this).parent("select");t&&a[0]&&"select-one"==a[0].type&&a.find("option").selected(!1),this.selected=t}})},e.fn.ajaxSubmit.debug=!1}); \ No newline at end of file diff --git a/routes/misc.js b/routes/misc.js index 9c260028..b877d1ca 100644 --- a/routes/misc.js +++ b/routes/misc.js @@ -1,4 +1,5 @@ var router = require("express").Router(), + app = require("../lib/app").getInstance(), renderer = require("../lib/renderer"), fs = require("fs"), models = require("../lib/models"); @@ -8,6 +9,7 @@ models.use(Git); router.get("/misc/syntax-reference", _getSyntaxReference); router.post("/misc/preview", _postPreview); router.get("/misc/existence", _getExistence); +router.get("/misc/upload", _getUploadForm); function _getSyntaxReference(req, res) { res.render("syntax"); @@ -19,6 +21,20 @@ function _postPreview(req, res) { }); } +function _getUploadForm(req, res) { + if (!res.locals.user) { + res.render("404", { + title: 'Modules' + }); + return; + } + + res.render("upload", { + config: app.locals.config.get("application").repository, + message: 'Ready to upload.' + }); +} + function _getExistence(req, res) { if (!req.query.data) { diff --git a/views/create.jade b/views/create.jade index bf630ff7..725afac8 100644 --- a/views/create.jade +++ b/views/create.jade @@ -25,6 +25,9 @@ block content #preview(tabindex="-1",role="dialog",aria-hidden="true").modal mixin dialogBox("Page preview") + #upload(tabindex="-1",role="dialog",aria-hidden="true").modal + mixin dialogBox("Upload a file") + #syntax-reference(tabindex="-1",role="dialog",aria-hidden="true").modal mixin dialogBox("Markdown cheatsheet") diff --git a/views/edit.jade b/views/edit.jade index 020ee5e4..2ad4229a 100644 --- a/views/edit.jade +++ b/views/edit.jade @@ -32,6 +32,9 @@ block content #preview(tabindex="-1",role="dialog",aria-hidden="true").modal mixin dialogBox("Page preview") + #upload(tabindex="-1",role="dialog",aria-hidden="true").modal + mixin dialogBox("Upload a file") + #syntax-reference(tabindex="-1",role="dialog",aria-hidden="true").modal mixin dialogBox("Markdown cheatsheet") diff --git a/views/mixins/form.jade b/views/mixins/form.jade index 7d6447f1..57a6d431 100644 --- a/views/mixins/form.jade +++ b/views/mixins/form.jade @@ -67,6 +67,7 @@ mixin featuresJavaScripts() if hasFeature('markitup') +asset("/vendor/jquery-migrate-1.1.0.min.js") +asset("/vendor/markitup/jquery.markitup.js") + +asset("/vendor/jquery.form.min.js") +asset("/vendor/markitup/sets/markdown/set.js") +asset("/vendor/widearea/widearea.min.js") script. diff --git a/views/upload.jade b/views/upload.jade new file mode 100644 index 00000000..53eb4eb2 --- /dev/null +++ b/views/upload.jade @@ -0,0 +1,13 @@ +form(id="wiki_upload", action="/uploadFile", method="post", enctype="multipart/form-data") + p + input.form-control(type="file", name="wiki_file", id="wiki_file") + p Commit Message + p + input.form-control(type="text", value="File Attachment Upload", name="file_message") + p + input(type="submit", name="wiki_upload_submit", id="wiki_upload_submit", value="Upload").btn.btn-default +div(id="upload_status") + p Ready for upload. +script(src="/vendor/jquery.form.min.js") +script + $(document).ready(function() { $("#wiki_upload").ajaxForm(function(response) { $('#upload_status').html(response); }); }); \ No newline at end of file diff --git a/views/upload_status.jade b/views/upload_status.jade new file mode 100644 index 00000000..4c81458d --- /dev/null +++ b/views/upload_status.jade @@ -0,0 +1 @@ +#message!=message \ No newline at end of file From 0ca3168ddd8e33faf6b1765600832523c0ed6828 Mon Sep 17 00:00:00 2001 From: Sam Cristall Date: Sat, 15 Oct 2016 15:52:10 -0600 Subject: [PATCH 2/3] Add Field to change Filename in Repository --- lib/app.js | 6 +++--- public/js/upload.js | 9 +++++++++ views/upload.jade | 6 ++++-- 3 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 public/js/upload.js diff --git a/lib/app.js b/lib/app.js index f282ba7b..143eb66d 100644 --- a/lib/app.js +++ b/lib/app.js @@ -190,8 +190,8 @@ module.exports.initialize = function (config) { return; } - var file_name = req.file.originalname; - var rep_file = app.locals.config.get("application").repository + '/uploads/' + file_name; + var rep_file_name = req.body.rep_file_name; + var rep_file = app.locals.config.get("application").repository + '/uploads/' + rep_file_name; var temp_file = req.file.path; var output_msg = ""; @@ -207,7 +207,7 @@ module.exports.initialize = function (config) { var git_msg = req.body.file_message; Git.add(rep_file, git_msg, req.user.asGitAuthor, function(err) { }); - output_msg = 'File uploaded to:
    /uploads/' + file_name + '
    '; + output_msg = 'File uploaded to:
    /uploads/' + rep_file_name + '
    '; res.render('upload_status', {message: output_msg}); }); }); diff --git a/public/js/upload.js b/public/js/upload.js new file mode 100644 index 00000000..fac48813 --- /dev/null +++ b/public/js/upload.js @@ -0,0 +1,9 @@ +$(document).ready(function() { + $("#wiki_upload").ajaxForm(function(response) { + $('#upload_status').html(response); + }); + $("input#wiki_file").change(function() { + var filename = $(this).val().replace(/^.*[\\\/]/, '') + $("input#rep_file_name").val(filename); + }); +}); diff --git a/views/upload.jade b/views/upload.jade index 53eb4eb2..7d685a28 100644 --- a/views/upload.jade +++ b/views/upload.jade @@ -1,6 +1,9 @@ form(id="wiki_upload", action="/uploadFile", method="post", enctype="multipart/form-data") p input.form-control(type="file", name="wiki_file", id="wiki_file") + p Filename in Repository + p + input.form-control(type="text", value="", name="rep_file_name", id="rep_file_name") p Commit Message p input.form-control(type="text", value="File Attachment Upload", name="file_message") @@ -9,5 +12,4 @@ form(id="wiki_upload", action="/uploadFile", method="post", enctype="multipart/f div(id="upload_status") p Ready for upload. script(src="/vendor/jquery.form.min.js") -script - $(document).ready(function() { $("#wiki_upload").ajaxForm(function(response) { $('#upload_status').html(response); }); }); \ No newline at end of file +script(src="/js/upload.js") From 1033b21405b6dc18a076293e2eca01ede43bac5f Mon Sep 17 00:00:00 2001 From: Sam Cristall Date: Sun, 16 Oct 2016 00:41:23 -0600 Subject: [PATCH 3/3] Linting upload code --- data | 1 + lib/app.js | 24 ++++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) create mode 160000 data diff --git a/data b/data new file mode 160000 index 00000000..7ea59903 --- /dev/null +++ b/data @@ -0,0 +1 @@ +Subproject commit 7ea59903852046590ea0edbec456c2cb5265bc18 diff --git a/lib/app.js b/lib/app.js index 143eb66d..0cad4913 100644 --- a/lib/app.js +++ b/lib/app.js @@ -181,34 +181,34 @@ module.exports.initialize = function (config) { } // File Uploads - var upload = multer({ dest: app.locals.config.get("application").repository + '/uploads/' }); + var upload = multer({ dest: app.locals.config.get("application").repository + "/uploads/" }); - app.use('/uploads', express.static(app.locals.config.get("application").repository + '/uploads')); + app.use("/uploads", express.static(app.locals.config.get("application").repository + "/uploads")); - app.post('/uploadFile', upload.single('wiki_file'), function (req, res, next) { + app.post("/uploadFile", upload.single("wiki_file"), function (req, res, next) { if (!res.locals.user) { return; } var rep_file_name = req.body.rep_file_name; - var rep_file = app.locals.config.get("application").repository + '/uploads/' + rep_file_name; + var rep_file = app.locals.config.get("application").repository + "/uploads/" + rep_file_name; var temp_file = req.file.path; var output_msg = ""; - var fs = require('fs'); + var fs = require("fs"); - fs.unlink(rep_file, function(err) { + fs.unlink(rep_file, function (err) { }); - fs.readFile(temp_file, function(err, data) { - fs.writeFile(rep_file, data, function(err) { - fs.unlink(temp_file, function() { + fs.readFile(temp_file, function (err, data) { + fs.writeFile(rep_file, data, function (err) { + fs.unlink(temp_file, function () { var git_msg = req.body.file_message; - Git.add(rep_file, git_msg, req.user.asGitAuthor, function(err) { + Git.add(rep_file, git_msg, req.user.asGitAuthor, function (err) { }); - output_msg = 'File uploaded to:
    /uploads/' + rep_file_name + '
    '; - res.render('upload_status', {message: output_msg}); + output_msg = "File uploaded to:
    /uploads/" + rep_file_name + "
    "; + res.render("upload_status", {message: output_msg}); }); }); });