<!--
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.
-->
<!-- shows a list of current products in the database -->

{% extends "experimentpage.html" %}

{% block content %}

<h1>Product Status</h1>

<form id="add_product_form" method="get" action="{% url 'exp_portal:add_product' %}">
	{% csrf_token %}
	<button class="btn btn-default btn-lg" type="submit">Add Product</button>
</form>

<div class="col-md-15">
<table class="table table-hover">
	<thead>
		<tr>
			<th class="text-center">Item</th>
			<th class="text-center">Active</th>
			<th class="text-center">Name</th>
			<th class="text-center">Team</th>
			<th class="text-center">Version</th>
			<th class="text-center">Challenge Problem</th>
			<th class="text-center">URL</th>
			<th class="text-center">Instructions</th>
		</tr>
	</thead>
	<div style="overflow-y:auto">
		<tbody>
			{% for product in products %}
				<tr>
					<td>
						{{ forloop.counter }}
					</td>
					<td>
						{% if product.is_active %}
						<span class="glyphicon glyphicon-ok" style="color:green"></span>
						{% else %}
						<span class="glyphicon glyphicon-remove" style="color:red"></span>
						{% endif %}
					</td>
					<td>
						<a href="{% url 'exp_portal:view_product_details' productname=product.name %}">
							{{ product.name }}
						</a>
					</td>
					<td>
						{{ product.team }}
					</td>
					<td>
						{{ product.version }}
					</td>
					<td>
						{{ product.dataset.name }}
					</td>
					<td>
						<a href="{{ product.url }}" target='_blank'>
							{{product.url}}
						</a>
					</td>
					<td>
						<a href="{{ product.instructions }}" target='_blank'>
							{{product.instructions}}
						</a>
					</td>
				</tr>
			{% endfor %}
		</tbody>
	</div>
</table>
</div>
{% endblock %}
