]> gitweb @ CieloNegro.org - Rakka.git/blobdiff - js/editPage.js
implemented previewer
[Rakka.git] / js / editPage.js
index e14b383eebe13197ae5f591e5db4db336bbdeaeb..2dd99510f2080d3d1ec60860344b3e66deee1eb0 100644 (file)
@@ -1,25 +1,37 @@
-Rakka.editPage = function (baseURI, pageName) {
+Rakka.$previewHeader = null;
+Rakka.$previewArea   = null;
+
+Rakka.editPage = function (pageName) {
     var $area = Rakka.switchScreen();
-    $area.text("Loading... please wait.");
+
+    Rakka.displayWaitingMessage("Loading... please wait.");
     
     // XML 版のページを取得する。
     $.ajax({
-        url    : baseURI + pageName + ".xml",
+        url    : Rakka.baseURI + pageName + ".xml",
         success: function (pageXml) {
+            Rakka.hideWaitingMessage();
+            
             var $page       = $(pageXml).find("page");
             var oldRevision = $page.attr("revision");
             var defaultType
                 = $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()
+                ;
+            Rakka.displayPageEditor(pageName, oldRevision, defaultType, source);
         },
         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);
@@ -28,30 +40,46 @@ Rakka.editPage = function (baseURI, pageName) {
     });
 };
 
-Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType, source) {
+Rakka.newPage = function () {
+    Rakka.displayPageEditor("", null, "rakka", null);
+};
+
+Rakka.displayPageEditor = function (pageName, oldRevision, defaultType, source) {
     var $area = Rakka.switchScreen();
     $area.empty();
 
-    $area.append($.H1({}, "Edit page"));
+    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 fldPageName
         = $.INPUT({type : "text", value: pageName});
 
     var btnTypeRakka
         = $.INPUT({type   : "radio",
                    name   : "type",
-                   checked: (defaultType == "rakka"  ? "checked" : "")});
+                   checked: (defaultType == "rakka"    ? "checked" : "")});
 
     var btnTypeCSS
         = $.INPUT({type   : "radio",
                    name   : "type",
-                   checked: (defaultType == "css"    ? "checked" : "")});
+                   checked: (defaultType == "css"      ? "checked" : "")});
 
     var btnTypeBinary
         = $.INPUT({type   : "radio",
                    name   : "type",
-                   checked: (defaultType == "binary" ? "checked" : "")});
-    
+                   checked: (defaultType == "binary"   ? "checked" : "")});
+
+    var btnTypeRedirect
+        = $.INPUT({type   : "radio",
+                   name   : "type",
+                   checked: (defaultType == "redirect" ? "checked" : "")});
 
     var fldRakkaSource
         = $.TEXTAREA({}, (defaultType == "rakka" && source != null ? source : ""));
@@ -62,6 +90,9 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
     var fldUploadFile
         = $.INPUT({type: "file"});
 
+    var fldRedirect
+        = $.INPUT({type: "text", value: (defaultType == "redirect" ? source : "")});
+
     var trContent
         = $.TR({}, 
                $.TH({}),
@@ -72,7 +103,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
@@ -81,7 +119,6 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
     $(btnSubmit).click(function () {
         if (btnTypeRakka.checked) {
             Rakka.submitTextPage(
-                baseURI,
                 pageName,
                 oldRevision,
                 fldPageName.value,
@@ -90,7 +127,6 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
         }
         else if (btnTypeCSS.checked) {
             Rakka.submitTextPage(
-                baseURI,
                 pageName,
                 oldRevision,
                 fldPageName.value,
@@ -99,12 +135,18 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
         }
         else if (btnTypeBinary.checked) {
             Rakka.submitBinaryPage(
-                baseURI,
                 pageName,
                 oldRevision,
                 fldPageName.value,
                 fldUploadFile.value);
         }
+        else if (btnTypeRedirect.checked) {
+            Rakka.submitRedirection(
+                pageName,
+                oldRevision,
+                fldPageName.value,
+                fldRedirect.value);
+        }
     });
 
     var btnDelete
@@ -118,19 +160,28 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
         if (btnTypeRakka.checked) {
             $(trContent).find("th").text("Wiki source");
             $(trContent).find("td").empty().append(fldRakkaSource);
+            $(btnPreview).show();
         }
         else if (btnTypeCSS.checked) {
             $(trContent).find("th").text("CSS source");
             $(trContent).find("td").empty().append(fldCSSSource);
+            $(btnPreview).hide();
         }
         else if (btnTypeBinary.checked) {
             $(trContent).find("th").text("File");
             $(trContent).find("td").empty().append(fldUploadFile);
+            $(btnPreview).show();
+        }
+        else if (btnTypeRedirect.checked) {
+            $(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
@@ -161,6 +212,12 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
                                                       btnTypeBinary,
                                                       "Binary file"
                                                      )
+                                             ),
+                                         $.LI({},
+                                              $.LABEL({},
+                                                      btnTypeRedirect,
+                                                      "Redirection"
+                                                     )
                                              )
                                         )
                                    )
@@ -181,7 +238,43 @@ Rakka.displayPageEditor = function (baseURI, pageName, oldRevision, defaultType,
     $area.append(pageEditor);
 };
 
-Rakka.submitTextPage = function (baseURI, 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) {
+            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.submitTextPage = function (pageName, oldRevision, givenPageName, mimeType, text) {
     var doc = document.implementation.createDocument(
         "http://cielonegro.org/schema/Rakka/Page/1.0", "page", null);
 
@@ -201,24 +294,74 @@ Rakka.submitTextPage = function (baseURI, pageName, oldRevision, givenPageName,
         page.appendChild(updateInfo);
     }
 
-    if (0) {
-        // redirection
-    }
-    else {
-        page.setAttribute("type", mimeType);
+    page.setAttribute("type", mimeType);
 
-        var textData = doc.createElement("textData");
-        textData.appendChild(
-            doc.createTextNode(text));
+    var textData = doc.createElement("textData");
+    textData.appendChild(
+        doc.createTextNode(text));
 
-        page.appendChild(textData);
-    }
+    page.appendChild(textData);
+
+    Rakka.displayWaitingMessage("Submitting... please wait.");
 
+    var url = Rakka.baseURI + encodeURI(givenPageName);
     $.ajax({
         type       : "PUT",
-        url        : baseURI + encodeURI(givenPageName),
+        url        : url,
         contentType: "text/xml",
         data       : doc,
-        processData: false
+        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(updateInfo);
+    }
+
+    page.setAttribute("redirect", destination);
+
+    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);
+        }
+    });
+};
\ No newline at end of file