mozreview: update commits table when issue status changes (bug 1253552) r?davidwalsh draft
authorbyron jones <glob@mozilla.com>
Fri, 08 Jul 2016 15:45:46 +0800
changeset 9680 dbee7b710d97be3a00c1edce923478dd3d7bcadb
parent 9679 1336761190e70b2e258242757baff2c18912e998
push id1268
push userbjones@mozilla.com
push dateMon, 10 Oct 2016 14:39:40 +0000
reviewersdavidwalsh
bugs1253552
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
pylib/mozreview/mozreview/static/mozreview/js/autoland.js
pylib/mozreview/mozreview/static/mozreview/js/commits.js
pylib/mozreview/mozreview/static/mozreview/js/init_rr.js
pylib/mozreview/mozreview/templates/mozreview/commits.html
--- 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 %}