Commit bb456184 authored by NGPixel's avatar NGPixel

Setup wizard - all UI steps

parent 04be7eba
...@@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). ...@@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Fixed ### Fixed
- Auth: Authentication would fail if email has uppercase chars and provider callback is in lowercase - Auth: Authentication would fail if email has uppercase chars and provider callback is in lowercase
- Markdown: Fixed potential crash on markdown processing of video links
- Search: Search index should now update upon article creation - Search: Search index should now update upon article creation
- Search: Search results are no longer duplicated upon article update - Search: Search results are no longer duplicated upon article update
- UI: Missing icons on login page - UI: Missing icons on login page
......
...@@ -49,10 +49,14 @@ var Cron = require('cron').CronJob ...@@ -49,10 +49,14 @@ var Cron = require('cron').CronJob
// Start Cron // Start Cron
// ---------------------------------------- // ----------------------------------------
var job
var jobIsBusy = false var jobIsBusy = false
var jobUplWatchStarted = false var jobUplWatchStarted = false
var job = new Cron({ db.onReady.then(() => {
return db.Entry.remove({})
}).then(() => {
job = new Cron({
cronTime: '0 */5 * * * *', cronTime: '0 */5 * * * *',
onTick: () => { onTick: () => {
// Make sure we don't start two concurrent jobs // Make sure we don't start two concurrent jobs
...@@ -79,8 +83,7 @@ var job = new Cron({ ...@@ -79,8 +83,7 @@ var job = new Cron({
// -> Sync with Git remote // -> Sync with Git remote
//* **************************************** //* ****************************************
jobs.push(git.onReady.then(() => { jobs.push(git.resync().then(() => {
return git.resync().then(() => {
// -> Stream all documents // -> Stream all documents
let cacheJobs = [] let cacheJobs = []
...@@ -131,7 +134,6 @@ var job = new Cron({ ...@@ -131,7 +134,6 @@ var job = new Cron({
}) })
return jobCbStreamDocs return jobCbStreamDocs
})
})) }))
//* **************************************** //* ****************************************
...@@ -180,6 +182,8 @@ var job = new Cron({ ...@@ -180,6 +182,8 @@ var job = new Cron({
start: false, start: false,
timeZone: 'UTC', timeZone: 'UTC',
runOnInit: true runOnInit: true
})
}) })
// ---------------------------------------- // ----------------------------------------
......
...@@ -50,4 +50,26 @@ defaults: ...@@ -50,4 +50,26 @@ defaults:
signature: signature:
name: Wiki name: Wiki
email: wiki@example.com email: wiki@example.com
langs:
-
id: en
name: English
-
id: fr
name: French - Français
-
id: de
name: German - Deutsch
-
id: ko
name: Korean - 한국어
-
id: pt
name: Portuguese - Português
-
id: ru
name: Russian - Русский
-
id: es
name: Spanish - Español
# --------------------------------- # ---------------------------------
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
"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(),void 0!==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<o.length;t++){var n=o[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(o,t,n){return t&&e(o.prototype,t),n&&e(o,n),o}}();jQuery(document).ready(function(e){var o=this;e("a").smoothScroll({speed:400,offset:-70});new Sticky(".stickyscroll");e(window).bind("beforeunload",function(){e("#notifload").addClass("active")}),e(document).ajaxSend(function(){e("#notifload").addClass("active")}).ajaxComplete(function(){e("#notifload").removeClass("active")});var t=new Alerts;alertsData&&_.forEach(alertsData,function(e){t.push(e)});var n=io(window.location.origin);if(e("#search-input").length){e("#search-input").focus(),e(".searchresults").css("display","block");var i=new Vue({el:"#header-container",data:{searchq:"",searchres:[],searchsuggest:[],searchload:0,searchactive:!1,searchmoveidx:0,searchmovekey:"",searchmovearr:[]},watch:{searchq:function(e,o){i.searchmoveidx=0,e.length>=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){i.searchmovekey=e>0?i.searchmovearr[e-1]?"res."+i.searchmovearr[e-1].entryPath:"sug."+i.searchmovearr[e-1]:""}},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.searchmoveidx<i.searchmovearr.length&&i.searchmoveidx++},moveUpSearch:function(){i.searchmoveidx>0&&i.searchmoveidx--}}});e("main").on("click",i.closeSearch)}if(e("#page-type-view").length){var a="home"!==e("#page-type-view").data("entrypath")?e("#page-type-view").data("entrypath"):"",r=a+"/new-page";e(".btn-create-prompt").on("click",function(o){e("#txt-create-prompt").val(r),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),a.length+1,r.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))}),""!==a&&e(".btn-move-prompt").removeClass("is-hidden");var l=_.lastIndexOf(a,"/")+1;e(".btn-move-prompt").on("click",function(o){e("#txt-move-prompt").val(a),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),l,a.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(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,o,i){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")}))})}if(e("#page-type-create").length){var d=e("#page-type-create").data("entrypath");if(e(".btn-create-discard").on("click",function(o){e("#modal-create-discard").toggleClass("is-active")}),1===e("#mk-editor").length){var s=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var c=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(){s=!0,e("#modal-editor-image").addClass("is-active"),c.refreshFolders()},cancel:function(o){s=!1,e("#modal-editor-image").removeClass("is-active")},selectImage:function(e){c.currentImage=e},insertImage:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(c.images,["_id",c.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(c.currentAlign){case"center":t+="{.align-center}";break;case"right":t+="{.align-right}";break;case"logo":t+="{.pagelogo}"}F.codemirror.doc.replaceSelection(t),c.cancel()},newFolder:function(o){c.newFolderName="",c.newFolderError=!1,c.newFolderShow=!0,_.delay(function(){e("#txt-editor-image-newfoldername").focus()},400)},newFolderDiscard:function(e){c.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(c.newFolderName=_.kebabCase(_.trim(c.newFolderName)),_.isEmpty(c.newFolderName)||!o.test(c.newFolderName))return void(c.newFolderError=!0);c.newFolderDiscard(),c.isLoadingText="Creating new folder...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:c.newFolderName},function(e){c.folders=e,c.currentFolder=c.newFolderName,c.images=[],c.isLoading=!1})})},fetchFromUrl:function(o){c.fetchFromUrlURL="",c.fetchFromUrlShow=!0,_.delay(function(){e("#txt-editor-image-fetchurl").focus()},400)},fetchFromUrlDiscard:function(e){c.fetchFromUrlShow=!1},fetchFromUrlGo:function(e){c.fetchFromUrlDiscard(),c.isLoadingText="Fetching image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsFetchFileFromURL",{folder:c.currentFolder,fetchUrl:c.fetchFromUrlURL},function(e){e.ok?c.waitChangeComplete(c.images.length,!0):(c.isLoading=!1,t.pushError("Upload error",e.msg))})})},renameImage:function(){var o=_.find(c.images,["_id",c.renameImageId]);c.renameImageFilename=o.basename||"",c.renameImageShow=!0,_.delay(function(){e("#txt-editor-image-rename").focus(),_.defer(function(){e("#txt-editor-image-rename").select()})},400)},renameImageDiscard:function(){c.renameImageShow=!1},renameImageGo:function(){c.renameImageDiscard(),c.isLoadingText="Renaming image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:c.renameImageId,folder:c.currentFolder,filename:c.renameImageFilename},function(e){e.ok?c.waitChangeComplete(c.images.length,!1):(c.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveImage:function(e,o){c.isLoadingText="Moving image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?c.loadImages():(c.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteImageWarn:function(e){if(e){var o=_.find(c.images,["_id",c.deleteImageId]);c.deleteImageFilename=o.filename||"this image"}c.deleteImageShow=e},deleteImageGo:function(){c.deleteImageWarn(!1),c.isLoadingText="Deleting image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:c.deleteImageId},function(e){c.loadImages()})})},selectFolder:function(e){c.currentFolder=e,c.loadImages()},refreshFolders:function(){c.isLoadingText="Fetching folders list...",c.isLoading=!0,c.currentFolder="",c.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){c.folders=e,c.loadImages()})})},loadImages:function(e){return e||(c.isLoadingText="Fetching images...",c.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetImages",{folder:c.currentFolder},function(t){c.images=t,e||(c.isLoading=!1),c.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,c.postUploadChecks++,c.isLoadingText="Processing...",Vue.nextTick(function(){c.loadImages(!0).then(function(){c.images.length!==e===o?(c.postUploadChecks=0,c.isLoading=!1):c.postUploadChecks>5?(c.postUploadChecks=0,c.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){c.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(c.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(c.folders,o);c.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){c.renameImageId=_.toString(o.$trigger[0].dataset.uid),c.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){c.deleteImageId=_.toString(o.$trigger[0].dataset.uid),c.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=c.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:c.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){c.uploadSucceeded=!1,c.isLoadingText="Preparing to upload...",c.isLoading=!0},progress:function(e){c.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),c.uploadSucceeded=!0)):c.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError(e.message,o.upload.file.name)},finish:function(){c.uploadSucceeded?c.waitChangeComplete(i,!0):c.isLoading=!1}})});var m=new Vue({el:"#modal-editor-file",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,folders:[],currentFolder:"",currentFile:"",files:[],uploadSucceeded:!1,postUploadChecks:0,renameFileShow:!1,renameFileId:"",renameFileFilename:"",deleteFileShow:!1,deleteFileId:"",deleteFileFilename:""},methods:{open:function(){s=!0,e("#modal-editor-file").addClass("is-active"),m.refreshFolders()},cancel:function(o){s=!1,e("#modal-editor-file").removeClass("is-active")},selectFile:function(e){m.currentFile=e},insertFileLink:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(m.files,["_id",m.currentFile]);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+'")';F.codemirror.doc.replaceSelection(t),m.cancel()},newFolder:function(o){m.newFolderName="",m.newFolderError=!1,m.newFolderShow=!0,_.delay(function(){e("#txt-editor-file-newfoldername").focus()},400)},newFolderDiscard:function(e){m.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(m.newFolderName=_.kebabCase(_.trim(m.newFolderName)),_.isEmpty(m.newFolderName)||!o.test(m.newFolderName))return void(m.newFolderError=!0);m.newFolderDiscard(),m.isLoadingText="Creating new folder...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:m.newFolderName},function(e){m.folders=e,m.currentFolder=m.newFolderName,m.files=[],m.isLoading=!1})})},renameFile:function(){var o=_.find(m.files,["_id",m.renameFileId]);m.renameFileFilename=o.basename||"",m.renameFileShow=!0,_.delay(function(){e("#txt-editor-renamefile").focus(),_.defer(function(){e("#txt-editor-file-rename").select()})},400)},renameFileDiscard:function(){m.renameFileShow=!1},renameFileGo:function(){m.renameFileDiscard(),m.isLoadingText="Renaming file...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:m.renameFileId,folder:m.currentFolder,filename:m.renameFileFilename},function(e){e.ok?m.waitChangeComplete(m.files.length,!1):(m.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveFile:function(e,o){m.isLoadingText="Moving file...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?m.loadFiles():(m.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteFileWarn:function(e){if(e){var o=_.find(m.files,["_id",m.deleteFileId]);m.deleteFileFilename=o.filename||"this file"}m.deleteFileShow=e},deleteFileGo:function(){m.deleteFileWarn(!1),m.isLoadingText="Deleting file...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:m.deleteFileId},function(e){m.loadFiles()})})},selectFolder:function(e){m.currentFolder=e,m.loadFiles()},refreshFolders:function(){m.isLoadingText="Fetching folders list...",m.isLoading=!0,m.currentFolder="",m.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){m.folders=e,m.loadFiles()})})},loadFiles:function(e){return e||(m.isLoadingText="Fetching files...",m.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetFiles",{folder:m.currentFolder},function(t){m.files=t,e||(m.isLoading=!1),m.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,m.postUploadChecks++,m.isLoadingText="Processing...",Vue.nextTick(function(){m.loadFiles(!0).then(function(){m.files.length!==e===o?(m.postUploadChecks=0,m.isLoading=!1):m.postUploadChecks>5?(m.postUploadChecks=0,m.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){m.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(m.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(m.folders,o);m.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){m.renameFileId=_.toString(o.$trigger[0].dataset.uid),m.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){m.deleteFileId=_.toString(o.$trigger[0].dataset.uid),m.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(o){var n=m.files.length;e(o.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:m.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){m.uploadSucceeded=!1,m.isLoadingText="Preparing to upload...",m.isLoading=!0},progress:function(e){m.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),m.uploadSucceeded=!0)):m.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError("Upload error",e.message)},finish:function(){m.uploadSucceeded?m.waitChangeComplete(n,!0):m.isLoading=!1}})});var u={youtube:new RegExp(/(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/,"i"),vimeo:new RegExp(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|)(\d+)(?:$|\/|\?)/,"i"),dailymotion:new RegExp(/(?:dailymotion\.com(?:\/embed)?(?:\/video|\/hub)|dai\.ly)\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/,"i")},g=new Vue({el:"#modal-editor-video",data:{link:""},methods:{open:function(o){e("#modal-editor-video").addClass("is-active"),e("#modal-editor-video input").focus()},cancel:function(o){s=!1,e("#modal-editor-video").removeClass("is-active"),g.link=""},insertVideo:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.findKey(u,function(e){return e.test(g.link)});_.isNil(o)&&(o="video");var t="[video]("+g.link+"){."+o+"}\n";F.codemirror.doc.replaceSelection(t),g.cancel()}}}),f=ace.require("ace/ext/modelist"),p=null,h=[],w=function(o){return e.ajax({url:"/js/ace/mode-"+o+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(h,o))return!1},success:function(){h.push(o)}})},v=new Vue({el:"#modal-editor-codeblock",data:{modes:f.modesByName,modeSelected:"text",initContent:""},watch:{modeSelected:function(e,o){w(e).done(function(){ace.require("ace/mode/"+e),p.getSession().setMode("ace/mode/"+e)})}},methods:{open:function(o){e("#modal-editor-codeblock").addClass("is-active"),_.delay(function(){p=ace.edit("codeblock-editor"),p.setTheme("ace/theme/tomorrow_night"),p.getSession().setMode("ace/mode/"+v.modeSelected),p.setOption("fontSize","14px"),p.setOption("hScrollBarAlwaysVisible",!1),p.setOption("wrap",!0),p.setValue(v.initContent),p.focus(),p.renderer.updateFull()},300)},cancel:function(o){s=!1,e("#modal-editor-codeblock").removeClass("is-active"),v.initContent=""},insertCode:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o="\n```"+v.modeSelected+"\n"+p.getValue()+"\n```\n";F.codemirror.doc.replaceSelection(o),v.cancel()}}}),F=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:"icon-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"icon-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"icon-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"icon-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"icon-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"icon-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"icon-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"icon-th-list",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"icon-list-ol",title:"Numbered List"},"|",{name:"link",action:function(e){},className:"icon-link2",title:"Insert Link"},{name:"image",action:function(e){s||c.open()},className:"icon-image",title:"Insert Image"},{name:"file",action:function(e){s||m.open()},className:"icon-paper",title:"Insert File"},{name:"video",action:function(e){s||g.open()},className:"icon-video-camera2",title:"Insert Video Player"},"|",{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:"icon-terminal",title:"Inline Code"},{name:"code-block",action:function(e){s||(s=!0,F.codemirror.doc.somethingSelected()&&(v.initContent=F.codemirror.doc.getSelection()),v.open())},className:"icon-code",title:"Code Block"},"|",{name:"table",action:function(e){},className:"icon-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"icon-minus2",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}}),x=function(o){e.ajax(window.location.href,{data:{markdown:F.value()},dataType:"json",method:"PUT"}).then(function(e,o,n){e.ok?window.location.assign("/"+d):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")})};e(".btn-edit-save, .btn-create-save").on("click",function(e){x(e)}),e(window).bind("keydown",function(e){if(e.ctrlKey||e.metaKey)switch(String.fromCharCode(e.which).toLowerCase()){case"s":e.preventDefault(),x(e)}})}}if(e("#page-type-edit").length){var S=e("#page-type-edit").data("entrypath");if(e(".btn-edit-discard").on("click",function(o){e("#modal-edit-discard").toggleClass("is-active")}),1===e("#mk-editor").length){var k=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var C=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(){k=!0,e("#modal-editor-image").addClass("is-active"),C.refreshFolders()},cancel:function(o){k=!1,e("#modal-editor-image").removeClass("is-active")},selectImage:function(e){C.currentImage=e},insertImage:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(C.images,["_id",C.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(C.currentAlign){case"center":t+="{.align-center}";break;case"right":t+="{.align-right}";break;case"logo":t+="{.pagelogo}"}F.codemirror.doc.replaceSelection(t),C.cancel()},newFolder:function(o){C.newFolderName="",C.newFolderError=!1,C.newFolderShow=!0,_.delay(function(){e("#txt-editor-image-newfoldername").focus()},400)},newFolderDiscard:function(e){C.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(C.newFolderName=_.kebabCase(_.trim(C.newFolderName)),_.isEmpty(C.newFolderName)||!o.test(C.newFolderName))return void(C.newFolderError=!0);C.newFolderDiscard(),C.isLoadingText="Creating new folder...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:C.newFolderName},function(e){C.folders=e,C.currentFolder=C.newFolderName,C.images=[],C.isLoading=!1})})},fetchFromUrl:function(o){C.fetchFromUrlURL="",C.fetchFromUrlShow=!0,_.delay(function(){e("#txt-editor-image-fetchurl").focus()},400)},fetchFromUrlDiscard:function(e){C.fetchFromUrlShow=!1},fetchFromUrlGo:function(e){C.fetchFromUrlDiscard(),C.isLoadingText="Fetching image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsFetchFileFromURL",{folder:C.currentFolder,fetchUrl:C.fetchFromUrlURL},function(e){e.ok?C.waitChangeComplete(C.images.length,!0):(C.isLoading=!1,t.pushError("Upload error",e.msg))})})},renameImage:function(){var o=_.find(C.images,["_id",C.renameImageId]);C.renameImageFilename=o.basename||"",C.renameImageShow=!0,_.delay(function(){e("#txt-editor-image-rename").focus(),_.defer(function(){e("#txt-editor-image-rename").select()})},400)},renameImageDiscard:function(){C.renameImageShow=!1},renameImageGo:function(){C.renameImageDiscard(),C.isLoadingText="Renaming image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:C.renameImageId,folder:C.currentFolder,filename:C.renameImageFilename},function(e){e.ok?C.waitChangeComplete(C.images.length,!1):(C.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveImage:function(e,o){C.isLoadingText="Moving image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?C.loadImages():(C.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteImageWarn:function(e){if(e){var o=_.find(C.images,["_id",C.deleteImageId]);C.deleteImageFilename=o.filename||"this image"}C.deleteImageShow=e},deleteImageGo:function(){C.deleteImageWarn(!1),C.isLoadingText="Deleting image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:C.deleteImageId},function(e){C.loadImages()})})},selectFolder:function(e){C.currentFolder=e,C.loadImages()},refreshFolders:function(){C.isLoadingText="Fetching folders list...",C.isLoading=!0,C.currentFolder="",C.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){C.folders=e,C.loadImages()})})},loadImages:function(e){return e||(C.isLoadingText="Fetching images...",C.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetImages",{folder:C.currentFolder},function(t){C.images=t,e||(C.isLoading=!1),C.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,C.postUploadChecks++,C.isLoadingText="Processing...",Vue.nextTick(function(){C.loadImages(!0).then(function(){C.images.length!==e===o?(C.postUploadChecks=0,C.isLoading=!1):C.postUploadChecks>5?(C.postUploadChecks=0,C.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){C.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(C.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(C.folders,o);C.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){C.renameImageId=_.toString(o.$trigger[0].dataset.uid),C.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){C.deleteImageId=_.toString(o.$trigger[0].dataset.uid),C.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=C.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:C.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){C.uploadSucceeded=!1,C.isLoadingText="Preparing to upload...",C.isLoading=!0},progress:function(e){C.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),C.uploadSucceeded=!0)):C.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError(e.message,o.upload.file.name)},finish:function(){C.uploadSucceeded?C.waitChangeComplete(i,!0):C.isLoading=!1}})});var I=new Vue({el:"#modal-editor-file",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,folders:[],currentFolder:"",currentFile:"",files:[],uploadSucceeded:!1,postUploadChecks:0,renameFileShow:!1,renameFileId:"",renameFileFilename:"",deleteFileShow:!1,deleteFileId:"",deleteFileFilename:""},methods:{open:function(){k=!0,e("#modal-editor-file").addClass("is-active"),I.refreshFolders()},cancel:function(o){k=!1,e("#modal-editor-file").removeClass("is-active")},selectFile:function(e){I.currentFile=e},insertFileLink:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(I.files,["_id",I.currentFile]);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+'")';F.codemirror.doc.replaceSelection(t),I.cancel()},newFolder:function(o){I.newFolderName="",I.newFolderError=!1,I.newFolderShow=!0,_.delay(function(){e("#txt-editor-file-newfoldername").focus()},400)},newFolderDiscard:function(e){I.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(I.newFolderName=_.kebabCase(_.trim(I.newFolderName)),_.isEmpty(I.newFolderName)||!o.test(I.newFolderName))return void(I.newFolderError=!0);I.newFolderDiscard(),I.isLoadingText="Creating new folder...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:I.newFolderName},function(e){I.folders=e,I.currentFolder=I.newFolderName,I.files=[],I.isLoading=!1})})},renameFile:function(){var o=_.find(I.files,["_id",I.renameFileId]);I.renameFileFilename=o.basename||"",I.renameFileShow=!0,_.delay(function(){e("#txt-editor-renamefile").focus(),_.defer(function(){e("#txt-editor-file-rename").select()})},400)},renameFileDiscard:function(){I.renameFileShow=!1},renameFileGo:function(){I.renameFileDiscard(),I.isLoadingText="Renaming file...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:I.renameFileId,folder:I.currentFolder,filename:I.renameFileFilename},function(e){e.ok?I.waitChangeComplete(I.files.length,!1):(I.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveFile:function(e,o){I.isLoadingText="Moving file...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?I.loadFiles():(I.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteFileWarn:function(e){if(e){var o=_.find(I.files,["_id",I.deleteFileId]);I.deleteFileFilename=o.filename||"this file"}I.deleteFileShow=e},deleteFileGo:function(){I.deleteFileWarn(!1),I.isLoadingText="Deleting file...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:I.deleteFileId},function(e){I.loadFiles()})})},selectFolder:function(e){I.currentFolder=e,I.loadFiles()},refreshFolders:function(){I.isLoadingText="Fetching folders list...",I.isLoading=!0,I.currentFolder="",I.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){I.folders=e,I.loadFiles()})})},loadFiles:function(e){return e||(I.isLoadingText="Fetching files...",I.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetFiles",{folder:I.currentFolder},function(t){I.files=t,e||(I.isLoading=!1),I.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,I.postUploadChecks++,I.isLoadingText="Processing...",Vue.nextTick(function(){I.loadFiles(!0).then(function(){I.files.length!==e===o?(I.postUploadChecks=0,I.isLoading=!1):I.postUploadChecks>5?(I.postUploadChecks=0,I.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){ "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(),void 0!==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<o.length;t++){var n=o[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(o,t,n){return t&&e(o.prototype,t),n&&e(o,n),o}}();jQuery(document).ready(function(e){var o=this;e("a").smoothScroll({speed:400,offset:-70});new Sticky(".stickyscroll");e(window).bind("beforeunload",function(){e("#notifload").addClass("active")}),e(document).ajaxSend(function(){e("#notifload").addClass("active")}).ajaxComplete(function(){e("#notifload").removeClass("active")});var t=new Alerts;alertsData&&_.forEach(alertsData,function(e){t.push(e)});var n=io(window.location.origin);if(e("#search-input").length){e("#search-input").focus(),e(".searchresults").css("display","block");var i=new Vue({el:"#header-container",data:{searchq:"",searchres:[],searchsuggest:[],searchload:0,searchactive:!1,searchmoveidx:0,searchmovekey:"",searchmovearr:[]},watch:{searchq:function(e,o){i.searchmoveidx=0,e.length>=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){i.searchmovekey=e>0?i.searchmovearr[e-1]?"res."+i.searchmovearr[e-1].entryPath:"sug."+i.searchmovearr[e-1]:""}},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.searchmoveidx<i.searchmovearr.length&&i.searchmoveidx++},moveUpSearch:function(){i.searchmoveidx>0&&i.searchmoveidx--}}});e("main").on("click",i.closeSearch)}if(e("#page-type-view").length){var a="home"!==e("#page-type-view").data("entrypath")?e("#page-type-view").data("entrypath"):"",r=a+"/new-page";e(".btn-create-prompt").on("click",function(o){e("#txt-create-prompt").val(r),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),a.length+1,r.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))}),""!==a&&e(".btn-move-prompt").removeClass("is-hidden");var l=_.lastIndexOf(a,"/")+1;e(".btn-move-prompt").on("click",function(o){e("#txt-move-prompt").val(a),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),l,a.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(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,o,i){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")}))})}if(e("#page-type-create").length){var d=e("#page-type-create").data("entrypath");if(e(".btn-create-discard").on("click",function(o){e("#modal-create-discard").toggleClass("is-active")}),1===e("#mk-editor").length){var s=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var c=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(){s=!0,e("#modal-editor-image").addClass("is-active"),c.refreshFolders()},cancel:function(o){s=!1,e("#modal-editor-image").removeClass("is-active")},selectImage:function(e){c.currentImage=e},insertImage:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(c.images,["_id",c.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(c.currentAlign){case"center":t+="{.align-center}";break;case"right":t+="{.align-right}";break;case"logo":t+="{.pagelogo}"}F.codemirror.doc.replaceSelection(t),c.cancel()},newFolder:function(o){c.newFolderName="",c.newFolderError=!1,c.newFolderShow=!0,_.delay(function(){e("#txt-editor-image-newfoldername").focus()},400)},newFolderDiscard:function(e){c.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(c.newFolderName=_.kebabCase(_.trim(c.newFolderName)),_.isEmpty(c.newFolderName)||!o.test(c.newFolderName))return void(c.newFolderError=!0);c.newFolderDiscard(),c.isLoadingText="Creating new folder...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:c.newFolderName},function(e){c.folders=e,c.currentFolder=c.newFolderName,c.images=[],c.isLoading=!1})})},fetchFromUrl:function(o){c.fetchFromUrlURL="",c.fetchFromUrlShow=!0,_.delay(function(){e("#txt-editor-image-fetchurl").focus()},400)},fetchFromUrlDiscard:function(e){c.fetchFromUrlShow=!1},fetchFromUrlGo:function(e){c.fetchFromUrlDiscard(),c.isLoadingText="Fetching image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsFetchFileFromURL",{folder:c.currentFolder,fetchUrl:c.fetchFromUrlURL},function(e){e.ok?c.waitChangeComplete(c.images.length,!0):(c.isLoading=!1,t.pushError("Upload error",e.msg))})})},renameImage:function(){var o=_.find(c.images,["_id",c.renameImageId]);c.renameImageFilename=o.basename||"",c.renameImageShow=!0,_.delay(function(){e("#txt-editor-image-rename").focus(),_.defer(function(){e("#txt-editor-image-rename").select()})},400)},renameImageDiscard:function(){c.renameImageShow=!1},renameImageGo:function(){c.renameImageDiscard(),c.isLoadingText="Renaming image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:c.renameImageId,folder:c.currentFolder,filename:c.renameImageFilename},function(e){e.ok?c.waitChangeComplete(c.images.length,!1):(c.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveImage:function(e,o){c.isLoadingText="Moving image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?c.loadImages():(c.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteImageWarn:function(e){if(e){var o=_.find(c.images,["_id",c.deleteImageId]);c.deleteImageFilename=o.filename||"this image"}c.deleteImageShow=e},deleteImageGo:function(){c.deleteImageWarn(!1),c.isLoadingText="Deleting image...",c.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:c.deleteImageId},function(e){c.loadImages()})})},selectFolder:function(e){c.currentFolder=e,c.loadImages()},refreshFolders:function(){c.isLoadingText="Fetching folders list...",c.isLoading=!0,c.currentFolder="",c.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){c.folders=e,c.loadImages()})})},loadImages:function(e){return e||(c.isLoadingText="Fetching images...",c.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetImages",{folder:c.currentFolder},function(t){c.images=t,e||(c.isLoading=!1),c.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,c.postUploadChecks++,c.isLoadingText="Processing...",Vue.nextTick(function(){c.loadImages(!0).then(function(){c.images.length!==e===o?(c.postUploadChecks=0,c.isLoading=!1):c.postUploadChecks>5?(c.postUploadChecks=0,c.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){c.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(c.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(c.folders,o);c.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){c.renameImageId=_.toString(o.$trigger[0].dataset.uid),c.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){c.deleteImageId=_.toString(o.$trigger[0].dataset.uid),c.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=c.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:c.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){c.uploadSucceeded=!1,c.isLoadingText="Preparing to upload...",c.isLoading=!0},progress:function(e){c.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),c.uploadSucceeded=!0)):c.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError(e.message,o.upload.file.name)},finish:function(){c.uploadSucceeded?c.waitChangeComplete(i,!0):c.isLoading=!1}})});var m=new Vue({el:"#modal-editor-file",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,folders:[],currentFolder:"",currentFile:"",files:[],uploadSucceeded:!1,postUploadChecks:0,renameFileShow:!1,renameFileId:"",renameFileFilename:"",deleteFileShow:!1,deleteFileId:"",deleteFileFilename:""},methods:{open:function(){s=!0,e("#modal-editor-file").addClass("is-active"),m.refreshFolders()},cancel:function(o){s=!1,e("#modal-editor-file").removeClass("is-active")},selectFile:function(e){m.currentFile=e},insertFileLink:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(m.files,["_id",m.currentFile]);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+'")';F.codemirror.doc.replaceSelection(t),m.cancel()},newFolder:function(o){m.newFolderName="",m.newFolderError=!1,m.newFolderShow=!0,_.delay(function(){e("#txt-editor-file-newfoldername").focus()},400)},newFolderDiscard:function(e){m.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(m.newFolderName=_.kebabCase(_.trim(m.newFolderName)),_.isEmpty(m.newFolderName)||!o.test(m.newFolderName))return void(m.newFolderError=!0);m.newFolderDiscard(),m.isLoadingText="Creating new folder...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:m.newFolderName},function(e){m.folders=e,m.currentFolder=m.newFolderName,m.files=[],m.isLoading=!1})})},renameFile:function(){var o=_.find(m.files,["_id",m.renameFileId]);m.renameFileFilename=o.basename||"",m.renameFileShow=!0,_.delay(function(){e("#txt-editor-renamefile").focus(),_.defer(function(){e("#txt-editor-file-rename").select()})},400)},renameFileDiscard:function(){m.renameFileShow=!1},renameFileGo:function(){m.renameFileDiscard(),m.isLoadingText="Renaming file...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:m.renameFileId,folder:m.currentFolder,filename:m.renameFileFilename},function(e){e.ok?m.waitChangeComplete(m.files.length,!1):(m.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveFile:function(e,o){m.isLoadingText="Moving file...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?m.loadFiles():(m.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteFileWarn:function(e){if(e){var o=_.find(m.files,["_id",m.deleteFileId]);m.deleteFileFilename=o.filename||"this file"}m.deleteFileShow=e},deleteFileGo:function(){m.deleteFileWarn(!1),m.isLoadingText="Deleting file...",m.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:m.deleteFileId},function(e){m.loadFiles()})})},selectFolder:function(e){m.currentFolder=e,m.loadFiles()},refreshFolders:function(){m.isLoadingText="Fetching folders list...",m.isLoading=!0,m.currentFolder="",m.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){m.folders=e,m.loadFiles()})})},loadFiles:function(e){return e||(m.isLoadingText="Fetching files...",m.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetFiles",{folder:m.currentFolder},function(t){m.files=t,e||(m.isLoading=!1),m.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,m.postUploadChecks++,m.isLoadingText="Processing...",Vue.nextTick(function(){m.loadFiles(!0).then(function(){m.files.length!==e===o?(m.postUploadChecks=0,m.isLoading=!1):m.postUploadChecks>5?(m.postUploadChecks=0,m.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){m.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(m.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(m.folders,o);m.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){m.renameFileId=_.toString(o.$trigger[0].dataset.uid),m.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){m.deleteFileId=_.toString(o.$trigger[0].dataset.uid),m.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(o){var n=m.files.length;e(o.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:m.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){m.uploadSucceeded=!1,m.isLoadingText="Preparing to upload...",m.isLoading=!0},progress:function(e){m.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),m.uploadSucceeded=!0)):m.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError("Upload error",e.message)},finish:function(){m.uploadSucceeded?m.waitChangeComplete(n,!0):m.isLoading=!1}})});var u={youtube:new RegExp(/(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/,"i"),vimeo:new RegExp(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|)(\d+)(?:$|\/|\?)/,"i"),dailymotion:new RegExp(/(?:dailymotion\.com(?:\/embed)?(?:\/video|\/hub)|dai\.ly)\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/,"i")},g=new Vue({el:"#modal-editor-video",data:{link:""},methods:{open:function(o){e("#modal-editor-video").addClass("is-active"),e("#modal-editor-video input").focus()},cancel:function(o){s=!1,e("#modal-editor-video").removeClass("is-active"),g.link=""},insertVideo:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.findKey(u,function(e){return e.test(g.link)});_.isNil(o)&&(o="video");var t="[video]("+g.link+"){."+o+"}\n";F.codemirror.doc.replaceSelection(t),g.cancel()}}}),f=ace.require("ace/ext/modelist"),p=null,h=[],w=function(o){return e.ajax({url:"/js/ace/mode-"+o+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(h,o))return!1},success:function(){h.push(o)}})},v=new Vue({el:"#modal-editor-codeblock",data:{modes:f.modesByName,modeSelected:"text",initContent:""},watch:{modeSelected:function(e,o){w(e).done(function(){ace.require("ace/mode/"+e),p.getSession().setMode("ace/mode/"+e)})}},methods:{open:function(o){e("#modal-editor-codeblock").addClass("is-active"),_.delay(function(){p=ace.edit("codeblock-editor"),p.setTheme("ace/theme/tomorrow_night"),p.getSession().setMode("ace/mode/"+v.modeSelected),p.setOption("fontSize","14px"),p.setOption("hScrollBarAlwaysVisible",!1),p.setOption("wrap",!0),p.setValue(v.initContent),p.focus(),p.renderer.updateFull()},300)},cancel:function(o){s=!1,e("#modal-editor-codeblock").removeClass("is-active"),v.initContent=""},insertCode:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o="\n```"+v.modeSelected+"\n"+p.getValue()+"\n```\n";F.codemirror.doc.replaceSelection(o),v.cancel()}}}),F=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:"icon-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"icon-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"icon-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"icon-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"icon-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"icon-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"icon-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"icon-th-list",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"icon-list-ol",title:"Numbered List"},"|",{name:"link",action:function(e){window.alert("Coming soon!")},className:"icon-link2",title:"Insert Link"},{name:"image",action:function(e){s||c.open()},className:"icon-image",title:"Insert Image"},{name:"file",action:function(e){s||m.open()},className:"icon-paper",title:"Insert File"},{name:"video",action:function(e){s||g.open()},className:"icon-video-camera2",title:"Insert Video Player"},"|",{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:"icon-terminal",title:"Inline Code"},{name:"code-block",action:function(e){s||(s=!0,F.codemirror.doc.somethingSelected()&&(v.initContent=F.codemirror.doc.getSelection()),v.open())},className:"icon-code",title:"Code Block"},"|",{name:"table",action:function(e){window.alert("Coming soon!")},className:"icon-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"icon-minus2",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}}),x=function(o){e.ajax(window.location.href,{data:{markdown:F.value()},dataType:"json",method:"PUT"}).then(function(e,o,n){e.ok?window.location.assign("/"+d):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")})};e(".btn-edit-save, .btn-create-save").on("click",function(e){x(e)}),e(window).bind("keydown",function(e){if(e.ctrlKey||e.metaKey)switch(String.fromCharCode(e.which).toLowerCase()){case"s":e.preventDefault(),x(e)}})}}if(e("#page-type-edit").length){var S=e("#page-type-edit").data("entrypath");if(e(".btn-edit-discard").on("click",function(o){e("#modal-edit-discard").toggleClass("is-active")}),1===e("#mk-editor").length){var k=!1;Vue.filter("filesize",function(e){return _.toUpper(filesize(e))});var C=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(){k=!0,e("#modal-editor-image").addClass("is-active"),C.refreshFolders()},cancel:function(o){k=!1,e("#modal-editor-image").removeClass("is-active")},selectImage:function(e){C.currentImage=e},insertImage:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(C.images,["_id",C.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(C.currentAlign){case"center":t+="{.align-center}";break;case"right":t+="{.align-right}";break;case"logo":t+="{.pagelogo}"}F.codemirror.doc.replaceSelection(t),C.cancel()},newFolder:function(o){C.newFolderName="",C.newFolderError=!1,C.newFolderShow=!0,_.delay(function(){e("#txt-editor-image-newfoldername").focus()},400)},newFolderDiscard:function(e){C.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(C.newFolderName=_.kebabCase(_.trim(C.newFolderName)),_.isEmpty(C.newFolderName)||!o.test(C.newFolderName))return void(C.newFolderError=!0);C.newFolderDiscard(),C.isLoadingText="Creating new folder...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:C.newFolderName},function(e){C.folders=e,C.currentFolder=C.newFolderName,C.images=[],C.isLoading=!1})})},fetchFromUrl:function(o){C.fetchFromUrlURL="",C.fetchFromUrlShow=!0,_.delay(function(){e("#txt-editor-image-fetchurl").focus()},400)},fetchFromUrlDiscard:function(e){C.fetchFromUrlShow=!1},fetchFromUrlGo:function(e){C.fetchFromUrlDiscard(),C.isLoadingText="Fetching image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsFetchFileFromURL",{folder:C.currentFolder,fetchUrl:C.fetchFromUrlURL},function(e){e.ok?C.waitChangeComplete(C.images.length,!0):(C.isLoading=!1,t.pushError("Upload error",e.msg))})})},renameImage:function(){var o=_.find(C.images,["_id",C.renameImageId]);C.renameImageFilename=o.basename||"",C.renameImageShow=!0,_.delay(function(){e("#txt-editor-image-rename").focus(),_.defer(function(){e("#txt-editor-image-rename").select()})},400)},renameImageDiscard:function(){C.renameImageShow=!1},renameImageGo:function(){C.renameImageDiscard(),C.isLoadingText="Renaming image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:C.renameImageId,folder:C.currentFolder,filename:C.renameImageFilename},function(e){e.ok?C.waitChangeComplete(C.images.length,!1):(C.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveImage:function(e,o){C.isLoadingText="Moving image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?C.loadImages():(C.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteImageWarn:function(e){if(e){var o=_.find(C.images,["_id",C.deleteImageId]);C.deleteImageFilename=o.filename||"this image"}C.deleteImageShow=e},deleteImageGo:function(){C.deleteImageWarn(!1),C.isLoadingText="Deleting image...",C.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:C.deleteImageId},function(e){C.loadImages()})})},selectFolder:function(e){C.currentFolder=e,C.loadImages()},refreshFolders:function(){C.isLoadingText="Fetching folders list...",C.isLoading=!0,C.currentFolder="",C.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){C.folders=e,C.loadImages()})})},loadImages:function(e){return e||(C.isLoadingText="Fetching images...",C.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetImages",{folder:C.currentFolder},function(t){C.images=t,e||(C.isLoading=!1),C.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,C.postUploadChecks++,C.isLoadingText="Processing...",Vue.nextTick(function(){C.loadImages(!0).then(function(){C.images.length!==e===o?(C.postUploadChecks=0,C.isLoading=!1):C.postUploadChecks>5?(C.postUploadChecks=0,C.isLoading=!1,t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){C.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(C.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(C.folders,o);C.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){C.renameImageId=_.toString(o.$trigger[0].dataset.uid),C.renameImage()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){C.deleteImageId=_.toString(o.$trigger[0].dataset.uid),C.deleteImageWarn(!0)}}}})}}});e("#btn-editor-image-upload input").on("change",function(n){var i=C.images.length;e(n.currentTarget).simpleUpload("/uploads/img",{name:"imgfile",data:{folder:C.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){C.uploadSucceeded=!1,C.isLoadingText="Preparing to upload...",C.isLoading=!0},progress:function(e){C.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),C.uploadSucceeded=!0)):C.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError(e.message,o.upload.file.name)},finish:function(){C.uploadSucceeded?C.waitChangeComplete(i,!0):C.isLoading=!1}})});var I=new Vue({el:"#modal-editor-file",data:{isLoading:!1,isLoadingText:"",newFolderName:"",newFolderShow:!1,newFolderError:!1,folders:[],currentFolder:"",currentFile:"",files:[],uploadSucceeded:!1,postUploadChecks:0,renameFileShow:!1,renameFileId:"",renameFileFilename:"",deleteFileShow:!1,deleteFileId:"",deleteFileFilename:""},methods:{open:function(){k=!0,e("#modal-editor-file").addClass("is-active"),I.refreshFolders()},cancel:function(o){k=!1,e("#modal-editor-file").removeClass("is-active")},selectFile:function(e){I.currentFile=e},insertFileLink:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.find(I.files,["_id",I.currentFile]);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+'")';F.codemirror.doc.replaceSelection(t),I.cancel()},newFolder:function(o){I.newFolderName="",I.newFolderError=!1,I.newFolderShow=!0,_.delay(function(){e("#txt-editor-file-newfoldername").focus()},400)},newFolderDiscard:function(e){I.newFolderShow=!1},newFolderCreate:function(e){var o=new RegExp("^[a-z0-9][a-z0-9-]*[a-z0-9]$");if(I.newFolderName=_.kebabCase(_.trim(I.newFolderName)),_.isEmpty(I.newFolderName)||!o.test(I.newFolderName))return void(I.newFolderError=!0);I.newFolderDiscard(),I.isLoadingText="Creating new folder...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsCreateFolder",{foldername:I.newFolderName},function(e){I.folders=e,I.currentFolder=I.newFolderName,I.files=[],I.isLoading=!1})})},renameFile:function(){var o=_.find(I.files,["_id",I.renameFileId]);I.renameFileFilename=o.basename||"",I.renameFileShow=!0,_.delay(function(){e("#txt-editor-renamefile").focus(),_.defer(function(){e("#txt-editor-file-rename").select()})},400)},renameFileDiscard:function(){I.renameFileShow=!1},renameFileGo:function(){I.renameFileDiscard(),I.isLoadingText="Renaming file...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsRenameFile",{uid:I.renameFileId,folder:I.currentFolder,filename:I.renameFileFilename},function(e){e.ok?I.waitChangeComplete(I.files.length,!1):(I.isLoading=!1,t.pushError("Rename error",e.msg))})})},moveFile:function(e,o){I.isLoadingText="Moving file...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsMoveFile",{uid:e,folder:o},function(e){e.ok?I.loadFiles():(I.isLoading=!1,t.pushError("Rename error",e.msg))})})},deleteFileWarn:function(e){if(e){var o=_.find(I.files,["_id",I.deleteFileId]);I.deleteFileFilename=o.filename||"this file"}I.deleteFileShow=e},deleteFileGo:function(){I.deleteFileWarn(!1),I.isLoadingText="Deleting file...",I.isLoading=!0,Vue.nextTick(function(){n.emit("uploadsDeleteFile",{uid:I.deleteFileId},function(e){I.loadFiles()})})},selectFolder:function(e){I.currentFolder=e,I.loadFiles()},refreshFolders:function(){I.isLoadingText="Fetching folders list...",I.isLoading=!0,I.currentFolder="",I.currentImage="",Vue.nextTick(function(){n.emit("uploadsGetFolders",{},function(e){I.folders=e,I.loadFiles()})})},loadFiles:function(e){return e||(I.isLoadingText="Fetching files...",I.isLoading=!0),new Promise(function(o,t){Vue.nextTick(function(){n.emit("uploadsGetFiles",{folder:I.currentFolder},function(t){I.files=t,e||(I.isLoading=!1),I.attachContextMenus(),o(!0)})})})},waitChangeComplete:function(e,o){o=!_.isBoolean(o)||o,I.postUploadChecks++,I.isLoadingText="Processing...",Vue.nextTick(function(){I.loadFiles(!0).then(function(){I.files.length!==e===o?(I.postUploadChecks=0,I.isLoading=!1):I.postUploadChecks>5?(I.postUploadChecks=0,I.isLoading=!1,
I.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(I.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(I.folders,o);I.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){I.renameFileId=_.toString(o.$trigger[0].dataset.uid),I.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){I.deleteFileId=_.toString(o.$trigger[0].dataset.uid),I.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(o){var n=I.files.length;e(o.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:I.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){I.uploadSucceeded=!1,I.isLoadingText="Preparing to upload...",I.isLoading=!0},progress:function(e){I.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),I.uploadSucceeded=!0)):I.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError("Upload error",e.message)},finish:function(){I.uploadSucceeded?I.waitChangeComplete(n,!0):I.isLoading=!1}})});var y={youtube:new RegExp(/(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/,"i"),vimeo:new RegExp(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|)(\d+)(?:$|\/|\?)/,"i"),dailymotion:new RegExp(/(?:dailymotion\.com(?:\/embed)?(?:\/video|\/hub)|dai\.ly)\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/,"i")},L=new Vue({el:"#modal-editor-video",data:{link:""},methods:{open:function(o){e("#modal-editor-video").addClass("is-active"),e("#modal-editor-video input").focus()},cancel:function(o){k=!1,e("#modal-editor-video").removeClass("is-active"),L.link=""},insertVideo:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.findKey(y,function(e){return e.test(L.link)});_.isNil(o)&&(o="video");var t="[video]("+L.link+"){."+o+"}\n";F.codemirror.doc.replaceSelection(t),L.cancel()}}}),b=ace.require("ace/ext/modelist"),E=null,T=[],U=function(o){return e.ajax({url:"/js/ace/mode-"+o+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(T,o))return!1},success:function(){T.push(o)}})},N=new Vue({el:"#modal-editor-codeblock",data:{modes:b.modesByName,modeSelected:"text",initContent:""},watch:{modeSelected:function(e,o){U(e).done(function(){ace.require("ace/mode/"+e),E.getSession().setMode("ace/mode/"+e)})}},methods:{open:function(o){e("#modal-editor-codeblock").addClass("is-active"),_.delay(function(){E=ace.edit("codeblock-editor"),E.setTheme("ace/theme/tomorrow_night"),E.getSession().setMode("ace/mode/"+N.modeSelected),E.setOption("fontSize","14px"),E.setOption("hScrollBarAlwaysVisible",!1),E.setOption("wrap",!0),E.setValue(N.initContent),E.focus(),E.renderer.updateFull()},300)},cancel:function(o){k=!1,e("#modal-editor-codeblock").removeClass("is-active"),N.initContent=""},insertCode:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o="\n```"+N.modeSelected+"\n"+E.getValue()+"\n```\n";F.codemirror.doc.replaceSelection(o),N.cancel()}}}),F=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:"icon-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"icon-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"icon-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"icon-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"icon-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"icon-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"icon-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"icon-th-list",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"icon-list-ol",title:"Numbered List"},"|",{name:"link",action:function(e){},className:"icon-link2",title:"Insert Link"},{name:"image",action:function(e){k||C.open()},className:"icon-image",title:"Insert Image"},{name:"file",action:function(e){k||I.open()},className:"icon-paper",title:"Insert File"},{name:"video",action:function(e){k||L.open()},className:"icon-video-camera2",title:"Insert Video Player"},"|",{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:"icon-terminal",title:"Inline Code"},{name:"code-block",action:function(e){k||(k=!0,F.codemirror.doc.somethingSelected()&&(N.initContent=F.codemirror.doc.getSelection()),N.open())},className:"icon-code",title:"Code Block"},"|",{name:"table",action:function(e){},className:"icon-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"icon-minus2",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}}),M=function(o){e.ajax(window.location.href,{data:{markdown:F.value()},dataType:"json",method:"PUT"}).then(function(e,o,n){e.ok?window.location.assign("/"+S):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")})};e(".btn-edit-save, .btn-create-save").on("click",function(e){M(e)}),e(window).bind("keydown",function(e){if(e.ctrlKey||e.metaKey)switch(String.fromCharCode(e.which).toLowerCase()){case"s":e.preventDefault(),M(e)}})}}if(e("#page-type-source").length){var D=ace.edit("source-display");D.setTheme("ace/theme/tomorrow_night"),D.getSession().setMode("ace/mode/markdown"),D.setOption("fontSize","14px"),D.setOption("hScrollBarAlwaysVisible",!1),D.setOption("wrap",!0),D.setReadOnly(!0),D.renderer.updateFull();var V="home"!==e("#page-type-source").data("entrypath")?e("#page-type-source").data("entrypath"):"",R=V+"/new-page";e(".btn-create-prompt").on("click",function(o){e("#txt-create-prompt").val(R),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),V.length+1,R.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))}),""!==V&&e(".btn-move-prompt").removeClass("is-hidden");var z=_.lastIndexOf(V,"/")+1;e(".btn-move-prompt").on("click",function(o){e("#txt-move-prompt").val(V),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),z,V.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(o){var n=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(n)||n===V||"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,i){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")}))})}if(e("#page-type-admin-profile").length)var $=new Vue({el:"#page-type-admin-profile",data:{password:"********",passwordVerify:"********",name:""},methods:{saveUser:function(o){if($.password!==$.passwordVerify)return void t.pushError("Error","Passwords don't match!");e.post(window.location.href,{password:$.password,name:$.name}).done(function(e){t.pushSuccess("Saved successfully","Changes have been applied.")}).fail(function(e,o,n){t.pushError("Error",n)})}},created:function(){this.name=usrDataName}});else if(e("#page-type-admin-users").length){var P=new Vue({el:"#modal-admin-users-create",data:{email:"",provider:"local",password:"",name:"",loading:!1},methods:{open:function(o){e("#modal-admin-users-create").addClass("is-active"),e("#modal-admin-users-create input").first().focus()},cancel:function(o){e("#modal-admin-users-create").removeClass("is-active"),P.email="",P.provider="local"},create:function(o){P.loading=!0,e.ajax("/admin/users/create",{data:{email:P.email,provider:P.provider,password:P.password,name:P.name},dataType:"json",method:"POST"}).then(function(e,o,n){P.loading=!1,e.ok?(P.cancel(),window.location.reload(!0)):t.pushError("Something went wrong",e.msg)},function(e,o,n){P.loading=!1,t.pushError("Error",e.responseJSON.msg)})}}});e(".btn-create-prompt").on("click",P.open)}else if(e("#page-type-admin-users-edit").length){var j=new Vue({el:"#page-type-admin-users-edit",data:{id:"",email:"",password:"********",name:"",rights:[],roleoverride:"none"},methods:{addRightsRow:function(e){j.rights.push({role:"write",path:"/",exact:!1,deny:!1})},removeRightsRow:function(e){_.pullAt(j.rights,e),j.$forceUpdate()},saveUser:function(o){var n=_.cloneDeep(j.rights);switch(j.roleoverride){case"admin":n.push({role:"admin",path:"/",exact:!1,deny:!1})}e.post(window.location.href,{password:j.password,name:j.name,rights:JSON.stringify(n)}).done(function(e){t.pushSuccess("Saved successfully","Changes have been applied.")}).fail(function(e,o,n){t.pushError("Error",n)})}},created:function(){this.id=usrData._id,this.email=usrData.email,this.name=usrData.name,_.find(usrData.rights,{role:"admin"})?(this.rights=_.reject(usrData.rights,["role","admin"]),this.roleoverride="admin"):this.rights=usrData.rights}}),G=new Vue({el:"#modal-admin-users-delete",data:{loading:!1},methods:{open:function(o){e("#modal-admin-users-delete").addClass("is-active")},cancel:function(o){e("#modal-admin-users-delete").removeClass("is-active")},deleteUser:function(o){G.loading=!0,e.ajax("/admin/users/"+usrData._id,{dataType:"json",method:"DELETE"}).then(function(e,o,t){G.loading=!1,G.cancel(),window.location.assign("/admin/users")},function(e,o,n){G.loading=!1,t.pushError("Error",e.responseJSON.msg)})}}});e(".btn-deluser-prompt").on("click",G.open)}else if(e("#page-type-admin-settings").length)var B=new Vue({el:"#page-type-admin-settings",data:{upgradeModal:{state:!1,step:"confirm",mode:"upgrade",error:"Something went wrong."}},methods:{upgrade:function(e){B.upgradeModal.mode="upgrade",B.upgradeModal.step="confirm",B.upgradeModal.state=!0},reinstall:function(e){B.upgradeModal.mode="re-install",B.upgradeModal.step="confirm",B.upgradeModal.state=!0},upgradeCancel:function(e){B.upgradeModal.state=!1},upgradeStart:function(o){B.upgradeModal.step="running",e.post("/admin/settings/install",{mode:B.upgradeModal.mode}).done(function(e){}).fail(function(e,o,t){B.upgradeModal.step="error",B.upgradeModal.error=e.responseText})},flushcache:function(e){window.alert("Coming soon!")},resetaccounts:function(e){window.alert("Coming soon!")},flushsessions:function(e){window.alert("Coming soon!")}}})});var Alerts=function(){function e(){_classCallCheck(this,e);var o=this;o.mdl=new Vue({el:"#alerts",data:{children:[]},methods:{acknowledge:function(e){o.close(e)}}}),o.uidNext=1}return _createClass(e,[{key:"push",value:function(e){var o=this,t=_.defaults(e,{_uid:o.uidNext,class:"info",message:"---",sticky:!1,title:"---"});o.mdl.children.push(t),t.sticky||_.delay(function(){o.close(t._uid)},5e3),o.uidNext++}},{key:"pushError",value:function(e,o){this.push({class:"error",message:o,sticky:!1,title:e})}},{key:"pushSuccess",value:function(e,o){this.push({class:"success",message:o,sticky:!1,title:e})}},{key:"close",value:function(e){var o=this,t=_.findIndex(o.mdl.children,["_uid",e]),n=_.nth(o.mdl.children,t);t>=0&&n&&(n.class+=" exit",Vue.set(o.mdl.children,t,n),_.delay(function(){o.mdl.children.splice(t,1)},500))}}]),e}(); t.pushError("Unable to fetch updated listing","Try again later")):_.delay(function(){I.waitChangeComplete(e,o)},1500)})})},attachContextMenus:function(){var o=_.map(I.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(I.folders,o);I.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){I.renameFileId=_.toString(o.$trigger[0].dataset.uid),I.renameFile()}},move:{name:"Move to...",icon:"fa-folder-open-o",items:o},delete:{name:"Delete",icon:"fa-trash",callback:function(e,o){I.deleteFileId=_.toString(o.$trigger[0].dataset.uid),I.deleteFileWarn(!0)}}}})}}});e("#btn-editor-file-upload input").on("change",function(o){var n=I.files.length;e(o.currentTarget).simpleUpload("/uploads/file",{name:"binfile",data:{folder:I.currentFolder},limit:20,expect:"json",maxFileSize:0,init:function(e){I.uploadSucceeded=!1,I.isLoadingText="Preparing to upload...",I.isLoading=!0},progress:function(e){I.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<e.results.length&&(t.push({title:"Some uploads succeeded",message:"Files that are not mentionned in the errors above were uploaded successfully."}),I.uploadSucceeded=!0)):I.uploadSucceeded=!0}else t.pushError("Upload error",e.msg)},error:function(e){t.pushError("Upload error",e.message)},finish:function(){I.uploadSucceeded?I.waitChangeComplete(n,!0):I.isLoading=!1}})});var y={youtube:new RegExp(/(?:(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/)|(?:(?:watch)?\?v(?:i)?=|&v(?:i)?=))([^#&?]*).*/,"i"),vimeo:new RegExp(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^\/]*)\/videos\/|album\/(?:\d+)\/video\/|)(\d+)(?:$|\/|\?)/,"i"),dailymotion:new RegExp(/(?:dailymotion\.com(?:\/embed)?(?:\/video|\/hub)|dai\.ly)\/([0-9a-z]+)(?:[-_0-9a-zA-Z]+(?:#video=)?([a-z0-9]+)?)?/,"i")},L=new Vue({el:"#modal-editor-video",data:{link:""},methods:{open:function(o){e("#modal-editor-video").addClass("is-active"),e("#modal-editor-video input").focus()},cancel:function(o){k=!1,e("#modal-editor-video").removeClass("is-active"),L.link=""},insertVideo:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o=_.findKey(y,function(e){return e.test(L.link)});_.isNil(o)&&(o="video");var t="[video]("+L.link+"){."+o+"}\n";F.codemirror.doc.replaceSelection(t),L.cancel()}}}),b=ace.require("ace/ext/modelist"),E=null,T=[],U=function(o){return e.ajax({url:"/js/ace/mode-"+o+".js",dataType:"script",cache:!0,beforeSend:function(){if(_.includes(T,o))return!1},success:function(){T.push(o)}})},N=new Vue({el:"#modal-editor-codeblock",data:{modes:b.modesByName,modeSelected:"text",initContent:""},watch:{modeSelected:function(e,o){U(e).done(function(){ace.require("ace/mode/"+e),E.getSession().setMode("ace/mode/"+e)})}},methods:{open:function(o){e("#modal-editor-codeblock").addClass("is-active"),_.delay(function(){E=ace.edit("codeblock-editor"),E.setTheme("ace/theme/tomorrow_night"),E.getSession().setMode("ace/mode/"+N.modeSelected),E.setOption("fontSize","14px"),E.setOption("hScrollBarAlwaysVisible",!1),E.setOption("wrap",!0),E.setValue(N.initContent),E.focus(),E.renderer.updateFull()},300)},cancel:function(o){k=!1,e("#modal-editor-codeblock").removeClass("is-active"),N.initContent=""},insertCode:function(e){F.codemirror.doc.somethingSelected()&&F.codemirror.execCommand("singleSelection");var o="\n```"+N.modeSelected+"\n"+E.getValue()+"\n```\n";F.codemirror.doc.replaceSelection(o),N.cancel()}}}),F=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:"icon-bold",title:"Bold"},{name:"italic",action:SimpleMDE.toggleItalic,className:"icon-italic",title:"Italic"},{name:"strikethrough",action:SimpleMDE.toggleStrikethrough,className:"icon-strikethrough",title:"Strikethrough"},"|",{name:"heading-1",action:SimpleMDE.toggleHeading1,className:"icon-header fa-header-x fa-header-1",title:"Big Heading"},{name:"heading-2",action:SimpleMDE.toggleHeading2,className:"icon-header fa-header-x fa-header-2",title:"Medium Heading"},{name:"heading-3",action:SimpleMDE.toggleHeading3,className:"icon-header fa-header-x fa-header-3",title:"Small Heading"},{name:"quote",action:SimpleMDE.toggleBlockquote,className:"icon-quote-left",title:"Quote"},"|",{name:"unordered-list",action:SimpleMDE.toggleUnorderedList,className:"icon-th-list",title:"Bullet List"},{name:"ordered-list",action:SimpleMDE.toggleOrderedList,className:"icon-list-ol",title:"Numbered List"},"|",{name:"link",action:function(e){window.alert("Coming soon!")},className:"icon-link2",title:"Insert Link"},{name:"image",action:function(e){k||C.open()},className:"icon-image",title:"Insert Image"},{name:"file",action:function(e){k||I.open()},className:"icon-paper",title:"Insert File"},{name:"video",action:function(e){k||L.open()},className:"icon-video-camera2",title:"Insert Video Player"},"|",{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:"icon-terminal",title:"Inline Code"},{name:"code-block",action:function(e){k||(k=!0,F.codemirror.doc.somethingSelected()&&(N.initContent=F.codemirror.doc.getSelection()),N.open())},className:"icon-code",title:"Code Block"},"|",{name:"table",action:function(e){window.alert("Coming soon!")},className:"icon-table",title:"Insert Table"},{name:"horizontal-rule",action:SimpleMDE.drawHorizontalRule,className:"icon-minus2",title:"Horizontal Rule"}],shortcuts:{toggleBlockquote:null,toggleFullScreen:null}}),M=function(o){e.ajax(window.location.href,{data:{markdown:F.value()},dataType:"json",method:"PUT"}).then(function(e,o,n){e.ok?window.location.assign("/"+S):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")})};e(".btn-edit-save, .btn-create-save").on("click",function(e){M(e)}),e(window).bind("keydown",function(e){if(e.ctrlKey||e.metaKey)switch(String.fromCharCode(e.which).toLowerCase()){case"s":e.preventDefault(),M(e)}})}}if(e("#page-type-source").length){var D=ace.edit("source-display");D.setTheme("ace/theme/tomorrow_night"),D.getSession().setMode("ace/mode/markdown"),D.setOption("fontSize","14px"),D.setOption("hScrollBarAlwaysVisible",!1),D.setOption("wrap",!0),D.setReadOnly(!0),D.renderer.updateFull();var V="home"!==e("#page-type-source").data("entrypath")?e("#page-type-source").data("entrypath"):"",R=V+"/new-page";e(".btn-create-prompt").on("click",function(o){e("#txt-create-prompt").val(R),e("#modal-create-prompt").toggleClass("is-active"),setInputSelection(e("#txt-create-prompt").get(0),V.length+1,R.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))}),""!==V&&e(".btn-move-prompt").removeClass("is-hidden");var z=_.lastIndexOf(V,"/")+1;e(".btn-move-prompt").on("click",function(o){e("#txt-move-prompt").val(V),e("#modal-move-prompt").toggleClass("is-active"),setInputSelection(e("#txt-move-prompt").get(0),z,V.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(o){var n=makeSafePath(e("#txt-move-prompt").val());_.isEmpty(n)||n===V||"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,i){e.ok?window.location.assign("/"+n):t.pushError("Something went wrong",e.error)},function(e,o,n){t.pushError("Something went wrong","Save operation failed.")}))})}if(e("#page-type-admin-profile").length)var $=new Vue({el:"#page-type-admin-profile",data:{password:"********",passwordVerify:"********",name:""},methods:{saveUser:function(o){if($.password!==$.passwordVerify)return void t.pushError("Error","Passwords don't match!");e.post(window.location.href,{password:$.password,name:$.name}).done(function(e){t.pushSuccess("Saved successfully","Changes have been applied.")}).fail(function(e,o,n){t.pushError("Error",n)})}},created:function(){this.name=usrDataName}});else if(e("#page-type-admin-users").length){var P=new Vue({el:"#modal-admin-users-create",data:{email:"",provider:"local",password:"",name:"",loading:!1},methods:{open:function(o){e("#modal-admin-users-create").addClass("is-active"),e("#modal-admin-users-create input").first().focus()},cancel:function(o){e("#modal-admin-users-create").removeClass("is-active"),P.email="",P.provider="local"},create:function(o){P.loading=!0,e.ajax("/admin/users/create",{data:{email:P.email,provider:P.provider,password:P.password,name:P.name},dataType:"json",method:"POST"}).then(function(e,o,n){P.loading=!1,e.ok?(P.cancel(),window.location.reload(!0)):t.pushError("Something went wrong",e.msg)},function(e,o,n){P.loading=!1,t.pushError("Error",e.responseJSON.msg)})}}});e(".btn-create-prompt").on("click",P.open)}else if(e("#page-type-admin-users-edit").length){var j=new Vue({el:"#page-type-admin-users-edit",data:{id:"",email:"",password:"********",name:"",rights:[],roleoverride:"none"},methods:{addRightsRow:function(e){j.rights.push({role:"write",path:"/",exact:!1,deny:!1})},removeRightsRow:function(e){_.pullAt(j.rights,e),j.$forceUpdate()},saveUser:function(o){var n=_.cloneDeep(j.rights);switch(j.roleoverride){case"admin":n.push({role:"admin",path:"/",exact:!1,deny:!1})}e.post(window.location.href,{password:j.password,name:j.name,rights:JSON.stringify(n)}).done(function(e){t.pushSuccess("Saved successfully","Changes have been applied.")}).fail(function(e,o,n){t.pushError("Error",n)})}},created:function(){this.id=usrData._id,this.email=usrData.email,this.name=usrData.name,_.find(usrData.rights,{role:"admin"})?(this.rights=_.reject(usrData.rights,["role","admin"]),this.roleoverride="admin"):this.rights=usrData.rights}}),G=new Vue({el:"#modal-admin-users-delete",data:{loading:!1},methods:{open:function(o){e("#modal-admin-users-delete").addClass("is-active")},cancel:function(o){e("#modal-admin-users-delete").removeClass("is-active")},deleteUser:function(o){G.loading=!0,e.ajax("/admin/users/"+usrData._id,{dataType:"json",method:"DELETE"}).then(function(e,o,t){G.loading=!1,G.cancel(),window.location.assign("/admin/users")},function(e,o,n){G.loading=!1,t.pushError("Error",e.responseJSON.msg)})}}});e(".btn-deluser-prompt").on("click",G.open)}else if(e("#page-type-admin-settings").length)var B=new Vue({el:"#page-type-admin-settings",data:{upgradeModal:{state:!1,step:"confirm",mode:"upgrade",error:"Something went wrong."}},methods:{upgrade:function(e){B.upgradeModal.mode="upgrade",B.upgradeModal.step="confirm",B.upgradeModal.state=!0},reinstall:function(e){B.upgradeModal.mode="re-install",B.upgradeModal.step="confirm",B.upgradeModal.state=!0},upgradeCancel:function(e){B.upgradeModal.state=!1},upgradeStart:function(o){B.upgradeModal.step="running",e.post("/admin/settings/install",{mode:B.upgradeModal.mode}).done(function(e){}).fail(function(e,o,t){B.upgradeModal.step="error",B.upgradeModal.error=e.responseText})},flushcache:function(e){window.alert("Coming soon!")},resetaccounts:function(e){window.alert("Coming soon!")},flushsessions:function(e){window.alert("Coming soon!")}}})});var Alerts=function(){function e(){_classCallCheck(this,e);var o=this;o.mdl=new Vue({el:"#alerts",data:{children:[]},methods:{acknowledge:function(e){o.close(e)}}}),o.uidNext=1}return _createClass(e,[{key:"push",value:function(e){var o=this,t=_.defaults(e,{_uid:o.uidNext,class:"info",message:"---",sticky:!1,title:"---"});o.mdl.children.push(t),t.sticky||_.delay(function(){o.close(t._uid)},5e3),o.uidNext++}},{key:"pushError",value:function(e,o){this.push({class:"error",message:o,sticky:!1,title:e})}},{key:"pushSuccess",value:function(e,o){this.push({class:"success",message:o,sticky:!1,title:e})}},{key:"close",value:function(e){var o=this,t=_.findIndex(o.mdl.children,["_uid",e]),n=_.nth(o.mdl.children,t);t>=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 \ No newline at end of file
"use strict";jQuery(document).ready(function(t){new Vue({el:"main",data:{loading:!1,state:"considerations",syscheck:{ok:!1,error:"",results:[]},conf:{title:"Wiki",host:"",port:80,lang:"en",db:"mongodb://localhost:27017/wiki"},considerations:{https:!1,port:!1,localhost:!1}},methods:{proceedToWelcome:function(t){this.state="welcome",this.loading=!1},proceedToSyscheck:function(t){var s=this;this.state="syscheck",this.loading=!0,s.syscheck={ok:!1,error:"",results:[]},_.delay(function(){axios.post("/syscheck").then(function(t){t.data.ok===!0?(s.syscheck.ok=!0,s.syscheck.results=t.data.results):(s.syscheck.ok=!1,s.syscheck.error=t.data.error),s.loading=!1,s.$nextTick()}).catch(function(t){window.alert(t.message)})},1e3)},proceedToGeneral:function(t){this.state="general",this.loading=!1},proceedToConsiderations:function(t){this.considerations={https:!_.startsWith(this.conf.host,"https"),port:!1,localhost:_.includes(this.conf.host,"localhost")},this.state="considerations",this.loading=!1},proceedToDb:function(t){this.state="db",this.loading=!1}}})}); "use strict";Vue.use(VeeValidate,{enableAutoClasses:!0,classNames:{touched:"is-touched",untouched:"is-untouched",valid:"is-valid",invalid:"is-invalid",pristine:"is-pristine",dirty:"is-dirty"}}),jQuery(document).ready(function(t){new Vue({el:"main",data:{loading:!1,state:"welcome",syscheck:{ok:!1,error:"",results:[]},dbcheck:{ok:!1,error:""},gitcheck:{ok:!1,error:""},final:{ok:!1,error:"",results:[]},conf:{title:"Wiki",host:"http://",port:80,lang:"en",db:"mongodb://localhost:27017/wiki",pathData:"./data",pathRepo:"./repo",gitUrl:"",gitBranch:"master",gitAuthType:"ssh",gitAuthSSHKey:"",gitAuthUser:"",gitAuthPass:"",gitAuthSSL:!0,gitSignatureName:"",gitSignatureEmail:"",adminEmail:"",adminPassword:"",adminPasswordConfirm:""},considerations:{https:!1,port:!1,localhost:!1}},computed:{currentProgress:function(){var t="0%";switch(this.state){case"welcome":t="0%";break;case"syscheck":t=this.syscheck.ok?"15%":"5%";break;case"general":t="20%";break;case"considerations":t="30%";break;case"db":t="35%";break;case"dbcheck":t=this.dbcheck.ok?"50%":"40%";break;case"paths":t="55%";break;case"git":t="60%";break;case"gitcheck":t=this.gitcheck.ok?"75%":"65%";break;case"admin":t="80%"}return t}},methods:{proceedToWelcome:function(t){this.state="welcome",this.loading=!1},proceedToSyscheck:function(t){var e=this;this.state="syscheck",this.loading=!0,e.syscheck={ok:!1,error:"",results:[]},_.delay(function(){axios.post("/syscheck").then(function(t){t.data.ok===!0?(e.syscheck.ok=!0,e.syscheck.results=t.data.results):(e.syscheck.ok=!1,e.syscheck.error=t.data.error),e.loading=!1,e.$nextTick()}).catch(function(t){window.alert(t.message)})},1e3)},proceedToGeneral:function(t){var e=this;e.state="general",e.loading=!1,e.$nextTick(function(){e.$validator.validateAll("general")})},proceedToConsiderations:function(t){this.considerations={https:!_.startsWith(this.conf.host,"https"),port:!1,localhost:_.includes(this.conf.host,"localhost")},this.state="considerations",this.loading=!1},proceedToDb:function(t){var e=this;e.state="db",e.loading=!1,e.$nextTick(function(){e.$validator.validateAll("db")})},proceedToDbcheck:function(t){var e=this;this.state="dbcheck",this.loading=!0,e.dbcheck={ok:!1,error:""},_.delay(function(){axios.post("/dbcheck",{db:e.conf.db}).then(function(t){t.data.ok===!0?e.dbcheck.ok=!0:(e.dbcheck.ok=!1,e.dbcheck.error=t.data.error),e.loading=!1,e.$nextTick()}).catch(function(t){window.alert(t.message)})},1e3)},proceedToPaths:function(t){var e=this;e.state="paths",e.loading=!1,e.$nextTick(function(){e.$validator.validateAll("paths")})},proceedToGit:function(t){var e=this;e.state="git",e.loading=!1,e.$nextTick(function(){e.$validator.validateAll("git")})},proceedToGitCheck:function(t){var e=this;this.state="gitcheck",this.loading=!0,e.dbcheck={ok:!1,error:""},_.delay(function(){axios.post("/gitcheck",e.conf).then(function(t){t.data.ok===!0?e.gitcheck.ok=!0:(e.gitcheck.ok=!1,e.gitcheck.error=t.data.error),e.loading=!1,e.$nextTick()}).catch(function(t){window.alert(t.message)})},1e3)},proceedToAdmin:function(t){var e=this;e.state="admin",e.loading=!1,e.$nextTick(function(){e.$validator.validateAll("admin")})},proceedToFinal:function(t){var e=this;e.state="final",e.loading=!0,e.final={ok:!1,error:"",results:[]},_.delay(function(){axios.post("/finalize",e.conf).then(function(t){t.data.ok===!0?(e.final.ok=!0,e.final.results=t.data.results):(e.final.ok=!1,e.final.error=t.data.error),e.loading=!1,e.$nextTick()}).catch(function(t){window.alert(t.message)})},1e3)},finish:function(t){}}})});
\ No newline at end of file \ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -93,6 +93,7 @@ if ($('#mk-editor').length === 1) { ...@@ -93,6 +93,7 @@ if ($('#mk-editor').length === 1) {
mdeModalOpenState = true; mdeModalOpenState = true;
$('#modal-editor-link').slideToggle(); $('#modal-editor-link').slideToggle();
} */ } */
window.alert('Coming soon!')
}, },
className: 'icon-link2', className: 'icon-link2',
title: 'Insert Link' title: 'Insert Link'
...@@ -163,6 +164,7 @@ if ($('#mk-editor').length === 1) { ...@@ -163,6 +164,7 @@ if ($('#mk-editor').length === 1) {
{ {
name: 'table', name: 'table',
action: (editor) => { action: (editor) => {
window.alert('Coming soon!')
// todo // todo
}, },
className: 'icon-table', className: 'icon-table',
......
'use strict' 'use strict'
/* global jQuery, _, Vue, axios */ /* global jQuery, _, Vue, VeeValidate, axios */
Vue.use(VeeValidate, {
enableAutoClasses: true,
classNames: {
touched: 'is-touched', // the control has been blurred
untouched: 'is-untouched', // the control hasn't been blurred
valid: 'is-valid', // model is valid
invalid: 'is-invalid', // model is invalid
pristine: 'is-pristine', // control has not been interacted with
dirty: 'is-dirty' // control has been interacted with
}
})
jQuery(document).ready(function ($) { jQuery(document).ready(function ($) {
new Vue({ // eslint-disable-line no-new new Vue({ // eslint-disable-line no-new
el: 'main', el: 'main',
data: { data: {
loading: false, loading: false,
state: 'considerations', state: 'welcome',
syscheck: { syscheck: {
ok: false, ok: false,
error: '', error: '',
results: [] results: []
}, },
dbcheck: {
ok: false,
error: ''
},
gitcheck: {
ok: false,
error: ''
},
final: {
ok: false,
error: '',
results: []
},
conf: { conf: {
title: 'Wiki', title: 'Wiki',
host: '', host: 'http://',
port: 80, port: 80,
lang: 'en', lang: 'en',
db: 'mongodb://localhost:27017/wiki' db: 'mongodb://localhost:27017/wiki',
pathData: './data',
pathRepo: './repo',
gitUrl: '',
gitBranch: 'master',
gitAuthType: 'ssh',
gitAuthSSHKey: '',
gitAuthUser: '',
gitAuthPass: '',
gitAuthSSL: true,
gitSignatureName: '',
gitSignatureEmail: '',
adminEmail: '',
adminPassword: '',
adminPasswordConfirm: ''
}, },
considerations: { considerations: {
https: false, https: false,
...@@ -26,6 +65,44 @@ jQuery(document).ready(function ($) { ...@@ -26,6 +65,44 @@ jQuery(document).ready(function ($) {
localhost: false localhost: false
} }
}, },
computed: {
currentProgress: function () {
let perc = '0%'
switch (this.state) {
case 'welcome':
perc = '0%'
break
case 'syscheck':
perc = (this.syscheck.ok) ? '15%' : '5%'
break
case 'general':
perc = '20%'
break
case 'considerations':
perc = '30%'
break
case 'db':
perc = '35%'
break
case 'dbcheck':
perc = (this.dbcheck.ok) ? '50%' : '40%'
break
case 'paths':
perc = '55%'
break
case 'git':
perc = '60%'
break
case 'gitcheck':
perc = (this.gitcheck.ok) ? '75%' : '65%'
break
case 'admin':
perc = '80%'
break
}
return perc
}
},
methods: { methods: {
proceedToWelcome: function (ev) { proceedToWelcome: function (ev) {
this.state = 'welcome' this.state = 'welcome'
...@@ -58,8 +135,12 @@ jQuery(document).ready(function ($) { ...@@ -58,8 +135,12 @@ jQuery(document).ready(function ($) {
}, 1000) }, 1000)
}, },
proceedToGeneral: function (ev) { proceedToGeneral: function (ev) {
this.state = 'general' let self = this
this.loading = false self.state = 'general'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('general')
})
}, },
proceedToConsiderations: function (ev) { proceedToConsiderations: function (ev) {
this.considerations = { this.considerations = {
...@@ -71,8 +152,115 @@ jQuery(document).ready(function ($) { ...@@ -71,8 +152,115 @@ jQuery(document).ready(function ($) {
this.loading = false this.loading = false
}, },
proceedToDb: function (ev) { proceedToDb: function (ev) {
this.state = 'db' let self = this
this.loading = false self.state = 'db'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('db')
})
},
proceedToDbcheck: function (ev) {
let self = this
this.state = 'dbcheck'
this.loading = true
self.dbcheck = {
ok: false,
error: ''
}
_.delay(() => {
axios.post('/dbcheck', {
db: self.conf.db
}).then(resp => {
if (resp.data.ok === true) {
self.dbcheck.ok = true
} else {
self.dbcheck.ok = false
self.dbcheck.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
proceedToPaths: function (ev) {
let self = this
self.state = 'paths'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('paths')
})
},
proceedToGit: function (ev) {
let self = this
self.state = 'git'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('git')
})
},
proceedToGitCheck: function (ev) {
let self = this
this.state = 'gitcheck'
this.loading = true
self.dbcheck = {
ok: false,
error: ''
}
_.delay(() => {
axios.post('/gitcheck', self.conf).then(resp => {
if (resp.data.ok === true) {
self.gitcheck.ok = true
} else {
self.gitcheck.ok = false
self.gitcheck.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
proceedToAdmin: function (ev) {
let self = this
self.state = 'admin'
self.loading = false
self.$nextTick(() => {
self.$validator.validateAll('admin')
})
},
proceedToFinal: function (ev) {
let self = this
self.state = 'final'
self.loading = true
self.final = {
ok: false,
error: '',
results: []
}
_.delay(() => {
axios.post('/finalize', self.conf).then(resp => {
if (resp.data.ok === true) {
self.final.ok = true
self.final.results = resp.data.results
} else {
self.final.ok = false
self.final.error = resp.data.error
}
self.loading = false
self.$nextTick()
}).catch(err => {
window.alert(err.message)
})
}, 1000)
},
finish: function (ev) {
} }
} }
}) })
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
if ($('#page-type-edit').length) { if ($('#page-type-edit').length) {
let pageEntryPath = $('#page-type-edit').data('entrypath') // eslint-disable-line no-unused-vars let pageEntryPath = $('#page-type-edit').data('entrypath') // eslint-disable-line no-unused-vars
// let pageCleanExit = false
// -> Discard // -> Discard
...@@ -9,6 +10,10 @@ if ($('#page-type-edit').length) { ...@@ -9,6 +10,10 @@ if ($('#page-type-edit').length) {
$('#modal-edit-discard').toggleClass('is-active') $('#modal-edit-discard').toggleClass('is-active')
}) })
// window.onbeforeunload = function () {
// return (pageCleanExit) ? true : 'Unsaved modifications will be lost. Are you sure you want to navigate away from this page?'
// }
/* eslint-disable spaced-comment */ /* eslint-disable spaced-comment */
//=include ../components/editor.js //=include ../components/editor.js
/* eslint-enable spaced-comment */ /* eslint-enable spaced-comment */
......
.editor-toolbar { .editor-toolbar {
z-index: 2; z-index: 2;
background-color: rgba(0,0,0,0.75); background-color: mc('indigo', '900');
border: none; border: none;
border-top-left-radius: 0; border-top-left-radius: 0;
border-top-right-radius: 0; border-top-right-radius: 0;
opacity: 1; opacity: 1;
position: fixed; position: fixed;
top: 51px; top: 50px;
left: 0; left: 0;
width: 100%; width: 100%;
......
...@@ -53,3 +53,24 @@ i.icon-warning-outline { ...@@ -53,3 +53,24 @@ i.icon-warning-outline {
max-height: 0; max-height: 0;
padding-top: 0; padding-top: 0;
} }
.progress-bar {
width: 150px;
height: 10px;
background-color: mc('indigo', '50');
border:1px solid mc('indigo', '100');
border-radius: 3px;
position: absolute;
left: 15px;
top: 21px;
padding: 1px;
> div {
width: 5px;
height: 6px;
background-color: mc('indigo', '200');
border-radius: 2px;
transition: all 1s ease;
}
}
...@@ -15,8 +15,11 @@ module.exports = (port, spinner) => { ...@@ -15,8 +15,11 @@ module.exports = (port, spinner) => {
const http = require('http') const http = require('http')
const path = require('path') const path = require('path')
const Promise = require('bluebird') const Promise = require('bluebird')
const fs = require('fs-extra')
const yaml = require('js-yaml')
const _ = require('lodash') const _ = require('lodash')
// ---------------------------------------- // ----------------------------------------
// Define Express App // Define Express App
// ---------------------------------------- // ----------------------------------------
...@@ -48,9 +51,20 @@ module.exports = (port, spinner) => { ...@@ -48,9 +51,20 @@ module.exports = (port, spinner) => {
// ---------------------------------------- // ----------------------------------------
app.get('*', (req, res) => { app.get('*', (req, res) => {
res.render('configure/index') let langs = []
try {
langs = yaml.safeLoad(fs.readFileSync('./app/data.yml', 'utf8')).langs
} catch (err) {
console.error(err)
}
res.render('configure/index', {
langs
})
}) })
/**
* Perform basic system checks
*/
app.post('/syscheck', (req, res) => { app.post('/syscheck', (req, res) => {
Promise.mapSeries([ Promise.mapSeries([
() => { () => {
...@@ -105,6 +119,106 @@ module.exports = (port, spinner) => { ...@@ -105,6 +119,106 @@ module.exports = (port, spinner) => {
}) })
}) })
/**
* Check the DB connection
*/
app.post('/dbcheck', (req, res) => {
let mongo = require('mongodb').MongoClient
mongo.connect(req.body.db, {
autoReconnect: false,
reconnectTries: 2,
reconnectInterval: 1000,
connectTimeoutMS: 5000,
socketTimeoutMS: 5000
}, (err, db) => {
if (err === null) {
// Try to create a test collection
db.createCollection('test', (err, results) => {
if (err === null) {
// Try to drop test collection
db.dropCollection('test', (err, results) => {
if (err === null) {
res.json({ ok: true })
} else {
res.json({ ok: false, error: 'Unable to delete test collection. Verify permissions. ' + err.message })
}
db.close()
})
} else {
res.json({ ok: false, error: 'Unable to create test collection. Verify permissions. ' + err.message })
db.close()
}
})
} else {
res.json({ ok: false, error: err.message })
}
})
})
/**
* Check the Git connection
*/
app.post('/gitcheck', (req, res) => {
const exec = require('execa')
const dataDir = path.resolve(ROOTPATH, req.body.pathData)
const gitDir = path.resolve(ROOTPATH, req.body.pathRepo)
let results = []
fs.ensureDir(dataDir).then(() => {
results.push('Data directory path is valid.')
return fs.ensureDir(gitDir).then(() => {
results.push('Git directory path is valid.')
return true
})
}).then(() => {
return exec.stdout('git', ['init'], { cwd: gitDir }).then(result => {
results.push('Git local repository initialized.')
return true
})
}).then(() => {
return res.json({ ok: true, results })
}).catch(err => {
res.json({ ok: false, error: err.message })
})
})
/**
* Check the DB connection
*/
app.post('/finalize', (req, res) => {
let mongo = require('mongodb').MongoClient
mongo.connect(req.body.db, {
autoReconnect: false,
reconnectTries: 2,
reconnectInterval: 1000,
connectTimeoutMS: 5000,
socketTimeoutMS: 5000
}, (err, db) => {
if (err === null) {
// Try to create a test collection
db.createCollection('test', (err, results) => {
if (err === null) {
// Try to drop test collection
db.dropCollection('test', (err, results) => {
if (err === null) {
res.json({ ok: true })
} else {
res.json({ ok: false, error: 'Unable to delete test collection. Verify permissions. ' + err.message })
}
db.close()
})
} else {
res.json({ ok: false, error: 'Unable to create test collection. Verify permissions. ' + err.message })
db.close()
}
})
} else {
res.json({ ok: false, error: err.message })
}
})
})
// ---------------------------------------- // ----------------------------------------
// Error handling // Error handling
// ---------------------------------------- // ----------------------------------------
......
...@@ -27,6 +27,7 @@ const paths = { ...@@ -27,6 +27,7 @@ const paths = {
'./node_modules/socket.io-client/dist/socket.io.min.js', './node_modules/socket.io-client/dist/socket.io.min.js',
'./node_modules/jquery/dist/jquery.min.js', './node_modules/jquery/dist/jquery.min.js',
'./node_modules/vue/dist/vue.min.js', './node_modules/vue/dist/vue.min.js',
'./node_modules/vee-validate/dist/vee-validate.min.js',
'./node_modules/axios/dist/axios.min.js', './node_modules/axios/dist/axios.min.js',
'./node_modules/jquery-smooth-scroll/jquery.smooth-scroll.min.js', './node_modules/jquery-smooth-scroll/jquery.smooth-scroll.min.js',
'./node_modules/jquery-simple-upload/simpleUpload.min.js', './node_modules/jquery-simple-upload/simpleUpload.min.js',
......
...@@ -152,7 +152,7 @@ module.exports = { ...@@ -152,7 +152,7 @@ module.exports = {
return false return false
} }
}).catch((err) => { // eslint-disable-line handle-callback-err }).catch((err) => { // eslint-disable-line handle-callback-err
return Promise.reject(new Promise.OperationalError('Entry ' + entryPath + ' does not exist!')) throw new Promise.OperationalError('Entry ' + entryPath + ' does not exist!')
}) })
}, },
...@@ -299,8 +299,7 @@ module.exports = { ...@@ -299,8 +299,7 @@ module.exports = {
_id: content.entryPath, _id: content.entryPath,
title: content.meta.title || content.entryPath, title: content.meta.title || content.entryPath,
subtitle: content.meta.subtitle || '', subtitle: content.meta.subtitle || '',
parent: content.parent.title || '', parent: content.parent.title || ''
content: content.text || ''
}, { }, {
new: true, new: true,
upsert: true upsert: true
...@@ -396,60 +395,5 @@ module.exports = { ...@@ -396,60 +395,5 @@ module.exports = {
return fs.readFileAsync(path.join(ROOTPATH, 'client/content/create.md'), 'utf8').then((contents) => { return fs.readFileAsync(path.join(ROOTPATH, 'client/content/create.md'), 'utf8').then((contents) => {
return _.replace(contents, new RegExp('{TITLE}', 'g'), formattedTitle) return _.replace(contents, new RegExp('{TITLE}', 'g'), formattedTitle)
}) })
},
/**
* Searches entries based on terms.
*
* @param {String} terms The terms to search for
* @return {Promise<Object>} Promise of the search results
*/
search (terms) {
terms = _.chain(terms)
.deburr()
.toLower()
.trim()
.replace(/[^a-z0-9\- ]/g, '')
.split(' ')
.filter((f) => { return !_.isEmpty(f) })
.join(' ')
.value()
return db.Entry.find(
{ $text: { $search: terms } },
{ score: { $meta: 'textScore' }, title: 1 }
)
.sort({ score: { $meta: 'textScore' } })
.limit(10)
.exec()
.then((hits) => {
if (hits.length < 5) {
let regMatch = new RegExp('^' + _.split(terms, ' ')[0])
return db.Entry.find({
_id: { $regex: regMatch }
}, '_id')
.sort('_id')
.limit(5)
.exec()
.then((matches) => {
return {
match: hits,
suggest: (matches) ? _.map(matches, '_id') : []
}
})
} else {
return {
match: _.filter(hits, (h) => { return h._doc.score >= 1 }),
suggest: []
}
} }
}).catch((err) => {
winston.error(err)
return {
match: [],
suggest: []
}
})
}
} }
...@@ -231,10 +231,8 @@ module.exports = { ...@@ -231,10 +231,8 @@ module.exports = {
*/ */
generateThumbnail (sourcePath, destPath) { generateThumbnail (sourcePath, destPath) {
return jimp.read(sourcePath).then(img => { return jimp.read(sourcePath).then(img => {
return img.cover(150, 150) return img
.background(0xFFFFFFFF) .contain(150, 150)
.opaque()
.rgba(false)
.write(destPath) .write(destPath)
}) })
}, },
......
...@@ -21,10 +21,6 @@ var entrySchema = Mongoose.Schema({ ...@@ -21,10 +21,6 @@ var entrySchema = Mongoose.Schema({
parent: { parent: {
type: String, type: String,
default: '' default: ''
},
content: {
type: String,
default: ''
} }
}, },
...@@ -32,19 +28,4 @@ var entrySchema = Mongoose.Schema({ ...@@ -32,19 +28,4 @@ var entrySchema = Mongoose.Schema({
timestamps: {} timestamps: {}
}) })
entrySchema.index({
_id: 'text',
title: 'text',
subtitle: 'text',
content: 'text'
}, {
weights: {
_id: 3,
title: 10,
subtitle: 5,
content: 1
},
name: 'EntriesTextIndex'
})
module.exports = Mongoose.model('Entry', entrySchema) module.exports = Mongoose.model('Entry', entrySchema)
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
"bcryptjs-then": "^1.0.1", "bcryptjs-then": "^1.0.1",
"bluebird": "^3.4.7", "bluebird": "^3.4.7",
"body-parser": "^1.17.1", "body-parser": "^1.17.1",
"bunyan": "^1.8.8", "bunyan": "^1.8.9",
"cheerio": "^0.22.0", "cheerio": "^0.22.0",
"child-process-promise": "^2.2.0", "child-process-promise": "^2.2.0",
"chokidar": "^1.6.0", "chokidar": "^1.6.0",
...@@ -51,21 +51,22 @@ ...@@ -51,21 +51,22 @@
"connect-mongo": "^1.3.2", "connect-mongo": "^1.3.2",
"cookie-parser": "^1.4.3", "cookie-parser": "^1.4.3",
"cron": "^1.2.1", "cron": "^1.2.1",
"execa": "^0.6.3",
"express": "^4.15.2", "express": "^4.15.2",
"express-brute": "^1.0.0", "express-brute": "^1.0.0",
"express-brute-mongoose": "0.0.7", "express-brute-mongoose": "0.0.7",
"express-session": "^1.15.1", "express-session": "^1.15.1",
"file-type": "^4.0.0", "file-type": "^4.0.0",
"filesize.js": "^1.0.2", "filesize.js": "^1.0.2",
"follow-redirects": "^1.2.1", "follow-redirects": "^1.2.3",
"fs-extra": "^2.0.0", "fs-extra": "^2.1.2",
"git-wrapper2-promise": "^0.2.9", "git-wrapper2-promise": "^0.2.9",
"highlight.js": "^9.9.0", "highlight.js": "^9.9.0",
"i18next": "^7.1.1", "i18next": "^7.1.3",
"i18next-express-middleware": "^1.0.2", "i18next-express-middleware": "^1.0.3",
"i18next-node-fs-backend": "^0.1.3", "i18next-node-fs-backend": "^0.1.3",
"image-size": "^0.5.1", "image-size": "^0.5.1",
"jimp": "github:NGPixel/jimp", "jimp": "github:ngpixel/jimp",
"js-yaml": "^3.8.1", "js-yaml": "^3.8.1",
"klaw": "^1.3.1", "klaw": "^1.3.1",
"levelup": "^1.3.5", "levelup": "^1.3.5",
...@@ -80,12 +81,13 @@ ...@@ -80,12 +81,13 @@
"markdown-it-footnote": "^3.0.1", "markdown-it-footnote": "^3.0.1",
"markdown-it-task-lists": "^1.4.1", "markdown-it-task-lists": "^1.4.1",
"memdown": "^1.2.4", "memdown": "^1.2.4",
"mime-types": "^2.1.13", "mime-types": "^2.1.15",
"moment": "^2.17.1", "moment": "^2.18.1",
"moment-timezone": "^0.5.11", "moment-timezone": "^0.5.11",
"mongoose": "^4.8.5", "mongodb": "^2.2.25",
"mongoose": "^4.9.1",
"multer": "^1.2.1", "multer": "^1.2.1",
"ora": "^1.1.0", "ora": "^1.2.0",
"passport": "^0.3.2", "passport": "^0.3.2",
"passport-local": "^1.0.0", "passport-local": "^1.0.0",
"passport.socketio": "^3.7.0", "passport.socketio": "^3.7.0",
...@@ -94,11 +96,11 @@ ...@@ -94,11 +96,11 @@
"read-chunk": "^2.0.0", "read-chunk": "^2.0.0",
"remove-markdown": "^0.1.0", "remove-markdown": "^0.1.0",
"requarks-core": "^0.2.2", "requarks-core": "^0.2.2",
"request": "^2.80.0", "request": "^2.81.0",
"search-index-adder": "github:NGPixel/search-index-adder", "search-index-adder": "github:ngpixel/search-index-adder",
"search-index-searcher": "github:NGPixel/search-index-searcher", "search-index-searcher": "github:ngpixel/search-index-searcher",
"semver": "^5.3.0", "semver": "^5.3.0",
"serve-favicon": "^2.4.1", "serve-favicon": "^2.4.2",
"simplemde": "^1.11.2", "simplemde": "^1.11.2",
"socket.io": "^1.7.3", "socket.io": "^1.7.3",
"sticky-js": "^1.0.7", "sticky-js": "^1.0.7",
...@@ -112,16 +114,16 @@ ...@@ -112,16 +114,16 @@
}, },
"devDependencies": { "devDependencies": {
"ace-builds": "^1.2.6", "ace-builds": "^1.2.6",
"babel-preset-es2015": "^6.16.0", "babel-preset-es2015": "^6.24.0",
"chai": "^3.5.0", "chai": "^3.5.0",
"chai-as-promised": "^6.0.0", "chai-as-promised": "^6.0.0",
"codacy-coverage": "^2.0.0", "codacy-coverage": "^2.0.0",
"eslint": "^3.16.1", "eslint": "^3.18.0",
"eslint-plugin-promise": "^3.5.0", "eslint-plugin-promise": "^3.5.0",
"eslint-plugin-standard": "^2.1.1", "eslint-plugin-standard": "^2.1.1",
"gulp": "^3.9.1", "gulp": "^3.9.1",
"gulp-babel": "^6.1.2", "gulp-babel": "^6.1.2",
"gulp-clean-css": "^3.0.3", "gulp-clean-css": "^3.0.4",
"gulp-concat": "^2.6.1", "gulp-concat": "^2.6.1",
"gulp-gzip": "^1.4.0", "gulp-gzip": "^1.4.0",
"gulp-include": "^2.3.1", "gulp-include": "^2.3.1",
...@@ -129,12 +131,12 @@ ...@@ -129,12 +131,12 @@
"gulp-plumber": "^1.1.0", "gulp-plumber": "^1.1.0",
"gulp-sass": "^3.0.0", "gulp-sass": "^3.0.0",
"gulp-tar": "^1.9.0", "gulp-tar": "^1.9.0",
"gulp-uglify": "^2.0.0", "gulp-uglify": "^2.1.2",
"gulp-watch": "^4.3.11", "gulp-watch": "^4.3.11",
"gulp-zip": "^4.0.0", "gulp-zip": "^4.0.0",
"istanbul": "^0.4.5", "istanbul": "^0.4.5",
"jquery": "^3.1.1", "jquery": "^3.2.1",
"jquery-contextmenu": "^2.4.3", "jquery-contextmenu": "^2.4.4",
"jquery-simple-upload": "^1.0.0", "jquery-simple-upload": "^1.0.0",
"jquery-smooth-scroll": "^2.0.0", "jquery-smooth-scroll": "^2.0.0",
"merge-stream": "^1.0.1", "merge-stream": "^1.0.1",
...@@ -144,10 +146,11 @@ ...@@ -144,10 +146,11 @@
"pug-lint": "^2.4.0", "pug-lint": "^2.4.0",
"run-sequence": "^1.2.2", "run-sequence": "^1.2.2",
"snyk": "^1.25.1", "snyk": "^1.25.1",
"standard": "^9.0.0", "standard": "^9.0.2",
"sticky-js": "^1.1.9", "sticky-js": "^1.1.9",
"twemoji-awesome": "^1.0.4", "twemoji-awesome": "^1.0.4",
"vue": "^2.2.1" "vee-validate": "^2.0.0-beta.25",
"vue": "^2.2.5"
}, },
"standard": { "standard": {
"globals": [ "globals": [
......
...@@ -36,6 +36,11 @@ html ...@@ -36,6 +36,11 @@ html
h1 Welcome to Wiki.js! h1 Welcome to Wiki.js!
h2(style={'margin-bottom': 0}) A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown h2(style={'margin-bottom': 0}) A modern, lightweight and powerful wiki app built on NodeJS, Git and Markdown
.content(v-cloak) .content(v-cloak)
//- ==============================================
//- WELCOME
//- ==============================================
template(v-if='state === "welcome"') template(v-if='state === "welcome"')
.panel .panel
h2.panel-title.is-featured h2.panel-title.is-featured
...@@ -45,8 +50,13 @@ html ...@@ -45,8 +50,13 @@ html
p This installation wizard will guide you through the steps needed to get your wiki up and running in no time! p This installation wizard will guide you through the steps needed to get your wiki up and running in no time!
p Detailed information about installation and usage can be found on the #[a(href='https://docs.wiki.requarks.io/') official documentation site]. #[br] Should you have any question or would like to report something that doesn't look right, feel free to create a new issue on the #[a(href='https://github.com/Requarks/wiki/issues') GitHub project]. p Detailed information about installation and usage can be found on the #[a(href='https://docs.wiki.requarks.io/') official documentation site]. #[br] Should you have any question or would like to report something that doesn't look right, feel free to create a new issue on the #[a(href='https://github.com/Requarks/wiki/issues') GitHub project].
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo(v-on:click='proceedToSyscheck', v-bind:disabled='loading') Start button.button.is-indigo(v-on:click='proceedToSyscheck', v-bind:disabled='loading') Start
//- ==============================================
//- SYSTEM CHECK
//- ==============================================
template(v-else-if='state === "syscheck"') template(v-else-if='state === "syscheck"')
.panel .panel
h2.panel-title.is-featured h2.panel-title.is-featured
...@@ -62,10 +72,15 @@ html ...@@ -62,10 +72,15 @@ html
strong Looks good! No issues so far. strong Looks good! No issues so far.
p(v-if='!loading && !syscheck.ok') #[i.icon-square-cross] Error: {{ syscheck.error }} p(v-if='!loading && !syscheck.ok') #[i.icon-square-cross] Error: {{ syscheck.error }}
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToWelcome', v-bind:disabled='loading') Back button.button.is-indigo.is-outlined(v-on:click='proceedToWelcome', v-bind:disabled='loading') Back
button.button.is-teal(v-on:click='proceedToSyscheck', v-if='!loading && !syscheck.ok') Check Again button.button.is-teal(v-on:click='proceedToSyscheck', v-if='!loading && !syscheck.ok') Check Again
button.button.is-indigo(v-on:click='proceedToGeneral', v-if='loading || syscheck.ok', v-bind:disabled='loading') Continue button.button.is-indigo(v-on:click='proceedToGeneral', v-if='loading || syscheck.ok', v-bind:disabled='loading') Continue
//- ==============================================
//- GENERAL
//- ==============================================
template(v-else-if='state === "general"') template(v-else-if='state === "general"')
.panel .panel
h2.panel-title.is-featured h2.panel-title.is-featured
...@@ -75,27 +90,33 @@ html ...@@ -75,27 +90,33 @@ html
section section
p.control.is-fullwidth p.control.is-fullwidth
label.label Site Title label.label Site Title
input(type='text', placeholder='e.g. Wiki', v-model='conf.title') input(type='text', placeholder='e.g. Wiki', v-model='conf.title', data-vv-scope='general', name='ipt-title', v-validate='{ required: true, min: 2 }')
p.desc The site title will appear in the top left corner on every page and within the window title bar. span.desc The site title will appear in the top left corner on every page and within the window title bar.
section section
p.control.is-fullwidth p.control.is-fullwidth
label.label Host label.label Host
input(type='text', placeholder='http://', v-model='conf.host') input(type='text', placeholder='http://', v-model='conf.host', data-vv-scope='general', name='ipt-host', v-validate='{ required: true, url: true }')
p.desc The full URL to your wiki, without the trailing slash. E.g.: http://wiki.domain.com. Note that sub-folders are not supported. span.desc The full URL to your wiki, without the trailing slash. E.g.: http://wiki.domain.com. Note that sub-folders are not supported.
section section
p.control p.control
label.label Port label.label Port
input(type='text', placeholder='e.g. 80', v-model='conf.port') input(type='text', placeholder='e.g. 80', v-model.number='conf.port', data-vv-scope='general', name='ipt-port', v-validate='{ required: true, numeric: true, min_value: 1, max_value: 65535 }')
p.desc The port on which Wiki.js will listen to. Usually port 80 if connecting directly, or a random port (e.g. 3000) if using a web server in front of it. span.desc The port on which Wiki.js will listen to. Usually port 80 if connecting directly, or a random port (e.g. 3000) if using a web server in front of it.
section section
p.control p.control
label.label Site UI Language label.label Site UI Language
select(v-model='conf.lang') select(v-model='conf.lang')
option(value='en') English each lg in langs
p.desc The language in which navigation, help and other UI elements will be displayed. option(value=lg.id)= lg.name
span.desc The language in which navigation, help and other UI elements will be displayed.
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToSyscheck', v-bind:disabled='loading') Back button.button.is-indigo.is-outlined(v-on:click='proceedToSyscheck', v-bind:disabled='loading') Back
button.button.is-indigo(v-on:click='proceedToConsiderations', v-bind:disabled='loading') Continue button.button.is-indigo(v-on:click='proceedToConsiderations', v-bind:disabled='loading || errors.any("general")') Continue
//- ==============================================
//- CONSIDERATIONS
//- ==============================================
template(v-else-if='state === "considerations"') template(v-else-if='state === "considerations"')
.panel .panel
...@@ -120,23 +141,228 @@ html ...@@ -120,23 +141,228 @@ html
h3 Are you sure you want to use localhost as the host base URL? #[i.icon-warning-outline.animated.fadeOut.infinite] h3 Are you sure you want to use localhost as the host base URL? #[i.icon-warning-outline.animated.fadeOut.infinite]
p The host URL you specified is localhost. Unless you are a developer running Wiki.js locally on your machine, this is not recommended! p The host URL you specified is localhost. Unless you are a developer running Wiki.js locally on your machine, this is not recommended!
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToGeneral', v-bind:disabled='loading') Back button.button.is-indigo.is-outlined(v-on:click='proceedToGeneral', v-bind:disabled='loading') Back
button.button.is-indigo(v-on:click='proceedToDb', v-bind:disabled='loading') Continue button.button.is-indigo(v-on:click='proceedToDb', v-bind:disabled='loading') Continue
//- ==============================================
//- DATABASE
//- ==============================================
template(v-else-if='state === "db"') template(v-else-if='state === "db"')
.panel .panel
h2.panel-title.is-featured h2.panel-title.is-featured
span Database span Database
i(v-if='loading') i(v-if='loading')
.panel-content.is-text
p Wiki.js stores administrative data such as users, permissions and assets metadata in a MongoDB database. Article contents and uploads are <u>not</u> stored in the DB. Instead, they are stored on-disk and synced automatically with a remote git repository of your choice.
.panel-content.form-sections .panel-content.form-sections
section section
p.control.is-fullwidth p.control.is-fullwidth
label.label MongoDB Connection String label.label MongoDB Connection String
input(type='text', placeholder='e.g. mongodb://localhost:27017/wiki', v-model='conf.db') input(type='text', placeholder='e.g. mongodb://localhost:27017/wiki', v-model='conf.db', data-vv-scope='db', name='ipt-db', v-validate='{ required: true, min: 14 }')
p.desc The connection string to your MongoDB server. Leave the default localhost value if MongoDB is installed on the same server. span.desc The connection string to your MongoDB server. Leave the default localhost value if MongoDB is installed on the same server.
.panel-footer .panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToConsiderations', v-bind:disabled='loading') Back button.button.is-indigo.is-outlined(v-on:click='proceedToConsiderations', v-bind:disabled='loading') Back
button.button.is-indigo(v-on:click='proceedToSyscheck', v-bind:disabled='loading') Connect button.button.is-indigo(v-on:click='proceedToDbcheck', v-bind:disabled='loading || errors.any("db")') Connect
//- ==============================================
//- DATABASE CHECK
//- ==============================================
template(v-else-if='state === "dbcheck"')
.panel
h2.panel-title.is-featured
span Database Check
i(v-if='loading')
.panel-content.is-text
p(v-if='loading') #[i.icon-loader.animated.rotateIn.infinite] Testing the connection to MongoDB...
p(v-if='!loading && dbcheck.ok')
i.icon-check
strong Connected successfully!
p(v-if='!loading && !dbcheck.ok') #[i.icon-square-cross] Error: {{ dbcheck.error }}
.panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToDb', v-bind:disabled='loading') Back
button.button.is-teal(v-on:click='proceedToDbcheck', v-if='!loading && !dbcheck.ok') Try Again
button.button.is-indigo(v-on:click='proceedToPaths', v-if='loading || dbcheck.ok', v-bind:disabled='loading') Continue
//- ==============================================
//- PATHS
//- ==============================================
template(v-else-if='state === "paths"')
.panel
h2.panel-title.is-featured
span Paths
i(v-if='loading')
.panel-content.is-text
p It is recommended to leave the default values.
.panel-content.form-sections
section
p.control.is-fullwidth
label.label Local Data Path
input(type='text', placeholder='e.g. ./data', v-model='conf.pathData', data-vv-scope='paths', name='ipt-datapath', v-validate='{ required: true, min: 2 }')
span.desc The path where cache (processed content, thumbnails, search index, etc.) will be stored on disk.
section
p.control.is-fullwidth
label.label Local Repository Path
input(type='text', placeholder='e.g. ./repo', v-model='conf.pathRepo', data-vv-scope='paths', name='ipt-repopath', v-validate='{ required: true, min: 2 }')
span.desc The path where the local git repository will be created, used to store content in markdown files and uploads.
.panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToDb', v-bind:disabled='loading') Back
button.button.is-indigo(v-on:click='proceedToGit', v-bind:disabled='loading || errors.any("paths")') Continue
//- ==============================================
//- GIT
//- ==============================================
template(v-else-if='state === "git"')
.panel
h2.panel-title.is-featured
span Git Repository
i(v-if='loading')
.panel-content.is-text
p Wiki.js stores article content and uploads locally on disk. All content is then regularly kept in sync with a remote git repository. This acts a backup protection and provides history / revert features. While optional, it is <strong>HIGHLY</strong> recommended to setup the remote git repository connection.
.panel-content.form-sections
section.columns
.column.is-two-thirds
p.control.is-fullwidth
label.label Repository URL
input(type='text', placeholder='e.g. git@github.com/org/repo.git or https://github.com/org/repo', v-model='conf.gitUrl', data-vv-scope='git', name='ipt-giturl', v-validate='{ required: true, min: 5 }')
span.desc The full git repository URL to connect to.
.column
p.control.is-fullwidth
label.label Branch
input(type='text', placeholder='e.g. master', v-model='conf.gitBranch', data-vv-scope='git', name='ipt-gitbranch', v-validate='{ required: true, min: 2 }')
span.desc The git branch to use when synchronizing changes.
section.columns
.column.is-one-third
p.control.is-fullwidth
label.label Authentication
select(v-model='conf.gitAuthType')
option(value='ssh') SSH (recommended)
option(value='basic') Basic
span.desc The authentication method used to connect to your remote Git repository.
p.control.is-fullwidth
input#ipt-git-verify-ssl(type='checkbox', v-model='conf.gitAuthSSL')
label.label(for='ipt-git-verify-ssl') Verify SSL
.column(v-show='conf.gitAuthType === "basic"')
p.control.is-fullwidth
label.label Username
input(type='text', v-model='conf.gitUrl')
span.desc The username for the remote git connection.
.column(v-show='conf.gitAuthType === "basic"')
p.control.is-fullwidth
label.label Password
input(type='password', v-model='conf.gitUrl')
span.desc The password for the remote git connection.
.column(v-show='conf.gitAuthType === "ssh"')
p.control.is-fullwidth
label.label Private Key location
input(type='text', placeholder='e.g. /etc/wiki/keys/git.pem')
span.desc The full path to the private key on disk.
section.columns
.column
p.control.is-fullwidth
label.label Sync User Name
input(type='text', placeholder='e.g. John Smith', v-model.number='conf.gitSignatureName', data-vv-scope='git', name='ipt-gitsigname', v-validate='{ required: true }')
span.desc The name to use when pushing commits to the git repository.
.column
p.control.is-fullwidth
label.label Sync User Email
input(type='text', placeholder='e.g. user@example.com', v-model.number='conf.gitSignatureEmail', data-vv-scope='git', name='ipt-gitsigemail', v-validate='{ required: true, email: true }')
span.desc The email to use when pushing commits to the git repository.
.panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToDb', v-bind:disabled='loading') Back
button.button.is-indigo.is-outlined(v-on:click='proceedToAdmin', v-bind:disabled='loading') Skip this step
button.button.is-indigo(v-on:click='proceedToGitCheck', v-bind:disabled='loading || errors.any("git")') Continue
//- ==============================================
//- GIT CHECK
//- ==============================================
template(v-else-if='state === "gitcheck"')
.panel
h2.panel-title.is-featured
span Git Repository Check
i(v-if='loading')
.panel-content.is-text
p(v-if='loading') #[i.icon-loader.animated.rotateIn.infinite] Testing the connection to Git repository...
p(v-if='!loading && gitcheck.ok')
ul
li(v-for='rs in gitcheck.results') #[i.icon-check] {{rs}}
p(v-if='!loading && gitcheck.ok')
i.icon-check
strong Git settings are correct!
p(v-if='!loading && !gitcheck.ok') #[i.icon-square-cross] Error: {{ gitcheck.error }}
.panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToGit', v-bind:disabled='loading') Back
button.button.is-teal(v-on:click='proceedToGitCheck', v-if='!loading && !gitcheck.ok') Try Again
button.button.is-indigo(v-on:click='proceedToAdmin', v-if='loading || gitcheck.ok', v-bind:disabled='loading') Continue
//- ==============================================
//- ADMINISTRATOR ACCOUNT
//- ==============================================
template(v-else-if='state === "admin"')
.panel
h2.panel-title.is-featured
span Administrator Account
i(v-if='loading')
.panel-content.is-text
p An administrator account will be created for local authentication. From this account, you can create or authorize more users.
.panel-content.form-sections
section
p.control.is-fullwidth
label.label Administrator Email
input(type='text', placeholder='e.g. admin@example.com', v-model='conf.adminEmail', data-vv-scope='admin', name='ipt-adminemail', v-validate='{ required: true, email: true }')
span.desc The full git repository URL to connect to.
section.columns
.column
p.control.is-fullwidth
label.label Password
input(type='password', v-model='conf.adminPassword', data-vv-scope='admin', name='ipt-adminpwd', v-validate='{ required: true, min: 8 }')
span.desc The full git repository URL to connect to.
.column
p.control.is-fullwidth
label.label Confirm Password
input(type='password', v-model='conf.adminPasswordConfirm', data-vv-scope='admin', name='ipt-adminpwd2', v-validate='{ required: true, confirmed: "ipt-adminpwd" }')
span.desc The git branch to use when synchronizing changes.
.panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToGit', v-bind:disabled='loading') Back
button.button.is-indigo(v-on:click='proceedToFinal', v-bind:disabled='loading || errors.any("admin")') Continue
//- ==============================================
//- FINAL
//- ==============================================
template(v-else-if='state === "final"')
.panel
h2.panel-title.is-featured
span Finalizing
i(v-if='loading')
.panel-content.is-text
p(v-if='loading') #[i.icon-loader.animated.rotateIn.infinite] Finalizing your installation...
p(v-if='!loading && final.ok')
ul
li(v-for='rs in final.results') #[i.icon-check] {{rs}}
p(v-if='!loading && final.ok')
i.icon-check
strong Wiki.js was configured successfully and is now ready for use.
p(v-if='!loading && final.ok')
| Click the <strong>Start</strong> button below to start the Wiki.js server.
p(v-if='!loading && !final.ok') #[i.icon-square-cross] Error: {{ final.error }}
.panel-footer
.progress-bar: div(v-bind:style='{width: currentProgress}')
button.button.is-indigo.is-outlined(v-on:click='proceedToWelcome', v-bind:disabled='loading') Back
button.button.is-teal(v-on:click='proceedToFinal', v-if='!loading && !final.ok') Try Again
button.button.is-green(v-on:click='finish', v-if='loading || final.ok', v-bind:disabled='loading') Start
footer.footer footer.footer
span span
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment