Copybara | 854996b | 2021-09-07 19:36:02 +0000 | [diff] [blame^] | 1 | <style> |
| 2 | #rules th, #rules td { padding-bottom: 1em } |
| 3 | </style> |
| 4 | |
| 5 | [# If any value is supplied for arg0, the user will be able to set actions |
| 6 | that set default owner, set default status, and add CC users.] |
| 7 | <h4 id="filters">Filter rules</h4> |
| 8 | <div class="section"> |
| 9 | |
| 10 | <div class="closed"> |
| 11 | <div>Filter rules can help you fill in defaults and stay organized. |
| 12 | <a class="ifClosed toggleHidden" href="#" |
| 13 | style="font-size:90%; margin-left:.5em">Learn more</a> |
| 14 | </div> |
| 15 | |
| 16 | <div id="filterhelp" class="ifOpened help"> |
| 17 | Filter rules can help your team triage issues by automatically |
| 18 | filling in default values based on other values. They can be used |
| 19 | in the same way that you might use message filters in an email client. |
| 20 | Filter rules are evaluated after each edit, not just on new items. And, |
| 21 | filter rules only add values or set default values, they never override |
| 22 | values that were explicitly set by a user.<br> |
| 23 | <br> |
| 24 | Note that exclusive prefixes still apply. So, if a user has set a label |
| 25 | with one of the exclusive prefixes, a rule that adds another label with |
| 26 | the same prefix will have no effect. |
| 27 | </div> |
| 28 | <br> |
| 29 | |
| 30 | <table border="0" id="rules"> |
| 31 | <tr> |
| 32 | <th></th> |
| 33 | <th style="text-align:left">If the issue matches this query:</th> |
| 34 | <th colspan="2" style="text-align:left">Then, [if-any arg0]do the following[else]add these labels[end]:</th> |
| 35 | <th></th> |
| 36 | </tr> |
| 37 | |
| 38 | [for rules] |
| 39 | <tr> |
| 40 | <td style="text-align:right" width="20">[rules.idx].</td> |
| 41 | <td><input type="text" name="predicate[rules.idx]" size="60" value="[rules.predicate]" |
| 42 | autocomplete="off" id="predicate_existing_[rules.idx]" class="acob"></td> |
| 43 | <td> |
| 44 | [if-any arg0] |
| 45 | <select name="action_type[rules.idx]"> |
| 46 | <option value="" disabled="disabled" [is rules.action_type ""]selected="selected"[end]>Choose...</option> |
| 47 | <option value="default_status" [is rules.action_type "default_status"]selected="selected"[end]>Set default status:</option> |
| 48 | <option value="default_owner" [is rules.action_type "default_owner"]selected="selected"[end]>Set default owner:</option> |
| 49 | <option value="add_ccs" [is rules.action_type "add_ccs"]selected="selected"[end]>Add Cc:</option> |
| 50 | <option value="add_labels" [is rules.action_type "add_labels"]selected="selected"[end]>Add labels:</option> |
| 51 | <option value="also_notify" [is rules.action_type "also_notify"]selected="selected"[end]>Also notify email:</option> |
| 52 | <option value="warning" [is rules.action_type "warning"]selected="selected"[end]>Show warning:</option> |
| 53 | </select> |
| 54 | [end] |
| 55 | </td> |
| 56 | <td> |
| 57 | <input type="text" name="action_value[rules.idx]" size="70" value="[rules.action_value]" class="acob"> |
| 58 | </td> |
| 59 | <td></td> |
| 60 | </tr> |
| 61 | [end] |
| 62 | |
| 63 | [for new_rule_indexes] |
| 64 | <tr id="newrow[new_rule_indexes]" [if-index new_rule_indexes first][else]style="display:none"[end]> |
| 65 | <td style="text-align:right" width="20">[new_rule_indexes].</td> |
| 66 | <td><input type="text" name="new_predicate[new_rule_indexes]" size="60" value="" |
| 67 | class="showNextRuleRow acob" data-index="[new_rule_indexes]" |
| 68 | autocomplete="off" id="predicate_new_[new_rule_indexes]"></td> |
| 69 | <td> |
| 70 | [if-any arg0] |
| 71 | <select name="new_action_type[new_rule_indexes]"> |
| 72 | <option value="" disabled="disabled" selected="selected">Choose...</option> |
| 73 | <option value="default_status">Set default status:</option> |
| 74 | <option value="default_owner">Set default owner:</option> |
| 75 | <option value="add_ccs">Add Cc:</option> |
| 76 | <option value="add_labels">Add labels:</option> |
| 77 | <option value="also_notify">Also notify email:</option> |
| 78 | <option value="warning">Show warning:</option> |
| 79 | </select> |
| 80 | [end] |
| 81 | </td> |
| 82 | <td> |
| 83 | <input type="text" name="new_action_value[new_rule_indexes]" size="70" value="" class="acob"> |
| 84 | [# TODO(jrobbins): figure out a way to display error messages on each rule. ] |
| 85 | </td> |
| 86 | <td width="40px"> |
| 87 | [if-index new_rule_indexes last][else] |
| 88 | <span id="addrow[new_rule_indexes]" class="fakelink" class="fakelink" data-index="[new_rule_indexes]">Add a row</span |
| 89 | [end] |
| 90 | </td> |
| 91 | </tr> |
| 92 | [end] |
| 93 | |
| 94 | </table> |
| 95 | </div> |
| 96 | |
| 97 | [if-any errors.rules] |
| 98 | [for errors.rules] |
| 99 | <div class="fielderror">[errors.rules]</div> |
| 100 | [end] |
| 101 | <script type="text/javascript" nonce="[nonce]"> |
| 102 | runOnLoad(function() { |
| 103 | document.location.hash = 'filters'; |
| 104 | }); |
| 105 | </script> |
| 106 | [end] |
| 107 | |
| 108 | </div> |
| 109 | |
| 110 | <script type="text/javascript" nonce="[nonce]"> |
| 111 | runOnLoad(function() { |
| 112 | function showNextRuleRow(i) { |
| 113 | if (i < [max_rules]) { |
| 114 | _showID('newrow' + (i + 1)); |
| 115 | _hideID('addrow' + i); |
| 116 | } |
| 117 | } |
| 118 | |
| 119 | var addARowLinks = document.getElementsByClassName("fakelink"); |
| 120 | for (var i = 0; i < addARowLinks.length; ++i) { |
| 121 | var link = addARowLinks[[]i]; |
| 122 | link.addEventListener("click", function(event) { |
| 123 | var index = Number(event.target.getAttribute("data-index")); |
| 124 | showNextRuleRow(index); |
| 125 | }); |
| 126 | } |
| 127 | |
| 128 | var typeToAddARow = document.getElementsByClassName("showNextRuleRow"); |
| 129 | for (var i = 0; i < typeToAddARow.length; ++i) { |
| 130 | var el = typeToAddARow[[]i]; |
| 131 | el.addEventListener("keydown", function(event) { |
| 132 | var index = Number(event.target.getAttribute("data-index")); |
| 133 | showNextRuleRow(index); |
| 134 | }); |
| 135 | } |
| 136 | |
| 137 | var acobElements = document.getElementsByClassName("acob"); |
| 138 | for (var i = 0; i < acobElements.length; ++i) { |
| 139 | var el = acobElements[[]i]; |
| 140 | el.addEventListener("focus", function(event) { |
| 141 | _acrob(null); |
| 142 | _acof(event); |
| 143 | }); |
| 144 | } |
| 145 | |
| 146 | var acobElements = document.getElementsByClassName("acob"); |
| 147 | for (var i = 0; i < acobElements.length; ++i) { |
| 148 | var el = acobElements[[]i]; |
| 149 | el.addEventListener("focus", function(event) { |
| 150 | _acrob(null); |
| 151 | _acof(event); |
| 152 | }); |
| 153 | } |
| 154 | }); |
| 155 | </script> |