From b2e693b1e4bb5577f8e135691ebabc03d5a3db5b Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sun, 19 Feb 2017 16:13:51 -0500 Subject: [PATCH] Settings page UI + npm installation fixes --- CHANGELOG.md | 15 +++++++- app/data.yml | 1 - assets/js/app.js | 4 +- client/js/pages/admin.js | 47 +++++++++++++++++++++++ controllers/admin.js | 31 ++++++++------- npm/install.js | 4 +- npm/package.json | 2 +- package.json | 5 ++- views/modals/admin-upgrade.pug | 25 ++++++++++++ views/pages/admin/settings.pug | 69 ++++++++++++++++++---------------- 10 files changed, 148 insertions(+), 55 deletions(-) create mode 100644 views/modals/admin-upgrade.pug diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d6871ca..4b2b80e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,22 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +## [v1.0.0-beta.8] - 2017-02-19 +### Added +- Automated Upgrade / Re-install feature UI only +- npm installation improvements + +# Fixed +- wiki executable shortcut on linux +- Settings page is now displaying the correct current version + +## [v1.0.0-beta.7] - 2017-02-14 +### Fixed +- npm installation fixes + ## [v1.0.0-beta.6] - 2017-02-14 ### Added -- Automated Upgrade / Re-install feature +- Settings page UI - Automated process management - npm automatic site installation diff --git a/app/data.yml b/app/data.yml index 9dfbfccd..52318bdb 100644 --- a/app/data.yml +++ b/app/data.yml @@ -3,7 +3,6 @@ # This is reserved for system use! # --------------------------------- name: Wiki.js -version: v1.0.0-beta.6 capabilities: guest: true rights: true diff --git a/assets/js/app.js b/assets/js/app.js index db31f1ff..df6dba20 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -1,2 +1,2 @@ -"use strict";function _classCallCheck(e,o){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}function setInputSelection(e,o,t){if(e.focus(),"undefined"!=typeof e.selectionStart)e.selectionStart=o,e.selectionEnd=t;else if(document.selection&&document.selection.createRange){e.select();var n=document.selection.createRange();n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",o),n.select()}}function makeSafePath(e){var o=_.split(_.trim(e),"/");return o=_.map(o,function(e){return _.kebabCase(_.deburr(_.trim(e)))}),_.join(_.filter(o,function(e){return!_.isEmpty(e)}),"/")}var _createClass=function(){function e(e,o){for(var t=0;t=3?(i.searchactive=!0,i.searchload++,n.emit("search",{terms:e},function(e){i.searchres=e.match,i.searchsuggest=e.suggest,i.searchmovearr=_.concat([],i.searchres,i.searchsuggest),i.searchload>0&&i.searchload--})):(i.searchactive=!1,i.searchres=[],i.searchsuggest=[],i.searchmovearr=[],i.searchload=0)},searchmoveidx:function(e,o){e>0?i.searchmovekey=i.searchmovearr[e-1]?"res."+i.searchmovearr[e-1].entryPath:"sug."+i.searchmovearr[e-1]:i.searchmovekey=""}},methods:{useSuggestion:function(e){i.searchq=e},closeSearch:function(){i.searchq=""},moveSelectSearch:function(){if(!(i.searchmoveidx<1)){var e=i.searchmoveidx-1;i.searchmovearr[e]?window.location.assign("/"+i.searchmovearr[e].entryPath):i.searchq=i.searchmovearr[e]}},moveDownSearch:function(){i.searchmoveidx0&&i.searchmoveidx--}}});e("main").on("click",i.closeSearch)}if(e("#page-type-view").length&&!function(){var o="home"!==e("#page-type-view").data("entrypath")?e("#page-type-view").data("entrypath"):"",n=o+"/new-page";e(".btn-create-prompt").on("click",function(t){e("#txt-create-prompt").val(n),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),o.length+1,n.length),e("#txt-create-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-create-prompt").on("keypress",function(o){13===o.which&&e(".btn-create-go").trigger("click")}),e(".btn-create-go").on("click",function(o){var t=makeSafePath(e("#txt-create-prompt").val());_.isEmpty(t)?e("#txt-create-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-create-prompt").parent().addClass("is-loading"),window.location.assign("/create/"+t))}),""!==o&&e(".btn-move-prompt").removeClass("is-hidden");var i=_.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),i,o.length),e("#txt-move-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-move-prompt").on("keypress",function(o){13===o.which&&e(".btn-move-go").trigger("click")}),e(".btn-move-go").on("click",function(n){var i=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(i)||i===o||"home"===i?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:i},dataType:"json",method:"PUT"}).then(function(e,o,n){e.ok?window.location.assign("/"+i):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")}))})}(),e("#page-type-create").length){var a;!function(){var i=e("#page-type-create").data("entrypath");e(".btn-create-discard").on("click",function(o){e("#modal-create-discard").toggleClass("is-active")}),1===e("#mk-editor").length&&!function(){var r=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var l=new Vue({el:"#modal-editor-image",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,fetchFromUrlURL:"",fetchFromUrlShow:!1,folders:[],currentFolder:"",currentImage:"",currentAlign:"left",images:[],uploadSucceeded:!1,postUploadChecks:0,renameImageShow:!1,renameImageId:"",renameImageFilename:"",deleteImageShow:!1,deleteImageId:"",deleteImageFilename:""},methods:{open:function(){r=!0,e("#modal-editor-image").addClass("is-active"),l.refreshFolders()},cancel:function(o){r=!1,e("#modal-editor-image").removeClass("is-active")},selectImage:function(e){l.currentImage=e},insertImage:function(e){a.codemirror.doc.somethingSelected()&&a.codemirror.execCommand("singleSelection");var o=_.find(l.images,["_id",l.currentImage]);o.normalizedPath="f:"===o.folder?o.filename:o.folder.slice(2)+"/"+o.filename,o.titleGuess=_.startCase(o.basename);var t="!["+o.titleGuess+"](/uploads/"+o.normalizedPath+' "'+o.titleGuess+'")';switch(l.currentAlign){case"center":t+="{.align-center}";break;case"right":t+="{.align-right}";break;case"logo":t+="{.pagelogo}"}a.codemirror.doc.replaceSelection(t),l.cancel()},newFolder:function(o){l.newFolderName="",l.newFolderError=!1,l.newFolderShow=!0,_.delay(function(){e("#txt-editor-image-newfoldername").focus()},400)},newFolderDiscard:function(e){l.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");return l.newFolderName=_.kebabCase(_.trim(l.newFolderName)),_.isEmpty(l.newFolderName)||!o.test(l.newFolderName)?void(l.newFolderError=!0):(l.newFolderDiscard(),l.isLoadingText="Creating new folder...",l.isLoading=!0,void Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:l.newFolderName},function(e){l.folders=e,l.currentFolder=l.newFolderName,l.images=[],l.isLoading=!1})}))},fetchFromUrl:function(o){l.fetchFromUrlURL="",l.fetchFromUrlShow=!0,_.delay(function(){e("#txt-editor-image-fetchurl").focus()},400)},fetchFromUrlDiscard:function(e){l.fetchFromUrlShow=!1},fetchFromUrlGo:function(e){l.fetchFromUrlDiscard(),l.isLoadingText="Fetching image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsFetchFileFromURL",{folder:l.currentFolder,fetchUrl:l.fetchFromUrlURL},function(e){e.ok?l.waitChangeComplete(l.images.length,!0):(l.isLoading=!1,t.pushError("Upload error",e.msg))})})},renameImage:function(){var o=_.find(l.images,["_id",l.renameImageId]);l.renameImageFilename=o.basename||"",l.renameImageShow=!0,_.delay(function(){e("#txt-editor-image-rename").focus(),_.defer(function(){e("#txt-editor-image-rename").select()})},400)},renameImageDiscard:function(){l.renameImageShow=!1},renameImageGo:function(){l.renameImageDiscard(),l.isLoadingText="Renaming image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:l.renameImageId,folder:l.currentFolder,filename:l.renameImageFilename},function(e){e.ok?l.waitChangeComplete(l.images.length,!1):(l.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveImage:function(e,o){l.isLoadingText="Moving image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?l.loadImages():(l.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteImageWarn:function(e){if(e){var o=_.find(l.images,["_id",l.deleteImageId]);l.deleteImageFilename=o.filename||"this image"}l.deleteImageShow=e},deleteImageGo:function(){l.deleteImageWarn(!1),l.isLoadingText="Deleting image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:l.deleteImageId},function(e){l.loadImages()})})},selectFolder:function(e){l.currentFolder=e,l.loadImages()},refreshFolders:function(){l.isLoadingText="Fetching folders list...",l.isLoading=!0,l.currentFolder="",l.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){l.folders=e,l.loadImages()})})},loadImages:function(e){return e||(l.isLoadingText="Fetching images...",l.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetImages",{folder:l.currentFolder},function(t){l.images=t,e||(l.isLoading=!1),l.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,l.postUploadChecks++,l.isLoadingText="Processing...",Vue.nextTick(function(){l.loadImages(!0).then(function(){l.images.length!==e===o?(l.postUploadChecks=0,l.isLoading=!1):l.postUploadChecks>5?(l.postUploadChecks=0,l.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){l.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(l.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(l.folders,o);l.moveImage(n,i)}}});e.contextMenu("destroy",".editor-modal-image-choices > figure"),e.contextMenu({selector:".editor-modal-image-choices > figure",appendTo:".editor-modal-image-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/2,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){l.renameImageId=_.toString(o.$trigger[0].dataset.uid),l.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){l.deleteImageId=_.toString(o.$trigger[0].dataset.uid),l.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=l.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:l.currentFolder},limit:20,expect:"json",allowedExts:["jpg","jpeg","gif","png","webp"],allowedTypes:["image/png","image/jpeg","image/gif","image/webp"],maxFileSize:3145728,init:function(e){l.uploadSucceeded=!1,l.isLoadingText="Preparing to upload...",l.isLoading=!0},progress:function(e){l.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length5?(d.postUploadChecks=0,d.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){d.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(d.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(d.folders,o);d.moveFile(n,i)}}});e.contextMenu("destroy",".editor-modal-file-choices > figure"),e.contextMenu({selector:".editor-modal-file-choices > figure",appendTo:".editor-modal-file-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/5,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){d.renameFileId=_.toString(o.$trigger[0].dataset.uid),d.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){d.deleteFileId=_.toString(o.$trigger[0].dataset.uid),d.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(n){var i=d.files.length;e(n.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:d.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){d.uploadSucceeded=!1,d.isLoadingText="Preparing to upload...",d.isLoading=!0},progress:function(e){d.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length5?(l.postUploadChecks=0,l.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){l.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(l.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(l.folders,o);l.moveImage(n,i)}}});e.contextMenu("destroy",".editor-modal-image-choices > figure"),e.contextMenu({selector:".editor-modal-image-choices > figure",appendTo:".editor-modal-image-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/2,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){l.renameImageId=_.toString(o.$trigger[0].dataset.uid),l.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){l.deleteImageId=_.toString(o.$trigger[0].dataset.uid),l.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=l.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:l.currentFolder},limit:20,expect:"json",allowedExts:["jpg","jpeg","gif","png","webp"],allowedTypes:["image/png","image/jpeg","image/gif","image/webp"],maxFileSize:3145728,init:function(e){l.uploadSucceeded=!1,l.isLoadingText="Preparing to upload...",l.isLoading=!0},progress:function(e){l.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length5?(d.postUploadChecks=0, -d.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){d.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(d.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(d.folders,o);d.moveFile(n,i)}}});e.contextMenu("destroy",".editor-modal-file-choices > figure"),e.contextMenu({selector:".editor-modal-file-choices > figure",appendTo:".editor-modal-file-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/5,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){d.renameFileId=_.toString(o.$trigger[0].dataset.uid),d.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){d.deleteFileId=_.toString(o.$trigger[0].dataset.uid),d.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(n){var i=d.files.length;e(n.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:d.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){d.uploadSucceeded=!1,d.isLoadingText="Preparing to upload...",d.isLoading=!0},progress:function(e){d.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length=0&&n&&(n.class+=" exit",Vue.set(o.mdl.children,t,n),_.delay(function(){o.mdl.children.splice(t,1)},500))}}]),e}(); \ No newline at end of file +"use strict";function _classCallCheck(e,o){if(!(e instanceof o))throw new TypeError("Cannot call a class as a function")}function setInputSelection(e,o,t){if(e.focus(),"undefined"!=typeof e.selectionStart)e.selectionStart=o,e.selectionEnd=t;else if(document.selection&&document.selection.createRange){e.select();var n=document.selection.createRange();n.collapse(!0),n.moveEnd("character",t),n.moveStart("character",o),n.select()}}function makeSafePath(e){var o=_.split(_.trim(e),"/");return o=_.map(o,function(e){return _.kebabCase(_.deburr(_.trim(e)))}),_.join(_.filter(o,function(e){return!_.isEmpty(e)}),"/")}var _createClass=function(){function e(e,o){for(var t=0;t=3?(i.searchactive=!0,i.searchload++,n.emit("search",{terms:e},function(e){i.searchres=e.match,i.searchsuggest=e.suggest,i.searchmovearr=_.concat([],i.searchres,i.searchsuggest),i.searchload>0&&i.searchload--})):(i.searchactive=!1,i.searchres=[],i.searchsuggest=[],i.searchmovearr=[],i.searchload=0)},searchmoveidx:function(e,o){e>0?i.searchmovekey=i.searchmovearr[e-1]?"res."+i.searchmovearr[e-1].entryPath:"sug."+i.searchmovearr[e-1]:i.searchmovekey=""}},methods:{useSuggestion:function(e){i.searchq=e},closeSearch:function(){i.searchq=""},moveSelectSearch:function(){if(!(i.searchmoveidx<1)){var e=i.searchmoveidx-1;i.searchmovearr[e]?window.location.assign("/"+i.searchmovearr[e].entryPath):i.searchq=i.searchmovearr[e]}},moveDownSearch:function(){i.searchmoveidx0&&i.searchmoveidx--}}});e("main").on("click",i.closeSearch)}if(e("#page-type-view").length&&!function(){var o="home"!==e("#page-type-view").data("entrypath")?e("#page-type-view").data("entrypath"):"",n=o+"/new-page";e(".btn-create-prompt").on("click",function(t){e("#txt-create-prompt").val(n),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),o.length+1,n.length),e("#txt-create-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-create-prompt").on("keypress",function(o){13===o.which&&e(".btn-create-go").trigger("click")}),e(".btn-create-go").on("click",function(o){var t=makeSafePath(e("#txt-create-prompt").val());_.isEmpty(t)?e("#txt-create-prompt").addClass("is-danger").next().removeClass("is-hidden"):(e("#txt-create-prompt").parent().addClass("is-loading"),window.location.assign("/create/"+t))}),""!==o&&e(".btn-move-prompt").removeClass("is-hidden");var i=_.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),i,o.length),e("#txt-move-prompt").removeClass("is-danger").next().addClass("is-hidden")}),e("#txt-move-prompt").on("keypress",function(o){13===o.which&&e(".btn-move-go").trigger("click")}),e(".btn-move-go").on("click",function(n){var i=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(i)||i===o||"home"===i?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:i},dataType:"json",method:"PUT"}).then(function(e,o,n){e.ok?window.location.assign("/"+i):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")}))})}(),e("#page-type-create").length){var a;!function(){var i=e("#page-type-create").data("entrypath");e(".btn-create-discard").on("click",function(o){e("#modal-create-discard").toggleClass("is-active")}),1===e("#mk-editor").length&&!function(){var r=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var l=new Vue({el:"#modal-editor-image",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,fetchFromUrlURL:"",fetchFromUrlShow:!1,folders:[],currentFolder:"",currentImage:"",currentAlign:"left",images:[],uploadSucceeded:!1,postUploadChecks:0,renameImageShow:!1,renameImageId:"",renameImageFilename:"",deleteImageShow:!1,deleteImageId:"",deleteImageFilename:""},methods:{open:function(){r=!0,e("#modal-editor-image").addClass("is-active"),l.refreshFolders()},cancel:function(o){r=!1,e("#modal-editor-image").removeClass("is-active")},selectImage:function(e){l.currentImage=e},insertImage:function(e){a.codemirror.doc.somethingSelected()&&a.codemirror.execCommand("singleSelection");var o=_.find(l.images,["_id",l.currentImage]);o.normalizedPath="f:"===o.folder?o.filename:o.folder.slice(2)+"/"+o.filename,o.titleGuess=_.startCase(o.basename);var t="!["+o.titleGuess+"](/uploads/"+o.normalizedPath+' "'+o.titleGuess+'")';switch(l.currentAlign){case"center":t+="{.align-center}";break;case"right":t+="{.align-right}";break;case"logo":t+="{.pagelogo}"}a.codemirror.doc.replaceSelection(t),l.cancel()},newFolder:function(o){l.newFolderName="",l.newFolderError=!1,l.newFolderShow=!0,_.delay(function(){e("#txt-editor-image-newfoldername").focus()},400)},newFolderDiscard:function(e){l.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");return l.newFolderName=_.kebabCase(_.trim(l.newFolderName)),_.isEmpty(l.newFolderName)||!o.test(l.newFolderName)?void(l.newFolderError=!0):(l.newFolderDiscard(),l.isLoadingText="Creating new folder...",l.isLoading=!0,void Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:l.newFolderName},function(e){l.folders=e,l.currentFolder=l.newFolderName,l.images=[],l.isLoading=!1})}))},fetchFromUrl:function(o){l.fetchFromUrlURL="",l.fetchFromUrlShow=!0,_.delay(function(){e("#txt-editor-image-fetchurl").focus()},400)},fetchFromUrlDiscard:function(e){l.fetchFromUrlShow=!1},fetchFromUrlGo:function(e){l.fetchFromUrlDiscard(),l.isLoadingText="Fetching image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsFetchFileFromURL",{folder:l.currentFolder,fetchUrl:l.fetchFromUrlURL},function(e){e.ok?l.waitChangeComplete(l.images.length,!0):(l.isLoading=!1,t.pushError("Upload error",e.msg))})})},renameImage:function(){var o=_.find(l.images,["_id",l.renameImageId]);l.renameImageFilename=o.basename||"",l.renameImageShow=!0,_.delay(function(){e("#txt-editor-image-rename").focus(),_.defer(function(){e("#txt-editor-image-rename").select()})},400)},renameImageDiscard:function(){l.renameImageShow=!1},renameImageGo:function(){l.renameImageDiscard(),l.isLoadingText="Renaming image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:l.renameImageId,folder:l.currentFolder,filename:l.renameImageFilename},function(e){e.ok?l.waitChangeComplete(l.images.length,!1):(l.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveImage:function(e,o){l.isLoadingText="Moving image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?l.loadImages():(l.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteImageWarn:function(e){if(e){var o=_.find(l.images,["_id",l.deleteImageId]);l.deleteImageFilename=o.filename||"this image"}l.deleteImageShow=e},deleteImageGo:function(){l.deleteImageWarn(!1),l.isLoadingText="Deleting image...",l.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:l.deleteImageId},function(e){l.loadImages()})})},selectFolder:function(e){l.currentFolder=e,l.loadImages()},refreshFolders:function(){l.isLoadingText="Fetching folders list...",l.isLoading=!0,l.currentFolder="",l.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){l.folders=e,l.loadImages()})})},loadImages:function(e){return e||(l.isLoadingText="Fetching images...",l.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetImages",{folder:l.currentFolder},function(t){l.images=t,e||(l.isLoading=!1),l.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,l.postUploadChecks++,l.isLoadingText="Processing...",Vue.nextTick(function(){l.loadImages(!0).then(function(){l.images.length!==e===o?(l.postUploadChecks=0,l.isLoading=!1):l.postUploadChecks>5?(l.postUploadChecks=0,l.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){l.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(l.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(l.folders,o);l.moveImage(n,i)}}});e.contextMenu("destroy",".editor-modal-image-choices > figure"),e.contextMenu({selector:".editor-modal-image-choices > figure",appendTo:".editor-modal-image-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/2,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){l.renameImageId=_.toString(o.$trigger[0].dataset.uid),l.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){l.deleteImageId=_.toString(o.$trigger[0].dataset.uid),l.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=l.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:l.currentFolder},limit:20,expect:"json",allowedExts:["jpg","jpeg","gif","png","webp"],allowedTypes:["image/png","image/jpeg","image/gif","image/webp"],maxFileSize:3145728,init:function(e){l.uploadSucceeded=!1,l.isLoadingText="Preparing to upload...",l.isLoading=!0},progress:function(e){l.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length5?(d.postUploadChecks=0,d.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){d.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(d.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(d.folders,o);d.moveFile(n,i)}}});e.contextMenu("destroy",".editor-modal-file-choices > figure"),e.contextMenu({selector:".editor-modal-file-choices > figure",appendTo:".editor-modal-file-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/5,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){d.renameFileId=_.toString(o.$trigger[0].dataset.uid),d.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){d.deleteFileId=_.toString(o.$trigger[0].dataset.uid),d.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(n){var i=d.files.length;e(n.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:d.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){d.uploadSucceeded=!1,d.isLoadingText="Preparing to upload...",d.isLoading=!0},progress:function(e){d.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length5?(l.postUploadChecks=0,l.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){l.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(l.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(l.folders,o);l.moveImage(n,i)}}});e.contextMenu("destroy",".editor-modal-image-choices > figure"),e.contextMenu({selector:".editor-modal-image-choices > figure",appendTo:".editor-modal-image-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/2,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){l.renameImageId=_.toString(o.$trigger[0].dataset.uid),l.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){l.deleteImageId=_.toString(o.$trigger[0].dataset.uid),l.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=l.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:l.currentFolder},limit:20,expect:"json",allowedExts:["jpg","jpeg","gif","png","webp"],allowedTypes:["image/png","image/jpeg","image/gif","image/webp"],maxFileSize:3145728,init:function(e){l.uploadSucceeded=!1,l.isLoadingText="Preparing to upload...",l.isLoading=!0},progress:function(e){l.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length5?(d.postUploadChecks=0, +d.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){d.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(d.folders,function(o){return{name:""!==o?o:"/ (root)",icon:"fa-folder",callback:function(o,t){var n=_.toString(e(t.$trigger).data("uid")),i=_.nth(d.folders,o);d.moveFile(n,i)}}});e.contextMenu("destroy",".editor-modal-file-choices > figure"),e.contextMenu({selector:".editor-modal-file-choices > figure",appendTo:".editor-modal-file-choices",position:function(o,t,n){e(o.$trigger).addClass("is-contextopen");var i=e(o.$trigger).position(),a={w:e(o.$trigger).width()/5,h:e(o.$trigger).height()/2};o.$menu.css({top:i.top+a.h,left:i.left+a.w})},events:{hide:function(o){e(o.$trigger).removeClass("is-contextopen")}},items:{rename:{name:"Rename",icon:"fa-edit",callback:function(e,o){d.renameFileId=_.toString(o.$trigger[0].dataset.uid),d.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){d.deleteFileId=_.toString(o.$trigger[0].dataset.uid),d.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(n){var i=d.files.length;e(n.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:d.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){d.uploadSucceeded=!1,d.isLoadingText="Preparing to upload...",d.isLoading=!0},progress:function(e){d.isLoadingText="Uploading..."+Math.round(e)+"%"},success:function(e){if(e.ok){var o=_.filter(e.results,["ok",!1]);o.length?(_.forEach(o,function(e){t.pushError("Upload error",e.msg)}),o.length=0&&n&&(n.class+=" exit",Vue.set(o.mdl.children,t,n),_.delay(function(){o.mdl.children.splice(t,1)},500))}}]),e}(); \ No newline at end of file diff --git a/client/js/pages/admin.js b/client/js/pages/admin.js index b2cf5577..ef1496aa 100644 --- a/client/js/pages/admin.js +++ b/client/js/pages/admin.js @@ -98,4 +98,51 @@ if ($('#page-type-admin-profile').length) { /* eslint-disable spaced-comment */ //=include ../modals/admin-users-delete.js /* eslint-enable spaced-comment */ +} else if ($('#page-type-admin-settings').length) { + let vueSettings = new Vue({ // eslint-disable-line no-unused-vars + el: '#page-type-admin-settings', + data: { + upgradeModal: { + state: false, + step: 'confirm', + mode: 'upgrade', + error: 'Something went wrong.' + } + }, + methods: { + upgrade: (ev) => { + vueSettings.upgradeModal.mode = 'upgrade' + vueSettings.upgradeModal.step = 'confirm' + vueSettings.upgradeModal.state = true + }, + reinstall: (ev) => { + vueSettings.upgradeModal.mode = 're-install' + vueSettings.upgradeModal.step = 'confirm' + vueSettings.upgradeModal.state = true + }, + upgradeCancel: (ev) => { + vueSettings.upgradeModal.state = false + }, + upgradeStart: (ev) => { + vueSettings.upgradeModal.step = 'running' + $.post('/admin/settings/install', { + mode: vueSettings.upgradeModal.mode + }).done((resp) => { + // todo + }).fail((jqXHR, txtStatus, resp) => { + vueSettings.upgradeModal.step = 'error' + vueSettings.upgradeModal.error = jqXHR.responseText + }) + }, + flushcache: (ev) => { + window.alert('Coming soon!') + }, + resetaccounts: (ev) => { + window.alert('Coming soon!') + }, + flushsessions: (ev) => { + window.alert('Coming soon!') + } + } + }) } diff --git a/controllers/admin.js b/controllers/admin.js index 6f87ad75..1c999b0f 100644 --- a/controllers/admin.js +++ b/controllers/admin.js @@ -7,6 +7,7 @@ const validator = require('validator') const _ = require('lodash') const axios = require('axios') const path = require('path') +const fs = Promise.promisifyAll(require('fs-extra')) /** * Admin @@ -220,28 +221,30 @@ router.get('/settings', (req, res) => { return res.render('error-forbidden') } - axios.get('https://api.github.com/repos/Requarks/wiki/releases/latest').then(resp => { - let sysversion = { - current: appdata.version, - latest: resp.data.tag_name, - latestPublishedAt: resp.data.published_at - } + fs.readJsonAsync(path.join(ROOTPATH, 'package.json')).then(packageObj => { + axios.get('https://api.github.com/repos/Requarks/wiki/releases/latest').then(resp => { + let sysversion = { + current: 'v' + packageObj.version, + latest: resp.data.tag_name, + latestPublishedAt: resp.data.published_at + } - res.render('pages/admin/settings', { adminTab: 'settings', sysversion }) - }).catch(err => { - winston.warn(err) - res.render('pages/admin/settings', { adminTab: 'settings', sysversion: { current: appdata.version } }) + res.render('pages/admin/settings', { adminTab: 'settings', sysversion }) + }).catch(err => { + winston.warn(err) + res.render('pages/admin/settings', { adminTab: 'settings', sysversion: { current: 'v' + packageObj.version } }) + }) }) }) -router.get('/settings/install', (req, res) => { +router.post('/settings/install', (req, res) => { if (!res.locals.rights.manage) { return res.render('error-forbidden') } - let sysLib = require(path.join(ROOTPATH, 'libs/system.js')) - sysLib.install('v1.0-beta.5') - res.status(200).end() + // let sysLib = require(path.join(ROOTPATH, 'libs/system.js')) + // sysLib.install('v1.0-beta.7') + res.status(400).send('Sorry, Upgrade/Re-Install via the web UI is not yet ready. You must use the npm upgrade method in the meantime.').end() }) module.exports = router diff --git a/npm/install.js b/npm/install.js index c81bff97..e4d9c999 100644 --- a/npm/install.js +++ b/npm/install.js @@ -1,6 +1,6 @@ 'use strict' -const ora = require('ora')('Initializing...').start() +const ora = require('ora')({ text: 'Initializing...', spinner: 'dots12' }).start() const Promise = require('bluebird') const exec = require('child_process').exec const fs = Promise.promisifyAll(require('fs-extra')) @@ -16,7 +16,7 @@ let installDir = path.resolve(__dirname, '../..') ora.text = 'Looking for running instances...' pm2.connectAsync().then(() => { return pm2.describeAsync('wiki').then(() => { - ora.text = 'Stopping and deleting from pm2...' + ora.text = 'Stopping and deleting process from pm2...' return pm2.deleteAsync('wiki') }).catch(err => { // eslint-disable-line handle-callback-err return true diff --git a/npm/package.json b/npm/package.json index 0acde83d..c9da49d1 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { "name": "wiki.js", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown", "main": "install.js", "scripts": { diff --git a/package.json b/package.json index 15f0f5e8..53d30109 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wiki", - "version": "1.0.0-beta.7", + "version": "1.0.0-beta.8", "description": "A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown", "main": "server.js", "scripts": { @@ -11,6 +11,9 @@ "snyk-protect": "snyk protect", "__prepublish": "npm run snyk-protect" }, + "bin": { + "wiki": "wiki.js" + }, "repository": { "type": "git", "url": "git+https://github.com/Requarks/wiki.git" diff --git a/views/modals/admin-upgrade.pug b/views/modals/admin-upgrade.pug new file mode 100644 index 00000000..2fa36b3e --- /dev/null +++ b/views/modals/admin-upgrade.pug @@ -0,0 +1,25 @@ +.modal(v-bind:class='{ "is-active": upgradeModal.state }') + .modal-background + .modal-container + .modal-content + template(v-if='upgradeModal.step === "running"') + header.is-blue Install + section.modal-loading + i + span Wiki.js {{ upgradeModal.mode }} in progress... + em Please wait + template(v-if='upgradeModal.step === "error"') + header.is-red Installation Error + section.modal-loading + span {{ upgradeModal.error }} + footer + a.button.is-grey.is-outlined(v-on:click='upgradeCancel') Abort + a.button.is-deep-orange(v-on:click='upgradeStart') Try Again + template(v-if='upgradeModal.step === "confirm"') + header.is-deep-orange Are you sure? + section + label.label You are about to {{ upgradeModal.mode }} Wiki.js. + span.note You will not be able to access your wiki during the operation. Content will not be affected. However, it is your responsability to ensure you have a backup in the unexpected event content gets lost or corrupted. + footer + a.button.is-grey.is-outlined(v-on:click='upgradeCancel') Abort + a.button.is-deep-orange(v-on:click='upgradeStart') Start diff --git a/views/pages/admin/settings.pug b/views/pages/admin/settings.pug index 9343c7d1..6a1d1a78 100644 --- a/views/pages/admin/settings.pug +++ b/views/pages/admin/settings.pug @@ -1,36 +1,39 @@ extends ./_layout.pug block adminContent - .hero - h1.title#title System Settings - h2.subtitle Manage site configuration - .form-sections - section - label.label System Version - .section-block - p Current Version: #[strong= sysversion.current] - if sysversion.latest - p Latest Version: #[strong= sysversion.latest] #[em (Published #{userMoment(sysversion.latestPublishedAt).fromNow()})] - p - if sysversion.current !== sysversion.latest - button.button.is-deep-orange Upgrade - else - button.button.is-disabled Upgrade - button.button.is-deep-orange.is-outlined Re-install current version - else - p: em Unable to query latest version. Try again later. - section - label.label Administrative Tools - .section-block - h6 Flush cache and rebuild indexes: - p.is-small If content or search results seems out-of-date or do not include latest content, flushing the cache can help resolve these issues. - p: button.button.is-teal.is-outlined Flush and Rebuild - h6 Reset the root administrator and guest accounts to defaults: - p.is-small - | The root administrator account will be reset to the email address in the configuration file and the password will be reinitialized to #[strong admin123]. - br - | The guest account will be recreated with its access rights set to defaults. - p: button.button.is-teal.is-outlined Reset System Accounts - h6 Flush all active user sessions: - p.is-small All users will be logged out and forced to login again. Your current session will also be affected! - p: button.button.is-teal.is-outlined Flush Sessions + #page-type-admin-settings + .hero + h1.title#title System Settings + h2.subtitle Manage site configuration + .form-sections + section + label.label System Version + .section-block + p Current Version: #[strong= sysversion.current] + if sysversion.latest + p Latest Version: #[strong= sysversion.latest] #[em (Published #{userMoment(sysversion.latestPublishedAt).fromNow()})] + p + if sysversion.current !== sysversion.latest + button.button.is-deep-orange(v-on:click='upgrade') Upgrade + else + button.button.is-disabled Upgrade + button.button.is-deep-orange.is-outlined(v-on:click='reinstall') Re-install current version + else + p: em Unable to query latest version. Try again later. + section + label.label Administrative Tools + .section-block + h6 Flush cache and rebuild indexes: + p.is-small If content or search results seems out-of-date or do not include latest content, flushing the cache can help resolve these issues. + p: button.button.is-teal.is-outlined(v-on:click='flushcache') Flush and Rebuild + h6 Reset the root administrator and guest accounts to defaults: + p.is-small + | The root administrator account will be reset to the email address in the configuration file and the password will be reinitialized to #[strong admin123]. + br + | The guest account will be recreated with its access rights set to defaults. + p: button.button.is-teal.is-outlined(v-on:click='resetaccounts') Reset System Accounts + h6 Flush all active user sessions: + p.is-small All users will be logged out and forced to login again. Your current session will also be affected! + p: button.button.is-teal.is-outlined(v-on:click='flushsessions') Flush Sessions + + include ../../modals/admin-upgrade.pug