Merge branch 'message-recipient'
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 27 Nov 2010 15:22:51 +0000 (16:22 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Sat, 27 Nov 2010 15:22:51 +0000 (16:22 +0100)
Conflicts:
src/main/resources/templates/include/viewPost.html

1  2 
src/main/java/net/pterodactylus/sone/web/ajax/CreatePostAjaxPage.java
src/main/resources/static/javascript/sone.js
src/main/resources/templates/include/viewPost.html

@@@ -36,7 -36,7 +36,7 @@@ public class CreatePostAjaxPage extend
         *            The Sone web interface
         */
        public CreatePostAjaxPage(WebInterface webInterface) {
 -              super("ajax/createPost.ajax", webInterface);
 +              super("createPost.ajax", webInterface);
        }
  
        /**
                if (sone == null) {
                        return createErrorJsonObject("auth-required");
                }
+               String recipientId = request.getHttpRequest().getParam("recipient");
+               Sone recipient = webInterface.getCore().getSone(recipientId, false);
                String text = request.getHttpRequest().getParam("text");
                if ((text == null) || (text.trim().length() == 0)) {
                        return createErrorJsonObject("text-required");
                }
-               Post newPost = webInterface.getCore().createPost(sone, text);
+               Post newPost = webInterface.getCore().createPost(sone, recipient, text);
                return createSuccessJsonObject().put("postId", newPost.getId());
        }
  
@@@ -105,7 -105,7 +105,7 @@@ function getTranslation(key, callback) 
                callback(translations[key]);
                return;
        }
 -      $.getJSON("ajax/getTranslation.ajax", {"key": key}, function(data, textStatus) {
 +      $.getJSON("getTranslation.ajax", {"key": key}, function(data, textStatus) {
                if ((data != null) && data.success) {
                        translations[key] = data.value;
                        callback(data.value);
@@@ -201,7 -201,7 +201,7 @@@ function enhanceDeleteButton(button, te
   */
  function enhanceDeletePostButton(button, postId, text) {
        enhanceDeleteButton(button, text, function() {
 -              $.getJSON("ajax/deletePost.ajax", { "post": postId, "formPassword": getFormPassword() }, function(data, textStatus) {
 +              $.getJSON("deletePost.ajax", { "post": postId, "formPassword": getFormPassword() }, function(data, textStatus) {
                        if (data == null) {
                                return;
                        }
   */
  function enhanceDeleteReplyButton(button, replyId, text) {
        enhanceDeleteButton(button, text, function() {
 -              $.getJSON("ajax/deleteReply.ajax", { "reply": replyId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
 +              $.getJSON("deleteReply.ajax", { "reply": replyId, "formPassword": $("#sone #formPassword").text() }, function(data, textStatus) {
                        if (data == null) {
                                return;
                        }
@@@ -314,7 -314,7 +314,7 @@@ function getReplyTime(element) 
  }
  
  function likePost(postId) {
 -      $.getJSON("ajax/like.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
 +      $.getJSON("like.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
                if ((data == null) || !data.success) {
                        return;
                }
  }
  
  function unlikePost(postId) {
 -      $.getJSON("ajax/unlike.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
 +      $.getJSON("unlike.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) {
                if ((data == null) || !data.success) {
                        return;
                }
  }
  
  function updatePostLikes(postId) {
 -      $.getJSON("ajax/getLikes.ajax", { "type": "post", "post": postId }, function(data, textStatus) {
 +      $.getJSON("getLikes.ajax", { "type": "post", "post": postId }, function(data, textStatus) {
                if ((data != null) && data.success) {
                        $("#sone .post#" + postId + " > .inner-part > .status-line .likes").toggleClass("hidden", data.likes == 0)
                        $("#sone .post#" + postId + " > .inner-part > .status-line .likes span.like-count").text(data.likes);
  }
  
  function likeReply(replyId) {
 -      $.getJSON("ajax/like.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
 +      $.getJSON("like.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
                if ((data == null) || !data.success) {
                        return;
                }
  }
  
  function unlikeReply(replyId) {
 -      $.getJSON("ajax/unlike.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
 +      $.getJSON("unlike.ajax", { "type": "reply", "reply" : replyId, "formPassword": getFormPassword() }, function(data, textStatus) {
                if ((data == null) || !data.success) {
                        return;
                }
  }
  
  function updateReplyLikes(replyId) {
 -      $.getJSON("ajax/getLikes.ajax", { "type": "reply", "reply": replyId }, function(data, textStatus) {
 +      $.getJSON("getLikes.ajax", { "type": "reply", "reply": replyId }, function(data, textStatus) {
                if ((data != null) && data.success) {
                        $("#sone .reply#" + replyId + " .status-line .likes").toggleClass("hidden", data.likes == 0)
                        $("#sone .reply#" + replyId + " .status-line .likes span.like-count").text(data.likes);
   *            parameters: success, error, replyId)
   */
  function postReply(postId, text, callbackFunction) {
 -      $.getJSON("ajax/createReply.ajax", { "formPassword" : getFormPassword(), "post" : postId, "text": text }, function(data, textStatus) {
 +      $.getJSON("createReply.ajax", { "formPassword" : getFormPassword(), "post" : postId, "text": text }, function(data, textStatus) {
                if (data == null) {
                        /* TODO - show error */
                        return;
   *            replyDisplayTime, text, html)
   */
  function getReply(replyId, callbackFunction) {
 -      $.getJSON("ajax/getReply.ajax", { "reply" : replyId }, function(data, textStatus) {
 +      $.getJSON("getReply.ajax", { "reply" : replyId }, function(data, textStatus) {
                if ((data != null) && data.success) {
                        callbackFunction(data.soneId, data.soneName, data.time, data.displayTime, data.text, data.html);
                }
@@@ -549,7 -549,7 +549,7 @@@ function ajaxifyNotification(notificati
                return false;
        });
        notification.find("form.dismiss button").click(function() {
 -              $.getJSON("ajax/dismissNotification.ajax", { "formPassword" : getFormPassword(), "notification" : notification.attr("id") }, function(data, textStatus) {
 +              $.getJSON("dismissNotification.ajax", { "formPassword" : getFormPassword(), "notification" : notification.attr("id") }, function(data, textStatus) {
                        /* dismiss in case of error, too. */
                        notification.slideUp();
                }, function(xmlHttpRequest, textStatus, error) {
  }
  
  function getStatus() {
 -      $.getJSON("ajax/getStatus.ajax", {}, function(data, textStatus) {
 +      $.getJSON("getStatus.ajax", {"loadAllSones": isKnownSonesPage()}, function(data, textStatus) {
                if ((data != null) && data.success) {
                        /* process Sone information. */
                        $.each(data.sones, function(index, value) {
@@@ -636,40 -636,10 +636,40 @@@ function isViewSonePage() 
   *
   * @returns The ID of the currently shown Sone
   */
 -function getSoneId() {
 +function getShownSoneId() {
        return $("#sone .sone-id").text();
  }
  
 +/**
 + * Returns whether the current page is a “view post” page.
 + *
 + * @returns {Boolean} <code>true</code> if the current page is a “view post”
 + *          page, <code>false</code> otherwise
 + */
 +function isViewPostPage() {
 +      return getPageId() == "view-post";
 +}
 +
 +/**
 + * Returns the ID of the currently shown post. This will only return a sensible
 + * value if isViewPostPage() returns <code>true</code>.
 + *
 + * @returns The ID of the currently shown post
 + */
 +function getShownPostId() {
 +      return $("#sone .post-id").text();
 +}
 +
 +/**
 + * Returns whether the current page is the “known Sones” page.
 + *
 + * @returns {Boolean} <code>true</code> if the current page is the “known
 + *          Sones” page, <code>false</code> otherwise
 + */
 +function isKnownSonesPage() {
 +      return getPageId() == "known-sones";
 +}
 +
  var loadedPosts = {};
  var loadedReplies = {};
  
@@@ -678,9 -648,9 +678,9 @@@ function loadNewPost(postId) 
                return;
        }
        loadedPosts[postId] = true;
 -      $.getJSON("ajax/getPost.ajax", { "post" : postId }, function(data, textStatus) {
 +      $.getJSON("getPost.ajax", { "post" : postId }, function(data, textStatus) {
                if ((data != null) && data.success) {
 -                      if (!isIndexPage() && !(isViewSonePage() && (getSoneId() == data.post.sone))) {
 +                      if (!isIndexPage() && !(isViewSonePage() && (getShownSoneId() == data.post.sone))) {
                                return;
                        }
                        var firstOlderPost = null;
@@@ -708,7 -678,7 +708,7 @@@ function loadNewReply(replyId) 
                return;
        }
        loadedReplies[replyId] = true;
 -      $.getJSON("ajax/getReply.ajax", { "reply": replyId }, function(data, textStatus) {
 +      $.getJSON("getReply.ajax", { "reply": replyId }, function(data, textStatus) {
                /* find post. */
                if ((data != null) && data.success) {
                        $("#sone .post#" + data.reply.postId).each(function() {
@@@ -742,7 -712,7 +742,7 @@@ function markPostAsKnown(postElements) 
                postElement = this;
                if ($(postElement).hasClass("new")) {
                        (function(postElement) {
 -                              $.getJSON("ajax/markPostAsKnown.ajax", {"formPassword": getFormPassword(), "post": getPostId(postElement)}, function(data, textStatus) {
 +                              $.getJSON("markPostAsKnown.ajax", {"formPassword": getFormPassword(), "post": getPostId(postElement)}, function(data, textStatus) {
                                        $(postElement).removeClass("new");
                                });
                        })(postElement);
@@@ -756,7 -726,7 +756,7 @@@ function markReplyAsKnown(replyElements
                replyElement = this;
                if ($(replyElement).hasClass("new")) {
                        (function(replyElement) {
 -                              $.getJSON("ajax/markReplyAsKnown.ajax", {"formPassword": getFormPassword(), "reply": getReplyId(replyElement)}, function(data, textStatus) {
 +                              $.getJSON("markReplyAsKnown.ajax", {"formPassword": getFormPassword(), "reply": getReplyId(replyElement)}, function(data, textStatus) {
                                        $(replyElement).removeClass("new");
                                });
                        })(replyElement);
@@@ -815,7 -785,7 +815,7 @@@ $(document).ready(function() 
                registerInputTextareaSwap("#sone #update-status .status-input", defaultText, "text", false, false);
                $("#sone #update-status").submit(function() {
                        text = $(this).find(":input:enabled").val();
 -                      $.getJSON("ajax/createPost.ajax", { "formPassword": getFormPassword(), "text": text }, function(data, textStatus) {
 +                      $.getJSON("createPost.ajax", { "formPassword": getFormPassword(), "text": text }, function(data, textStatus) {
                                if ((data != null) && data.success) {
                                        loadNewPost(data.postId);
                                }
                });
        });
  
+       /* ajaxify input field on “view Sone” page. */
+       getTranslation("WebInterface.DefaultText.Message", function(defaultText) {
+               registerInputTextareaSwap("#sone #post-message input[name=text]", defaultText, "text", false, false);
+               $("#sone #post-message").submit(function() {
+                       text = $(this).find(":input:enabled").val();
+                       $.getJSON("ajax/createPost.ajax", { "formPassword": getFormPassword(), "recipient": $("#sone #sone-id").text(), "text": text }, function(data, textStatus) {
+                               if ((data != null) && data.success) {
+                                       loadNewPost(data.postId);
+                               }
+                       });
+                       $(this).find(":input:enabled").val("").blur();
+                       return false;
+               });
+       });
        /* Ajaxifies all posts. */
        /* calling getTranslation here will cache the necessary values. */
        getTranslation("WebInterface.Confirmation.DeletePostButton", function(text) {
        });
  
        /* hides all replies but the latest two. */
 -      getTranslation("WebInterface.ClickToShow.Replies", function(text) {
 -              $("#sone .post .replies").each(function() {
 -                      allReplies = $(this).find(".reply");
 -                      if (allReplies.length > 2) {
 -                              newHidden = false;
 -                              for (replyIndex = 0; replyIndex < (allReplies.length - 2); ++replyIndex) {
 -                                      $(allReplies[replyIndex]).addClass("hidden");
 -                                      newHidden |= $(allReplies[replyIndex]).hasClass("new");
 -                              }
 -                              clickToShowElement = $("<div></div>").addClass("click-to-show");
 -                              if (newHidden) {
 -                                      clickToShowElement.addClass("new");
 +      if (!isViewPostPage()) {
 +              getTranslation("WebInterface.ClickToShow.Replies", function(text) {
 +                      $("#sone .post .replies").each(function() {
 +                              allReplies = $(this).find(".reply");
 +                              if (allReplies.length > 2) {
 +                                      newHidden = false;
 +                                      for (replyIndex = 0; replyIndex < (allReplies.length - 2); ++replyIndex) {
 +                                              $(allReplies[replyIndex]).addClass("hidden");
 +                                              newHidden |= $(allReplies[replyIndex]).hasClass("new");
 +                                      }
 +                                      clickToShowElement = $("<div></div>").addClass("click-to-show");
 +                                      if (newHidden) {
 +                                              clickToShowElement.addClass("new");
 +                                      }
 +                                      (function(clickToShowElement, allReplies, text) {
 +                                              clickToShowElement.text(text);
 +                                              clickToShowElement.click(function() {
 +                                                      allReplies.removeClass("hidden");
 +                                                      clickToShowElement.addClass("hidden");
 +                                              });
 +                                      })(clickToShowElement, allReplies, text);
 +                                      $(allReplies[0]).before(clickToShowElement);
                                }
 -                              (function(clickToShowElement, allReplies, text) {
 -                                      clickToShowElement.text(text);
 -                                      clickToShowElement.click(function() {
 -                                              allReplies.removeClass("hidden");
 -                                              clickToShowElement.addClass("hidden");
 -                                      });
 -                              })(clickToShowElement, allReplies, text);
 -                              $(allReplies[0]).before(clickToShowElement);
 -                      }
 +                      });
                });
 -      });
 +      }
  
        /*
         * convert all “follow”, “unfollow”, “lock”, and “unlock” links to something
         */
        $("#sone .follow").submit(function() {
                var followElement = this;
 -              $.getJSON("ajax/followSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
 +              $.getJSON("followSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
                        $(followElement).addClass("hidden");
                        $(followElement).parent().find(".unfollow").removeClass("hidden");
                });
        });
        $("#sone .unfollow").submit(function() {
                var unfollowElement = this;
 -              $.getJSON("ajax/unfollowSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
 +              $.getJSON("unfollowSone.ajax", { "sone": getSoneId(this), "formPassword": getFormPassword() }, function() {
                        $(unfollowElement).addClass("hidden");
                        $(unfollowElement).parent().find(".follow").removeClass("hidden");
                });
        });
        $("#sone .lock").submit(function() {
                var lockElement = this;
 -              $.getJSON("ajax/lockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
 +              $.getJSON("lockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
                        $(lockElement).addClass("hidden");
                        $(lockElement).parent().find(".unlock").removeClass("hidden");
                });
        });
        $("#sone .unlock").submit(function() {
                var unlockElement = this;
 -              $.getJSON("ajax/unlockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
 +              $.getJSON("unlockSone.ajax", { "sone" : getSoneId(this), "formPassword" : getFormPassword() }, function() {
                        $(unlockElement).addClass("hidden");
                        $(unlockElement).parent().find(".lock").removeClass("hidden");
                });
@@@ -7,7 -7,15 +7,15 @@@
        <div class="inner-part">
                <div>
                        <div class="author profile-link"><a href="viewSone.html?sone=<% post.sone.id|html>"><% post.sone.niceName|html></a></div>
 -                      <div class="text"><% post.text|html></div>
+                       <%ifnull !post.recipient>
+                               <span class="recipient-to">→</span>
+                               <%ifnull post.recipient.identity>
+                                       <div class="recipient profile-link"><a href="viewSone.html?sone=<% post.recipient.id|html>"><% View.Post.UnknownAuthor|l10n|html></a></div>
+                               <%else>
+                                       <div class="recipient profile-link"><a href="viewSone.html?sone=<% post.recipient.id|html>"><% post.recipient.niceName|html></a></div>
+                               <%/if>
+                       <%/if>
 +                      <div class="text"><% post.text></div>
                </div>
                <div class="post-status-line status-line">
                        <div class="time"><a href="viewPost.html?post=<% post.id|html>"><% post.time|date format="MMM d, yyyy, HH:mm:ss"></a></div>