{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% set page = "new_projects" %}
{% set hide_left_bar = True %}

{% extends 'allura:templates/site_admin.html' %}

{% macro _paging() %}
<div class="paging">
    <a class="newer" title="Newer" href="{{ newer_url }}">&lt;</a>&nbsp;&hellip;&nbsp;
    <a class="newer" title="Older" href="{{ older_url }}">&gt;</a>
</div>
{% endmacro %}

{% block content %}
  <div class="grid-24">
  <form method="GET">
    <div class="grid-13">
    <label for="start-dt">From: </label><input type="text" name="start-dt" id="start-dt" value="{{ window_start.strftime('%Y/%m/%d %H:%M:%S') }}">
    <label for="end-dt">To: </label><input type="text" name="end-dt" id="end-dt" value="{{ window_end.strftime('%Y/%m/%d %H:%M:%S') }}">
    </div>
    <div class="grid-3"><input type="submit" value="Filter"></div>
  </form>
  </div>
  {{ _paging() }}
  <div style="clear:both;"></div>
  <table id="new_projects">
    <thead>
      <tr>
        <th class="narrow"></th>
        <th>Created</th>
        <th>Shortname</th>
        <th>Name</th>
        <th>Short description</th>
        <th>Summary</th>
        <th>Homepage</th>
        <th>Admins</th>
      </tr>
    </thead>
    {% for p in projects %}
    <tr>
      <td class="narrow">
        <input type="checkbox" class="js-select-project" data-shortname="{{ p.shortname }}" />
      </td>
      <td class="narrow">
        <small>{{ p._id.generation_time.strftime('%Y-%m-%d %H:%M:%S') }}</small>
      </td>
      <td><small>{{ p.shortname }}</small></td>
      <td><small><a href="{{ p.url() }}">{{ p.name }}</a></small></td>
      <td><small>{{ p.short_description|truncate(100) }}</small></td>
      <td><small>{{ p.summary }}</small></td>
      <td><small>{{ p.external_homepage|urlize(22) }}</small></td>
      <td>{% for a in p.admins() %}<small><a href="{{ a.url() }}">{{ a.username }}</a></small> {% endfor %}</td>
    </tr>
    {% endfor %}
  </table>
  {{ _paging() }}
  <div id="selected-projects"></div>
{% endblock %}

{% block extra_css %}
<style type="text/css">
    .paging {
        float: right;
        margin: 1em;
    }
    .pad table {
      width: 915px;
    }
    td {
        max-width: 120px;
    }
    th.header {
        background-image: url("{{g.forge_static('images/bg.gif')}}");
        cursor: pointer;
        font-weight: bold;
        background-repeat: no-repeat;
        background-position: center left;
        padding-left: 20px;
    }
    th.headerSortUp {
        background-image: url("{{g.forge_static('images/asc.gif')}}");
        background-color: #6bb3fd;
    }
    th.headerSortDown {
        background-image: url("{{g.forge_static('images/desc.gif')}}");
        background-color: #6bb3fd;
    }
</style>
{% endblock %}

{% block extra_js %}
  <script type="text/javascript" src="{{g.forge_static('js/site_admin_new_projects.js')}}"></script>
  <script type="text/javascript" src="{{g.forge_static('js/jquery.tablesorter.js')}}"></script>
  <script type="text/JavaScript">$(document).ready(function() {$("#new_projects").tablesorter({headers: {0: {sorter: false}}});} );</script>
{% endblock %}
