<!--

    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.

-->
{% extends "stats/base.html" %}

{% load table %}
{% load humanize %}

{% block title %}Home{% endblock %}

{% block content %}

<table>
<thead>
    <tr>
        {% column_header properties 'name' 'Property' %}
        {% column_header properties 'numNamespaces' 'Namespaces' %}
        {% column_header properties 'numTopics' 'Topics' %}
        {% column_header properties 'numProducers' 'Producers' %}
        {% column_header properties 'numSubscriptions' 'Subscriptions' %}
        {% column_header properties 'numConsumers' 'Consumers' %}
        {% column_header properties 'rateIn' 'Rate In' %}
        {% column_header properties 'rateOut' 'Rate Out' %}
        {% column_header properties 'throughputIn' 'Throughput In' %}
        {% column_header properties 'throughputOut' 'Throughput Out' %}
        {% column_header properties 'backlog' 'Backlog' %}
        {% column_header properties 'storage' 'Storage' %}
    </tr>
</thead>
<tbody>

{% for property in properties.results %}
    <tr class="{% cycle 'row1' 'row2' %}">
        <th>
            <a href="{% url 'property' property.name %}">{{property.name}}</a>
        </th>
        <td>{{property.numNamespaces | intcomma}}</td>
        <td>{{property.numTopics | intcomma}}</td>
        <td>{{property.numProducers | intcomma}}</td>
        <td>{{property.numSubscriptions | intcomma}}</td>
        <td>{{property.numConsumers | intcomma}}</td>
        <td>{{property.rateIn | intcomma}}</td>
        <td>{{property.rateOut | intcomma}}</td>
        <td>{{property.throughputIn | intcomma}}</td>
        <td>{{property.throughputOut | intcomma}}</td>
        <td>{{property.backlog | intcomma}}</td>
        <td>{{property.storage | filesizeformat}}</td>
    </tr>
{% empty %}
    <tr><td>No properties</td></tr>
{% endfor %}
</tbody>
</table>



{% endblock %}
