[define category_css]css/ph_detail.css[end]
[include "../framework/header.ezt" "showtabs"]

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

<form action="adminComponents.do" id="adminComponents" method="POST">
 <input type="hidden" name="token" value="form_token]">

 <h4>Issue components</h4>
 [if-any perms.EditProject]
   <span style="margin:0 .7em">Show:
    <select id="rowfilter">
     <option label="All components" value="all">
     <option label="Active components" value="active" selected=true>
     <option label="Top-level components" value="toplevel">
     <option label="Components I administer" value="myadmin">
     <option label="Components I am CC'd on" value="mycc">
     <option label="Deprecated components" value="deprecated">
    </select>
   </span>
   <span style="margin:0 .7em">Select:
     <a id="selectall" href="#">All</a>
     <a id="selectnone" href="#">None</a>
   </span>
 [end]

 <div class="list-foot"></div>
 [if-any perms.EditProject]
   <form action="adminComponents.do" method="POST">
     <a href="/p/[projectname]/components/create" class="buttonify primary">Create component</a>
     <input type="hidden" name="delete_components">
     <input type="hidden" name="token" value="[form_token]">
     <input type="submit" class="secondary" name="deletebtn" value="Delete Component(s)" disabled>
   </form>
   <div id="deletebtnsfeedback" class="fielderror" style="margin-left:1em">
     [if-any failed_perm]
       You do not have permission to delete the components:
       [failed_perm]<br/>
     [end]
     [if-any failed_subcomp]
       Can not delete the following components because they have subcomponents:
       [failed_subcomp]<br/>
     [end]
     [if-any failed_templ]
       Can not delete the following components because they are listed in templates:
       [failed_templ]<br/>
     [end]
   </div>
 [end]

 <div class="section">
   <table cellspacing="0" cellpadding="2" border="0" class="comptable results striped vt active" id="resultstable" width="100%">
   <tbody>
     <tr>
       [if-any perms.EditProject]<th></th>[end]
       <th>ID</th>
       <th>Name</th>
       <th>Administrators</th>
       <th>Auto Cc</th>
       <th>Add Labels</th>
       <th>Description</th>
     </tr>
     [if-any component_defs][else]
       <tr>
         <td colspan="5">
           <div style="padding: 3em; text-align: center">
             This project has not defined any components.
           </div>
         </td>
       </tr>
     [end]
     [for component_defs]
       [define detail_url]/p/[projectname]/components/detail?component=[format "url"][component_defs.path][end][end]
       <tr data-url="[detail_url]" class="comprow [component_defs.classes]">
         [if-any perms.EditProject]
           <td class="cb rowwidgets">
             <input type="checkbox" data-path="[component_defs.path]" class="checkRangeSelect">
           </td>
         [end]
         <td>
            [component_defs.component_id]
         </td>
         <td class="id">
           <a style="white-space:nowrap" href="[detail_url]">[component_defs.path]</a>
         </td>
         <td>
           [for component_defs.admins]
             [include "../framework/user-link.ezt" component_defs.admins][if-index component_defs.admins last][else],[end]
           [end]
         </td>
         <td>
           [for component_defs.cc]
             [include "../framework/user-link.ezt" component_defs.cc][if-index component_defs.cc last][else],[end]
           [end]
         </td>
         <td>
           [for component_defs.labels]
             [component_defs.labels][if-index component_defs.labels last][else],[end]
           [end]
         </td>
         <td>
             [component_defs.docstring_short]
         </td>
       </tr>
     [end]
   </tbody>
   </table>
 </div>[# section]

 <div class="list-foot"></div>
 [if-any perms.EditProject]
   <form action="adminComponents.do" method="POST">
     <a href="/p/[projectname]/components/create" class="buttonify primary">Create component</a>
     <input type="hidden" name="delete_components">
     <input type="hidden" name="token" value="[form_token]">
     <input type="submit" class="secondary" name="deletebtn" value="Delete Component(s)" disabled>
   </form>
 [end]

</form>

[end]

<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);
    });
  }

  var checkboxNodes = document.getElementsByClassName("checkRangeSelect");
  var checkboxes = Array();
  for (var i = 0; i < checkboxNodes.length; ++i) {
    var checkbox = checkboxNodes.item(i);
    checkboxes.push(checkbox);
    checkbox.addEventListener("click", function (event) {
      _checkRangeSelect(event, event.target);
      _highlightRow(event.target);
      updateEnabled();
    });
  }

  function updateEnabled() {
    var anySelected = checkboxes.some(function(checkbox) {
      return checkbox.checked;
    });
    setDisabled(!anySelected);
   }

  var deleteButtons = document.getElementsByName("deletebtn");
  function setDisabled(disabled) {
    for (var i = 0; i < deleteButtons.length; ++i) {
      deleteButtons.item(i).disabled = disabled;
    }
  }

  for (var i = 0; i < deleteButtons.length; ++i) {
    deleteButtons.item(i).addEventListener("click", function(event) {
      var componentsToDelete = [];
      for (var i = 0; i< checkboxes.length; ++i) {
        var checkbox = checkboxes[[]i];
        if (checkbox.checked)
          componentsToDelete.push(checkbox.getAttribute("data-path"));
      }
      var fields = document.getElementsByName("delete_components");
      for (var i = 0; i< fields.length; ++i) {
        fields.item(i).value = componentsToDelete.join();
      }
      if (!confirm("Are you sure you want to delete the selected components ?\nThis operation cannot be undone."))
        event.preventDefault();
     });
  }

  function _handleResultsClick(event) {
    var target = event.target;
    if (target.tagName == "A" || target.type == "checkbox" || target.className == "cb")
      return;
    while (target && target.tagName != "TR") target = target.parentNode;
    _go(target.attributes[[]"data-url"].value,
        (event.metaKey || event.ctrlKey || event.button == 1));
  };
  _addClickListener($("resultstable"), _handleResultsClick);


  function _handleRowFilterChange(event) {
    $("resultstable").classList.remove('all', 'active', 'toplevel', 'myadmin', 'mycc', 'deprecated');
    $("resultstable").classList.add(event.target.value);
  };
  $("rowfilter").addEventListener("change", _handleRowFilterChange);
});
</script>


[include "../framework/footer.ezt"]
