Daniel Axtens <d...@axtens.net> writes: > Raxel Gutierrez <ra...@google.com> writes: > >> Add new label to patch comments to show the status of whether they are >> addressed or not and add an adjacent button to allow users to change the >> status of the comment. Only users that can edit the patch (i.e. patch >> author, delegate, project maintainers) as well as comment authors can >> change the status of a comment. Before [1] and after [2] images for >> reference. >> >> Refactor both the message containers in the "Commit Message" and >> "Comments" to have the same styling through the `patch-message` class so >> that the headers are normalized to be left-aligned. Also, pass context >> about whether the patch is `editable` by the user to the patch-detail >> template. >> >> Use new comment detail REST API endpoint to update the addressed field >> value when "Addressed" or "Unaddressed" buttons are clicked. After, the >> request is made, the appearance of the comment status label and buttons >> are toggled appropriately. >> >> [1] https://imgur.com/NDfcPJy >> [2] https://imgur.com/kIhohED >> >> Signed-off-by: Raxel Gutierrez <ra...@google.com> >> --- >> htdocs/css/style.css | 53 +++++++++++++- >> htdocs/js/submission.js | 15 ++++ >> patchwork/templates/patchwork/submission.html | 69 ++++++++++++++----- >> patchwork/views/patch.py | 1 + >> 4 files changed, 118 insertions(+), 20 deletions(-) >> >> diff --git a/htdocs/css/style.css b/htdocs/css/style.css >> index 46a91ee..ba83de4 100644 >> --- a/htdocs/css/style.css >> +++ b/htdocs/css/style.css >> @@ -1,3 +1,9 @@ >> +:root { >> + --light-color: #F7F7F7; >> + --warning-color: #f0ad4e; >> + --success-color: #5cb85c; >> +} >> + >> h2 { >> font-size: 25px; >> margin: 18px 0 18px 0; >> @@ -21,6 +27,10 @@ pre { >> top: 17em; >> } >> >> +.hidden { >> + visibility: hidden; >> +} >> + >> /* Bootstrap overrides */ >> >> .navbar-inverse .navbar-brand > a { >> @@ -277,12 +287,18 @@ table.patch-meta tr th, table.patch-meta tr td { >> color: #f7977a; >> } >> >> -.comment .meta { >> +.patch-message .meta { >> + display: flex; >> + align-items: center; >> background: #f0f0f0; >> padding: 0.3em 0.5em; >> } >> >> -.comment .content { >> +.patch-message .message-date { >> + margin-left: 8px; >> +} >> + >> +.patch-message .content { >> border: 0; >> } >> >> @@ -294,6 +310,39 @@ table.patch-meta tr th, table.patch-meta tr td { >> font-family: "DejaVu Sans Mono", fixed; >> } >> >> +div[class^="comment-status-bar-"] { >> + display: flex; >> + flex-wrap: wrap; >> + align-items: center; >> +} >> + >> +.comment-status-label { >> + margin: 0px 8px; >> +} >> + >> +button[class^=comment-action] { >> + background-color: var(--light-color); >> + border-radius: 4px; >> +} >> + >> +.comment-action-addressed { >> + border-color: var(--success-color); >> +} >> + >> +.comment-action-unaddressed { >> + border-color: var(--warning-color); >> +} >> + >> +.comment-action-addressed:hover { >> + background-color: var(--success-color); >> + color: var(--light-color); >> +} >> + >> +.comment-action-unaddressed:hover { >> + background-color: var(--warning-color); >> + color: var(--light-color); >> +} >> + >> .quote { >> color: #007f00; >> } >> diff --git a/htdocs/js/submission.js b/htdocs/js/submission.js >> index 9676f34..27e4a02 100644 >> --- a/htdocs/js/submission.js >> +++ b/htdocs/js/submission.js >> @@ -1,3 +1,5 @@ >> +import { updateProperty } from "./rest.js"; >> + >> $( document ).ready(function() { >> function toggleDiv(link_id, headers_id, label_show, label_hide) { >> const link = document.getElementById(link_id) >> @@ -14,6 +16,19 @@ $( document ).ready(function() { >> } >> } >> >> + $("button[class^='comment-action']").click((event) => { >> + const patchId = document.getElementById("patch").dataset.patchId; >> + const commentId = event.target.parentElement.dataset.commentId; >> + const url = "/api/patches/" + patchId + "/comments/" + commentId + >> "/"; >> + const data = {'addressed': event.target.value} ; >> + const updateMessage = { >> + 'none': "No comments updated", >> + 'some': "1 comment(s) updated", >> + }; >> + updateProperty(url, data, updateMessage); >> + >> $("div[class^='comment-status-bar-'][data-comment-id='"+commentId+"']").toggleClass("hidden"); >> + }); >> + > > If I hit this button repeatedly and quickly, I eventually get a 500 > error from the server and the following on the console: > > rest.js:22 PATCH http://localhost:8000/api/patches/17/comments/undefined/ 500 > (Internal Server Error) > VM283:1 Uncaught (in promise) SyntaxError: Unexpected token < in JSON at > position 0 > at JSON.parse (<anonymous>) > at rest.js:28 > > The django log contains the following revealing snippet (and then we hit > the error from the API patch where we try to look up the linkname field > which doesn't exist): > > web_1 | "PATCH /api/patches/17/comments/undefined/ HTTP/1.1" 500 169238 > web_1 | Internal Server Error: /api/patches/17/comments/undefined/ > web_1 | Traceback (most recent call last): > web_1 | File "/home/patchwork/patchwork/patchwork/api/comment.py", line > 101, in get_object > web_1 | obj = queryset.get(id=int(comment_id)) > web_1 | ValueError: invalid literal for int() with base 10: 'undefined' > > Somehow I'm guessing the data field is getting rewritten and we're > losing the comment ID temporarily? I haven't traced through the JS to > figure out how but hopefully you can debug it from here. FWIW I'm using > Chrome on Ubuntu.
This no longer happens with the new rest.js. :D > > Kind regards, > Daniel > >> // Click listener to show/hide headers >> >> document.getElementById("toggle-patch-headers").addEventListener("click", >> function() { >> toggleDiv("toggle-patch-headers", "patch-headers"); >> diff --git a/patchwork/templates/patchwork/submission.html >> b/patchwork/templates/patchwork/submission.html >> index 66efa0b..1ee3436 100644 >> --- a/patchwork/templates/patchwork/submission.html >> +++ b/patchwork/templates/patchwork/submission.html >> @@ -257,14 +257,14 @@ >> {% else %} >> <h2>Message</h2> >> {% endif %} >> -<div class="comment"> >> -<div class="meta"> >> - <span>{{ submission.submitter|personify:project }}</span> >> - <span class="pull-right">{{ submission.date }} UTC</span> >> -</div> >> -<pre class="content"> >> -{{ submission|commentsyntax }} >> -</pre> >> +<div class="patch-message"> >> + <div class="meta"> >> + <span>{{ submission.submitter|personify:project }}</span> >> + <span class="message-date">{{ submission.date }} UTC</span> >> + </div> >> + <pre class="content"> >> + {{ submission|commentsyntax }} >> + </pre> >> </div> >> >> {% for item in comments %} >> @@ -273,15 +273,48 @@ >> {% endif %} >> >> <a name="{{ item.id }}"></a> >> -<div class="comment"> >> -<div class="meta"> >> - <span>{{ item.submitter|personify:project }}</span> >> - <span class="pull-right">{{ item.date }} UTC | <a href="{% url >> 'comment-redirect' comment_id=item.id %}" >> - >#{{ forloop.counter }}</a></span> >> -</div> >> -<pre class="content"> >> -{{ item|commentsyntax }} >> -</pre> >> +<div class="patch-message"> >> + <div class="meta"> >> + {{ item.submitter|personify:project }} >> + <span class="message-date">{{ item.date }} UTC | >> + <a href="{% url 'comment-redirect' comment_id=item.id %}">#{{ >> forloop.counter }}</a> >> + </span> >> + {% if item.addressed %} >> + <div class="comment-status-bar-addressed" data-comment-id={{item.id}}> >> + {% else %} >> + <div class="comment-status-bar-addressed hidden" >> data-comment-id={{item.id}}> >> + {% endif %} >> + <div class="comment-status-label text-success mx-3"> >> + <span class="glyphicon glyphicon-ok-circle" >> aria-hidden="true"></span> >> + Addressed >> + </div> >> + {% if editable %} >> + <button class="comment-action-unaddressed text-warning" >> value="false"> >> + <span class="glyphicon glyphicon-warning-sign" >> aria-hidden="true"></span> >> + Unaddressed >> + </button> >> + {% endif %} >> + </div> >> + {% if item.addressed %} >> + <div class="comment-status-bar-unaddressed hidden" >> data-comment-id={{item.id}}> >> + {% else %} >> + <div class="comment-status-bar-unaddressed" >> data-comment-id={{item.id}}> >> + {% endif %} >> + <div class="comment-status-label text-warning mx-3"> >> + <span class="glyphicon glyphicon-warning-sign" >> aria-hidden="true"></span> >> + Unaddressed >> + </div> >> + {% if editable %} >> + <button class="comment-action-addressed text-success" >> value="true"> >> + <span class="glyphicon glyphicon-ok-circle" >> aria-hidden="true"></span> >> + Addressed >> + </button> >> + {% endif %} >> + </div> >> + </div> >> + <pre class="content"> >> + {{ item|commentsyntax }} >> + </pre> >> </div> >> {% endfor %} >> >> @@ -290,7 +323,7 @@ >> {% include "patchwork/partials/download-buttons.html" %} >> <h2>Patch</h2> >> </div> >> -<div id="patch" class="patch"> >> +<div id="patch" data-patch-id={{submission.id}} class="patch"> >> <pre class="content"> >> {{ submission|patchsyntax }} >> </pre> >> diff --git a/patchwork/views/patch.py b/patchwork/views/patch.py >> index 3e6874a..ac9cb44 100644 >> --- a/patchwork/views/patch.py >> +++ b/patchwork/views/patch.py >> @@ -128,6 +128,7 @@ def patch_detail(request, project_id, msgid): >> patch.check_set.all().select_related('user'), >> ) >> context['submission'] = patch >> + context['editable'] = editable >> context['patchform'] = form >> context['createbundleform'] = createbundleform >> context['project'] = patch.project >> -- >> 2.33.0.rc1.237.g0d66db33f3-goog >> >> _______________________________________________ >> Patchwork mailing list >> Patchwork@lists.ozlabs.org >> https://lists.ozlabs.org/listinfo/patchwork _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork