Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/templates/tracker/spam-moderation-queue.ezt b/templates/tracker/spam-moderation-queue.ezt
new file mode 100644
index 0000000..e43e477
--- /dev/null
+++ b/templates/tracker/spam-moderation-queue.ezt
@@ -0,0 +1,121 @@
+[define title]Spam Moderation Queue[end]
+[define category_css]css/ph_list.css[end]
+[define page_css]css/ph_detail.css[end][# needed for infopeek]
+
+[if-any projectname]
+  [include "../framework/header.ezt" "showtabs"]
+[else]
+  [include "../framework/header.ezt" "hidetabs"]
+[end]
+[include "../framework/js-placeholders.ezt" "showtabs"]
+
+<h2>Spam Moderation Queue: Automatic Classifier Close Calls</h2>
+[include "../framework/artifact-list-pagination-part.ezt"]
+
+<button type="submit" vaue="mark_spam" disabled="true">Mark as Spam</button>
+<button type="submit" value="mark_ham" disabled="true">Mark as Ham</button>
+
+<span style="margin:0 .7em">Select:
+  <a id="selectall" href="#">All</a>
+  <a id="selectnone" href="#">None</a>
+</span>
+
+<table id='resultstable'>
+<tr>
+  <td>
+  </td>
+  <td>ID</td>
+  <td>Author</td>
+  <td>Summary</td>
+  <td>Snippet</td>
+  <td>Opened at</td>
+  <td>Spam?</td>
+  <td>Verdict reason</td>
+  <td>Confidence</td>
+  <td>Verdict at</td>
+  <td>Flag count</td>
+</tr>
+[for issue_queue]
+<tr>
+  <td><input type='checkbox' name='issue_local_id' value='[issue_queue.issue.local_id]'/></td>
+  <td><a href='/p/[projectname]/issues/detail?id=[issue_queue.issue.local_id]'>[issue_queue.issue.local_id]</a></td>
+  <td><a href='/u/[issue_queue.reporter.email]'>[issue_queue.reporter.email]</a></td>
+  <td><a href='/p/[projectname]/issues/detail?id=[issue_queue.issue.local_id]'>[issue_queue.summary]</a></td>
+  <td>
+  [issue_queue.comment_text]
+  </td>
+  <td>[issue_queue.issue.opened_timestamp]</td>
+  <td>[issue_queue.issue.is_spam]</td>
+
+  <td>[issue_queue.reason]</td>
+  <td>[issue_queue.classifier_confidence]</td>
+  <td>[issue_queue.verdict_time]</td>
+  <td>[issue_queue.flag_count]</td>
+</tr>
+[end]
+</table>
+
+[include "../framework/artifact-list-pagination-part.ezt"]
+<button type="submit" vaue="mark_spam" disabled="true">Mark as Spam</button>
+<button type="submit" value="mark_ham" disabled="true">Mark as Ham</button>
+
+</form>
+
+<script type="text/javascript" nonce="[nonce]">
+runOnLoad(function() {
+  if ($("selectall")) {
+    $("selectall").addEventListener("click", function() {
+        _selectAllIssues();
+        setDisabled(false);
+    });
+  }
+  if ($("selectnone")) {
+    $("selectnone").addEventListener("click", function() {
+        _selectNoneIssues();
+        setDisabled(true);
+    });
+  }
+
+  const checkboxes = Array.from(
+      document.querySelectorAll('input[type=checkbox]'));
+  checkboxes.forEach(checkbox => {
+    checkbox.addEventListener('change', updateEnabled);
+  });
+
+  const buttons = Array.from(
+      document.querySelectorAll('button[type=submit]'));
+  buttons.forEach(button => {
+    button.addEventListener('click', function(event) {
+      const markSpam = (button.value === 'mark_spam');
+      const issueRefs = [];
+      checkboxes.forEach(checkbox => {
+        if (checkbox.checked) {
+          issueRefs.push({
+              projectName: window.CS_env.projectName,
+              localId: checkbox.value,
+          });
+          const rowElement = checkbox.parentElement.parentElement;
+          rowElement.parentElement.removeChild(rowElement);
+        }
+      });
+      window.prpcClient.call('monorail.Issues', 'FlagIssues', {
+        issueRefs: issueRefs,
+        flag: markSpam,
+      });
+    });
+  });
+
+  function updateEnabled() {
+    const anySelected = checkboxes.some(checkbox => checkbox.checked);
+    setDisabled(!anySelected);
+   }
+
+  function setDisabled(disabled) {
+    buttons.forEach(button => {
+      button.disabled = disabled;
+    });
+  }
+});
+</script>
+
+[include "../framework/footer.ezt"]