[define title]New Issue[end]
[define category_css]css/ph_detail.css[end]
[include "../framework/header.ezt" "hidetabs"]

[# Note: base permission for this page is CreateIssue]

[if-any read_only][include "../framework/read-only-rejection.ezt"]
[else]

<div id="color_control" style="margin-top: 0; padding: 3px;" class="closed [if-any code_font]codefont[end]">
 <form action="entry.do" method="POST" style="margin: 0; padding: 0" enctype="multipart/form-data" id="create_issue_form">
  <input type="hidden" name="token" value="[form_token]">
  <input type="hidden" name="template_name" value="[template_name]">
  <input type="hidden" name="star" id="star_input" value="1">
  <table cellpadding="0" cellspacing="0" border="0" role="presentation">
   <tr><td>

    <table cellspacing="0" cellpadding="3" border="0" class="rowmajor vt" role="presentation">
     [if-any offer_templates]
      <tr><th><label for="template_name">Template:</label></th>
       <td colspan="2">
        <select name="template_name" id="template_name" data-project-name="[projectname]" ignore-dirty>
         [for config.template_names]
           <option role="option" value="[format "url"][config.template_names][end]" [is config.template_names template_name]selected=selected[end]>[config.template_names]</option>
         [end]
        </select>
        <span id="mr-code-font-toggle-slot"></span>
       </td>
      </tr>
     [else]
      <tr>
       <td colspan="3">
        <span id="mr-code-font-toggle-slot"></span>
       </td>
      </tr>
     [end]

      <tr><th><label for="summary">Summary:</label></th>
       <td colspan="2" class="inplace">
        <input type="text" id="summary" name="summary" value="[initial_summary]" required data-clear-summary-on-click="[clear_summary_on_click]"
               [if-any any_errors][else]autofocus[end]>
        [if-any errors.summary]
         <div class="fielderror">[errors.summary]</div>
        [end]

        [if-any any_errors][else]
          <script type="text/javascript" nonce="[nonce]">
            document.getElementById('summary').select();
          </script>
        [end]
       </td>
      </tr>

      <tr><th rowspan="3"><label for="comment">Description:</label></th>
       <td colspan="2">
        <textarea style="width:100%" cols="80" rows="15" name="comment" id="comment" class="issue_text" required>[initial_description]
</textarea> [# We want 1 final newline but 0 trailing spaces in the textarea]
        [if-any errors.comment]
         <div class="fielderror">[errors.comment]</div>
        [end]
       </td>
      </tr>

      <tr><td colspan="2">
       [include "../features/cues-conduct.ezt"]
       <div id="attachmentareadeventry"></div>
      </td></tr>

      <tr>
       <td style="width: 12em">
        [if-any allow_attachments]
         <span id="attachprompt"><img width="16" height="16" src="/static/images/paperclip.png" border="0" alt="A paperclip">
         <a href="#" id="attachafile">Attach a file</a></span>
         <div id="attachmaxsize" style="margin-left:1.2em; display:none">Max. attachments: [max_attach_size]</div>
         [if-any errors.attachments]
          <div class="fielderror">[errors.attachments]</div>
         [end]
        [else]
         <div style="color:#666">Issue attachment storage quota exceeded.</div>
        [end]
       </td>
       <td id="star_cell" style="vertical-align: initial">
        [# Note: if the user is permitted to enter an issue, they are permitted to star it.]
        <a class="star" id="star" style="color:cornflowerblue;">&#9733;</a>
        Notify me of issue changes, if enabled in <a id="settings" target="new" href="/hosting/settings">settings</a>
       </td>
      </tr>

      <tr [if-any page_perms.EditIssue page_perms.EditIssueStatus][else]style="display:none;"[end]><th width="10%"><label for="statusenter">Status:</label></th>
       <td colspan="2" class="inplace">
       <select id="statusenter" name="status">
         <option style="display: none" value="[initial_status]"></option>
       </select>
       </label>
       </td>
      </tr>
      <tr [if-any page_perms.EditIssue page_perms.EditIssueOwner][else]style="display:none;"[end]><th width="10%"><label for="ownerenter">Owner:</label></th>
       <td colspan="2">
        <input type="text" id="ownerenter" autocomplete="off"
               style="width:16em"
               name="owner" value="[initial_owner]" aria-autocomplete="list" role="combobox">
          <span class="availability_[owner_avail_state]" id="owner_avail_state"
                style="padding-left:1em; [if-any owner_avail_message_short][else]display:none[end]">
            &#9608;
            <span id="owner_availability">[owner_avail_message_short]</span>
          </span>
        </div>
        [if-any errors.owner]
         <div class="fielderror">[errors.owner]</div>
        [end]
       </td>
      </tr>

      <tr [if-any page_perms.EditIssue page_perms.EditIssueCc][else]style="display:none;"[end]><th><label for="memberenter">Cc:</label></th>
       <td colspan="2" class="inplace">
        <input type="text" multiple id="memberenter" autocomplete="off" name="cc" value="[initial_cc]" aria-autocomplete="list" role="combobox">
        [if-any errors.cc]
         <div class="fielderror">[errors.cc]</div>
        [end]
       </td>
      </tr>

      [# TODO(jrobbins): page_perms.EditIssueComponent]
      <tr [if-any page_perms.EditIssue][else]style="display:none;"[end]><th><label for="components">Components:</label></th>
       <td colspan="2" class="inplace">
        <input type="text" id="components" autocomplete="off" name="components" value="[initial_components]" aria-autocomplete="list" role="combobox">
        [if-any errors.components]
         <div class="fielderror">[errors.components]</div>
        [end]
       </td>
      </tr>

      [if-any uneditable_fields]
      <tr id="res_fd_banner"><th></th>
        <td colspan="2" class="inplace" 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]

      <tbody [if-any page_perms.EditIssue][else]style="display:none;"[end] class="collapse">
       [define any_fields_to_reveal]No[end]
       [for fields]
        [if-any fields.applicable][if-any fields.field_def.is_approval_subfield][else][if-any fields.field_def.is_phase_field][else]
         [# TODO(jrobbins): determine applicability dynamically and update fields in JS]
         <tr [if-any fields.display][else]class="ifExpand"[define any_fields_to_reveal]Yes[end][end]>
          <th id="[fields.field_id]_label">[fields.field_name]:</th>
          <td colspan="2">
            [if-any fields.is_editable]
              [include "field-value-widgets.ezt" fields.field_def.is_multivalued_bool "" fields.field_def.is_required_bool ""]
              <div class="fielderror" style="display:none" id="error_custom_[fields.field_id]"></div>
            [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]
          </td>
         <tr>
        [end][end][end]
       [end]
       [is any_fields_to_reveal "Yes"]
        <tr class="ifCollapse">
         <td colspan="2"><a href="#" class="toggleCollapse">Show all fields</a><t/td>
        </tr>
       [end]
      </tbody>

      <tr [if-any page_perms.EditIssue][else]style="display:none;"[end]><th>Labels:</th>[# aria-labels added in label-fields.ezt]
       <td colspan="2" class="labelediting">
        [include "label-fields.ezt" "just-two" ""]
       </td>
      </tr>

      <tbody class="collapse">
       [if-any page_perms.EditIssue]
       <tr class="ifCollapse">
        <td><a href="#" class="toggleCollapse">More options</a></td>
       </tr>
       [end]

       <tr [if-any page_perms.EditIssue][else]style="display:none;"[end] class="ifExpand"><th style="white-space:nowrap"><label for="blocked_on">Blocked on:</label></th>
        <td class="inplace" colspan="2">
         <input type="text" name="blocked_on" id="blocked_on" value="[initial_blocked_on]">
         [if-any errors.blocked_on]
          <div class="fielderror">[errors.blocked_on]</div>
         [end]
        </td>
       </tr>
       <tr [if-any page_perms.EditIssue][else]style="display:none;"[end] class="ifExpand"><th><label for="blocking">Blocking:</label></th>
        <td class="inplace" colspan="2">
         <input type="text" name="blocking" id="blocking" value="[initial_blocking]" />
         [if-any errors.blocking]
          <div class="fielderror">[errors.blocking]</div>
         [end]
        </td>
       </tr>

       <tr [if-any page_perms.EditIssue][else]style="display:none;"[end] class="ifExpand"><th><label for="hotlistsenter">Hotlists:</label></th>
        <td class="inplace" colspan="2">
         <input type="text" name="hotlists" autocomplete="off" id="hotlistsenter" value="[initial_hotlists]" />
         [if-any errors.hotlists]
          <div class="fielderror">[errors.hotlists]</div>
         [end]
        </td>
       </tr>
     </tbody>

     [if-any approvals]
        <tr>
          <th>Launch Gates:</th>
          <td colspan="7">
            [include "launch-gates-widget.ezt"]
          </td>
        </tr>
     [end]

     [for fields][if-any fields.applicable][if-any fields.field_def.is_approval_subfield]
     <tr is="subfield-row">
       <th>[fields.field_def.parent_approval_name] [fields.field_name]:</th>
       <td colspan="2">
         [if-any fields.is_editable]
           [include "field-value-widgets.ezt" False "tmpl" False ""]
           <div class="fielderror" style="display:none" id="error_custom_[fields.field_id]"></div>
         [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]
       </td>
     </tr>
    [end][end][end]

    [for issue_phase_names]
      [for fields]
        [is fields.phase_name issue_phase_names]
        <tr>
          <th>[issue_phase_names].[fields.field_name]:</th>
            <td colspan="2">
              [if-any fields.is_editable]
                [include "field-value-widgets.ezt" False "tmpl" False issue_phase_names]
                <div class="fielderror" style="display:none" id="error_custom_[issue_phase_names]_[fields.field_id]"></div>
              [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]
            </td>
          </th>
        </tr>
      [end][end][end]

     [include "../framework/label-validation-row.ezt"]
     [include "../framework/component-validation-row.ezt"]
    </table>

    <div style="padding:6px">
     <input type="submit" id="submit_btn" name="btn" value="Submit issue">
     <input type="button" id="discard" name="nobtn" value="Discard">
    </div>

   </td>
   </tr>
  </table>
 </form>
</div>

[include "../features/filterrules-preview.ezt"]

<div style="margin-top:5em; margin-left: 8px;">
  Problems submitting issues?
  <a href="#" id="new-issue-feedback-link">
    Send feedback
  </a>
</div>

<div id="helparea"></div>

<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {
  window.getTSMonClient().recordIssueEntryTiming();

  if ($('launch-gates-table')) {
    $('launch-gates-table').classList.remove('hidden');
  }

  if ($("template_name")) {
    $("template_name").addEventListener("change", function(event) {
      _switchTemplate(event.target.getAttribute("data-project-name"),
                      event.target.value)
    });
  }

  if ($("summary")) {
    var clearSummaryOnClick = $("summary").getAttribute("data-clear-summary-on-click");
    if (clearSummaryOnClick) {
      $("summary").addEventListener("keydown", function(event) {
        _clearOnFirstEvent('[format "js"][initial_summary][end]');
      });
    }
    $("summary").addEventListener("click", function(event) {
      if (clearSummaryOnClick) {
        _clearOnFirstEvent('[format "js"][initial_summary][end]');
      }
      checksubmit();
    });
    $("summary").addEventListener("focus", function(event) {
      _acrob(null);
      _acof(event);
    });
    $("summary").addEventListener("keyup", function(event) {
      checksubmit();
      return true;
    });
  }

  if ($("settings")) {
    $("settings").addEventListener("focus", function(event) {
      _acrob(null);
    });
  }
  if ($("statusenter")) {
    _loadStatusSelect("[projectname]", "statusenter", "[initial_status]");
    $("statusenter").addEventListener("focus", function(event) {
      _acrob(null);
    });
  }
  if($("res_fd_message")) {
    $("res_fd_message").onclick = function(){
      $("res_fd_banner").classList.add("hidden");
    };
  };

  if ($("submit_btn")) {
    $("submit_btn").addEventListener("focus", function(event) {
      _acrob(null);
    });
    $("submit_btn").addEventListener("click", function(event) {
      _acrob(null);
      _trimCommas();
      userMadeChanges = false;
    });
  }
  if ($("discard")) {
    $("discard").addEventListener("focus", function(event) {
      _acrob(null);
    });
    $("discard").addEventListener("click", function(event) {
      _acrob(null);
      _confirmDiscardEntry(event.target);
      event.preventDefault();
    });
  }
  if ($("new-issue-feedback-link")) {
    $("new-issue-feedback-link").addEventListener("click", function(event) {
      userfeedback.api.startFeedback({
          'productId': '5208992',  // Required.
          'productVersion': '[app_version]'  // Optional.
        });
    })
  }

  window.allowSubmit = true;
  $("create_issue_form").addEventListener("submit", function() {
    if (allowSubmit) {
      allowSubmit = false;
      $("submit_btn").value = "Creating issue...";
      $("submit_btn").disabled = "disabled";
    }
    else {
      event.preventDefault();
    }
  });

  var _blockIdsToListeners = [[]"blocked_on", "blocking", "hotlistsenter"];
  for (var i = 0; i < _blockIdsToListeners.length; i++) {
    var id = _blockIdsToListeners[[]i];
    if ($(id)) {
      $(id).addEventListener("focus", function(event) {
        _acrob(null);
        _acof(event);
      });
    }
  }

  var _idsToAddDefaultListeners = [[]"ownerenter", "memberenter", "components"];
  for (var i = 0; i < _idsToAddDefaultListeners.length; i++) {
    var id = _idsToAddDefaultListeners[[]i];
    if ($(id)) {
      $(id).addEventListener("focus", function(event) {
        _acrob(null);
        _acof(event);
      });
    }
  }

  var _elementsToAddPresubmit = document.querySelectorAll(
      "#create_issue_form input, #create_issue_form select");
  var debounced_presubmit = debounce(TKR_presubmit, 500);
  for (var i = 0; i < _elementsToAddPresubmit.length; i++) {
    var el = _elementsToAddPresubmit[[]i];
    el.addEventListener("keyup", debounced_presubmit);
    el.addEventListener("change", debounced_presubmit);
  }
  debounced_presubmit();

  if ($("attachafile")) {
    $("attachafile").addEventListener("click", function(event) {
      _addAttachmentFields("attachmentareadeventry");
      event.preventDefault();
    });
  }

  document.addEventListener('keydown', function(event) {
    if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {
      event.preventDefault();
      $('submit_btn').click();
    }
  })

  window.onsubmit = function() {
    TKR_initialFormValues = TKR_currentFormValues();
  };

  window.onbeforeunload = function() {
    if (TKR_isDirty()) {
      // This message is ignored in recent versions of Chrome and Firefox.
      return "You have unsaved changes. Leave this page and discard them?";
    }
  };

  _lfidprefix = 'labelenter';
  [if-any any_errors]
   function _clearOnFirstEvent(){}
  [end]

  [if-any page_perms.EditIssue page_perms.EditIssueStatus page_perms.EditIssueOwner page_perms.EditIssueCc]
    setTimeout(_forceProperTableWidth, 100);
  [end]

  [if-any page_perms.EditIssue]
   _exposeExistingLabelFields();
  [end]

  var field_error;
  [if-any  errors.custom_fields]
    [for errors.custom_fields]
      field_error = document.getElementById('error_custom_' + [errors.custom_fields.field_id]);
      field_error.textContent = "[errors.custom_fields.message]";
      field_error.style.display = "";
    [end]
  [end]



function checksubmit() {
  var restrict_to_known = [if-any restrict_to_known]true[else]false[end];
  var confirmmsg = document.getElementById('confirmmsg');
  var cg = document.getElementById('cg');
  var label_blocksubmitmsg = document.getElementById('blocksubmitmsg');
  var component_blocksubmitmsg = document.getElementById('component_blocksubmitmsg');

  // Check for templates that require components.
  var component_required = [if-any component_required]true[else]false[end];
  var components = document.getElementById('components');
  if (components && component_required && components.value == "") {
    component_blocksubmitmsg.textContent = "You must specify a component for this template.";
  } else {
    component_blocksubmitmsg.textContent = "";
  }

  var submit = document.getElementById('submit_btn');
  var summary = document.getElementById('summary');
  if ((restrict_to_known && confirmmsg && confirmmsg.textContent) ||
      (label_blocksubmitmsg && label_blocksubmitmsg.textContent) ||
      (component_blocksubmitmsg && component_blocksubmitmsg.textContent) ||
      (cg && cg.value == "") ||
      (!allowSubmit) ||
      (!summary.value [if-any must_edit_summary]|| summary.value == '[format "js"][template_summary][end]'[end])) {
     submit.disabled='disabled';
  } else {
     submit.disabled='';
  }
}
checksubmit();
setInterval(checksubmit, 700); [# catch changes that were not keystrokes, e.g., paste menu item.]

$("star").addEventListener("click", function (event) {
    _TKR_toggleStarLocal($("star"), "star_input");
});

  const mrCodeFontToggle = document.createElement('mr-pref-toggle');
  mrCodeFontToggle.style = 'float:right; margin: 3px;';
  [if-any code_font]
    mrCodeFontToggle.initialValue = true;
  [end]
  [if-any logged_in_user]
    mrCodeFontToggle.userDisplayName = "[logged_in_user.email]";
  [end]
  mrCodeFontToggle.label = "Code";
  mrCodeFontToggle.title = "Code font";
  mrCodeFontToggle.prefName = "code_font";
  $('mr-code-font-toggle-slot').appendChild(mrCodeFontToggle);
  mrCodeFontToggle.fetchPrefs();
  mrCodeFontToggle.addEventListener('font-toggle', function(e) {
    const checked = e.detail.checked;
    const ancestor = $('color_control');
    if (ancestor) {
      if (checked) {
        ancestor.classList.add('codefont');
      } else {
        ancestor.classList.remove('codefont');
      }
    }
  });


});
</script>

<script type="text/javascript" defer src="/static/third_party/js/keys.js?version=[app_version]" nonce="[nonce]"></script>
<script type="text/javascript" defer src="/static/third_party/js/skipper.js?version=[app_version]" nonce="[nonce]"></script>
<script type="text/javascript" defer src="https://support.google.com/inapp/api.js" nonce="[nonce]"></script>
<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {
  _setupKibblesOnEntryPage('[project_home_url]/issues/list');
});
</script>

[end]

[include "field-value-widgets-js.ezt"]
[include "../framework/footer.ezt"]

<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {
  if (typeof(ClientLogger) === "function") {
    const l = new ClientLogger("issues");
    l.logStart("new-issue", "user-time");
    document.forms.create_issue_form.addEventListener('submit', function() {
      l.logStart("new-issue", "server-time");
    });
  }
});
</script>
