mozreview: update commits table when issue status changes (
bug 1253552) r?davidwalsh
Listen for the issueStatusUpdated event and refresh the commits table.
MozReview-Commit-ID: IjmQP0REgMk
--- a/pylib/mozreview/mozreview/static/mozreview/js/autoland.js
+++ b/pylib/mozreview/mozreview/static/mozreview/js/autoland.js
@@ -283,29 +283,37 @@
} else if (!MozReview.reviewRequestPending) {
autoland_trigger.attr('title', 'You can not autoland from a closed review request');
} else {
MozReview.parentReviewRequest.ready({
error: function() {
autoland_trigger.attr('title', 'Error determining approval');
},
ready: function() {
- if (!MozReview.parentReviewRequest.get('approved')) {
- autoland_trigger.attr(
- 'title',
- 'Review request not approved for landing: ' +
- MozReview.parentReviewRequest.get('approvalFailure'));
- } else {
- autoland_trigger.css('opacity', '1');
- autoland_trigger.click(autoland_confirm);
- }
+ $(document).trigger('mr:update_autoland_menuitem');
}
});
}
+ $(document).on('mr:update_autoland_menuitem', function() {
+ var $autoland_trigger = $('#autoland-trigger');
+ if (!MozReview.parentReviewRequest.get('approved')) {
+ $autoland_trigger
+ .attr('title', 'Review request not approved for landing: ' +
+ MozReview.parentReviewRequest.get('approvalFailure'))
+ .css('opacity', 0.5)
+ .off('click', autoland_confirm);
+ } else {
+ $autoland_trigger
+ .attr('title', '')
+ .css('opacity', 1)
+ .on('click', autoland_confirm);
+ }
+ });
+
$('.action-landed[data-repository][data-revision]').each(function(index, elem) {
var repository = $(elem).data('repository');
var revision = $(elem).data('revision');
var actionHeading = $(elem).find('.action-info > .action-heading')[0];
var actionMeta = $(elem).find('.action-info > .action-meta')[0];
$.ajax({
url: 'https://treeherder.mozilla.org/api/project/'+repository+'/resultset/?revision='+revision,
})
--- a/pylib/mozreview/mozreview/static/mozreview/js/commits.js
+++ b/pylib/mozreview/mozreview/static/mozreview/js/commits.js
@@ -85,24 +85,24 @@
//
// Local Drafts
//
function getLocalDraft() {
var localDrafts = window.localStorage.localDrafts ?
JSON.parse(window.localStorage.localDrafts) : {};
- var parent_rrid = $("#mozreview-parent-request").data("id");
+ var parent_rrid = $("#mozreview-data").data("parent-review-id");
return localDrafts[parent_rrid] ? localDrafts[parent_rrid] : {};
}
function setLocalDraft(draft) {
var localDrafts = window.localStorage.localDrafts ?
JSON.parse(window.localStorage.localDrafts) : {};
- var parent_rrid = $("#mozreview-parent-request").data("id");
+ var parent_rrid = $("#mozreview-data").data("parent-review-id");
if (draft) {
localDrafts[parent_rrid] = draft;
}
else {
delete localDrafts[parent_rrid];
}
window.localStorage.localDrafts = JSON.stringify(localDrafts);
}
@@ -116,17 +116,17 @@
discardLocalDraft();
return;
}
var draft = getLocalDraft();
RB.setActivityIndicator(true, {});
$.ajax({
type: "POST",
data: {
- parent_request_id: $("#mozreview-parent-request").data("id"),
+ parent_request_id: $("#mozreview-data").data("parent-review-id"),
reviewers: JSON.stringify(draft)
},
url: "/api/extensions/mozreview.extension.MozReviewExtension/modify-reviewers/",
success: function(rsp) {
discardLocalDraft(true);
window.location.reload(true);
},
error: function(xhr, textStatus, errorThrown) {
@@ -227,34 +227,34 @@
}
}
function ensureNativeDrafts() {
RB.setActivityIndicator(true, {});
$.ajax({
type: "POST",
data: {
- parent_request_id: $("#mozreview-parent-request").data("id")
+ parent_request_id: $("#mozreview-data").data("parent-review-id")
},
url: "/api/extensions/mozreview.extension.MozReviewExtension/ensure-drafts/",
success: function(rsp) {
RB.setActivityIndicator(false, {});
},
error: function(xhr, textStatus, errorThrown) {
RB.setActivityIndicator(false, {});
showError(errorThrown, xhr);
}
});
}
function augmentNativeBanner() {
if (!MozReview.isParent) {
// Unfortunately we cannot publish from children, so provide a link
// to the parent instead.
- var parent_rrid = $("#mozreview-parent-request").data("id");
+ var parent_rrid = $("#mozreview-data").data("parent-review-id");
$("#draft-banner").append(
$('<a href="/r/' + parent_rrid + '/" title="You can only Publish or Discard when ' +
'viewing the \'Review Summary / Parent\'.">Publish or Discard my changes.</a>'));
}
}
var editors = {};
@@ -340,58 +340,81 @@
RB.setActivityIndicator(false, {});
restoreLocalDraftState($reviewer_list);
showError(errorThrown, xhr);
}
});
}
}
- $(".mozreview-child-reviewer-list")
- .inlineEditor({
- editIconClass: "rb-icon rb-icon-edit",
- useEditIconOnly: true,
- enabled: true,
- setFieldValue: function(editor, value) {
- editor._field.val(value.trim());
- }
- })
- .on({
- beginEdit: function() {
- $reviewer_list = $(this);
- // Store the original html and reviewer list so we can restore later.
- saveOriginalReviewerState($reviewer_list);
- // store the current edit to support cancelling
- $reviewer_list.data("prior", $reviewer_list.html());
- // Inc editCount to enable "leave this page" warning.
- MozReview.reviewEditor.incr("editCount");
- },
- cancel: function() {
- $reviewer_list = $(this);
- // restoreOriginalReviewerState($reviewer_list);
- $reviewer_list.html($reviewer_list.data("prior"));
- $reviewer_list.data("prior", "");
- MozReview.reviewEditor.decr("editCount");
- },
- complete: function(e, value) {
- $reviewer_list = $(this);
- $reviewer_list.data("prior", "");
- MozReview.reviewEditor.decr("editCount");
- updateReviewers($reviewer_list, value);
- }
- });
+ $("#mozreview-child-requests").on("mr:commits_setup", function() {
+ $(".mozreview-child-reviewer-list")
+ .inlineEditor({
+ editIconClass: "rb-icon rb-icon-edit",
+ useEditIconOnly: true,
+ enabled: true,
+ setFieldValue: function(editor, value) {
+ editor._field.val(value.trim());
+ }
+ })
+ .on({
+ beginEdit: function() {
+ $reviewer_list = $(this);
+ // Store the original html and reviewer list so we can restore later.
+ saveOriginalReviewerState($reviewer_list);
+ // store the current edit to support cancelling
+ $reviewer_list.data("prior", $reviewer_list.html());
+ // Inc editCount to enable "leave this page" warning.
+ MozReview.reviewEditor.incr("editCount");
+ },
+ cancel: function() {
+ $reviewer_list = $(this);
+ // restoreOriginalReviewerState($reviewer_list);
+ $reviewer_list.html($reviewer_list.data("prior"));
+ $reviewer_list.data("prior", "");
+ MozReview.reviewEditor.decr("editCount");
+ },
+ complete: function(e, value) {
+ $reviewer_list = $(this);
+ $reviewer_list.data("prior", "");
+ MozReview.reviewEditor.decr("editCount");
+ updateReviewers($reviewer_list, value);
+ }
+ });
+ })
+ .trigger("mr:commits_setup");
// Update UI if there's an existing draft.
if (MozReview.isSubmitter) {
augmentNativeBanner();
} else if (hasLocalDraft()) {
showLocalDraftBanner();
restoreLocalDraftState();
}
+ // Update state when issues are fixed/dropped/reopened.
+ RB.PageManager.getPage().commentIssueManager.on('issueStatusUpdated',
+ function(comment) {
+ // Refresh the commits table.
+ var parent_rrid = $("#mozreview-data").data("parent-review-id");
+ var selected_rrid = $("#mozreview-data").data("selected-review-id");
+ $("#mozreview-child-requests")
+ .load("/mozreview/commits_summary_table/" + parent_rrid + "/" +
+ selected_rrid + "/", function() {
+ $(this).trigger('mr:commits_setup');
+ });
+
+ // Update the parentReviewRequest object, then update the autoland menu.
+ MozReview.parentReviewRequest.fetch({
+ success: function() {
+ $(document).trigger('mr:update_autoland_menuitem');
+ }
+ });
+ });
+
// This next bit sets up the autocomplete popups for reviewers. This
// code is mostly copied from Review Board itself - please see the
// copyright notice in the header.
var acOptions = {
fieldName: "users",
nameKey: "username",
descKey: "fullname",
extraParams: {
--- a/pylib/mozreview/mozreview/static/mozreview/js/init_rr.js
+++ b/pylib/mozreview/mozreview/static/mozreview/js/init_rr.js
@@ -1,16 +1,16 @@
var MozReview = {};
$(document).ready(function() {
// The back-end should have already supplied us with the parent review
// request ID (whether or not we're already looking at it), and set it as
- // the data-id attribute on the mozreview-parent-request element. Let's get
+ // the parent-review-id attribute on the mozreview-data element. Let's get
// that first - because if we can't get it, we're stuck.
- MozReview.parentID = $("#mozreview-parent-request").data("id");
+ MozReview.parentID = $("#mozreview-data").data("parent-review-id");
if (!MozReview.parentID) {
console.error("Could not find a valid id for the parent review " +
"request.");
return;
}
// Load injected user data>
--- a/pylib/mozreview/mozreview/templates/mozreview/commits.html
+++ b/pylib/mozreview/mozreview/templates/mozreview/commits.html
@@ -9,18 +9,24 @@ This is the template for the "Commits" l
<div id="error-container">
<h1>Well, this is embarassing...</h1>
<p>Something's gone wrong in either retrieving or manipulating these review requests. Sorry about that. <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=MozReview&component=General" target="_blank">Please consider filing a bug,</a> and including the following information:</p>
<p id="error-info"></p>
<pre id="error-stack"></pre>
<a href="#" id="error-stack-toggle">Stack</a>
<a href="#" id="error-close">Close</a>
</div>
+
+<div id="mozreview-data"
+ data-parent-review-id="{{ parent_details.get_review_request.id }}"
+ data-selected-review-id="{{ review_request_details.get_review_request.id }}"
+></div>
+
<div id="mozreview-request-series">
- <div id="mozreview-parent-request" data-id="{{parent_details.get_review_request.id}}">
+ <div id="mozreview-parent-request">
<a href="{{parent_details.get_review_request.get_absolute_url}}">Review Summary</a>
<a href="{{parent_details.get_review_request.get_absolute_url}}diff/#index_header">Squashed Diff</a>
</div>
{% include 'mozreview/commits-requests.html' %}
{% if latest_autoland_requests %}
<div id="ci-actions">
{% for autoland_request in latest_autoland_requests %}
{% if not forloop.first %}