Project import generated by Copybara.
GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/templates/tracker/template-detail-page.ezt b/templates/tracker/template-detail-page.ezt
new file mode 100644
index 0000000..b596e4c
--- /dev/null
+++ b/templates/tracker/template-detail-page.ezt
@@ -0,0 +1,303 @@
+[define title]Issue Template [template_name][end]
+[define category_css]css/ph_detail.css[end]
+[include "../framework/header.ezt" "showtabs"]
+
+<a href="/p/[projectname]/adminTemplates">‹ Back to template list</a><br><br>
+
+[if-any read_only][include "../framework/read-only-rejection.ezt"]
+[else]
+
+<h4>Issue Template</h4>
+
+[if-any new_template_form]
+ <form action="create.do" method="POST">
+[else]
+ <form action="detail.do" method="POST">
+[end]
+<input type="hidden" name="token" value="[form_token]">
+<input type="hidden" name="template" value="[template_name]">
+
+
+<table cellspacing="0" cellpadding="3" class="rowmajor vt">
+ <tr>
+ <th>Members only:</th>
+ <td>
+ <input type="checkbox"[if-any allow_edit][else]disabled[end] name="members_only" [if-any initial_members_only]checked[end]>
+ <label for="members_only_checkbox">Only offer this template to project members</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th>Name:</th>
+ <td>
+ [if-any new_template_form]
+ <input type="text" name="name" value="[template_name]">
+ <span id="fieldnamefeedback" class="fielderror" style="margin-left:1em">
+ [if-any errors.name][errors.name][end]
+ </span>
+ [else]
+ [template_name]
+ <input type="hidden" name="name" value="[template_name]">
+ [end]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Summary:</th>
+ <td>
+ [if-any allow_edit]
+ <input type="text" name="summary" size="60" class=acob" value="[initial_summary]"><br>
+ [else]
+ [initial_summary]<br>
+ [end]
+ <input type="checkbox" [if-any allow_edit][else]disabled[end] name="summary_must_be_edited" [if-any initial_must_edit_summary]checked[end]>
+ <label for="summary_must_be_edited_checkbox">Users must edit issue summary before submitting</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th>Description:</th>
+ <td>
+ [if-any allow_edit]
+ <textarea name="content" rows="12" cols="75">[initial_content]</textarea>
+ [# Note: wrap="hard" has no effect on content_editor because we copy to a hidden field before submission.]
+ [else]
+ [initial_content]
+ [end]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Status:</th>
+ <td>
+ [if-any allow_edit]
+ <select id="status" name="status">
+ <option style="display: none" value="[initial_status]"></option>
+ </select>
+ [else]
+ [initial_status]
+ [end]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Owner:</th>
+ <td>
+ [if-any allow_edit]
+ <input id="owner_editor" type="text" name="owner" size="25" class="acob" value="[initial_owner]"
+ autocomplete="off">
+ <span id="fieldnamefeedback" class="fielderror" style="margin-left:1em">
+ [if-any errors.owner][errors.owner][end]
+ </span>
+ [else]
+ [initial_owner]<br>
+ [end]
+ <span>
+ <input type="checkbox" [if-any allow_edit][else]disabled[end] name="owner_defaults_to_member" style="margin-left:2em" [if-any initial_owner_defaults_to_member]checked[end]>
+ <label for="owner_defaults_to_member_checkbox">Default to member who is entering the issue</label>
+ </span>
+ </td>
+ </tr>
+
+ <tr>
+ <th>Components:</th>
+ <td>
+ [if-any allow_edit]
+ <input id="components" type="text" name="components" size="75" class="acob"
+ autocomplete="off" value="[initial_components]">
+ <span id="fieldnamefeedback" class="fielderror" style="margin-left:1em">
+ [if-any errors.components][errors.components][end]
+ </span>
+ [else]
+ [initial_components]
+ [end]
+ <br/>
+ <span>
+ <input type="checkbox" [if-any allow_edit][else]disabled[end] name="component_required" [if-any initial_component_required]checked[end]>
+ <label for="component_required_checkbox">Require at least one component</label>
+ </span>
+ </td>
+ </tr>
+
+ [if-any allow_edit][if-any uneditable_fields]
+ <tr id="res_fd_banner"><th></th>
+ <td style="text-align:left; border-radius:25px">
+ <span style="background:var(--chops-orange-50); padding:5px; margin-top:10px;padding-left:10px; padding-right:10px; border-radius:25px">
+ <span style="padding-right:7px">
+ Info: Disabled inputs occur when you are not allowed to edit that restricted field.
+ </span>
+ <i id="res_fd_message" class="material-icons inline-icon" style="font-weight:bold; font-size:14px; vertical-align: text-bottom; cursor: pointer">
+ close</i>
+ </span>
+ </td>
+ </tr>
+ [end][end]
+
+ [for fields]
+ [# TODO(jrobbins): determine applicability dynamically and update fields in JS]
+ [# approval subfields are shown below, not here]
+ [if-any fields.field_def.is_approval_subfield][else][if-any fields.field_def.is_phase_field][else]
+ <tr>
+ <th>[fields.field_name]:</th>
+ <td colspan="2">
+ [if-any allow_edit]
+ [if-any fields.is_editable]
+ [include "field-value-widgets.ezt" False "tmpl" False ""]
+ [else]
+ <input disabled value = "
+ [for fields.values]
+ [fields.values.val]
+ [end]
+ " style="text-align:right; width:12em" class="multivalued customfield" aria-labelledby="[fields.field_id]_label">
+ [end]
+ [else]
+ [for fields.values]
+ [fields.values.val]
+ [end]
+ [end]
+ </td>
+ <tr>
+ [end][end]
+ [end]
+
+ <tr>
+ <th>Labels:</th>
+ <td>
+ [include "label-fields.ezt" "all" ""]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Template admins:</th>
+ <td>
+ [if-any allow_edit]
+ <input id="admin_names_editor" type="text" name="admin_names" size="75" class="acob" value="[initial_admins]"
+ autocomplete="off">
+ [else]
+ [initial_admins]
+ [end]
+ </td>
+ </tr>
+
+ [if-any approvals]
+ <tr>
+ <th>Launch Gates:</th>
+ <td colspan="7">
+ <input type="checkbox" name="add_approvals" id="cb_add_approvals" [if-any allow_edit][else]disabled[end] [if-any initial_add_approvals]checked="checked"[end]>
+ <label for="cb_add_approvals">Include Gates and Approval Tasks in issue</label>
+ [include "launch-gates-widget.ezt"]
+ <span id="fieldnamefeedback" class="fielderror" style="margin-left:1em">
+ [if-any errors.phase_approvals][errors.phase_approvals][end]
+ </span>
+ </td>
+ </tr>
+ [end]
+
+ [for fields]
+ [if-any fields.field_def.is_approval_subfield]
+ <tr id="subfield-row" class="subfield-row-class">
+ <th>[fields.field_def.parent_approval_name] [fields.field_name]:</th>
+ <td colspan="2">
+ [if-any allow_edit]
+ [if-any fields.is_editable]
+ [include "field-value-widgets.ezt" False "tmpl" False ""]
+ [else]
+ <input disabled value = "
+ [for fields.values]
+ [fields.values.val]
+ [end]
+ " style="text-align:right; width:12em" class="multivalued customfield" aria-labelledby="[fields.field_id]_label">
+ [end]
+ [else]
+ [for fields.values][fields.values.val][end]
+ [end]
+ </td>
+ </tr>
+ [end][end]
+
+ [if-any allow_edit]
+ <tr>
+ <td></td>
+ <td>
+ <input id="submit_btn" type="submit" name="submit" value="Save template">
+ <input id="delete_btn" type="submit" class="secondary" name="deletetemplate" value="Delete Template">
+ </td>
+ </tr>
+ [end]
+
+</table>
+</form>
+
+[include "field-value-widgets-js.ezt"]
+
+[end][# end if not read_only]
+
+<script type="text/javascript" nonce="[nonce]">
+runOnLoad(function() {
+
+ [if-any allow_edit]
+ let addPhasesCheckbox = document.getElementById('cb_add_approvals');
+ if (addPhasesCheckbox) {
+ addPhasesCheckbox.addEventListener('change', toggleGatesView);
+ }
+
+ var acobElements = document.getElementsByClassName("acob");
+ for (var i = 0; i < acobElements.length; ++i) {
+ var el = acobElements[[]i];
+ el.addEventListener("focus", function(event) {
+ _acrob(null);
+ _acof(event);
+ });
+ }
+
+ if ($("status")) {
+ _loadStatusSelect("[projectname]", "status", "[initial_status]");
+ $("status").addEventListener("focus", function(event) {
+ _acrob(null);
+ });
+ }
+
+ if($("res_fd_message")) {
+ $("res_fd_message").onclick = function(){
+ $("res_fd_banner").classList.add("hidden");
+ };
+ };
+
+ [else]
+
+ let labelInputs = document.getElementsByClassName("labelinput");
+ Array.prototype.forEach.call(labelInputs, labelInput => {
+ labelInput.disabled = true;
+ });
+ [end]
+
+ toggleGatesView();
+ function toggleGatesView() {
+ let addPhasesCheckbox = document.getElementById('cb_add_approvals');
+ if (addPhasesCheckbox === null) return;
+ let addPhases = addPhasesCheckbox.checked;
+ let subfieldRows = document.getElementsByClassName('subfield-row-class');
+ let phasefieldRows = document.getElementsByClassName('phasefield-row-class');
+ if (addPhases) {
+ $('launch-gates-table').classList.remove('hidden');
+ for (let i=0; i<subfieldRows.length; i++){
+ subfieldRows[[]i].classList.remove('hidden');
+ }
+ for (let i=0; i<phasefieldRows.length; i++){
+ phasefieldRows[[]i].classList.remove('hidden');
+ }
+ } else{
+ $('launch-gates-table').classList.add('hidden');
+ for (let i=0; i<subfieldRows.length; i++){
+ subfieldRows[[]i].classList.add('hidden');
+ }
+ for (let i=0; i<phasefieldRows.length; i++){
+ phasefieldRows[[]i].classList.add('hidden');
+ }
+ }
+ }
+
+});
+</script>
+
+[include "../framework/footer.ezt"]