[alert-manager] Add ability to add params to a silence

Screenshot: https://screenshot.googleplex.com/Mj34pgYtOh7

Bug: skia:9587
Change-Id: Ia89cb51dd02cfbff98d2869b7a35c08ae3972dfe
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/251362
Commit-Queue: Ravi Mistry <rmistry@google.com>
Reviewed-by: Joe Gregorio <jcgregorio@google.com>
diff --git a/am/modules/alert-manager-sk/alert-manager-sk.js b/am/modules/alert-manager-sk/alert-manager-sk.js
index 7861f04..8afbaf7 100644
--- a/am/modules/alert-manager-sk/alert-manager-sk.js
+++ b/am/modules/alert-manager-sk/alert-manager-sk.js
@@ -249,6 +249,7 @@
     this.addEventListener('delete-silence', e => this._deleteSilence(e.detail.silence));
     this.addEventListener('add-silence-note', e => this._addSilenceNote(e));
     this.addEventListener('del-silence-note', e => this._delSilenceNote(e));
+    this.addEventListener('add-silence-param', e => this._addSilenceParam(e.detail.silence));
     this.addEventListener('delete-silence-param', e => this._deleteSilenceParam(e.detail.silence));
     this.addEventListener('modify-silence-param', e => this._modifySilenceParam(e.detail.silence));
     this.addEventListener('add-note', e => this._addNote(e));
@@ -429,6 +430,17 @@
     this._doImpl('/_/del_note', e.detail);
   }
 
+  _addSilenceParam(silence) {
+    // Don't save silences that are just being created when you add a param.
+    if (!silence.key) {
+      this._current_silence = silence;
+      this._render();
+      return
+    }
+    this._checked = new Set();
+    this._doImpl('/_/save_silence', silence, json => this._silenceAction(json, false));
+  }
+
   _deleteSilenceParam(silence) {
     // Don't save silences that are just being created when you delete a param.
     if (!silence.key) {
diff --git a/am/modules/silence-sk/silence-sk.js b/am/modules/silence-sk/silence-sk.js
index 9441b7d..bef2b9f 100644
--- a/am/modules/silence-sk/silence-sk.js
+++ b/am/modules/silence-sk/silence-sk.js
@@ -75,8 +75,19 @@
  *       silence: {...},
  *     }
  *   </pre>
+ *
+ * @evt add-silence-param Sent when the user add a param to a silence.
+ *    The detail is a copy of the silence with the new parameter added.
+ *
+ *   <pre>
+ *     detail {
+ *       silence: {...},
+ *     }
+ *   </pre>
+ *
  */
 import { define } from 'elements-sk/define'
+import 'elements-sk/icon/add-box-icon-sk'
 import 'elements-sk/icon/delete-icon-sk'
 
 import * as paramset from '../paramset'
@@ -88,9 +99,9 @@
 import { upgradeProperty } from 'elements-sk/upgradeProperty'
 
 function table(ele, o) {
-  let keys = Object.keys(o);
+  const keys = Object.keys(o);
   keys.sort();
-  return keys.filter(k => !k.startsWith('__')).map((k) =>
+  const rules = keys.filter(k => !k.startsWith('__')).map((k) =>
     html`
     <tr>
       <td>
@@ -101,6 +112,20 @@
         <input @change=${(e) => ele._modifyRule(e, k)} .value=${o[k].join(', ')} ?disabled=${o[k].length > 1}></input>
       </td>
     </tr>`);
+  rules.push(html`
+    <tr>
+      <td>
+        <add-box-icon-sk title='Add rule.' @click=${(e) => ele._addRule(e)}></add-box-icon-sk>
+      </td>
+      <td>
+        <input id='add_param_key'></input>
+      </td>
+      <td>
+        <input id='add_param_value'></input>
+      </td>
+    </tr>
+  `);
+  return rules;
 }
 
 function addNote(ele) {
@@ -263,6 +288,33 @@
     this.dispatchEvent(new CustomEvent('modify-silence-param', { detail: detail, bubbles: true }));
   }
 
+  _addRule(e) {
+    const keyInput = $$("#add_param_key", this);
+    if (!keyInput.value) {
+        errorMessage("Please enter a name for the new param");
+        keyInput.focus();
+        return;
+    }
+    const valueInput = $$("#add_param_value", this);
+    if (!valueInput.value) {
+        errorMessage("Please enter a value for the new param");
+        valueInput.focus();
+        return;
+    }
+
+    // Dispatch event adding the new silence param.
+    let silence = JSON.parse(JSON.stringify(this._state));
+    silence.param_set[keyInput.value] = [valueInput.value];
+    let detail = {
+      silence: silence,
+    };
+    this.dispatchEvent(new CustomEvent('add-silence-param', { detail: detail, bubbles: true }));
+
+    // Reset the manual param key and value.
+    keyInput.value = "";
+    valueInput.value = "";
+  }
+
   _addNote(e) {
     let textarea = $$('textarea', this);
     let detail = {