From 90afe796eedaf2431a8ea51ce5fedd096ad77868 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Wed, 28 Sep 2016 21:58:18 -0400 Subject: [PATCH] Added New Folder feature in Image Editor + Winston init refactor --- agent.js | 12 +----- assets/js/app.js | 2 +- client/js/components/editor-image.js | 28 ++++++++++++ lib/winston.js | 18 ++++++++ models/config.js | 1 + models/git.js | 22 +++++----- models/localdata.js | 64 +++++++++++++++++----------- server.js | 14 +----- views/modals/editor-image.pug | 5 ++- ws-server.js | 18 ++++---- 10 files changed, 112 insertions(+), 72 deletions(-) create mode 100644 lib/winston.js diff --git a/agent.js b/agent.js index f19e66bb..d3b5a3ab 100644 --- a/agent.js +++ b/agent.js @@ -5,22 +5,14 @@ // =========================================== global.ROOTPATH = __dirname; +global.PROCNAME = 'AGENT'; // ---------------------------------------- // Load Winston // ---------------------------------------- var _isDebug = process.env.NODE_ENV === 'development'; - -global.winston = require('winston'); -winston.remove(winston.transports.Console) -winston.add(winston.transports.Console, { - level: (_isDebug) ? 'info' : 'warn', - prettyPrint: true, - colorize: true, - silent: false, - timestamp: true -}); +global.winston = require('./lib/winston')(_isDebug); // ---------------------------------------- // Fetch internal handshake key diff --git a/assets/js/app.js b/assets/js/app.js index cd201044..560e5f2e 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -1 +1 @@ -"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function setInputSelection(e,t,a){if(e.focus(),"undefined"!=typeof e.selectionStart)e.selectionStart=t,e.selectionEnd=a;else if(document.selection&&document.selection.createRange){e.select();var o=document.selection.createRange();o.collapse(!0),o.moveEnd("character",a),o.moveStart("character",t),o.select()}}function makeSafePath(e){var t=_.split(_.trim(e),"/");return t=_.map(t,function(e){return _.kebabCase(_.deburr(_.trim(e)))}),_.join(_.filter(t,function(e){return!_.isEmpty(e)}),"/")}var _createClass=function(){function e(e,t){for(var a=0;a=3?(t.searchactive=!0,t.searchload++,a.emit("search",{terms:e},function(e){t.searchres=e.match,t.searchsuggest=e.suggest,t.searchmovearr=_.concat([],t.searchres,t.searchsuggest),t.searchload>0&&t.searchload--})):(t.searchactive=!1,t.searchres=[],t.searchsuggest=[],t.searchmovearr=[],t.searchload=0)},searchmoveidx:function(e,a){e>0?t.searchmovekey=t.searchmovearr[e-1].document?"res."+t.searchmovearr[e-1].document.entryPath:"sug."+t.searchmovearr[e-1]:t.searchmovekey=""}},methods:{useSuggestion:function(e){t.searchq=e},closeSearch:function(){t.searchq=""},moveSelectSearch:function(){if(!(t.searchmoveidx<1)){var e=t.searchmoveidx-1;t.searchmovearr[e].document?window.location.assign("/"+t.searchmovearr[e].document.entryPath):t.searchq=t.searchmovearr[e]}},moveDownSearch:function(){t.searchmoveidx0&&t.searchmoveidx--}}});e("main").on("click",t.closeSearch)}}),e("#page-type-view").length&&!function(){var a="home"!==e("#page-type-view").data("entrypath")?e("#page-type-view").data("entrypath"):"",o=a+"/new-page";e(".btn-create-prompt").on("click",function(t){e("#txt-create-prompt").val(o),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),a.length+1,o.length),e("#txt-create-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-create-prompt").on("keypress",function(t){13===t.which&&e(".btn-create-go").trigger("click")}),e(".btn-create-go").on("click",function(t){var a=makeSafePath(e("#txt-create-prompt").val());_.isEmpty(a)?e("#txt-create-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-create-prompt").parent().addClass("is-loading"),window.location.assign("/create/"+a))}),""!==a&&e(".btn-move-prompt").removeClass("is-hidden");var n=_.lastIndexOf(a,"/")+1;e(".btn-move-prompt").on("click",function(t){e("#txt-move-prompt").val(a),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),n,a.length),e("#txt-move-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-move-prompt").on("keypress",function(t){13===t.which&&e(".btn-move-go").trigger("click")}),e(".btn-move-go").on("click",function(o){var n=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(n)||n===a||"home"===n?e("#txt-move-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-move-prompt").parent().addClass("is-loading"),e.ajax(window.location.href,{data:{move:n},dataType:"json",method:"PUT"}).then(function(e,a,o){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,a,o){t.pushError("Something went wrong","Save operation failed.")}))})}(),e("#page-type-create").length){var o;!function(){var n=e("#page-type-create").data("entrypath");e(".btn-create-discard").on("click",function(t){e("#modal-create-discard").toggleClass("is-active")}),1===e("#mk-editor").length&&!function(){var n=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var i=new Vue({el:"#modal-editor-image",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,fetchFromUrlURL:"",fetchFromUrlShow:!1,folders:[],currentFolder:"",currentImage:"",currentAlign:"left",images:[]},methods:{open:function(){n=!0,e("#modal-editor-image").slideDown(),i.refreshFolders()},cancel:function(t){n=!1,e("#modal-editor-image").slideUp()},insertImage:function(e){o.codemirror.doc.somethingSelected()&&o.codemirror.execCommand("singleSelection");var t=_.find(i.images,["uid",i.currentImage]);t.normalizedPath=""===t.folder?t.filename:t.folder+"/"+t.filename,t.titleGuess=_.startCase(t.basename);var a="!["+t.titleGuess+"](/uploads/"+t.normalizedPath+' "'+t.titleGuess+'")';switch(i.currentAlign){case"center":a+="{.align-center}";break;case"right":a+="{.align-right}";break;case"logo":a+="{.pagelogo}"}o.codemirror.doc.replaceSelection(a),i.cancel()},newFolder:function(e){i.newFolderShow=!0},newFolderDiscard:function(e){i.newFolderShow=!1},fetchFromUrl:function(e){i.fetchFromUrlShow=!0},fetchFromUrlDiscard:function(e){i.fetchFromUrlShow=!1},selectFolder:function(e){i.currentFolder=e,i.loadImages()},refreshFolders:function(){i.isLoading=!0,i.isLoadingText="Fetching folders list...",i.currentFolder="",i.currentImage="",Vue.nextTick(function(){a.emit("uploadsGetFolders",{},function(e){i.folders=e,i.loadImages()})})},loadImages:function(){i.isLoading=!0,i.isLoadingText="Fetching images...",Vue.nextTick(function(){a.emit("uploadsGetImages",{folder:i.currentFolder},function(e){i.images=e,i.isLoading=!1})})},selectImage:function(e){i.currentImage=e},selectAlignment:function(e){i.currentAlign=e}}}),r=ace.edit("codeblock-editor");r.setTheme("ace/theme/tomorrow_night"),r.getSession().setMode("ace/mode/markdown"),r.setOption("fontSize","14px"),r.setOption("hScrollBarAlwaysVisible",!1),r.setOption("wrap",!0);var c=ace.require("ace/ext/modelist"),l=new Vue({el:"#modal-editor-codeblock",data:{modes:c.modesByName,modeSelected:"text"},watch:{modeSelected:function(e,t){d(e).done(function(){ace.require("ace/mode/"+e),r.getSession().setMode("ace/mode/"+e)})}},methods:{cancel:function(t){n=!1,e("#modal-editor-codeblock").slideUp()},insertCode:function(e){o.codemirror.doc.somethingSelected()&&o.codemirror.execCommand("singleSelection");var t="\n```"+l.modeSelected+"\n"+r.getValue()+"\n```\n";o.codemirror.doc.replaceSelection(t),l.cancel()}}}),s=[],d=function(t){return e.ajax({url:"/js/ace/mode-"+t+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(s,t))return!1},success:function(){s.push(t)}})};o=new SimpleMDE({autofocus:!0,autoDownloadFontAwesome:!1,element:e("#mk-editor").get(0),placeholder:"Enter Markdown formatted content here...",spellChecker:!1,status:!1,toolbar:[{name:"bold",action:SimpleMDE.toggleBold,className:"fa fa-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"fa fa-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"fa fa-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"fa fa-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"fa fa-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"fa fa-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"fa fa-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"fa fa-list-ul",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"fa fa-list-ol",title:"Numbered List"},"|",{name:"link",action:function(t){n||(n=!0,e("#modal-editor-link").slideToggle())},className:"fa fa-link",title:"Insert Link"},{name:"image",action:function(e){n||i.open()},className:"fa fa-image",title:"Insert Image"},{name:"file",action:function(e){},className:"fa fa-file-text-o",title:"Insert File"},"|",{name:"inline-code",action:function(e){if(!e.codemirror.doc.somethingSelected())return t.pushError("Invalid selection","You must select at least 1 character first.");var a=e.codemirror.doc.getSelections();a=_.map(a,function(e){return"`"+e+"`"}),e.codemirror.doc.replaceSelections(a)},className:"fa fa-terminal",title:"Inline Code"},{name:"code-block",action:function(t){n||(n=!0,o.codemirror.doc.somethingSelected()?r.setValue(o.codemirror.doc.getSelection()):r.setValue(""),e("#modal-editor-codeblock").slideDown(400,function(){r.resize(),r.focus()}))},className:"fa fa-code",title:"Code Block"},"|",{name:"table",action:function(e){},className:"fa fa-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"fa fa-minus",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}})}(),e(".btn-edit-save, .btn-create-save").on("click",function(a){e.ajax(window.location.href,{data:{markdown:o.value()},dataType:"json",method:"PUT"}).then(function(e,a,o){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,a,o){t.pushError("Something went wrong","Save operation failed.")})})}()}if(e("#page-type-edit").length){var o;!function(){var n=e("#page-type-edit").data("entrypath");e(".btn-edit-discard").on("click",function(t){e("#modal-edit-discard").toggleClass("is-active")}),1===e("#mk-editor").length&&!function(){var n=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var i=new Vue({el:"#modal-editor-image",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,fetchFromUrlURL:"",fetchFromUrlShow:!1,folders:[],currentFolder:"",currentImage:"",currentAlign:"left",images:[]},methods:{open:function(){n=!0,e("#modal-editor-image").slideDown(),i.refreshFolders()},cancel:function(t){n=!1,e("#modal-editor-image").slideUp()},insertImage:function(e){o.codemirror.doc.somethingSelected()&&o.codemirror.execCommand("singleSelection");var t=_.find(i.images,["uid",i.currentImage]);t.normalizedPath=""===t.folder?t.filename:t.folder+"/"+t.filename,t.titleGuess=_.startCase(t.basename);var a="!["+t.titleGuess+"](/uploads/"+t.normalizedPath+' "'+t.titleGuess+'")';switch(i.currentAlign){case"center":a+="{.align-center}";break;case"right":a+="{.align-right}";break;case"logo":a+="{.pagelogo}"}o.codemirror.doc.replaceSelection(a),i.cancel()},newFolder:function(e){i.newFolderShow=!0},newFolderDiscard:function(e){i.newFolderShow=!1},fetchFromUrl:function(e){i.fetchFromUrlShow=!0},fetchFromUrlDiscard:function(e){i.fetchFromUrlShow=!1},selectFolder:function(e){i.currentFolder=e,i.loadImages()},refreshFolders:function(){i.isLoading=!0,i.isLoadingText="Fetching folders list...",i.currentFolder="",i.currentImage="",Vue.nextTick(function(){a.emit("uploadsGetFolders",{},function(e){i.folders=e,i.loadImages()})})},loadImages:function(){i.isLoading=!0,i.isLoadingText="Fetching images...",Vue.nextTick(function(){a.emit("uploadsGetImages",{folder:i.currentFolder},function(e){i.images=e,i.isLoading=!1})})},selectImage:function(e){i.currentImage=e},selectAlignment:function(e){i.currentAlign=e}}}),r=ace.edit("codeblock-editor");r.setTheme("ace/theme/tomorrow_night"),r.getSession().setMode("ace/mode/markdown"),r.setOption("fontSize","14px"),r.setOption("hScrollBarAlwaysVisible",!1),r.setOption("wrap",!0);var c=ace.require("ace/ext/modelist"),l=new Vue({el:"#modal-editor-codeblock",data:{modes:c.modesByName,modeSelected:"text"},watch:{modeSelected:function(e,t){d(e).done(function(){ace.require("ace/mode/"+e),r.getSession().setMode("ace/mode/"+e)})}},methods:{cancel:function(t){n=!1,e("#modal-editor-codeblock").slideUp()},insertCode:function(e){o.codemirror.doc.somethingSelected()&&o.codemirror.execCommand("singleSelection");var t="\n```"+l.modeSelected+"\n"+r.getValue()+"\n```\n";o.codemirror.doc.replaceSelection(t),l.cancel()}}}),s=[],d=function(t){return e.ajax({url:"/js/ace/mode-"+t+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(s,t))return!1},success:function(){s.push(t)}})};o=new SimpleMDE({autofocus:!0,autoDownloadFontAwesome:!1,element:e("#mk-editor").get(0),placeholder:"Enter Markdown formatted content here...",spellChecker:!1,status:!1,toolbar:[{name:"bold",action:SimpleMDE.toggleBold,className:"fa fa-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"fa fa-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"fa fa-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"fa fa-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"fa fa-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"fa fa-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"fa fa-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"fa fa-list-ul",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"fa fa-list-ol",title:"Numbered List"},"|",{name:"link",action:function(t){n||(n=!0,e("#modal-editor-link").slideToggle())},className:"fa fa-link",title:"Insert Link"},{name:"image",action:function(e){n||i.open()},className:"fa fa-image",title:"Insert Image"},{name:"file",action:function(e){},className:"fa fa-file-text-o",title:"Insert File"},"|",{name:"inline-code",action:function(e){if(!e.codemirror.doc.somethingSelected())return t.pushError("Invalid selection","You must select at least 1 character first.");var a=e.codemirror.doc.getSelections();a=_.map(a,function(e){return"`"+e+"`"}),e.codemirror.doc.replaceSelections(a)},className:"fa fa-terminal",title:"Inline Code"},{name:"code-block",action:function(t){n||(n=!0,o.codemirror.doc.somethingSelected()?r.setValue(o.codemirror.doc.getSelection()):r.setValue(""),e("#modal-editor-codeblock").slideDown(400,function(){r.resize(),r.focus()}))},className:"fa fa-code",title:"Code Block"},"|",{name:"table",action:function(e){},className:"fa fa-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"fa fa-minus",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}})}(),e(".btn-edit-save, .btn-create-save").on("click",function(a){e.ajax(window.location.href,{data:{markdown:o.value()},dataType:"json",method:"PUT"}).then(function(e,a,o){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,a,o){t.pushError("Something went wrong","Save operation failed.")})})}()}if(e("#page-type-source").length){var n;!function(){n=ace.edit("source-display"),n.setTheme("ace/theme/tomorrow_night"),n.getSession().setMode("ace/mode/markdown"),n.setReadOnly(!0),n.renderer.updateFull();var a="home"!==e("#page-type-source").data("entrypath")?e("#page-type-source").data("entrypath"):"",o=a+"/new-page";e(".btn-create-prompt").on("click",function(t){e("#txt-create-prompt").val(o),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),a.length+1,o.length),e("#txt-create-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-create-prompt").on("keypress",function(t){13===t.which&&e(".btn-create-go").trigger("click")}),e(".btn-create-go").on("click",function(t){var a=makeSafePath(e("#txt-create-prompt").val());_.isEmpty(a)?e("#txt-create-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-create-prompt").parent().addClass("is-loading"),window.location.assign("/create/"+a))}),""!==a&&e(".btn-move-prompt").removeClass("is-hidden");var i=_.lastIndexOf(a,"/")+1;e(".btn-move-prompt").on("click",function(t){e("#txt-move-prompt").val(a),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),i,a.length),e("#txt-move-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-move-prompt").on("keypress",function(t){13===t.which&&e(".btn-move-go").trigger("click")}),e(".btn-move-go").on("click",function(o){var n=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(n)||n===a||"home"===n?e("#txt-move-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-move-prompt").parent().addClass("is-loading"),e.ajax(window.location.href,{data:{move:n},dataType:"json",method:"PUT"}).then(function(e,a,o){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,a,o){t.pushError("Something went wrong","Save operation failed.")}))})}()}});var Alerts=function(){function e(){_classCallCheck(this,e);var t=this;t.mdl=new Vue({el:"#alerts",data:{children:[]},methods:{acknowledge:function(e){t.close(e)}}}),t.uidNext=1}return _createClass(e,[{key:"push",value:function(e){var t=this,a=_.defaults(e,{_uid:t.uidNext,class:"is-info",message:"---",sticky:!1,title:"---"});t.mdl.children.push(a),a.sticky||_.delay(function(){t.close(a._uid)},5e3),t.uidNext++}},{key:"pushError",value:function(e,t){this.push({class:"is-danger",message:t,sticky:!1,title:e})}},{key:"pushSuccess",value:function(e,t){this.push({class:"is-success",message:t,sticky:!1,title:e})}},{key:"close",value:function(e){var t=this,a=_.findIndex(t.mdl.children,["_uid",e]),o=_.nth(t.mdl.children,a);a>=0&&o&&(o.class+=" exit",t.mdl.children.$set(a,o),_.delay(function(){t.mdl.children.$remove(o)},500))}}]),e}(); \ No newline at end of file +"use strict";function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function setInputSelection(e,t,o){if(e.focus(),"undefined"!=typeof e.selectionStart)e.selectionStart=t,e.selectionEnd=o;else if(document.selection&&document.selection.createRange){e.select();var a=document.selection.createRange();a.collapse(!0),a.moveEnd("character",o),a.moveStart("character",t),a.select()}}function makeSafePath(e){var t=_.split(_.trim(e),"/");return t=_.map(t,function(e){return _.kebabCase(_.deburr(_.trim(e)))}),_.join(_.filter(t,function(e){return!_.isEmpty(e)}),"/")}var _createClass=function(){function e(e,t){for(var o=0;o=3?(t.searchactive=!0,t.searchload++,o.emit("search",{terms:e},function(e){t.searchres=e.match,t.searchsuggest=e.suggest,t.searchmovearr=_.concat([],t.searchres,t.searchsuggest),t.searchload>0&&t.searchload--})):(t.searchactive=!1,t.searchres=[],t.searchsuggest=[],t.searchmovearr=[],t.searchload=0)},searchmoveidx:function(e,o){e>0?t.searchmovekey=t.searchmovearr[e-1].document?"res."+t.searchmovearr[e-1].document.entryPath:"sug."+t.searchmovearr[e-1]:t.searchmovekey=""}},methods:{useSuggestion:function(e){t.searchq=e},closeSearch:function(){t.searchq=""},moveSelectSearch:function(){if(!(t.searchmoveidx<1)){var e=t.searchmoveidx-1;t.searchmovearr[e].document?window.location.assign("/"+t.searchmovearr[e].document.entryPath):t.searchq=t.searchmovearr[e]}},moveDownSearch:function(){t.searchmoveidx0&&t.searchmoveidx--}}});e("main").on("click",t.closeSearch)}}),e("#page-type-view").length&&!function(){var o="home"!==e("#page-type-view").data("entrypath")?e("#page-type-view").data("entrypath"):"",a=o+"/new-page";e(".btn-create-prompt").on("click",function(t){e("#txt-create-prompt").val(a),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),o.length+1,a.length),e("#txt-create-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-create-prompt").on("keypress",function(t){13===t.which&&e(".btn-create-go").trigger("click")}),e(".btn-create-go").on("click",function(t){var o=makeSafePath(e("#txt-create-prompt").val());_.isEmpty(o)?e("#txt-create-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-create-prompt").parent().addClass("is-loading"),window.location.assign("/create/"+o))}),""!==o&&e(".btn-move-prompt").removeClass("is-hidden");var n=_.lastIndexOf(o,"/")+1;e(".btn-move-prompt").on("click",function(t){e("#txt-move-prompt").val(o),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),n,o.length),e("#txt-move-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-move-prompt").on("keypress",function(t){13===t.which&&e(".btn-move-go").trigger("click")}),e(".btn-move-go").on("click",function(a){var n=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(n)||n===o||"home"===n?e("#txt-move-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-move-prompt").parent().addClass("is-loading"),e.ajax(window.location.href,{data:{move:n},dataType:"json",method:"PUT"}).then(function(e,o,a){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,a){t.pushError("Something went wrong","Save operation failed.")}))})}(),e("#page-type-create").length){var a;!function(){var n=e("#page-type-create").data("entrypath");e(".btn-create-discard").on("click",function(t){e("#modal-create-discard").toggleClass("is-active")}),1===e("#mk-editor").length&&!function(){var n=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var r=new Vue({el:"#modal-editor-image",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,fetchFromUrlURL:"",fetchFromUrlShow:!1,folders:[],currentFolder:"",currentImage:"",currentAlign:"left",images:[]},methods:{open:function(){n=!0,e("#modal-editor-image").slideDown(),r.refreshFolders()},cancel:function(t){n=!1,e("#modal-editor-image").slideUp()},insertImage:function(e){a.codemirror.doc.somethingSelected()&&a.codemirror.execCommand("singleSelection");var t=_.find(r.images,["uid",r.currentImage]);t.normalizedPath=""===t.folder?t.filename:t.folder+"/"+t.filename,t.titleGuess=_.startCase(t.basename);var o="!["+t.titleGuess+"](/uploads/"+t.normalizedPath+' "'+t.titleGuess+'")';switch(r.currentAlign){case"center":o+="{.align-center}";break;case"right":o+="{.align-right}";break;case"logo":o+="{.pagelogo}"}a.codemirror.doc.replaceSelection(o),r.cancel()},newFolder:function(t){r.newFolderName="",r.newFolderError=!1,r.newFolderShow=!0,_.delay(function(){e("#txt-editor-newfoldername").focus()},400)},newFolderDiscard:function(e){r.newFolderShow=!1},newFolderCreate:function(e){var t=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");return r.newFolderName=_.kebabCase(_.trim(r.newFolderName)),_.isEmpty(r.newFolderName)||!t.test(r.newFolderName)?void(r.newFolderError=!0):(r.newFolderDiscard(),r.isLoading=!0,r.isLoadingText="Creating new folder...",void Vue.nextTick(function(){o.emit("uploadsCreateFolder",{foldername:r.newFolderName},function(e){r.folders=e,r.currentFolder=r.newFolderName,r.images=[],r.isLoading=!1})}))},fetchFromUrl:function(e){r.fetchFromUrlShow=!0},fetchFromUrlDiscard:function(e){r.fetchFromUrlShow=!1},selectFolder:function(e){r.currentFolder=e,r.loadImages()},refreshFolders:function(){r.isLoading=!0,r.isLoadingText="Fetching folders list...",r.currentFolder="",r.currentImage="",Vue.nextTick(function(){o.emit("uploadsGetFolders",{},function(e){r.folders=e,r.loadImages()})})},loadImages:function(){r.isLoading=!0,r.isLoadingText="Fetching images...",Vue.nextTick(function(){o.emit("uploadsGetImages",{folder:r.currentFolder},function(e){r.images=e,r.isLoading=!1})})},selectImage:function(e){r.currentImage=e},selectAlignment:function(e){r.currentAlign=e}}}),i=ace.edit("codeblock-editor");i.setTheme("ace/theme/tomorrow_night"),i.getSession().setMode("ace/mode/markdown"),i.setOption("fontSize","14px"),i.setOption("hScrollBarAlwaysVisible",!1),i.setOption("wrap",!0);var c=ace.require("ace/ext/modelist"),l=new Vue({el:"#modal-editor-codeblock",data:{modes:c.modesByName,modeSelected:"text"},watch:{modeSelected:function(e,t){d(e).done(function(){ace.require("ace/mode/"+e),i.getSession().setMode("ace/mode/"+e)})}},methods:{cancel:function(t){n=!1,e("#modal-editor-codeblock").slideUp()},insertCode:function(e){a.codemirror.doc.somethingSelected()&&a.codemirror.execCommand("singleSelection");var t="\n```"+l.modeSelected+"\n"+i.getValue()+"\n```\n";a.codemirror.doc.replaceSelection(t),l.cancel()}}}),s=[],d=function(t){return e.ajax({url:"/js/ace/mode-"+t+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(s,t))return!1},success:function(){s.push(t)}})};a=new SimpleMDE({autofocus:!0,autoDownloadFontAwesome:!1,element:e("#mk-editor").get(0),placeholder:"Enter Markdown formatted content here...",spellChecker:!1,status:!1,toolbar:[{name:"bold",action:SimpleMDE.toggleBold,className:"fa fa-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"fa fa-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"fa fa-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"fa fa-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"fa fa-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"fa fa-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"fa fa-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"fa fa-list-ul",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"fa fa-list-ol",title:"Numbered List"},"|",{name:"link",action:function(t){n||(n=!0,e("#modal-editor-link").slideToggle())},className:"fa fa-link",title:"Insert Link"},{name:"image",action:function(e){n||r.open()},className:"fa fa-image",title:"Insert Image"},{name:"file",action:function(e){},className:"fa fa-file-text-o",title:"Insert File"},"|",{name:"inline-code",action:function(e){if(!e.codemirror.doc.somethingSelected())return t.pushError("Invalid selection","You must select at least 1 character first.");var o=e.codemirror.doc.getSelections();o=_.map(o,function(e){return"`"+e+"`"}),e.codemirror.doc.replaceSelections(o)},className:"fa fa-terminal",title:"Inline Code"},{name:"code-block",action:function(t){n||(n=!0,a.codemirror.doc.somethingSelected()?i.setValue(a.codemirror.doc.getSelection()):i.setValue(""),e("#modal-editor-codeblock").slideDown(400,function(){i.resize(),i.focus()}))},className:"fa fa-code",title:"Code Block"},"|",{name:"table",action:function(e){},className:"fa fa-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"fa fa-minus",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}})}(),e(".btn-edit-save, .btn-create-save").on("click",function(o){e.ajax(window.location.href,{data:{markdown:a.value()},dataType:"json",method:"PUT"}).then(function(e,o,a){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,a){t.pushError("Something went wrong","Save operation failed.")})})}()}if(e("#page-type-edit").length){var a;!function(){var n=e("#page-type-edit").data("entrypath");e(".btn-edit-discard").on("click",function(t){e("#modal-edit-discard").toggleClass("is-active")}),1===e("#mk-editor").length&&!function(){var n=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var r=new Vue({el:"#modal-editor-image",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,fetchFromUrlURL:"",fetchFromUrlShow:!1,folders:[],currentFolder:"",currentImage:"",currentAlign:"left",images:[]},methods:{open:function(){n=!0,e("#modal-editor-image").slideDown(),r.refreshFolders()},cancel:function(t){n=!1,e("#modal-editor-image").slideUp()},insertImage:function(e){a.codemirror.doc.somethingSelected()&&a.codemirror.execCommand("singleSelection");var t=_.find(r.images,["uid",r.currentImage]);t.normalizedPath=""===t.folder?t.filename:t.folder+"/"+t.filename,t.titleGuess=_.startCase(t.basename);var o="!["+t.titleGuess+"](/uploads/"+t.normalizedPath+' "'+t.titleGuess+'")';switch(r.currentAlign){case"center":o+="{.align-center}";break;case"right":o+="{.align-right}";break;case"logo":o+="{.pagelogo}"}a.codemirror.doc.replaceSelection(o),r.cancel()},newFolder:function(t){r.newFolderName="",r.newFolderError=!1,r.newFolderShow=!0,_.delay(function(){e("#txt-editor-newfoldername").focus()},400)},newFolderDiscard:function(e){r.newFolderShow=!1},newFolderCreate:function(e){var t=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");return r.newFolderName=_.kebabCase(_.trim(r.newFolderName)),_.isEmpty(r.newFolderName)||!t.test(r.newFolderName)?void(r.newFolderError=!0):(r.newFolderDiscard(),r.isLoading=!0,r.isLoadingText="Creating new folder...",void Vue.nextTick(function(){o.emit("uploadsCreateFolder",{foldername:r.newFolderName},function(e){r.folders=e,r.currentFolder=r.newFolderName,r.images=[],r.isLoading=!1})}))},fetchFromUrl:function(e){r.fetchFromUrlShow=!0},fetchFromUrlDiscard:function(e){r.fetchFromUrlShow=!1},selectFolder:function(e){r.currentFolder=e,r.loadImages()},refreshFolders:function(){r.isLoading=!0,r.isLoadingText="Fetching folders list...",r.currentFolder="",r.currentImage="",Vue.nextTick(function(){o.emit("uploadsGetFolders",{},function(e){r.folders=e,r.loadImages()})})},loadImages:function(){r.isLoading=!0,r.isLoadingText="Fetching images...",Vue.nextTick(function(){o.emit("uploadsGetImages",{folder:r.currentFolder},function(e){r.images=e,r.isLoading=!1})})},selectImage:function(e){r.currentImage=e},selectAlignment:function(e){r.currentAlign=e}}}),i=ace.edit("codeblock-editor");i.setTheme("ace/theme/tomorrow_night"),i.getSession().setMode("ace/mode/markdown"),i.setOption("fontSize","14px"),i.setOption("hScrollBarAlwaysVisible",!1),i.setOption("wrap",!0);var c=ace.require("ace/ext/modelist"),l=new Vue({el:"#modal-editor-codeblock",data:{modes:c.modesByName,modeSelected:"text"},watch:{modeSelected:function(e,t){d(e).done(function(){ace.require("ace/mode/"+e),i.getSession().setMode("ace/mode/"+e)})}},methods:{cancel:function(t){n=!1,e("#modal-editor-codeblock").slideUp()},insertCode:function(e){a.codemirror.doc.somethingSelected()&&a.codemirror.execCommand("singleSelection");var t="\n```"+l.modeSelected+"\n"+i.getValue()+"\n```\n";a.codemirror.doc.replaceSelection(t),l.cancel()}}}),s=[],d=function(t){return e.ajax({url:"/js/ace/mode-"+t+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(s,t))return!1},success:function(){s.push(t)}})};a=new SimpleMDE({autofocus:!0,autoDownloadFontAwesome:!1,element:e("#mk-editor").get(0),placeholder:"Enter Markdown formatted content here...",spellChecker:!1,status:!1,toolbar:[{name:"bold",action:SimpleMDE.toggleBold,className:"fa fa-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"fa fa-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"fa fa-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"fa fa-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"fa fa-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"fa fa-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"fa fa-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"fa fa-list-ul",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"fa fa-list-ol",title:"Numbered List"},"|",{name:"link",action:function(t){n||(n=!0,e("#modal-editor-link").slideToggle())},className:"fa fa-link",title:"Insert Link"},{name:"image",action:function(e){n||r.open()},className:"fa fa-image",title:"Insert Image"},{name:"file",action:function(e){},className:"fa fa-file-text-o",title:"Insert File"},"|",{name:"inline-code",action:function(e){if(!e.codemirror.doc.somethingSelected())return t.pushError("Invalid selection","You must select at least 1 character first.");var o=e.codemirror.doc.getSelections();o=_.map(o,function(e){return"`"+e+"`"}),e.codemirror.doc.replaceSelections(o)},className:"fa fa-terminal",title:"Inline Code"},{name:"code-block",action:function(t){n||(n=!0,a.codemirror.doc.somethingSelected()?i.setValue(a.codemirror.doc.getSelection()):i.setValue(""),e("#modal-editor-codeblock").slideDown(400,function(){i.resize(),i.focus()}))},className:"fa fa-code",title:"Code Block"},"|",{name:"table",action:function(e){},className:"fa fa-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"fa fa-minus",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}})}(),e(".btn-edit-save, .btn-create-save").on("click",function(o){e.ajax(window.location.href,{data:{markdown:a.value()},dataType:"json",method:"PUT"}).then(function(e,o,a){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,a){t.pushError("Something went wrong","Save operation failed.")})})}()}if(e("#page-type-source").length){var n;!function(){n=ace.edit("source-display"),n.setTheme("ace/theme/tomorrow_night"),n.getSession().setMode("ace/mode/markdown"),n.setReadOnly(!0),n.renderer.updateFull();var o="home"!==e("#page-type-source").data("entrypath")?e("#page-type-source").data("entrypath"):"",a=o+"/new-page";e(".btn-create-prompt").on("click",function(t){e("#txt-create-prompt").val(a),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),o.length+1,a.length),e("#txt-create-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-create-prompt").on("keypress",function(t){13===t.which&&e(".btn-create-go").trigger("click")}),e(".btn-create-go").on("click",function(t){var o=makeSafePath(e("#txt-create-prompt").val());_.isEmpty(o)?e("#txt-create-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-create-prompt").parent().addClass("is-loading"),window.location.assign("/create/"+o))}),""!==o&&e(".btn-move-prompt").removeClass("is-hidden");var r=_.lastIndexOf(o,"/")+1;e(".btn-move-prompt").on("click",function(t){e("#txt-move-prompt").val(o),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),r,o.length),e("#txt-move-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-move-prompt").on("keypress",function(t){13===t.which&&e(".btn-move-go").trigger("click")}),e(".btn-move-go").on("click",function(a){var n=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(n)||n===o||"home"===n?e("#txt-move-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-move-prompt").parent().addClass("is-loading"),e.ajax(window.location.href,{data:{move:n},dataType:"json",method:"PUT"}).then(function(e,o,a){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,a){t.pushError("Something went wrong","Save operation failed.")}))})}()}});var Alerts=function(){function e(){_classCallCheck(this,e);var t=this;t.mdl=new Vue({el:"#alerts",data:{children:[]},methods:{acknowledge:function(e){t.close(e)}}}),t.uidNext=1}return _createClass(e,[{key:"push",value:function(e){var t=this,o=_.defaults(e,{_uid:t.uidNext,class:"is-info",message:"---",sticky:!1,title:"---"});t.mdl.children.push(o),o.sticky||_.delay(function(){t.close(o._uid)},5e3),t.uidNext++}},{key:"pushError",value:function(e,t){this.push({class:"is-danger",message:t,sticky:!1,title:e})}},{key:"pushSuccess",value:function(e,t){this.push({class:"is-success",message:t,sticky:!1,title:e})}},{key:"close",value:function(e){var t=this,o=_.findIndex(t.mdl.children,["_uid",e]),a=_.nth(t.mdl.children,o);o>=0&&a&&(a.class+=" exit",t.mdl.children.$set(o,a),_.delay(function(){t.mdl.children.$remove(a)},500))}}]),e}(); \ No newline at end of file diff --git a/client/js/components/editor-image.js b/client/js/components/editor-image.js index 77bc3295..8b239657 100644 --- a/client/js/components/editor-image.js +++ b/client/js/components/editor-image.js @@ -6,6 +6,7 @@ let vueImage = new Vue({ isLoadingText: '', newFolderName: '', newFolderShow: false, + newFolderError: false, fetchFromUrlURL: '', fetchFromUrlShow: false, folders: [], @@ -52,11 +53,38 @@ let vueImage = new Vue({ }, newFolder: (ev) => { + vueImage.newFolderName = ''; + vueImage.newFolderError = false; vueImage.newFolderShow = true; + _.delay(() => { $('#txt-editor-newfoldername').focus(); }, 400); }, newFolderDiscard: (ev) => { vueImage.newFolderShow = false; }, + newFolderCreate: (ev) => { + + let regFolderName = new RegExp("^[a-z0-9][a-z0-9\-]*[a-z0-9]$"); + vueImage.newFolderName = _.kebabCase(_.trim(vueImage.newFolderName)); + + if(_.isEmpty(vueImage.newFolderName) || !regFolderName.test(vueImage.newFolderName)) { + vueImage.newFolderError = true; + return; + } + + vueImage.newFolderDiscard(); + vueImage.isLoading = true; + vueImage.isLoadingText = 'Creating new folder...'; + + Vue.nextTick(() => { + socket.emit('uploadsCreateFolder', { foldername: vueImage.newFolderName }, (data) => { + vueImage.folders = data; + vueImage.currentFolder = vueImage.newFolderName; + vueImage.images = []; + vueImage.isLoading = false; + }); + }); + + }, fetchFromUrl: (ev) => { vueImage.fetchFromUrlShow = true; }, diff --git a/lib/winston.js b/lib/winston.js new file mode 100644 index 00000000..e630e380 --- /dev/null +++ b/lib/winston.js @@ -0,0 +1,18 @@ +"use strict"; + +var winston = require('winston'); + +module.exports = (isDebug) => { + + winston.remove(winston.transports.Console) + winston.add(winston.transports.Console, { + level: (isDebug) ? 'info' : 'warn', + prettyPrint: true, + colorize: true, + silent: false, + timestamp: true + }); + + return winston; + +}; \ No newline at end of file diff --git a/models/config.js b/models/config.js index 513b249f..8031caa2 100644 --- a/models/config.js +++ b/models/config.js @@ -25,6 +25,7 @@ module.exports = (confPath) => { title: "Requarks Wiki", host: "http://localhost", port: process.env.PORT, + wsPort: 8080, db: "mongodb://localhost/wiki", redis: null, sessionSecret: null, diff --git a/models/git.js b/models/git.js index d0dcc4ce..47f1d3cf 100644 --- a/models/git.js +++ b/models/git.js @@ -72,13 +72,13 @@ module.exports = { let self = this; - winston.info('[GIT] Checking Git repository...'); + winston.info('[' + PROCNAME + '][GIT] Checking Git repository...'); //-> Check if path is accessible return fs.mkdirAsync(self._repo.path).catch((err) => { if(err.code !== 'EEXIST') { - winston.error('Invalid Git repository path or missing permissions.'); + winston.error('[' + PROCNAME + '][GIT] Invalid Git repository path or missing permissions.'); } }).then(() => { @@ -116,10 +116,10 @@ module.exports = { }); }).catch((err) => { - winston.error('Git remote error!'); + winston.error('[' + PROCNAME + '][GIT] Git remote error!'); throw err; }).then(() => { - winston.info('[GIT] Git repository is OK.'); + winston.info('[' + PROCNAME + '][GIT] Git repository is OK.'); return true; }); @@ -147,12 +147,12 @@ module.exports = { // Fetch - winston.info('[GIT] Performing pull from remote repository...'); + winston.info('[' + PROCNAME + '][GIT] Performing pull from remote repository...'); return self._git.pull('origin', self._repo.branch).then((cProc) => { - winston.info('[GIT] Pull completed.'); + winston.info('[' + PROCNAME + '][GIT] Pull completed.'); }) .catch((err) => { - winston.error('Unable to fetch from git origin!'); + winston.error('[' + PROCNAME + '][GIT] Unable to fetch from git origin!'); throw err; }) .then(() => { @@ -164,14 +164,14 @@ module.exports = { if(_.includes(out, 'commit')) { - winston.info('[GIT] Performing push to remote repository...'); + winston.info('[' + PROCNAME + '][GIT] Performing push to remote repository...'); return self._git.push('origin', self._repo.branch).then(() => { - return winston.info('[GIT] Push completed.'); + return winston.info('[' + PROCNAME + '][GIT] Push completed.'); }); } else { - winston.info('[GIT] Push skipped. Repository is already in sync.'); + winston.info('[' + PROCNAME + '][GIT] Push skipped. Repository is already in sync.'); } @@ -181,7 +181,7 @@ module.exports = { }) .catch((err) => { - winston.error('Unable to push changes to remote!'); + winston.error('[' + PROCNAME + '][GIT] Unable to push changes to remote!'); throw err; }); diff --git a/models/localdata.js b/models/localdata.js index eb110ebb..73c5d980 100644 --- a/models/localdata.js +++ b/models/localdata.js @@ -1,11 +1,13 @@ "use strict"; -var fs = require('fs'), - path = require('path'), +var path = require('path'), loki = require('lokijs'), Promise = require('bluebird'), + fs = Promise.promisifyAll(require('fs-extra')), _ = require('lodash'); +var regFolderName = new RegExp("^[a-z0-9][a-z0-9\-]*[a-z0-9]$"); + /** * Local Data Storage * @@ -114,36 +116,20 @@ module.exports = { */ createBaseDirectories(appconfig) { - winston.info('[SERVER] Create data directories if they don\'t exist...'); + winston.info('[SERVER] Checking data directories...'); try { - fs.mkdirSync(appconfig.datadir.db); - } catch (err) { - if(err.code !== 'EEXIST') { - winston.error(err); - process.exit(1); - } - } + fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.db)); + fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.db, './cache')); + fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.db, './thumbs')); - try { - fs.mkdirSync(path.join(appconfig.datadir.db, 'cache')); + fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.repo)); + fs.ensureDirSync(path.resolve(ROOTPATH, appconfig.datadir.repo, './uploads')); } catch (err) { - if(err.code !== 'EEXIST') { - winston.error(err); - process.exit(1); - } + winston.error(err); } - try { - fs.mkdirSync(path.join(appconfig.datadir.db, 'thumbs')); - } catch (err) { - if(err.code !== 'EEXIST') { - winston.error(err); - process.exit(1); - } - } - - winston.info('[SERVER] Data directories are OK.'); + winston.info('[SERVER] Data and Repository directories are OK.'); return; @@ -171,6 +157,32 @@ module.exports = { return this._uploadsFolders; }, + /** + * Creates an uploads folder. + * + * @param {String} folderName The folder name + * @return {Promise} Promise of the operation + */ + createUploadsFolder(folderName) { + + let self = this; + + folderName = _.kebabCase(_.trim(folderName)); + + if(_.isEmpty(folderName) || !regFolderName.test(folderName)) { + return Promise.resolve(self.getUploadsFolders()); + } + + return fs.ensureDirAsync(path.join(self._uploadsPath, folderName)).then(() => { + if(!_.includes(self._uploadsFolders, folderName)) { + self._uploadsFolders.push(folderName); + self._uploadsFolders = _.sortBy(self._uploadsFolders); + } + return self.getUploadsFolders(); + }); + + }, + /** * Sets the uploads files. * diff --git a/server.js b/server.js index aac2bcdb..3da94222 100644 --- a/server.js +++ b/server.js @@ -5,23 +5,14 @@ // =========================================== global.ROOTPATH = __dirname; +global.PROCNAME = 'SERVER'; // ---------------------------------------- // Load Winston // ---------------------------------------- var _isDebug = process.env.NODE_ENV === 'development'; - -global.winston = require('winston'); -winston.remove(winston.transports.Console) -winston.add(winston.transports.Console, { - level: (_isDebug) ? 'info' : 'warn', - prettyPrint: true, - colorize: true, - silent: false, - timestamp: true -}); - +global.winston = require('./lib/winston')(_isDebug); winston.info('[SERVER] Requarks Wiki is initializing...'); // ---------------------------------------- @@ -66,7 +57,6 @@ var ctrl = autoload(path.join(ROOTPATH, '/controllers')); // ---------------------------------------- global.app = express(); -var _isDebug = (app.get('env') === 'development'); // ---------------------------------------- // Security diff --git a/views/modals/editor-image.pug b/views/modals/editor-image.pug index f2be206e..4739708b 100644 --- a/views/modals/editor-image.pug +++ b/views/modals/editor-image.pug @@ -60,6 +60,7 @@ img(v-bind:src="'/uploads/t/' + img.uid + '.png'") span: strong {{ img.basename }} span {{ img.filesize | filesize }} + em(v-show="images.length < 1") This folder is empty. .modal(v-bind:class="{ 'is-active': newFolderShow }") .modal-background @@ -72,8 +73,8 @@ .content label.label Enter the new folder name: p.control - input.input(type='text', placeholder='folder name', v-model='newFolderName') - span.help.is-danger.is-hidden This folder name is invalid! + input.input#txt-editor-newfoldername(type='text', placeholder='folder name', v-model='newFolderName', v-on:keyup.enter="newFolderCreate", v-on:keyup.esc="newFolderDiscard") + span.help.is-danger(v-show="newFolderError") This folder name is invalid! footer.card-footer a.card-footer-item(v-on:click="newFolderDiscard") Discard a.card-footer-item(v-on:click="newFolderCreate") Create diff --git a/ws-server.js b/ws-server.js index 0f7ca879..0b6bda93 100644 --- a/ws-server.js +++ b/ws-server.js @@ -5,22 +5,14 @@ // =========================================== global.ROOTPATH = __dirname; +global.PROCNAME = 'WS'; // ---------------------------------------- // Load Winston // ---------------------------------------- var _isDebug = process.env.NODE_ENV === 'development'; - -global.winston = require('winston'); -winston.remove(winston.transports.Console) -winston.add(winston.transports.Console, { - level: (_isDebug) ? 'info' : 'warn', - prettyPrint: true, - colorize: true, - silent: false, - timestamp: true -}); +global.winston = require('./lib/winston')(_isDebug); // ---------------------------------------- // Fetch internal handshake key @@ -141,6 +133,12 @@ io.on('connection', (socket) => { cb(lcdata.getUploadsFolders()); }); + socket.on('uploadsCreateFolder', (data, cb) => { + lcdata.createUploadsFolder(data.foldername).then((fldList) => { + cb(fldList); + }); + }); + socket.on('uploadsSetFiles', (data, cb) => { if(internalAuth.validateKey(data.auth)) { lcdata.setUploadsFiles(data.content);