Implements FS#10863

Signed-off-by: Mark Weiman <[email protected]>
---
 web/html/css/aurweb.css              |  18 +++++-
 web/lib/pkgbasefuncs.inc.php         |   7 +++
 web/lib/pkgfuncs.inc.php             |   9 ++-
 web/template/pkg_comments.php        |  22 +++++++
 web/template/pkg_pinned_comments.php | 112 +++++++++++++++++++++++++++++++++++
 5 files changed, 165 insertions(+), 3 deletions(-)
 create mode 100644 web/template/pkg_pinned_comments.php

diff --git a/web/html/css/aurweb.css b/web/html/css/aurweb.css
index 11af747..9912c56 100644
--- a/web/html/css/aurweb.css
+++ b/web/html/css/aurweb.css
@@ -101,7 +101,7 @@
        color: #999;
 }
 
-.delete-comment-form, .edit-comment {
+.delete-comment-form, .pin-comment-form, .edit-comment {
        float: right;
        margin-left: 8px;
 }
@@ -118,12 +118,26 @@
        opacity: 0.6;
 }
 
-.delete-comment:hover, .edit-comment:hover {
+.delete-comment:hover, .edit-comment:hover, .pin-comment:hover {
        -webkit-filter: none;
        filter: none;
        opacity: 1;
 }
 
+.pin-comment {
+       float: right;
+       font-weight: 600;
+       background: none!important;
+       border: none; 
+       padding: 0!important;
+       font: inherit;
+       cursor: pointer;
+       color: #3366aa;
+       -webkit-filter: grayscale(100%);
+       filter: grayscale(100%);
+       opacity: 0.6;
+}
+
 .ajax-loader {
        float: right;
        position: relative;
diff --git a/web/lib/pkgbasefuncs.inc.php b/web/lib/pkgbasefuncs.inc.php
index 0a4176f..87f5dcb 100644
--- a/web/lib/pkgbasefuncs.inc.php
+++ b/web/lib/pkgbasefuncs.inc.php
@@ -257,6 +257,13 @@ function pkgbase_display_details($base_id, $row, $SID="") {
                if ($SID) {
                        include('pkg_comment_box.php');
                }
+               
+               $limit_pinned = isset($_GET['pinned']) ? 0 : 5;
+               $include_del_pinned = has_credential(CRED_COMMENT_VIEW_DELETED);
+               $pinned = pkgbase_pinned_comments($base_id, $limit_pinned, 
$include_del_pinned);
+               if (!empty($pinned)) {
+                       include('pkg_pinned_comments.php');
+               }
 
                $limit = isset($_GET['comments']) ? 0 : 10;
                $include_deleted = has_credential(CRED_COMMENT_VIEW_DELETED);
diff --git a/web/lib/pkgfuncs.inc.php b/web/lib/pkgfuncs.inc.php
index 8e8f5d2..0019706 100644
--- a/web/lib/pkgfuncs.inc.php
+++ b/web/lib/pkgfuncs.inc.php
@@ -635,7 +635,14 @@ function pkg_display_details($id=0, $row, $SID="") {
                if ($SID) {
                        include('pkg_comment_box.php');
                }
-
+               
+               $limit_pinned = isset($_GET['pinned']) ? 0 : 5;
+               $include_del_pinned = has_credential(CRED_COMMENT_VIEW_DELETED);
+               $pinned = pkgbase_pinned_comments($base_id, $limit_pinned, 
$include_del_pinned);
+               if (!empty($pinned)) {
+                   include('pkg_pinned_comments.php');
+               }
+               
                $limit = isset($_GET['comments']) ? 0 : 10;
                $include_deleted = has_credential(CRED_COMMENT_VIEW_DELETED);
                $comments = pkgbase_comments($base_id, $limit, 
$include_deleted);
diff --git a/web/template/pkg_comments.php b/web/template/pkg_comments.php
index 21ce16f..a0afc64 100644
--- a/web/template/pkg_comments.php
+++ b/web/template/pkg_comments.php
@@ -56,6 +56,28 @@ $count = pkgbase_comments_count($base_id, $include_deleted);
                        <?php if (!$row['DelUsersID'] && 
can_edit_comment_array($row)): ?>
                        <a href="<?= 
htmlspecialchars(get_pkgbase_uri($pkgbase_name) . 'edit-comment/?comment_id=' . 
$row['ID'], ENT_QUOTES) ?>" class="edit-comment" title="<?= __('Edit comment') 
?>"><img src="/images/pencil.min.svg" alt="<?= __('Edit comment') ?>" 
width="11" height="11"></a>
                        <?php endif; ?>
+                       
+                       <?php if (!$row['DelUsersID'] && !$row['PinnedUsersID'] 
&& can_pin_comment_array($row)): ?>
+                               <form class="pin-comment-form" method="post" 
action="<?= htmlspecialchars(get_pkgbase_uri($pkgbase_name), ENT_QUOTES); ?>">
+                                       <fieldset style="display:inline;">
+                                               <input type="hidden" 
name="action" value="do_PinComment" />
+                                               <input type="hidden" 
name="comment_id" value="<?= $row['ID'] ?>" />
+                                               <input type="hidden" 
name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+                                               <input type="submit" 
class="pin-comment" value="<?= __('Pin') ?>" width="11" height="11" alt="<?= 
__('Pin comment') ?>" title="<?= __('Pin comment') ?>" name="submit" value="1" 
/>
+                                       </fieldset>
+                               </form>
+                       <?php endif; ?>
+                       
+                       <?php if (!$row['DelUsersID'] && $row['PinnedUsersID'] 
&& can_pin_comment_array($row)): ?>
+                               <form class="pin-comment-form" method="post" 
action="<?= htmlspecialchars(get_pkgbase_uri($pkgbase_name), ENT_QUOTES); ?>">
+                                       <fieldset style="display:inline;">
+                                               <input type="hidden" 
name="action" value="do_UnpinComment" />
+                                               <input type="hidden" 
name="comment_id" value="<?= $row['ID'] ?>" />
+                                               <input type="hidden" 
name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+                                               <input type="submit" 
class="pin-comment" value="<?= __('Unpin') ?>" width="11" height="11" alt="<?= 
__('Unin comment') ?>" title="<?= __('Pin comment') ?>" name="submit" value="1" 
/>
+                                       </fieldset>
+                               </form>
+                       <?php endif; ?>
                </h4>
                <div class="article-content<?php if ($row['DelUsersID']): ?> 
comment-deleted<?php endif; ?>">
                        <p>
diff --git a/web/template/pkg_pinned_comments.php 
b/web/template/pkg_pinned_comments.php
new file mode 100644
index 0000000..9d87082
--- /dev/null
+++ b/web/template/pkg_pinned_comments.php
@@ -0,0 +1,112 @@
+<?php
+if (isset($row['BaseID'])) {
+       /* On a package details page. */
+       $base_id = $row['BaseID'];
+} else {
+       /* On a package base details page. */
+       $base_id = $row['ID'];
+}
+$include_deleted = has_credential(CRED_COMMENT_VIEW_DELETED);
+$count = pkgbase_comments_count($base_id, $include_deleted);
+?>
+<div id="news">
+       <h3>
+               <a href="<?= htmlentities(get_pkgbase_uri($pkgbase_name), 
ENT_QUOTES) . '?' . mkurl('comments=all') ?>" title="<?= __('View all pinned 
comments' , $count) ?> (<?= $count ?>)"><?= __('Pinned Comments') ?></a>
+               <span class="arrow"></span>
+       </h3>
+
+       <?php while (list($indx, $row) = each($pinned)): ?>
+               <?php
+               $date_fmtd = gmdate('Y-m-d H:i', $row['CommentTS']);
+               if ($row['UserName']) {
+                       $user_fmtd = html_format_username($row['UserName']);
+                       $heading = __('%s commented on %s', $user_fmtd, 
$date_fmtd);
+               } else {
+                       $heading = __('Anonymous comment on %s', $date_fmtd);
+               }
+
+               if ($row['EditedTS']) {
+                       $date_fmtd = gmdate('Y-m-d H:i', $row['EditedTS']);
+                       $heading .= ' <span class="edited">(';
+                       if ($row['DelUsersID']) {
+                               $user_fmtd = 
html_format_username($row['DelUserName']);
+                               $heading .= __('deleted on %s by %s', 
$date_fmtd, $user_fmtd);
+                       } else {
+                               $user_fmtd = 
html_format_username($row['EditUserName']);
+                               $heading .= __('last edited on %s by %s', 
$date_fmtd, $user_fmtd);
+                       }
+                       $heading .= ')</span>';
+               }
+
+               $row['DelUserName'] = html_format_username($row['DelUserName']);
+               $row['EditUserName'] = 
html_format_username($row['EditUserName']);
+               ?>
+               <h4 id="comment-<?= $row['ID'] ?>"<?php if 
($row['DelUsersID']): ?> class="comment-deleted"<?php endif; ?>>
+                       <?= $heading ?>
+                       <?php if (!$row['DelUsersID'] && 
can_delete_comment_array($row)): ?>
+                               <form class="delete-comment-form" method="post" 
action="<?= htmlspecialchars(get_pkgbase_uri($pkgbase_name), ENT_QUOTES); ?>">
+                                       <fieldset style="display:inline;">
+                                               <input type="hidden" 
name="action" value="do_DeleteComment" />
+                                               <input type="hidden" 
name="comment_id" value="<?= $row['ID'] ?>" />
+                                               <input type="hidden" 
name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+                                               <input type="image" 
class="delete-comment" src="/images/x.min.svg" width="11" height="11" alt="<?= 
__('Delete comment') ?>" title="<?= __('Delete comment') ?>" name="submit" 
value="1" />
+                                       </fieldset>
+                               </form>
+                       <?php endif; ?>
+                       <?php if (!$row['DelUsersID'] && 
can_edit_comment_array($row)): ?>
+                       <a href="<?= 
htmlspecialchars(get_pkgbase_uri($pkgbase_name) . 'edit-comment/?comment_id=' . 
$row['ID'], ENT_QUOTES) ?>" class="edit-comment" title="<?= __('Edit comment') 
?>"><img src="/images/pencil.min.svg" alt="<?= __('Edit comment') ?>" 
width="11" height="11"></a>
+                       <?php endif; ?>
+                       
+                       <?php if (!$row['DelUsersID'] && 
can_pin_comment_array($row)): ?>
+                               <form class="pin-comment-form" method="post" 
action="<?= htmlspecialchars(get_pkgbase_uri($pkgbase_name), ENT_QUOTES); ?>">
+                                       <fieldset style="display:inline;">
+                                               <input type="hidden" 
name="action" value="do_UnpinComment" />
+                                               <input type="hidden" 
name="comment_id" value="<?= $row['ID'] ?>" />
+                                               <input type="hidden" 
name="token" value="<?= htmlspecialchars($_COOKIE['AURSID']) ?>" />
+                                               <input type="submit" 
class="pin-comment" value="<?= __('Unpin') ?>" width="11" height="11" alt="<?= 
__('Unpin comment') ?>" title="<?= __('Pin comment') ?>" name="submit" 
value="1" />
+                                       </fieldset>
+                               </form>
+                       <?php endif; ?>
+               </h4>
+               <div class="article-content<?php if ($row['DelUsersID']): ?> 
comment-deleted<?php endif; ?>">
+                       <p>
+                               <?= parse_comment($row['Comments']) ?>
+                       </p>
+               </div>
+       <?php endwhile; ?>
+</div>
+<script>
+$(document).ready(function() {
+       $('.edit-comment').click(function () {
+               var parent_element = this.parentElement,
+                       parent_id = parent_element.id,
+                       comment_id = parent_id.substr(parent_id.indexOf('-') + 
1),
+                       edit_form = $(parent_element).next(),
+                       _this = $(this);
+               add_busy_indicator(_this);
+               $.getJSON('<?= get_uri('/rpc') ?>', {
+                       type: 'get-comment-form',
+                       arg: comment_id,
+                       base_id: <?= intval($base_id) ?>,
+                       pkgbase_name: <?= json_encode($pkgbase_name) ?>
+               }, function (data) {
+                       remove_busy_indicator(_this);
+                       if (data.success) {
+                               edit_form.html(data.form);
+                               edit_form.find('textarea').focus();
+                       } else {
+                               alert(data.error);
+                       }
+               });
+               return false;
+       });
+
+       function add_busy_indicator(sibling) {
+               sibling.after('<img src="/images/ajax-loader.gif" 
class="ajax-loader" width="16" height="11" alt="Busy..." />');
+       }
+
+       function remove_busy_indicator(sibling) {
+               sibling.next().remove();
+       }
+});
+</script>
-- 
2.6.2

Reply via email to