X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fresources%2Fstatic%2Fjavascript%2Fsone.js;h=d9d6f0688e821a5d1892d1b05b66638af429c695;hb=bd423714c75ceff757c493a0fe863c5b481ee66d;hp=a3761b85f4c266b3e57eed596b8fd066b314c0d9;hpb=d615555392317949e47f6367209ee7194f650768;p=Sone.git diff --git a/src/main/resources/static/javascript/sone.js b/src/main/resources/static/javascript/sone.js index a3761b8..d9d6f06 100644 --- a/src/main/resources/static/javascript/sone.js +++ b/src/main/resources/static/javascript/sone.js @@ -265,6 +265,19 @@ function getFormPassword() { return $("#sone #formPassword").text(); } +/** + * Returns the element of the Sone with the given ID. + * + * @param soneId + * The ID of the Sone + * @returns All Sone elements with the given ID + */ +function getSone(soneId) { + return $("#sone .sone").filter(function(index) { + return $(".id").text() == soneId; + }); +} + function getSoneElement(element) { return $(element).closest(".sone"); } @@ -333,6 +346,17 @@ function getPostAuthor(element) { return getPostElement(element).find(".post-author").text(); } +/** + * Returns the element of the reply with the given ID. + * + * @param replyId + * The ID of the reply + * @returns The element of the reply + */ +function getReply(replyId) { + return $("#sone .reply#" + replyId); +} + function getReplyElement(element) { return $(element).closest(".reply"); } @@ -356,6 +380,39 @@ function getReplyAuthor(element) { return getReplyElement(element).find(".reply-author").text(); } +/** + * Returns the notification with the given ID. + * + * @param notificationId + * The ID of the notification + * @returns The notification element + */ +function getNotification(notificationId) { + return $("#sone #notification-area .notification#" + notificationId); +} + +/** + * Returns the notification element closest to the given element. + * + * @param element + * The element to get the closest notification of + * @return The closest notification element + */ +function getNotificationElement(element) { + return $(element).closest(".notification"); +} + +/** + * Returns the ID of the notification element. + * + * @param notificationElement + * The notification element + * @returns The ID of the notification + */ +function getNotificationId(notificationElement) { + return $(notificationElement).attr("id"); +} + function likePost(postId) { $.getJSON("like.ajax", { "type": "post", "post" : postId, "formPassword": getFormPassword() }, function(data, textStatus) { if ((data == null) || !data.success) { @@ -562,25 +619,6 @@ function postReply(sender, postId, text, callbackFunction) { } /** - * Requests information about the reply with the given ID. - * - * @param replyId - * The ID of the reply - * @param callbackFunction - * A callback function (parameters soneId, soneName, replyTime, - * replyDisplayTime, text, html) - */ -function getReply(replyId, callbackFunction) { - $.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); - } - }, function(xmlHttpRequest, textStatus, error) { - /* ignore error. */ - }); -} - -/** * Ajaxifies the given Sone by enhancing all eligible elements with AJAX. * * @param soneElement @@ -720,9 +758,12 @@ function ajaxifyPost(postElement) { addCommentLink(getPostId(postElement), postElement, $(postElement).find(".post-status-line .time")); /* process all replies. */ + replyIds = []; $(postElement).find(".reply").each(function() { + replyIds.push(getReplyId(this)); ajaxifyReply(this); }); + updateReplyTimes(replyIds.join(",")); /* process reply input fields. */ getTranslation("WebInterface.DefaultText.Reply", function(text) { @@ -863,7 +904,7 @@ function getStatus() { }); /* process notifications. */ $.each(data.notifications, function(index, value) { - oldNotification = $("#sone #notification-area .notification#" + value.id); + oldNotification = getNotification(value.id); notification = ajaxifyNotification(createNotification(value.id, value.text, value.dismissable)).hide(); if (oldNotification.length != 0) { if ((oldNotification.find(".short-text").length > 0) && (notification.find(".short-text").length > 0)) { @@ -1035,6 +1076,7 @@ function loadNewPost(postId, soneId, recipientId, time) { newPost.insertBefore(firstOlderPost); } ajaxifyPost(newPost); + updatePostTimes(data.post.id); newPost.slideDown(); setActivity(); } @@ -1073,6 +1115,7 @@ function loadNewReply(replyId, soneId, postId, postSoneId) { } } ajaxifyReply(newReply); + updateReplyTimes(data.reply.id); newReply.slideDown(); setActivity(); return false; @@ -1086,41 +1129,130 @@ function loadNewReply(replyId, soneId, postId, postSoneId) { * * @param soneElement * The Sone to mark as known + * @param skipRequest + * true to skip the JSON request, false or omit to perform the JSON + * request */ -function markSoneAsKnown(soneElement) { +function markSoneAsKnown(soneElement, skipRequest) { if ($(".new", soneElement).length > 0) { - $.getJSON("maskAsKnown.ajax", {"formPassword": getFormPassword(), "type": "sone", "id": getSoneId(soneElement)}, function(data, textStatus) { - $(soneElement).removeClass("new"); - }); + if ((typeof skipRequest != "undefined") && !skipRequest) { + $.getJSON("maskAsKnown.ajax", {"formPassword": getFormPassword(), "type": "sone", "id": getSoneId(soneElement)}, function(data, textStatus) { + $(soneElement).removeClass("new"); + }); + } } } -function markPostAsKnown(postElements) { +function markPostAsKnown(postElements, skipRequest) { $(postElements).each(function() { postElement = this; if ($(postElement).hasClass("new")) { (function(postElement) { $(postElement).removeClass("new"); $(".click-to-show", postElement).removeClass("new"); - $.getJSON("markAsKnown.ajax", {"formPassword": getFormPassword(), "type": "post", "id": getPostId(postElement)}); + if ((typeof skipRequest == "undefined") || !skipRequest) { + $.getJSON("markAsKnown.ajax", {"formPassword": getFormPassword(), "type": "post", "id": getPostId(postElement)}); + } })(postElement); } }); markReplyAsKnown($(postElements).find(".reply")); } -function markReplyAsKnown(replyElements) { +function markReplyAsKnown(replyElements, skipRequest) { $(replyElements).each(function() { replyElement = this; if ($(replyElement).hasClass("new")) { (function(replyElement) { $(replyElement).removeClass("new"); - $.getJSON("markAsKnown.ajax", {"formPassword": getFormPassword(), "type": "reply", "id": getReplyId(replyElement)}); + if ((typeof skipRequest == "undefined") || !skipRequest) { + $.getJSON("markAsKnown.ajax", {"formPassword": getFormPassword(), "type": "reply", "id": getReplyId(replyElement)}); + } })(replyElement); } }); } +/** + * Updates the time of the post with the given ID. + * + * @param postId + * The ID of the post to update + * @param timeText + * The text of the time to show + * @param refreshTime + * The refresh time after which to request a new time (in seconds) + * @param tooltip + * The tooltip to show + */ +function updatePostTime(postId, timeText, refreshTime, tooltip) { + if (!getPost(postId).is(":visible")) { + return; + } + getPost(postId).find(".post-status-line > .time a").html(timeText).attr("title", tooltip); + (function(postId, refreshTime) { + setTimeout(function() { + updatePostTimes(postId); + }, refreshTime * 1000); + })(postId, refreshTime); +} + +/** + * Requests new rendered times for the posts with the given IDs. + * + * @param postIds + * Comma-separated post IDs + */ +function updatePostTimes(postIds) { + $.getJSON("getTimes.ajax", { "posts" : postIds }, function(data, textStatus) { + if ((data != null) && data.success) { + $.each(data.postTimes, function(index, value) { + updatePostTime(index, value.timeText, value.refreshTime, value.tooltip); + }); + } + }); +} + +/** + * Updates the time of the reply with the given ID. + * + * @param postId + * The ID of the reply to update + * @param timeText + * The text of the time to show + * @param refreshTime + * The refresh time after which to request a new time (in seconds) + * @param tooltip + * The tooltip to show + */ +function updateReplyTime(replyId, timeText, refreshTime, tooltip) { + if (!getReply(replyId).is(":visible")) { + return; + } + getReply(replyId).find(".reply-status-line > .time").html(timeText).attr("title", tooltip); + (function(replyId, refreshTime) { + setTimeout(function() { + updateReplyTimes(replyId); + }, refreshTime * 1000); + })(replyId, refreshTime); +} + +/** + * Requests new rendered times for the posts with the given IDs. + * + * @param postIds + * Comma-separated post IDs + */ +function updateReplyTimes(replyIds) { + $.getJSON("getTimes.ajax", { "replies" : replyIds }, function(data, textStatus) { + if ((data != null) && data.success) { + $.each(data.replyTimes, function(index, value) { + updateReplyTime(index, value.timeText, value.refreshTime, value.tooltip); + }); + } + }); +} + function resetActivity() { title = document.title; if (title.indexOf('(') == 0) { @@ -1379,6 +1511,13 @@ $(document).ready(function() { }); }); + /* update post times. */ + postIds = []; + $("#sone .post").each(function() { + postIds.push(getPostId(this)); + }); + updatePostTimes(postIds.join(",")); + /* hides all replies but the latest two. */ if (!isViewPostPage()) { getTranslation("WebInterface.ClickToShow.Replies", function(text) {