diff --git a/assets/js/app.min.js b/assets/js/app.min.js index d57e253c..0aa1adcc 100644 --- a/assets/js/app.min.js +++ b/assets/js/app.min.js @@ -1 +1 @@ -$(document).ready(function(){$(document).pjax("a[data-pjax]","#content")}),$(document).on("ready pjax:success",function(){function a(a){this.style.height="5px",this.style.height=this.scrollHeight+"px"}if($("textarea").each(a),$("textarea").keyup(a),$(window).resize(function(){$("textarea").each(a)}),$("#logout").click(function(a){return a.preventDefault(),$.ajax({type:"GET",url:"/admin",async:!1,username:"username",password:"password",headers:{Authorization:"Basic xxx"}}).fail(function(){window.location="/"}),!1}),$("body").on("click",".delete",function(a){return a.preventDefault(),button=$(this),button.data("file")&&confirm("Are you sure you want to delete this?")?$.ajax({type:"DELETE",url:button.data("file")}).done(function(a){button.parent().parent().fadeOut(),notification({text:button.data("message"),type:"success",timeout:5e3})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}):(name=button.parent().parent().attr("for")||button.parent().parent().attr("id")||button.parent().parent().parent().attr("id"),name=name.replace(/\[/,"\\["),name=name.replace(/\]/,"\\]"),console.log(name),$('label[for="'+name+'"]').fadeOut().remove(),$("#"+name).fadeOut().remove()),!1}),$("main").hasClass("browse")&&($(".new").click(function(a){return a.preventDefault(),$(this).data("opened")?($("#new-file").fadeOut(200),$(this).data("opened",!1)):($("#new-file").fadeIn(200),$(this).data("opened",!0)),!1}),$("#new-file").on("keypress","input",function(a){if(13==a.keyCode){a.preventDefault();var b=$(this).val(),c=b.split(":"),d="",e="";if(""==b)return notification({text:"You have to write something. If you want to close the box, click the button again.",type:"warning",timeout:5e3}),!1;if(1==c.length)d=b;else{if(2!=c.length)return notification({text:"Hmm... I don't understand you. Try writing something like 'name[:archetype]'.",type:"error"}),!1;d=c[0],e=c[1]}var f='{"filename": "'+d+'", "archetype": "'+e+'"}';return $.ajax({type:"POST",url:window.location.pathname,data:f,dataType:"json",encode:!0}).done(function(a){notification({text:"File created successfully.",type:"success",timeout:5e3}),$.pjax({url:window.location.pathname.replace("browse","edit")+d,container:"#content"})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1}}),$("#upload").click(function(a){return a.preventDefault(),$('.actions input[type="file"]').click(),!1}),$('input[type="file"]').on("change",function(a){a.preventDefault(),files=a.target.files;var b=new FormData;return $.each(files,function(a,c){b.append(a,c)}),$.ajax({url:window.location.pathname,type:"POST",data:b,cache:!1,dataType:"json",headers:{"X-Upload":"true"},processData:!1,contentType:!1}).done(function(a){notification({text:"File(s) uploaded successfully.",type:"success",timeout:5e3}),$.pjax({url:window.location.pathname,container:"#content"})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1})),$(".editor")[0]){var b=$("#source-area").data("mode"),c=ace.edit("source-area");c.getSession().setMode("ace/mode/"+b),c.setOptions({wrap:!0,maxLines:1/0,theme:"ace/theme/github",showPrintMargin:!1,fontSize:"1em"}),preview=$("#preview-area"),textarea=$("#content-area"),$("body").on("keypress","input",function(a){return 13==a.keyCode?(a.preventDefault(),$('input[value="Save"]').focus().click(),!1):void 0}),$("form").submit(function(a){a.preventDefault(),$("#preview-area").html("").fadeOut(),$("#preview").data("previewing","false"),$(".CodeMirror").fadeIn(),"undefined"!=typeof c&&c&&c.save();var b=JSON.stringify($(this).serializeJSON()),d=$(this).find("input[type=submit]:focus");return $.ajax({type:"POST",url:window.location,data:b,headers:{"X-Regenerate":d.data("regenerate"),"X-Schedule":d.data("schedule"),"X-Content-Type":d.data("type")},dataType:"json",encode:!0,contentType:"application/json; charset=utf-8"}).done(function(a){notification({text:d.data("message"),type:"success",timeout:5e3})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1}),$("body").on("click",".add",function(a){if(a.preventDefault(),defaultID="lorem-ipsum-sin-dolor-amet",$("#"+defaultID).length)return!1;if(block=$(this).parent().parent(),blockType=block.data("type"),blockID=block.attr("id"),block.is("div")&&block.hasClass("frontmatter")&&(block=$(".blocks"),block.append('
'),blockType="object"),"array"==blockType&&(newID=blockID+"[]",input=blockID,input=input.replace(/\[/,"\\["),input=input.replace(/\]/,"\\]"),block.append('
div").length+'" data-type="array-item">
')),"object"==blockType){if(newItem=$("#"+defaultID),newItem.html(''),field=$("#name-"+defaultID),!document.cookie.replace(/(?:(?:^|.*;\s*)placeholdertip\s*\=\s*([^;]*).*$)|^.*$/,"$1")){var b=new Date;b.setDate(b.getDate()+365),document.cookie="placeholdertip=true; expires="+b.toUTCString+"; path=/",notification({text:'Write the field name and then press enter. If you want to create an array or an object, end the name with ":array" or ":object".',type:"information"})}$(field).keypress(function(a){return 13==a.which?(a.preventDefault(),value=field.val(),""==value?(newItem.remove(),!1):(elements=value.split(":"),elements.length>2?(notification({text:"Invalid syntax. It must be 'name[:type]'.",type:"error"}),!1):2==elements.length&&"array"!=elements[1]&&"object"!=elements[1]?(notification({text:"Only arrays and objects are allowed.",type:"error"}),!1):(field.remove(),"undefined"==typeof blockID?blockID=elements[0]:blockID=blockID+"["+elements[0]+"]",1==elements.length?(newItem.attr("id","block-"+blockID),newItem.append('
'),newItem.prepend(' ')):(type="","array"==elements[1]?type="array":type="object",template='

${elements[0]}

',template=template.replace("${blockID}",blockID),template=template.replace("${elements[0]}",elements[0]),template=template.replace("${type}",type),newItem.after(template),newItem.remove(),console.log('"'+blockID+'" block of type "'+type+'" added.')),!1))):void 0})}return!1}),textarea[0]&&(options={mode:textarea.data("mode"),theme:"ttcn",lineWrapping:!0,lineNumbers:!0,scrollbarStyle:null},"markdown"==textarea.data("mode")&&(options.lineNumbers=!1),c=CodeMirror.fromTextArea(textarea[0],options),codemirror=$(".CodeMirror"),$("#preview").click(function(a){if(a.preventDefault(),"true"==$(this).data("previewing"))preview.hide(),codemirror.fadeIn(),$(this).data("previewing","false"),notification({text:"Think, relax and do the better you can!",type:"information",timeout:2e3});else{c.save();var b=new showdown.Converter,d=textarea.val(),e=b.makeHtml(d);codemirror.hide(),preview.html(e).fadeIn(),$(this).data("previewing","true"),notification({text:"This is how your post looks like.",type:"information",timeout:2e3})}return!1}))}}),$.noty.themes.admin={name:"admin",helpers:{},modal:{css:{position:"fixed",width:"100%",height:"100%",backgroundColor:"#000",zIndex:1e4,opacity:.6,display:"none",left:0,top:0}}},$.noty.defaults={layout:"topRight",theme:"admin",dismissQueue:!0,animation:{open:"animated bounceInRight",close:"animated fadeOut",easing:"swing",speed:500},timeout:!1,force:!1,modal:!1,maxVisible:5,killer:!1,closeWith:["click"],callback:{onShow:function(){},afterShow:function(){},onClose:function(){},afterClose:function(){},onCloseClick:function(){}},buttons:!1},notification=function(a){var b;switch(a.type){case"success":b='';break;case"error":b='';break;case"warning":b='';break;case"information":b='';break;default:b=''}var c={template:'
'+b+'
'};if(a=$.extend({},c,a),noty(a),!document.cookie.replace(/(?:(?:^|.*;\s*)stickynoties\s*\=\s*([^;]*).*$)|^.*$/,"$1")&&!a.timeout){var d=new Date;d.setDate(d.getDate()+365),document.cookie="stickynoties=true; expires="+d.toUTCString+"; path=/",notification({text:"Some notifications are sticky. If it doesn't go away, click to dismiss it.",type:"information"})}}; \ No newline at end of file +$(document).ready(function(){$(document).pjax("a[data-pjax]","#content")}),$(document).on("ready pjax:success",function(){function a(a){this.style.height="5px",this.style.height=this.scrollHeight+"px"}return document.title=document.getElementById("site-title").innerHTML,$("textarea").each(a),$("textarea").keyup(a),$(window).resize(function(){$("textarea").each(a)}),$("#logout").click(function(a){return a.preventDefault(),$.ajax({type:"GET",url:"/admin",async:!1,username:"username",password:"password",headers:{Authorization:"Basic xxx"}}).fail(function(){window.location="/"}),!1}),$("main").hasClass("browse")&&$(document).trigger("page:browse"),$(".editor")[0]&&$(document).trigger("page:editor"),!1}),$(document).on("page:browse",function(){$("body").off("click",".delete").on("click",".delete",function(a){return a.preventDefault(),button=$(this),$.ajax({type:"DELETE",url:button.data("file")}).done(function(a){button.parent().parent().fadeOut(),notification({text:button.data("message"),type:"success",timeout:5e3})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1}),$(".new").click(function(a){return a.preventDefault(),$(this).data("opened")?($("#new-file").fadeOut(200),$(this).data("opened",!1)):($("#new-file").fadeIn(200),$(this).data("opened",!0)),!1}),$("#new-file").on("keypress","input",function(a){if(13==a.keyCode){a.preventDefault();var b=$(this).val(),c=b.split(":"),d="",e="";if(""==b)return notification({text:"You have to write something. If you want to close the box, click the button again.",type:"warning",timeout:5e3}),!1;if(1==c.length)d=b;else{if(2!=c.length)return notification({text:"Hmm... I don't understand you. Try writing something like 'name[:archetype]'.",type:"error"}),!1;d=c[0],e=c[1]}var f='{"filename": "'+d+'", "archetype": "'+e+'"}';return $.ajax({type:"POST",url:window.location.pathname,data:f,dataType:"json",encode:!0}).done(function(a){notification({text:"File created successfully.",type:"success",timeout:5e3}),$.pjax({url:window.location.pathname.replace("browse","edit")+d,container:"#content"})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1}}),$("#upload").click(function(a){return a.preventDefault(),$('.actions input[type="file"]').click(),!1}),$('input[type="file"]').on("change",function(a){a.preventDefault(),files=a.target.files;var b=new FormData;return $.each(files,function(a,c){b.append(a,c)}),$.ajax({url:window.location.pathname,type:"POST",data:b,cache:!1,dataType:"json",headers:{"X-Upload":"true"},processData:!1,contentType:!1}).done(function(a){notification({text:"File(s) uploaded successfully.",type:"success",timeout:5e3}),$.pjax({url:window.location.pathname,container:"#content"})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1})}),$(document).on("page:editor",function(){var a=$("#source-area").data("mode"),b=ace.edit("source-area");b.getSession().setMode("ace/mode/"+a),b.setOptions({wrap:!0,maxLines:1/0,theme:"ace/theme/github",showPrintMargin:!1,fontSize:"1em"}),preview=$("#preview-area"),textarea=$("#content-area"),$("body").on("keypress","input",function(a){return 13==a.keyCode?(a.preventDefault(),$('input[value="Save"]').focus().click(),!1):void 0}),$("form").submit(function(a){a.preventDefault(),$("#preview-area").html("").fadeOut(),$("#preview").data("previewing","false"),$(".CodeMirror").fadeIn(),"undefined"!=typeof b&&b&&b.save();var c=JSON.stringify($(this).serializeJSON()),d=$(this).find("input[type=submit]:focus");return $.ajax({type:"POST",url:window.location,data:c,headers:{"X-Regenerate":d.data("regenerate"),"X-Schedule":d.data("schedule"),"X-Content-Type":d.data("type")},dataType:"json",encode:!0,contentType:"application/json; charset=utf-8"}).done(function(a){notification({text:d.data("message"),type:"success",timeout:5e3})}).fail(function(a){notification({text:"Something went wrong.",type:"error"}),console.log(a)}),!1}),$("body").on("click",".add",function(a){if(a.preventDefault(),defaultID="lorem-ipsum-sin-dolor-amet",$("#"+defaultID).length)return!1;if(block=$(this).parent().parent(),blockType=block.data("type"),blockID=block.attr("id"),block.is("div")&&block.hasClass("frontmatter")&&(block=$(".blocks"),block.append('
'),blockType="object"),"array"==blockType&&(newID=blockID+"[]",input=blockID,input=input.replace(/\[/,"\\["),input=input.replace(/\]/,"\\]"),block.append('
div").length+'" data-type="array-item">
')),"object"==blockType){if(newItem=$("#"+defaultID),newItem.html(''),field=$("#name-"+defaultID),!document.cookie.replace(/(?:(?:^|.*;\s*)placeholdertip\s*\=\s*([^;]*).*$)|^.*$/,"$1")){var b=new Date;b.setDate(b.getDate()+365),document.cookie="placeholdertip=true; expires="+b.toUTCString+"; path=/",notification({text:'Write the field name and then press enter. If you want to create an array or an object, end the name with ":array" or ":object".',type:"information"})}$(field).keypress(function(a){return 13==a.which?(a.preventDefault(),value=field.val(),""==value?(newItem.remove(),!1):(elements=value.split(":"),elements.length>2?(notification({text:"Invalid syntax. It must be 'name[:type]'.",type:"error"}),!1):2==elements.length&&"array"!=elements[1]&&"object"!=elements[1]?(notification({text:"Only arrays and objects are allowed.",type:"error"}),!1):(field.remove(),"undefined"==typeof blockID?blockID=elements[0]:blockID=blockID+"["+elements[0]+"]",1==elements.length?(newItem.attr("id","block-"+blockID),newItem.append('
'),newItem.prepend(' ')):(type="","array"==elements[1]?type="array":type="object",template='

${elements[0]}

',template=template.replace("${blockID}",blockID),template=template.replace("${elements[0]}",elements[0]),template=template.replace("${type}",type),newItem.after(template),newItem.remove(),console.log('"'+blockID+'" block of type "'+type+'" added.')),!1))):void 0})}return!1}),textarea[0]&&(options={mode:textarea.data("mode"),theme:"ttcn",lineWrapping:!0,lineNumbers:!0,scrollbarStyle:null},"markdown"==textarea.data("mode")&&(options.lineNumbers=!1),b=CodeMirror.fromTextArea(textarea[0],options),codemirror=$(".CodeMirror"),$("#preview").click(function(a){if(a.preventDefault(),"true"==$(this).data("previewing"))preview.hide(),codemirror.fadeIn(),$(this).data("previewing","false"),notification({text:"Think, relax and do the better you can!",type:"information",timeout:2e3});else{b.save();var c=new showdown.Converter,d=textarea.val(),e=c.makeHtml(d);codemirror.hide(),preview.html(e).fadeIn(),$(this).data("previewing","true"),notification({text:"This is how your post looks like.",type:"information",timeout:2e3})}return!1})),$("body").on("click",".delete",function(a){return a.preventDefault(),button=$(this),name=button.parent().parent().attr("for")||button.parent().parent().attr("id")||button.parent().parent().parent().attr("id"),name=name.replace(/\[/,"\\["),name=name.replace(/\]/,"\\]"),console.log(name),$('label[for="'+name+'"]').fadeOut().remove(),$("#"+name).fadeOut().remove(),!1})}),$.noty.themes.admin={name:"admin",helpers:{},modal:{css:{position:"fixed",width:"100%",height:"100%",backgroundColor:"#000",zIndex:1e4,opacity:.6,display:"none",left:0,top:0}}},$.noty.defaults={layout:"topRight",theme:"admin",dismissQueue:!0,animation:{open:"animated bounceInRight",close:"animated fadeOut",easing:"swing",speed:500},timeout:!1,force:!1,modal:!1,maxVisible:5,killer:!1,closeWith:["click"],callback:{onShow:function(){},afterShow:function(){},onClose:function(){},afterClose:function(){},onCloseClick:function(){}},buttons:!1},notification=function(a){var b;switch(a.type){case"success":b='';break;case"error":b='';break;case"warning":b='';break;case"information":b='';break;default:b=''}var c={template:'
'+b+'
'};if(a=$.extend({},c,a),noty(a),!document.cookie.replace(/(?:(?:^|.*;\s*)stickynoties\s*\=\s*([^;]*).*$)|^.*$/,"$1")&&!a.timeout){var d=new Date;d.setDate(d.getDate()+365),document.cookie="stickynoties=true; expires="+d.toUTCString+"; path=/",notification({text:"Some notifications are sticky. If it doesn't go away, click to dismiss it.",type:"information"})}}; \ No newline at end of file diff --git a/assets/src/js/app.js b/assets/src/js/app.js index 23fce6cc..d25961c2 100644 --- a/assets/src/js/app.js +++ b/assets/src/js/app.js @@ -1,20 +1,19 @@ $(document).ready(function() { - // Start pjax $(document).pjax('a[data-pjax]', '#content'); }); $(document).on('ready pjax:success', function() { + // Update the title + document.title = document.getElementById('site-title').innerHTML; + // Auto Grow Textarea function autoGrow(element) { this.style.height = "5px"; this.style.height = (this.scrollHeight) + "px"; } - // Auto Grow textareas after loading $("textarea").each(autoGrow); - // Auto Grow textareas when changing its content $('textarea').keyup(autoGrow); - // Auto Grow textareas when resizing the window $(window).resize(function() { $("textarea").each(autoGrow); }); @@ -37,415 +36,13 @@ $(document).on('ready pjax:success', function() { return false; }); - // Delete a file or a field in editor - $("body").on('click', '.delete', function(event) { - event.preventDefault(); - button = $(this); - - if (button.data("file") && confirm("Are you sure you want to delete this?")) { - $.ajax({ - type: 'DELETE', - url: button.data("file") - }).done(function(data) { - button.parent().parent().fadeOut(); - notification({ - text: button.data("message"), - type: 'success', - timeout: 5000 - }); - }).fail(function(data) { - notification({ - text: 'Something went wrong.', - type: 'error' - }); - console.log(data); - }); - } else { - name = button.parent().parent().attr("for") || button.parent().parent().attr("id") || button.parent().parent().parent().attr("id"); - name = name.replace(/\[/, '\\['); - name = name.replace(/\]/, '\\]'); - console.log(name) - - $('label[for="' + name + '"]').fadeOut().remove(); - $('#' + name).fadeOut().remove(); - } - - return false; - }); - if ($('main').hasClass('browse')) { - $('.new').click(function(event) { - event.preventDefault(); - - if ($(this).data("opened")) { - $('#new-file').fadeOut(200); - $(this).data("opened", false); - } else { - $('#new-file').fadeIn(200); - $(this).data("opened", true); - } - - return false; - }); - - $('#new-file').on('keypress', 'input', function(event) { - if (event.keyCode == 13) { - event.preventDefault(); - var value = $(this).val(), - splited = value.split(":"), - filename = "", - archetype = ""; - - if (value == "") { - notification({ - text: "You have to write something. If you want to close the box, click the button again.", - type: 'warning', - timeout: 5000 - }); - - return false; - } else if (splited.length == 1) { - filename = value; - } else if (splited.length == 2) { - filename = splited[0]; - archetype = splited[1]; - } else { - notification({ - text: "Hmm... I don't understand you. Try writing something like 'name[:archetype]'.", - type: 'error' - }); - - return false; - } - - var content = '{"filename": "' + filename + '", "archetype": "' + archetype + '"}'; - - $.ajax({ - type: 'POST', - url: window.location.pathname, - data: content, - dataType: 'json', - encode: true, - }).done(function(data) { - notification({ - text: "File created successfully.", - type: 'success', - timeout: 5000 - }); - - $.pjax({ - url: window.location.pathname.replace("browse", "edit") + filename, - container: '#content' - }) - }).fail(function(data) { - // error types - notification({ - text: 'Something went wrong.', - type: 'error' - }); - console.log(data); - }); - - return false; - } - }); - - $("#upload").click(function(event) { - event.preventDefault(); - $('.actions input[type="file"]').click(); - return false; - }); - - $('input[type="file"]').on('change', function(event) { - event.preventDefault(); - files = event.target.files; - - // Create a formdata object and add the files - var data = new FormData(); - $.each(files, function(key, value) { - data.append(key, value); - }); - - $.ajax({ - url: window.location.pathname, - type: 'POST', - data: data, - cache: false, - dataType: 'json', - headers: { - 'X-Upload': 'true', - }, - processData: false, - contentType: false, - }).done(function(data) { - notification({ - text: "File(s) uploaded successfully.", - type: 'success', - timeout: 5000 - }); - - $.pjax({ - url: window.location.pathname, - container: '#content' - }) - }).fail(function(data) { - notification({ - text: 'Something went wrong.', - type: 'error' - }); - console.log(data); - }); - return false; - }); + $(document).trigger("page:browse"); } - // If it's editor page if ($(".editor")[0]) { - var mode = $("#source-area").data('mode'); - var editor = ace.edit("source-area"); - editor.getSession().setMode("ace/mode/" + mode); - editor.setOptions({ - wrap: true, - maxLines: Infinity, - theme: "ace/theme/github", - showPrintMargin: false, - fontSize: "1em" - }); - - - preview = $("#preview-area"); - textarea = $("#content-area"); - - $('body').on('keypress', 'input', function(event) { - if (event.keyCode == 13) { - event.preventDefault(); - $('input[value="Save"]').focus().click(); - return false; - } - }); - - //TODO: reform this - // Submites any form in the page in JSON format - $('form').submit(function(event) { - event.preventDefault(); - - // Reset preview area and button to make sure it will - // not serialize any form inside the preview - $('#preview-area').html('').fadeOut(); - $('#preview').data("previewing", "false"); - $('.CodeMirror').fadeIn(); - - // Save editor values - if (typeof editor !== 'undefined' && editor) { - editor.save(); - } - - var data = JSON.stringify($(this).serializeJSON()), - button = $(this).find("input[type=submit]:focus"); - - $.ajax({ - type: 'POST', - url: window.location, - data: data, - headers: { - 'X-Regenerate': button.data("regenerate"), - 'X-Schedule': button.data("schedule"), - 'X-Content-Type': button.data("type") - }, - dataType: 'json', - encode: true, - contentType: "application/json; charset=utf-8", - }).done(function(data) { - notification({ - text: button.data("message"), - type: 'success', - timeout: 5000 - }); - }).fail(function(data) { - notification({ - text: 'Something went wrong.', - type: 'error' - }); - console.log(data); - }); - - return false; - }); - - // Adds one more field to the current group - $("body").on('click', '.add', function(event) { - event.preventDefault(); - defaultID = "lorem-ipsum-sin-dolor-amet"; - - if ($("#" + defaultID).length) { - return false; - } - - block = $(this).parent().parent(); - blockType = block.data("type"); - blockID = block.attr("id"); - - // Main add button, after all blocks - if (block.is('div') && block.hasClass("frontmatter")) { - block = $('.blocks'); - block.append('
'); - blockType = "object"; - } - - // If the Block Type is an array - if (blockType == "array") { - newID = blockID + "[]"; - input = blockID; - input = input.replace(/\[/, '\\['); - input = input.replace(/\]/, '\\]'); - block.append('
'); - } - - // If the Block is an object - if (blockType == "object") { - newItem = $("#" + defaultID); - newItem.html(''); - field = $("#name-" + defaultID); - - // Show a notification with some information for newbies - if (!document.cookie.replace(/(?:(?:^|.*;\s*)placeholdertip\s*\=\s*([^;]*).*$)|^.*$/, "$1")) { - var date = new Date(); - date.setDate(date.getDate() + 365); - document.cookie = 'placeholdertip=true; expires=' + date.toUTCString + '; path=/'; - - notification({ - text: 'Write the field name and then press enter. If you want to create an array or an object, end the name with ":array" or ":object".', - type: 'information' - }); - } - - $(field).keypress(function(event) { - // When you press enter within the new name field: - if (event.which == 13) { - event.preventDefault(); - // This var should have a value of the type "name[:array, :object]" - value = field.val(); - - if (value == "") { - newItem.remove(); - return false; - } - - elements = value.split(":") - - if (elements.length > 2) { - notification({ - text: "Invalid syntax. It must be 'name[:type]'.", - type: 'error' - }); - return false; - } - - if (elements.length == 2 && elements[1] != "array" && elements[1] != "object") { - notification({ - text: "Only arrays and objects are allowed.", - type: 'error' - }); - return false; - } - - field.remove(); - - // TODO: continue here. :) 04/02/2016 10:30pm - - if (typeof blockID === "undefined") { - blockID = elements[0]; - } else { - blockID = blockID + '[' + elements[0] + ']'; - } - - if (elements.length == 1) { - newItem.attr('id', 'block-' + blockID); - newItem.append('
'); - newItem.prepend(' '); - } else { - type = ""; - - if (elements[1] == "array") { - type = "array"; - } else { - type = "object" - } - - template = "

${elements[0]}

" - template = template.replace("${blockID}", blockID); - template = template.replace("${elements[0]}", elements[0]); - template = template.replace("${type}", type); - newItem.after(template); - newItem.remove(); - - console.log('"' + blockID + '" block of type "' + type + '" added.'); - } - - return false; - } - }); - } - - return false; - }); - - // If it has a textarea - if (textarea[0]) { - options = { - mode: textarea.data("mode"), - theme: 'ttcn', - lineWrapping: true, - lineNumbers: true, - scrollbarStyle: null - } - - if (textarea.data("mode") == "markdown") { - options.lineNumbers = false - } - - editor = CodeMirror.fromTextArea(textarea[0], options); - codemirror = $('.CodeMirror'); - - // Toggles between preview and editing mode - $("#preview").click(function(event) { - event.preventDefault(); - - // If it currently in the preview mode, hide the preview - // and show the editor - if ($(this).data("previewing") == "true") { - preview.hide(); - codemirror.fadeIn(); - $(this).data("previewing", "false"); - notification({ - text: "Think, relax and do the better you can!", - type: 'information', - timeout: 2000 - }); - } else { - // Copy the editor content to texteare - editor.save() - - // If it's in editing mode, convert the markdown to html - // and show it - var converter = new showdown.Converter(), - text = textarea.val(), - html = converter.makeHtml(text); - - // Hide the editor and show the preview - codemirror.hide(); - preview.html(html).fadeIn(); - - $(this).data("previewing", "true"); - notification({ - text: "This is how your post looks like.", - type: 'information', - timeout: 2000 - }); - } - - return false; - }); - } + $(document).trigger("page:editor"); } + + return false; }); diff --git a/assets/src/js/browse.js b/assets/src/js/browse.js new file mode 100644 index 00000000..6086b263 --- /dev/null +++ b/assets/src/js/browse.js @@ -0,0 +1,150 @@ +$(document).on('page:browse', function() { + $("body").off('click', '.delete').on('click', '.delete', function(event) { + event.preventDefault(); + button = $(this); + + $.ajax({ + type: 'DELETE', + url: button.data("file") + }).done(function(data) { + button.parent().parent().fadeOut(); + notification({ + text: button.data("message"), + type: 'success', + timeout: 5000 + }); + }).fail(function(data) { + notification({ + text: 'Something went wrong.', + type: 'error' + }); + console.log(data); + }); + + return false; + }); + + $('.new').click(function(event) { + event.preventDefault(); + + if ($(this).data("opened")) { + $('#new-file').fadeOut(200); + $(this).data("opened", false); + } else { + $('#new-file').fadeIn(200); + $(this).data("opened", true); + } + + return false; + }); + + $('#new-file').on('keypress', 'input', function(event) { + if (event.keyCode == 13) { + event.preventDefault(); + var value = $(this).val(), + splited = value.split(":"), + filename = "", + archetype = ""; + + if (value == "") { + notification({ + text: "You have to write something. If you want to close the box, click the button again.", + type: 'warning', + timeout: 5000 + }); + + return false; + } else if (splited.length == 1) { + filename = value; + } else if (splited.length == 2) { + filename = splited[0]; + archetype = splited[1]; + } else { + notification({ + text: "Hmm... I don't understand you. Try writing something like 'name[:archetype]'.", + type: 'error' + }); + + return false; + } + + var content = '{"filename": "' + filename + '", "archetype": "' + archetype + '"}'; + + $.ajax({ + type: 'POST', + url: window.location.pathname, + data: content, + dataType: 'json', + encode: true, + }).done(function(data) { + notification({ + text: "File created successfully.", + type: 'success', + timeout: 5000 + }); + + $.pjax({ + url: window.location.pathname.replace("browse", "edit") + filename, + container: '#content' + }) + }).fail(function(data) { + // error types + notification({ + text: 'Something went wrong.', + type: 'error' + }); + console.log(data); + }); + + return false; + } + }); + + $("#upload").click(function(event) { + event.preventDefault(); + $('.actions input[type="file"]').click(); + return false; + }); + + $('input[type="file"]').on('change', function(event) { + event.preventDefault(); + files = event.target.files; + + // Create a formdata object and add the files + var data = new FormData(); + $.each(files, function(key, value) { + data.append(key, value); + }); + + $.ajax({ + url: window.location.pathname, + type: 'POST', + data: data, + cache: false, + dataType: 'json', + headers: { + 'X-Upload': 'true', + }, + processData: false, + contentType: false, + }).done(function(data) { + notification({ + text: "File(s) uploaded successfully.", + type: 'success', + timeout: 5000 + }); + + $.pjax({ + url: window.location.pathname, + container: '#content' + }) + }).fail(function(data) { + notification({ + text: 'Something went wrong.', + type: 'error' + }); + console.log(data); + }); + return false; + }); +}); diff --git a/assets/src/js/editor.js b/assets/src/js/editor.js new file mode 100644 index 00000000..454fcb73 --- /dev/null +++ b/assets/src/js/editor.js @@ -0,0 +1,263 @@ +$(document).on('page:editor', function() { + var mode = $("#source-area").data('mode'); + var editor = ace.edit("source-area"); + editor.getSession().setMode("ace/mode/" + mode); + editor.setOptions({ + wrap: true, + maxLines: Infinity, + theme: "ace/theme/github", + showPrintMargin: false, + fontSize: "1em" + }); + + + preview = $("#preview-area"); + textarea = $("#content-area"); + + $('body').on('keypress', 'input', function(event) { + if (event.keyCode == 13) { + event.preventDefault(); + $('input[value="Save"]').focus().click(); + return false; + } + }); + + //TODO: reform this + // Submites any form in the page in JSON format + $('form').submit(function(event) { + event.preventDefault(); + + // Reset preview area and button to make sure it will + // not serialize any form inside the preview + $('#preview-area').html('').fadeOut(); + $('#preview').data("previewing", "false"); + $('.CodeMirror').fadeIn(); + + // Save editor values + if (typeof editor !== 'undefined' && editor) { + editor.save(); + } + + var data = JSON.stringify($(this).serializeJSON()), + button = $(this).find("input[type=submit]:focus"); + + $.ajax({ + type: 'POST', + url: window.location, + data: data, + headers: { + 'X-Regenerate': button.data("regenerate"), + 'X-Schedule': button.data("schedule"), + 'X-Content-Type': button.data("type") + }, + dataType: 'json', + encode: true, + contentType: "application/json; charset=utf-8", + }).done(function(data) { + notification({ + text: button.data("message"), + type: 'success', + timeout: 5000 + }); + }).fail(function(data) { + notification({ + text: 'Something went wrong.', + type: 'error' + }); + console.log(data); + }); + + return false; + }); + + // Adds one more field to the current group + $("body").on('click', '.add', function(event) { + event.preventDefault(); + defaultID = "lorem-ipsum-sin-dolor-amet"; + + if ($("#" + defaultID).length) { + return false; + } + + block = $(this).parent().parent(); + blockType = block.data("type"); + blockID = block.attr("id"); + + // Main add button, after all blocks + if (block.is('div') && block.hasClass("frontmatter")) { + block = $('.blocks'); + block.append('
'); + blockType = "object"; + } + + // If the Block Type is an array + if (blockType == "array") { + newID = blockID + "[]"; + input = blockID; + input = input.replace(/\[/, '\\['); + input = input.replace(/\]/, '\\]'); + block.append('
'); + } + + // If the Block is an object + if (blockType == "object") { + newItem = $("#" + defaultID); + newItem.html(''); + field = $("#name-" + defaultID); + + // Show a notification with some information for newbies + if (!document.cookie.replace(/(?:(?:^|.*;\s*)placeholdertip\s*\=\s*([^;]*).*$)|^.*$/, "$1")) { + var date = new Date(); + date.setDate(date.getDate() + 365); + document.cookie = 'placeholdertip=true; expires=' + date.toUTCString + '; path=/'; + + notification({ + text: 'Write the field name and then press enter. If you want to create an array or an object, end the name with ":array" or ":object".', + type: 'information' + }); + } + + $(field).keypress(function(event) { + // When you press enter within the new name field: + if (event.which == 13) { + event.preventDefault(); + // This var should have a value of the type "name[:array, :object]" + value = field.val(); + + if (value == "") { + newItem.remove(); + return false; + } + + elements = value.split(":") + + if (elements.length > 2) { + notification({ + text: "Invalid syntax. It must be 'name[:type]'.", + type: 'error' + }); + return false; + } + + if (elements.length == 2 && elements[1] != "array" && elements[1] != "object") { + notification({ + text: "Only arrays and objects are allowed.", + type: 'error' + }); + return false; + } + + field.remove(); + + // TODO: continue here. :) 04/02/2016 + + if (typeof blockID === "undefined") { + blockID = elements[0]; + } else { + blockID = blockID + '[' + elements[0] + ']'; + } + + if (elements.length == 1) { + newItem.attr('id', 'block-' + blockID); + newItem.append('
'); + newItem.prepend(' '); + } else { + type = ""; + + if (elements[1] == "array") { + type = "array"; + } else { + type = "object" + } + + template = "

${elements[0]}

" + template = template.replace("${blockID}", blockID); + template = template.replace("${elements[0]}", elements[0]); + template = template.replace("${type}", type); + newItem.after(template); + newItem.remove(); + + console.log('"' + blockID + '" block of type "' + type + '" added.'); + } + + return false; + } + }); + } + + return false; + }); + + // If it has a textarea + if (textarea[0]) { + options = { + mode: textarea.data("mode"), + theme: 'ttcn', + lineWrapping: true, + lineNumbers: true, + scrollbarStyle: null + } + + if (textarea.data("mode") == "markdown") { + options.lineNumbers = false + } + + editor = CodeMirror.fromTextArea(textarea[0], options); + codemirror = $('.CodeMirror'); + + // Toggles between preview and editing mode + $("#preview").click(function(event) { + event.preventDefault(); + + // If it currently in the preview mode, hide the preview + // and show the editor + if ($(this).data("previewing") == "true") { + preview.hide(); + codemirror.fadeIn(); + $(this).data("previewing", "false"); + notification({ + text: "Think, relax and do the better you can!", + type: 'information', + timeout: 2000 + }); + } else { + // Copy the editor content to texteare + editor.save() + + // If it's in editing mode, convert the markdown to html + // and show it + var converter = new showdown.Converter(), + text = textarea.val(), + html = converter.makeHtml(text); + + // Hide the editor and show the preview + codemirror.hide(); + preview.html(html).fadeIn(); + + $(this).data("previewing", "true"); + notification({ + text: "This is how your post looks like.", + type: 'information', + timeout: 2000 + }); + } + + return false; + }); + } + + $("body").on('click', '.delete', function(event) { + event.preventDefault(); + button = $(this); + + name = button.parent().parent().attr("for") || button.parent().parent().attr("id") || button.parent().parent().parent().attr("id"); + name = name.replace(/\[/, '\\['); + name = name.replace(/\]/, '\\]'); + console.log(name) + + $('label[for="' + name + '"]').fadeOut().remove(); + $('#' + name).fadeOut().remove(); + + return false; + }); +}); diff --git a/templates/browse.tmpl b/templates/browse.tmpl index bbd550ec..d5a1dc45 100644 --- a/templates/browse.tmpl +++ b/templates/browse.tmpl @@ -1,7 +1,7 @@ {{ define "content" }}{{ $path := .Path }}
-

{{ $path }}

+

Path: {{ $path }}