X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=js%2FeditPage.js;h=960ce4eb5f6f8fdba41b9c9837d0c1fc0a732a02;hb=b51bb0c6d9385938eab21c70ed7ea631883260d0;hp=43dc7766f5397a7874a63ac5b62cb6ae1cee111b;hpb=743f4a87fd557832ce67d6eb51749582820577c4;p=Rakka.git diff --git a/js/editPage.js b/js/editPage.js index 43dc776..960ce4e 100644 --- a/js/editPage.js +++ b/js/editPage.js @@ -1,11 +1,16 @@ -Rakka.editPage = function (baseURI, pageName) { +Rakka.$previewHeader = null; +Rakka.$previewArea = null; + +Rakka.isDirty = null; + +Rakka.editPage = function (pageName) { var $area = Rakka.switchScreen(); Rakka.displayWaitingMessage("Loading... please wait."); // XML 版のページを取得する。 $.ajax({ - url : baseURI + pageName + ".xml", + url : Rakka.baseURI + pageName + ".xml", success: function (pageXml) { Rakka.hideWaitingMessage(); @@ -15,16 +20,22 @@ Rakka.editPage = function (baseURI, pageName) { = $page.attr("isBinary") == "yes" ? "binary" : $page.attr("type") == "text/x-rakka" ? "rakka" : $page.attr("type") == "text/css" ? "css" + : $page.attr("redirect") != null ? "redirect" : "unknown" ; - var source = $page.find("textData").text(); - Rakka.displayPageEditor(baseURI, pageName, oldRevision, defaultType, source); + var source + = $page.attr("redirect") != null ? $page.attr("redirect") + : $page.find("textData").text() + ; + var summary = $page.find("summary").text(); + + Rakka.displayPageEditor(pageName, oldRevision, defaultType, source, summary); }, error : function (req) { Rakka.hideWaitingMessage(); if (req.status == 404) { - Rakka.displayPageEditor(baseURI, pageName, null, "rakka", null); + Rakka.displayPageEditor(pageName, null, "rakka", null, ""); } else { $area.text("Error: " + req.status + " " + req.statusText); @@ -33,44 +44,93 @@ Rakka.editPage = function (baseURI, pageName) { }); }; -Rakka.newPage = function (baseURI) { - Rakka.displayPageEditor(baseURI, "", null, "rakka", null); +Rakka.newPage = function () { + Rakka.displayPageEditor("", null, "rakka", null, ""); }; -Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, source) { +Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source, summary) { var $area = Rakka.switchScreen(); $area.empty(); + Rakka.$previewHeader = $( $.H1({}, "Preview") ); + $area.append(Rakka.$previewHeader); + Rakka.$previewHeader.hide(); + + Rakka.$previewArea = $( $.DIV({className: "preview"}) ); + $area.append(Rakka.$previewArea); + Rakka.$previewArea.hide(); + $area.append($.H1({}, pageName == "" ? "Create page" : "Edit page")); + var makeDirty = function () { + Rakka.isDirty = true; + }; + var fldPageName = $.INPUT({type : "text", value: pageName}); + $(fldPageName).change(makeDirty); + var btnTypeRakka = $.INPUT({type : "radio", name : "type", - checked: (defaultType == "rakka" ? "checked" : "")}); + checked: (defaultType == "rakka" ? "checked" : "")}); + + $(btnTypeRakka).change(makeDirty); var btnTypeCSS = $.INPUT({type : "radio", name : "type", - checked: (defaultType == "css" ? "checked" : "")}); + checked: (defaultType == "css" ? "checked" : "")}); + + $(btnTypeCSS).change(makeDirty); var btnTypeBinary = $.INPUT({type : "radio", name : "type", - checked: (defaultType == "binary" ? "checked" : "")}); - + checked: (defaultType == "binary" ? "checked" : "")}); + + $(btnTypeBinary).change(makeDirty); + + var btnTypeRedirect + = $.INPUT({type : "radio", + name : "type", + checked: (defaultType == "redirect" ? "checked" : "")}); + + $(btnTypeRedirect).change(makeDirty); + + var fldSummary + = $.TEXTAREA({className: "summary"}, summary); + + $(fldSummary).change(makeDirty); + + var trSummary + = $.TR({}, + $.TH({}, "Summary"), + $.TD({}, fldSummary)); var fldRakkaSource - = $.TEXTAREA({}, (defaultType == "rakka" && source != null ? source : "")); + = $.TEXTAREA({className: "source"}, + (defaultType == "rakka" && source != null ? source : "")); + + $(fldRakkaSource).change(makeDirty); var fldCSSSource - = $.TEXTAREA({}, (defaultType == "css" && source != null ? source : "")); + = $.TEXTAREA({className: "source"}, + (defaultType == "css" && source != null ? source : "")); + + $(fldCSSSource).change(makeDirty); var fldUploadFile = $.INPUT({type: "file"}); + $(fldUploadFile).change(makeDirty); + + var fldRedirect + = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")}); + + $(fldRedirect).change(makeDirty); + var trContent = $.TR({}, $.TH({}), @@ -81,7 +141,14 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, = $.INPUT({type: "button", value: "Preview page"}); $(btnPreview).click(function () { - throw new Error("FIXME: not implemented yet"); + if (btnTypeRakka.checked) { + Rakka.previewRakkaPage( + fldPageName.value, fldRakkaSource.value); + } + else if (btnTypeBinary.checked) { + Rakka.previewBinaryPage( + fldPageName.value, fldUploadFile.value); + } }); var btnSubmit @@ -90,56 +157,92 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, $(btnSubmit).click(function () { if (btnTypeRakka.checked) { Rakka.submitTextPage( - baseURI, pageName, oldRevision, fldPageName.value, "text/x-rakka", + fldSummary.value, fldRakkaSource.value); } else if (btnTypeCSS.checked) { Rakka.submitTextPage( - baseURI, pageName, oldRevision, fldPageName.value, "text/css", + fldSummary.value, fldCSSSource.value); } else if (btnTypeBinary.checked) { Rakka.submitBinaryPage( - baseURI, pageName, oldRevision, fldPageName.value, + fldSummary.value, fldUploadFile.value); } + else if (btnTypeRedirect.checked) { + Rakka.submitRedirection( + pageName, + oldRevision, + fldPageName.value, + fldRedirect.value); + } }); var btnDelete = $.INPUT({type: "button", value: "Delete this page"}); $(btnDelete).click(function () { - throw new Error("FIXME: not implemented yet"); + if (window.confirm("Do you really want to delete this page?")) { + Rakka.deletePage(pageName); + } + }); + + var btnCancel + = $.INPUT({type: "button", value: "Cancel editing"}); + + $(btnCancel).click(function () { + if (Rakka.isDirty) { + if (window.confirm("Do you really want to discard changes?")) { + Rakka.restoreScreen(); + } + } + else { + Rakka.restoreScreen(); + } }); var updateTRContent = function () { if (btnTypeRakka.checked) { + $(trSummary).show(); $(trContent).find("th").text("Wiki source"); $(trContent).find("td").empty().append(fldRakkaSource); + $(btnPreview).show(); } else if (btnTypeCSS.checked) { + $(trSummary).show(); $(trContent).find("th").text("CSS source"); $(trContent).find("td").empty().append(fldCSSSource); + $(btnPreview).hide(); } else if (btnTypeBinary.checked) { + $(trSummary).show(); $(trContent).find("th").text("File"); $(trContent).find("td").empty().append(fldUploadFile); + $(btnPreview).show(); + } + else if (btnTypeRedirect.checked) { + $(trSummary).hide(); + $(trContent).find("th").text("Destination Page"); + $(trContent).find("td").empty().append(fldRedirect); + $(btnPreview).hide(); } }; - $(btnTypeRakka ).change(updateTRContent); - $(btnTypeCSS ).change(updateTRContent); - $(btnTypeBinary).change(updateTRContent); + $(btnTypeRakka ).change(updateTRContent); + $(btnTypeCSS ).change(updateTRContent); + $(btnTypeBinary ).change(updateTRContent); + $(btnTypeRedirect).change(updateTRContent); updateTRContent(); var pageEditor @@ -170,14 +273,21 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, btnTypeBinary, "Binary file" ) + ), + $.LI({}, + $.LABEL({}, + btnTypeRedirect, + "Redirection" + ) ) ) ) ), + trSummary, trContent, $.TR({}, $.TH({}), - $.TD({}, btnPreview, btnSubmit, btnDelete) + $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel) ) ) ); @@ -188,9 +298,129 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, } $area.append(pageEditor); + + Rakka.isDirty = false; +}; + +Rakka.previewRakkaPage = function (pageName, source) { + Rakka.displayWaitingMessage("Loading... please wait."); + + var url = Rakka.baseURI + "render/" + encodeURI(pageName); + $.ajax({ + type : "POST", + url : url, + contentType: "text/x-rakka", + data : source, + processData: false, + success : function (resultDoc) { + Rakka.hideWaitingMessage(); + Rakka.showPreview(resultDoc); + }, + error : function (req) { + Rakka.hideWaitingMessage(); + alert("Error: " + req.status + " " + req.statusText); + } + }); +}; + +Rakka.previewBinaryPage = function (pageName, path) { + Rakka.displayWaitingMessage("Loading... please wait."); + + /* Firefox でバイナリを送らうとすると 0x00 の位置で切れてしまふ。*/ + var bin = Rakka.loadLocalBinaryFile(path); + var url = Rakka.baseURI + "render/" + encodeURI(pageName); + $.ajax({ + type : "POST", + url : url, + contentType: "application/x-rakka-base64-stream", + data : Rakka.encodeBase64(bin), + processData: false, + success : function (resultDoc) { + Rakka.hideWaitingMessage(); + Rakka.showPreview(resultDoc); + }, + error : function (req) { + Rakka.hideWaitingMessage(); + alert("Error: " + req.status + " " + req.statusText); + } + }); +}; + +Rakka.showPreview = function (doc) { + Rakka.$previewArea.empty(); + + Rakka.$previewHeader.show(); + Rakka.$previewArea.show(); + + var root = doc.documentElement; + var child = root.firstChild; + do { + if (child.nodeType == 1) { + // 要素だったので複製 + Rakka.$previewArea.append(child.cloneNode(true)); + } + } while (child = child.nextSibling); + + Rakka.scrollToTopLeft(); +}; + +Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, summary, text) { + var doc = document.implementation.createDocument( + "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null); + + var page = doc.documentElement; + + if (oldRevision != null) { + // ページ書換時 + var updateInfo = doc.createElement("updateInfo"); + updateInfo.setAttribute("oldRevision", oldRevision); + + if (pageName != givenPageName) { + var move = doc.createElement("move"); + move.setAttribute("from", pageName); + updateInfo.appendChild(move); + } + + page.appendChild(updateInfo); + } + + page.setAttribute("type", mimeType); + + if (summary != null) { + var s = doc.createElement("summary"); + s.appendChild( + doc.createTextNode(summary)); + page.appendChild(s); + } + + var textData = doc.createElement("textData"); + textData.appendChild( + doc.createTextNode(text)); + + page.appendChild(textData); + + Rakka.displayWaitingMessage("Submitting... please wait."); + + var url = Rakka.baseURI + encodeURI(givenPageName); + $.ajax({ + type : "PUT", + url : url, + contentType: "text/xml", + data : doc, + processData: false, + success : function () { + window.location.replace(url); + }, + error : function (req) { + Rakka.hideWaitingMessage(); + + var $area = Rakka.switchScreen(); + $area.text("Error: " + req.status + " " + req.statusText); + } + }); }; -Rakka.submitTextPage = function (baseURI, pageName, oldRevision, givenPageName, mimeType, text) { +Rakka.submitBinaryPage = function (pageName, oldRevision, givenPageName, summary, path) { var doc = document.implementation.createDocument( "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null); @@ -210,22 +440,70 @@ Rakka.submitTextPage = function (baseURI, pageName, oldRevision, givenPageName, page.appendChild(updateInfo); } - if (0) { - // redirection + page.setAttribute("type", ""); + + if (summary != null) { + var s = doc.createElement("summary"); + s.appendChild( + doc.createTextNode(summary)); + page.appendChild(s); } - else { - page.setAttribute("type", mimeType); - var textData = doc.createElement("textData"); - textData.appendChild( - doc.createTextNode(text)); + var bin = Rakka.loadLocalBinaryFile(path); + var b64 = Rakka.encodeBase64(bin); + + var binaryData = doc.createElement("binaryData"); + binaryData.appendChild( + doc.createTextNode(b64)); + + page.appendChild(binaryData); + + Rakka.displayWaitingMessage("Submitting... please wait."); + + var url = Rakka.baseURI + encodeURI(givenPageName); + $.ajax({ + type : "PUT", + url : url, + contentType: "text/xml", + data : doc, + processData: false, + success : function () { + window.location.replace(url); + }, + error : function (req) { + Rakka.hideWaitingMessage(); + + var $area = Rakka.switchScreen(); + $area.text("Error: " + req.status + " " + req.statusText); + } + }); +}; + +Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destination) { + var doc = document.implementation.createDocument( + "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null); + + var page = doc.documentElement; + + if (oldRevision != null) { + // ページ書換時 + var updateInfo = doc.createElement("updateInfo"); + updateInfo.setAttribute("oldRevision", oldRevision); + + if (pageName != givenPageName) { + var move = doc.createElement("move"); + move.setAttribute("from", pageName); + updateInfo.appendChild(move); + } - page.appendChild(textData); + page.appendChild(updateInfo); } + page.setAttribute("redirect", destination); + Rakka.displayWaitingMessage("Submitting... please wait."); - var url = baseURI + encodeURI(givenPageName); + var url = Rakka.baseURI + encodeURI(givenPageName); $.ajax({ type : "PUT", url : url, @@ -243,3 +521,20 @@ Rakka.submitTextPage = function (baseURI, pageName, oldRevision, givenPageName, } }); }; + +Rakka.deletePage = function (pageName) { + var url = Rakka.baseURI + encodeURI(pageName); + $.ajax({ + type : "DELETE", + url : url, + success : function () { + window.location.replace(url); + }, + error : function (req) { + Rakka.hideWaitingMessage(); + + var $area = Rakka.switchScreen(); + $area.text("Error: " + req.status + " " + req.statusText); + } + }); +};