]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - js/editPage.js
improved the page editor
[Rakka.git] / js / editPage.js
index 4623849dec6e35fde133d2e10be86ec79d962854..960ce4eb5f6f8fdba41b9c9837d0c1fc0a732a02 100644 (file)
@@ -1,3 +1,8 @@
+Rakka.$previewHeader = null;
+Rakka.$previewArea   = null;
+
+Rakka.isDirty = null;
+
 Rakka.editPage = function (pageName) {
     var $area = Rakka.switchScreen();
 
@@ -22,13 +27,15 @@ Rakka.editPage = function (pageName) {
                 = $page.attr("redirect") != null ? $page.attr("redirect")
                 : $page.find("textData").text()
                 ;
-            Rakka.displayPageEditor(pageName, oldRevision, defaultType, source);
+            var summary     = $page.find("summary").text();
+                
+            Rakka.displayPageEditor(pageName, oldRevision, defaultType, source, summary);
         },
         error  : function (req) {
             Rakka.hideWaitingMessage();
             
             if (req.status == 404) {
-                Rakka.displayPageEditor(pageName, null, "rakka", null);
+                Rakka.displayPageEditor(pageName, null, "rakka", null, "");
             }
             else {
                 $area.text("Error: " + req.status + " " + req.statusText);
@@ -38,50 +45,92 @@ Rakka.editPage = function (pageName) {
 };
 
 Rakka.newPage = function () {
-    Rakka.displayPageEditor("", null, "rakka", null);
+    Rakka.displayPageEditor("", null, "rakka", null, "");
 };
 
-Rakka.displayPageEditor = function (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" : "")});
 
+    $(btnTypeRakka).change(makeDirty);
+
     var btnTypeCSS
         = $.INPUT({type   : "radio",
                    name   : "type",
                    checked: (defaultType == "css"      ? "checked" : "")});
 
+    $(btnTypeCSS).change(makeDirty);
+
     var btnTypeBinary
         = $.INPUT({type   : "radio",
                    name   : "type",
                    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({}),
@@ -92,7 +141,14 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
         = $.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
@@ -105,6 +161,7 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
                 oldRevision,
                 fldPageName.value,
                 "text/x-rakka",
+                fldSummary.value,
                 fldRakkaSource.value);
         }
         else if (btnTypeCSS.checked) {
@@ -113,6 +170,7 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
                 oldRevision,
                 fldPageName.value,
                 "text/css",
+                fldSummary.value,
                 fldCSSSource.value);
         }
         else if (btnTypeBinary.checked) {
@@ -120,6 +178,7 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
                 pageName,
                 oldRevision,
                 fldPageName.value,
+                fldSummary.value,
                 fldUploadFile.value);
         }
         else if (btnTypeRedirect.checked) {
@@ -135,26 +194,46 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
         = $.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();
@@ -204,10 +283,11 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
                                         )
                                    )
                               ),
+                          trSummary,
                           trContent,
                           $.TR({},
                                $.TH({}),
-                               $.TD({}, btnPreview, btnSubmit, btnDelete)
+                               $.TD({}, btnPreview, btnSubmit, btnDelete, btnCancel)
                               )
                          )
                  );
@@ -218,9 +298,73 @@ Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source)
     }
 
     $area.append(pageEditor);
+
+    Rakka.isDirty = false;
 };
 
-Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, text) {
+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);
 
@@ -242,6 +386,13 @@ Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType,
 
     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));
@@ -269,6 +420,65 @@ Rakka.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType,
     });
 };
 
+Rakka.submitBinaryPage = function (pageName, oldRevision, givenPageName, summary, path) {
+    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", "");
+
+    if (summary != null) {
+        var s = doc.createElement("summary");
+        s.appendChild(
+            doc.createTextNode(summary));
+        page.appendChild(s);
+    }
+
+    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);
@@ -310,4 +520,21 @@ Rakka.submitRedirection = function (pageName, oldRevision, givenPageName, destin
             $area.text("Error: " + req.status + " " + req.statusText);
         }
     });
-};
\ No newline at end of file
+};
+
+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);
+        }
+    });
+};