[results feed] Add link to create a GitHub issue to try results

Change-Id: I70096b275c10429391c94c562dcb77e87cd90268
Reviewed-on: https://dart-review.googlesource.com/c/dart_ci/+/132320
Reviewed-by: Jonas Termansen <sortie@google.com>
diff --git a/results_feed/lib/src/components/try_results_component.dart b/results_feed/lib/src/components/try_results_component.dart
index 83140da..0dcf1f1 100644
--- a/results_feed/lib/src/components/try_results_component.dart
+++ b/results_feed/lib/src/components/try_results_component.dart
@@ -62,6 +62,7 @@
       .any((change) => change.result != change.expected);
 
   bool get approving => _approving;
+
   set approving(bool approve) {
     if (approve) {
       _tryDataService.logIn().then((_) {
@@ -140,4 +141,33 @@
     patchset = patchParam == null ? null : int.parse(patchParam);
     tryUpdate();
   }
+
+  String githubNewIssueURL() {
+    String title = "Failures on ${reviewInfo.title}";
+    List<Change> failures =
+        changes.where((change) => change.result != change.expected).toList();
+    String body = [
+      "There are new test failures on CL [${reviewInfo.title}]"
+          "(https://dart-review.googlesource.com/c/sdk/+/$review).\n",
+      "The tests",
+      "```",
+      for (final change in failures)
+        "${change.name} ${change.result} (expected ${change.expected})",
+      "```",
+      "are failing on configurations",
+      "```",
+      ...{
+        for (final change in failures)
+          ...change.configurations.configurations
+      },
+      "```"
+    ].join('\n');
+    if (failures.isEmpty) {
+      body = "There are no new test failures on CL [${reviewInfo.title}]"
+          "(https://dart-review.googlesource.com/c/sdk/+/$review).";
+    }
+    final query = {'title': title, 'body': body};
+    return Uri.https("github.com", "dart-lang/sdk/issues/new", query)
+        .toString();
+  }
 }
diff --git a/results_feed/lib/src/components/try_results_component.html b/results_feed/lib/src/components/try_results_component.html
index bfd2c2e..b5403fe 100644
--- a/results_feed/lib/src/components/try_results_component.html
+++ b/results_feed/lib/src/components/try_results_component.html
@@ -3,7 +3,6 @@
     <a href="http://dart-review.googlesource.com/c/sdk/+/{{review}}/{{patchset}}"
        target="_blank">{{reviewInfo.title}}</a>
   </h2>
-
   <h2 *ngIf="changeGroup.changes.isEmpty">No changed test results</h2>
   <results-panel *ngIf="!approving"
       [changes]="changeGroup.changes"
@@ -65,6 +64,13 @@
         (click)="approve(true)">
       Approve
     </material-button>
+    <span
+        *ngIf="approveEnabled && !approving"
+        raised>
+      <a href="{{githubNewIssueURL()}}" target="_blank">
+        Create GitHub issue
+      </a>
+    </span>
   </div>
 
 </div>
\ No newline at end of file
diff --git a/results_feed/lib/src/services/try_data_service.dart b/results_feed/lib/src/services/try_data_service.dart
index 03ff973..1649503 100644
--- a/results_feed/lib/src/services/try_data_service.dart
+++ b/results_feed/lib/src/services/try_data_service.dart
@@ -45,7 +45,8 @@
         ..setPatchsets(await _firestoreService.fetchPatchsetInfo(review))
         ..setBuilds(await _firestoreService.fetchTryBuilds(review));
     } else {
-      return ReviewInfo(review, "No results received yet for CL $review", []);
+      return ReviewInfo(review, "No results received yet for CL $review", [])
+        ..setBuilds([]);
     }
   }