| <%-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. The ASF licenses this file to You |
| under the Apache License, Version 2.0 (the "License"); you may not |
| use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. For additional information regarding |
| copyright in this work, please see the NOTICE file in the top level |
| directory of this distribution. |
| --%> |
| <%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %> |
| <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> |
| |
| <%-- are we on a blog's comment management page or the global admin's comment management page? --%> |
| <s:if test="actionName == 'comments'"> |
| <s:set var="mainAction">comments</s:set> |
| </s:if> |
| <s:else> |
| <s:set var="mainAction">globalCommentManagement</s:set> |
| </s:else> |
| |
| |
| <p class="subtitle"> |
| <s:if test="actionName == 'comments'"> |
| <s:if test="bean.entryId != null && !bean.entryId.equals('') "> |
| <s:text name="commentManagement.entry.subtitle"> |
| <s:param value="queryEntry.title"/> |
| </s:text> |
| </s:if> |
| <s:else> |
| <s:text name="commentManagement.website.subtitle"> |
| <s:param value="%{actionWeblog.handle}"/> |
| </s:text> |
| </s:else> |
| </s:if> |
| <s:else> |
| <s:text name="commentManagement.subtitle"/> |
| </s:else> |
| </p> |
| |
| <s:if test="pager.items.isEmpty"> |
| <s:text name="commentManagement.noCommentsFound"/> |
| </s:if> |
| <s:else> |
| <p class="pagetip"> |
| <s:if test="actionName == 'comments'"> |
| <s:text name="commentManagement.tip"/> |
| </s:if> |
| <s:else> |
| <s:text name="commentManagement.globalTip"/> |
| </s:else> |
| </p> |
| |
| <%-- ============================================================= --%> |
| <%-- Comment table / form with checkboxes --%> |
| |
| <s:form action="%{#mainAction}!update"> |
| <s:hidden name="salt"/> |
| <s:hidden name="bean.ids"/> |
| <s:hidden name="bean.startDateString"/> |
| <s:hidden name="bean.endDateString"/> |
| <s:if test="actionName == 'comments'"> |
| <s:hidden name="bean.entryId"/> |
| <s:hidden name="bean.searchString"/> |
| <s:hidden name="bean.approvedString"/> |
| <s:hidden name="weblog"/> |
| </s:if> |
| <s:else> |
| <s:hidden name="bean.offset"/> |
| <s:hidden name="bean.count"/> |
| <s:hidden name="bean.pendingString"/> |
| </s:else> |
| |
| |
| <%-- ============================================================= --%> |
| <%-- Number of comments and date message --%> |
| |
| <div class="tablenav"> |
| |
| <div style="float:left;"> |
| <s:text name="commentManagement.nowShowing"> |
| <s:param value="pager.items.size()"/> |
| </s:text> |
| </div> |
| <div style="float:right;"> |
| <s:if test="firstComment.postTime != null"> |
| <s:text name="commentManagement.date.toStringFormat"> |
| <s:param value="firstComment.postTime"/> |
| </s:text> |
| </s:if> |
| --- |
| <s:if test="lastComment.postTime != null"> |
| <s:text name="commentManagement.date.toStringFormat"> |
| <s:param value="lastComment.postTime"/> |
| </s:text> |
| </s:if> |
| </div> |
| <br/> |
| |
| |
| <%-- ============================================================= --%> |
| <%-- Next / previous links --%> |
| |
| <nav> |
| <ul class="pager"> |
| <s:if test="pager.prevLink != null"> |
| <li class="previous"> |
| <a href='<s:property value="pager.prevLink" />'> |
| <span aria-hidden="true">←</span>Newer</a> |
| </li> |
| </s:if> |
| <s:if test="pager.nextLink != null"> |
| <li class="next"> |
| <a href='<s:property value="pager.nextLink"/>'>Older |
| <span aria-hidden="true">→</span></a> |
| </li> |
| </s:if> |
| </ul> |
| </nav> |
| |
| </div> <%-- class="tablenav" --%> |
| |
| |
| <%-- ============================================================= --%> |
| <%-- Bulk comment delete link --%> |
| <%-- ============================================================= --%> |
| |
| <s:if test="bulkDeleteCount > 0"> |
| <p> |
| <s:text name="commentManagement.bulkDeletePrompt1"> |
| <s:param value="bulkDeleteCount"/> |
| </s:text> |
| <a href="#" onclick="bulkDelete()"> |
| <s:text name="commentManagement.bulkDeletePrompt2"/> |
| </a> |
| </p> |
| </s:if> |
| |
| <table class="rollertable table table-striped" width="100%"> |
| |
| <%-- ======================================================== --%> |
| <%-- Comment table header --%> |
| |
| <tr> |
| <s:if test="actionName == 'comments'"> |
| <th class="rollertable" width="5%"> |
| <s:text name="commentManagement.columnApproved"/> |
| </th> |
| </s:if> |
| <th class="rollertable" width="5%"> |
| <s:text name="commentManagement.columnSpam"/> |
| </th> |
| <th class="rollertable" width="5%"> |
| <s:text name="generic.delete"/> |
| </th> |
| <th class="rollertable"> |
| <s:text name="commentManagement.columnComment"/> |
| </th> |
| </tr> |
| |
| <%-- ======================================================== --%> |
| <%-- Select ALL and NONE buttons --%> |
| |
| <tr class="actionrow"> |
| <s:if test="actionName == 'comments'"> |
| <td align="center"> |
| <s:text name="commentManagement.select"/><br/> |
| |
| <span id="checkallapproved"><a href="#"><s:text name="generic.all"/></a></span><br/> |
| <span id="clearallapproved"><a href="#"><s:text name="generic.none"/></a></span> |
| </td> |
| </s:if> |
| <td align="center"> |
| <s:text name="commentManagement.select"/><br/> |
| |
| <span id="checkallspam"><a href="#"><s:text name="generic.all"/></a></span><br/> |
| <span id="clearallspam"><a href="#"><s:text name="generic.none"/></a></span> |
| </td> |
| <td align="center"> |
| <s:text name="commentManagement.select"/><br/> |
| |
| <span id="checkalldelete"><a href="#"><s:text name="generic.all"/></a></span><br/> |
| <span id="clearalldelete"><a href="#"><s:text name="generic.none"/></a></span> |
| </td> |
| <td align="right"> |
| <br/> |
| <span class="pendingCommentBox"> </span> |
| <s:text name="commentManagement.pending"/> |
| <span class="spamCommentBox"> </span> |
| <s:text name="commentManagement.spam"/> |
| </td> |
| </tr> |
| |
| |
| <%-- ========================================================= --%> |
| <%-- Loop through comments --%> |
| |
| <%-- it is a bit funky to use checkbox list here, but using checkbox didn't work for me :( |
| we are effectively just creating a checkbox list of 1 item for each iteration of our collection. --%> |
| |
| <s:iterator var="comment" value="pager.items" status="rowstatus"> |
| <tr> |
| <s:if test="actionName == 'comments'"> |
| <%-- only blog admins (not the global admin) can approve blog comments --%> |
| <td> |
| <s:checkboxlist name="bean.approvedComments" cssClass="comment-select" |
| list="#comment" listKey="id" listValue="emptyString" /> |
| </td> |
| </s:if> |
| <td> |
| <s:checkboxlist name="bean.spamComments" cssClass="comment-select" |
| list="#comment" listKey="id" listValue="emptyString" /> |
| </td> |
| <td> |
| <s:checkboxlist name="bean.deleteComments" cssClass="comment-select" |
| list="#comment" listKey="id" listValue="emptyString" /> |
| </td> |
| |
| <%-- ======================================================== --%> |
| <%-- Display comment details and text --%> |
| |
| <%-- <td> with style if comment is spam or pending --%> |
| <s:if test="#comment.status.name() == 'SPAM'"> |
| <td class="spamcomment"> |
| </s:if> |
| <s:elseif test="#comment.status.name() == 'PENDING'"> |
| <td class="pendingcomment"> |
| </s:elseif> |
| <s:else> |
| <td> |
| </s:else> |
| |
| <%-- comment details table in table --%> |
| <table class="innertable"> |
| <tr> |
| <td class="viewbody"> |
| |
| <div class="viewdetails bot"> |
| |
| <div class="details"> |
| <s:text name="commentManagement.entryTitled"/> : |
| <a href='<s:property value="#comment.weblogEntry.permalink" />'> |
| <s:property value="#comment.weblogEntry.title"/></a> |
| </div> |
| |
| <div class="details"> |
| <s:text name="commentManagement.commentBy"/> : |
| <s:if test="#comment.email != null && #comment.name != null"> |
| <s:text name="commentManagement.commentByBoth"> |
| <s:param><s:property value="#comment.name"/></s:param> |
| <s:param><s:property value="#comment.email"/></s:param> |
| <s:param><s:property value="#comment.email"/></s:param> |
| <s:param><s:property value="#comment.remoteHost"/></s:param> |
| </s:text> |
| </s:if> |
| <s:elseif test="#comment.email == null && #comment.name == null"> |
| <s:text name="commentManagement.commentByIP"> |
| <s:param><s:property value="#comment.remoteHost"/></s:param> |
| </s:text> |
| </s:elseif> |
| <s:else> |
| <s:text name="commentManagement.commentByName"> |
| <s:param><s:property value="#comment.name"/></s:param> |
| <s:param><s:property value="#comment.remoteHost"/></s:param> |
| </s:text> |
| </s:else> |
| </div> |
| |
| <s:if test="#comment.url != null && !#comment.url.equals('')"> |
| <div class="details"> |
| <s:text name="commentManagement.commentByURL"/> : |
| <a href='<s:property value="#comment.url" />'> |
| <str:truncateNicely upper="60" appendToEnd="..."><s:property |
| value="#comment.url"/></str:truncateNicely></a> |
| </div> |
| </s:if> |
| |
| <div class="details"> |
| <s:text name="commentManagement.postTime"/> : |
| <s:date name="#comment.postTime"/> |
| </div> |
| |
| </div> |
| <div class="viewdetails bot"> |
| |
| <div class="details bot"> |
| |
| <s:if test="#comment.content.length() > 1000"> |
| <div class="bot" id="comment-<s:property value="#comment.id"/>"> |
| <str:truncateNicely upper="1000" appendToEnd="..."> |
| <s:property value="#comment.content" escapeHtml="true"/> |
| </str:truncateNicely> |
| </div> |
| <div id="link-<s:property value="#comment.id"/>"> |
| <a onclick='readMoreComment("<s:property |
| value="#comment.id"/>")'><s:text |
| name="commentManagement.readmore"/></a> |
| </div> |
| </s:if> |
| <s:else> |
| <span width="200px" |
| id="comment-<s:property value="#comment.id"/>"><s:property |
| value="#comment.content" escapeHtml="true"/></span> |
| </s:else> |
| </div> |
| |
| <s:if test="actionName == 'comments'"> |
| <div class="details"> |
| <a id="editlink-<s:property value="#comment.id"/>" |
| onclick='editComment("<s:property value="#comment.id"/>")'> |
| <s:text name="generic.edit"/> |
| </a> |
| </div> |
| <div class="details"> |
| <span id="savelink-<s:property value="#comment.id"/>" |
| style="display: none"> |
| <a onclick='saveComment("<s:property value="#comment.id"/>")'><s:text |
| name="generic.save"/></a> | |
| </span> |
| <span id="cancellink-<s:property value="#comment.id"/>" |
| style="display: none"> |
| <a onclick='editCommentCancel("<s:property |
| value="#comment.id"/>")'><s:text name="generic.cancel"/></a> |
| </span> |
| </div> |
| </s:if> |
| |
| </div> |
| </tr> |
| </table> |
| <%-- end comment details table in table --%> |
| </td> |
| </tr> |
| </s:iterator> |
| </table> |
| |
| <%-- ============================================================= --%> |
| <%-- Next / previous links --%> |
| |
| <nav> |
| <ul class="pager"> |
| <s:if test="pager.prevLink != null"> |
| <li class="previous"> |
| <a href='<s:property value="pager.prevLink" />'> |
| <span aria-hidden="true">←</span>Newer</a> |
| </li> |
| </s:if> |
| <s:if test="pager.nextLink != null"> |
| <li class="next"> |
| <a href='<s:property value="pager.nextLink"/>'>Older |
| <span aria-hidden="true">→</span></a> |
| </li> |
| </s:if> |
| </ul> |
| </nav> |
| |
| <%-- ========================================================= --%> |
| <%-- Save changes and cancel buttons --%> |
| |
| <hr size="1" noshade="noshade"/> |
| <s:submit cssClass="btn btn-primary" value="%{getText('commentManagement.update')}"/> |
| |
| </s:form> |
| |
| </s:else> |
| |
| |
| <script> |
| |
| <%-- setup check all/none checkbox controls --%> |
| <s:if test="pager.items != null"> |
| $(document).ready(function () { |
| $('#checkallapproved').click(function () { |
| toggleFunction(true, "bean.approvedComments"); |
| }); |
| $('#clearallapproved').click(function () { |
| toggleFunction(false, "bean.approvedComments"); |
| }); |
| $('#checkallspam').click(function () { |
| toggleFunction(true, "bean.spamComments"); |
| }); |
| $('#clearallspam').click(function () { |
| toggleFunction(false, "bean.spamComments"); |
| }); |
| $('#checkalldelete').click(function () { |
| toggleFunction(true, "bean.deleteComments"); |
| }); |
| $('#clearalldelete').click(function () { |
| toggleFunction(false, "bean.deleteComments"); |
| }); |
| }); |
| </s:if> |
| |
| <%-- TODO: hook this up; it is currently not working in Roller trunk either --%> |
| |
| function bulkDelete() { |
| if (window.confirm('<s:text name="commentManagement.confirmBulkDelete"><s:param value="bulkDeleteCount" /></s:text>')) { |
| document.commentQueryForm.method.value = "bulkDelete"; |
| document.commentQueryForm.submit(); |
| } |
| } |
| |
| var comments = {}; |
| |
| function editComment(id) { |
| // make sure we have the full comment |
| if ($("#link-" + id).size() > 0) readMoreComment(id, editComment); |
| |
| // save the original comment value |
| comments[id] = $("#comment-" + id).html(); |
| |
| $("#editlink-" + id).hide(); |
| $("#savelink-" + id).show(); |
| $("#cancellink-" + id).show(); |
| |
| // put comment in a textarea for editing |
| $("#comment-" + id).html("<textarea style='width:100%' rows='10'>" + comments[id] + "</textarea>"); |
| } |
| |
| function saveComment(id) { |
| var content = $("#comment-" + id).children()[0].value; |
| var salt = $("#comments_salt").val(); |
| $.ajax({ |
| type: "POST", |
| url: '<%= request.getContextPath()%>/roller-ui/authoring/commentdata?id=' + id + '&salt=' + salt, |
| data: content, |
| dataType: "text", |
| processData: "false", |
| contentType: "text/plain", |
| success: function (rdata) { |
| if (status != "success") { |
| var cdata = eval("(" + rdata + ")"); |
| $("#editlink-" + id).show(); |
| $("#savelink-" + id).hide(); |
| $("#cancellink-" + id).hide(); |
| $("#comment-" + id).html(cdata.content); |
| } else { |
| alert('<s:text name="commentManagement.saveError" />'); |
| } |
| } |
| }); |
| } |
| |
| function editCommentCancel(id) { |
| $("#editlink-" + id).show(); |
| $("#savelink-" + id).hide(); |
| $("#cancellink-" + id).hide(); |
| if (comments[id]) { |
| $("#comment-" + id).html(comments[id]); |
| comments[id] = null; |
| } |
| } |
| |
| function readMoreComment(id, callback) { |
| $.ajax({ |
| type: "GET", |
| url: '<%= request.getContextPath()%>/roller-ui/authoring/commentdata?id=' + id, |
| success: function (data) { |
| var cdata = eval("(" + data + ")"); |
| $("#comment-" + cdata.id).html(cdata.content); |
| $("#link-" + id).detach(); |
| if (callback) callback(id); |
| } |
| }); |
| } |
| |
| </script> |