[aur-dev] [PATCH 1/2] Add capability to pin comments above others
Adds functions and credential information to pin comments before others.
This needs two extra columns (PinnedTS and PinnedUsersID) to the
PackageComments table.
Signed-off-by: Mark Weiman
Implements FS#10863
Signed-off-by: Mark Weiman
+ <?= $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
On Sat, 28 Nov 2015 at 01:44:26, Mark Weiman wrote:
Adds functions and credential information to pin comments before others.
This needs two extra columns (PinnedTS and PinnedUsersID) to the PackageComments table.
Signed-off-by: Mark Weiman
--- web/html/pkgbase.php | 4 ++ web/lib/credentials.inc.php | 2 + web/lib/pkgbasefuncs.inc.php | 123 ++++++++++++++++++++++++++++++++++++++++++- web/lib/pkgfuncs.inc.php | 54 +++++++++++++++++++ 4 files changed, 182 insertions(+), 1 deletion(-)
First of all, thanks for working on this! I planned on implementing this for a while but never got around to doing it. The main difference of this series to what I had in mind is that you allow for pinning multiple comments whereas I planned to have a single pinned comment (per package base) only. Can you think of a use case where having several pinned comments is desirable? Can't the maintainer simply edit the pinned comment and add new information? Would we ever want to pin a comment from a user other than the current maintainer? More comments on the implementation below.
[...] /** + * Get all pinned package comment information for a specific package base + * + * @param int $base_id The package base ID to get comments for + * @param int $limit Maximum number of comments to return (0 means unlimited) + * @param bool $include_deleted True if deleted comments should be included + * + * @return array Pinned package comment information for specific package base + */ +function pkgbase_pinned_comments($base_id, $limit, $include_deleted) { [...]
I did not have a very detailed look at the second patch in this series but is this really needed? Can't we simply retrieve all comments by calling pkgbase_comments() and order them such that pinned comments are displayed first?
[...] +/** + * Display pinned comments before the other comments on a package page + * + * @param string $base_id The package base ID to add the comment on + * @param string $uid The user ID of the individual who pinned the comment + * @param string $comment_id The comment id to be pinned + * + * @return void + */ +function pkgbase_disp_pin_comment($base_id, $uid, $comment_id) { + $dbh = DB::connect(); + + $q = "UPDATE PackageComments "; + $q.= "SET PinnedTS = UNIXTIMESTAMP()), PinnedUsersID=" . $uid . " "; + $q.= "WHERE ID = " . intval($comment_id);
After having read the function name and the comment, I would have expected this function to print a pinned comment but that does not seem to be what this function does... Anyway, what is the difference between this function and pkgbase_pin_comment() below? Can't we somehow merge those functions?
[...] /** + * Determine if the user can pin a specific package comment + * + * Only the Package Maintainer, Trusted Users, and Developers can pin + * comments. This function is used for the backend side of comment pinning. + * + * @param string $comment_id The comment ID in the database + * + * @return bool True if the user can pin the comment, otherwise false + */ +function can_pin_comment($comment_id=0) { + $dbh = DB::connect(); + + $q = "SELECT MaintainerUID FROM PackageBases AS pb "; + $q.= "LEFT JOIN PackageComments AS pc ON pb.ID = pc.PackageBaseID "; + $q.= "WHERE pc.ID = " . intval($comment_id); + $result = $dbh->query($q); + + if (!$result) { + return false; + } + + $uid = $result->fetch(PDO::FETCH_COLUMN, 0); + + return has_credential(CRED_COMMENT_PIN, array($uid)); +} + +/** + * Determine if the user can edit a specific package comment using an array + * + * Only the Package Maintainer, Trusted Users, and Developers can pin + * comments. This function is used for the frontend side of comment pinning. + * + * @param array $comment All database information relating a specific comment + * + * @return bool True if the user can edit the comment, otherwise false + */ +function can_pin_comment_array($comment) { + $dbh = DB::connect(); + + $q = "SELECT MaintainerUID FROM PackageBases AS pb "; + $q.= "LEFT JOIN PackageComments AS pc ON pb.ID = pc.PackageBaseID "; + $q.= "WHERE pc.ID = " . intval($comment['ID']); + $result = $dbh->query($q); + + if (!$result) { + return false; + } + + $uid = $result->fetch(PDO::FETCH_COLUMN, 0); + + return has_credential(CRED_COMMENT_PIN, array($uid)); +} [...]
Isn't this equivalent to function can_pin_comment_array($comment) { return can_pin_comment($comment['ID']); } ...? I also think that the function name is slightly misleading. I would have expected that can_pin_comment_array() accepts an array of comment IDs and returns an array of boolean values. Do we need that function at all? Can't we simply call can_pin_comment($comment['ID']) instead? Regards, Lukas
On Sat, 2015-11-28 at 13:06 +0100, Lukas Fleischer wrote:
First of all, thanks for working on this! I planned on implementing this for a while but never got around to doing it.
The main difference of this series to what I had in mind is that you allow for pinning multiple comments whereas I planned to have a single pinned comment (per package base) only. Can you think of a use case where having several pinned comments is desirable? Can't the maintainer simply edit the pinned comment and add new information? Would we ever want to pin a comment from a user other than the current maintainer?
More comments on the implementation below.
No problem! I was thinking that rather than having to retype the same information (or copy and paste), we could just pin a comment from anyone and if multiple comments have good information, we can pin all of them. Only 5 get displayed unless you go to the "comments=all" page.
I did not have a very detailed look at the second patch in this series but is this really needed? Can't we simply retrieve all comments by calling pkgbase_comments() and order them such that pinned comments are displayed first?
To begin, the only reason I made two patches is because my Postfix server would complain when the patch got too long (lost connection after DATA error) while using git-send-email, so I made two smaller patches to get around that issue. Nothing I did could solve that problem. The idea I was going for was rather than removing the comment order below (preserving the readability of a conversation), just make a copy of it above. While doing that, make a new header above that says "Pinned Comments" above the pinned comments, then do the normal "Latest Comments" section. If you think it should be a single comment from the maintainer that is displaced, I can make that change.
After having read the function name and the comment, I would have expected this function to print a pinned comment but that does not seem to be what this function does... Anyway, what is the difference between this function and pkgbase_pin_comment() below? Can't we somehow merge those functions?
You know what, I cannot tell what I was thinking about when I made this and it appears I never actually use this function. I removed it on my own local instance of aurweb and nothing appears to be broken as a result. The next patch revision will have this removed completely.
Isn't this equivalent to
function can_pin_comment_array($comment) { return can_pin_comment($comment['ID']); }
...? I also think that the function name is slightly misleading. I would have expected that can_pin_comment_array() accepts an array of comment IDs and returns an array of boolean values. Do we need that function at all? Can't we simply call can_pin_comment($comment['ID']) instead?
Wow, I cannot believe that I didn't think of that. Whoops. The reason I did this is it follows how it was done for editing and deleting comments. Even the comments are similar wording (all I really did was a copy and paste from the others). I initially thought about doing just the can_pin_comment() function, but I didn't want to differ too much from editing and deleting. I will for sure simplify that function, but if you think it's better to delete it altogether, I'll get to work on making it work. Perhaps also a rework the other two "array" functions (can_edit_comment_array() and can_delete_comment_array()) should be done in the future if the can_pin_comment_array() function is removed or the comment is changed. Mark Weiman
On Sat, 28 Nov 2015 at 16:01:06, Mark Weiman wrote:
[...] I was thinking that rather than having to retype the same information (or copy and paste), we could just pin a comment from anyone and if multiple comments have good information, we can pin all of them. Only 5 get displayed unless you go to the "comments=all" page.
Sounds good to me.
[...] To begin, the only reason I made two patches is because my Postfix server would complain when the patch got too long (lost connection after DATA error) while using git-send-email, so I made two smaller patches to get around that issue. Nothing I did could solve that problem.
Note that there is a patch size limit on this mailing list as well. However, there is nothing wrong with splitting such a large a patch into back and front end changes.
The idea I was going for was rather than removing the comment order below (preserving the readability of a conversation), just make a copy of it above. While doing that, make a new header above that says "Pinned Comments" above the pinned comments, then do the normal "Latest Comments" section. If you think it should be a single comment from the maintainer that is displaced, I can make that change.
Okay. Maybe we can still share a lot of code between the function that retrieves all comments and the function to retrieve pinned comments?
[...] I will for sure simplify that function, but if you think it's better to delete it altogether, I'll get to work on making it work. Perhaps also a rework the other two "array" functions (can_edit_comment_array() and can_delete_comment_array()) should be done in the future if the can_pin_comment_array() function is removed or the comment is changed. [...]
I am fine with simplifying the function. We can still refactor all the can_*_comment_array() functions in another patch series. Regards, Lukas
Adds functions and credential information to pin comments before others.
This needs two extra columns (PinnedTS and PinnedUsersID) to the
PackageComments table.
Implements FS#10863
Signed-off-by: Mark Weiman
Adds functions and credential information to pin comments before others.
This needs two extra columns (PinnedTS and PinnedUsersID) to the
PackageComments table.
Implements FS#10863
Signed-off-by: Mark Weiman
participants (2)
-
Lukas Fleischer
-
Mark Weiman