<!--
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.
-->

{{> www/common-header.tmpl }}
{{> www/query_detail_tabs.tmpl }}
<br/>
{{?backend_states}}
<div>
  <label>
    <input type="checkbox" checked="true" id="toggle" onClick="toggleRefresh()"/>
    <span id="refresh_on">Auto-refresh on</span>
  </label>  Last updated: <span id="last-updated"></span>
</div>

<br/>
<table id="backends" class='table table-hover table-bordered'>
  <thead>
    <tr>
      <th>Host</th>
      <th>Num. instances</th>
      <th>Num. remaining instances</th>
      <th>Done</th>
      <th>Peak mem. consumption</th>
      <th>Time since last report (ms)</th>
    </tr>
  </thead>
  <tbody>

  </tbody>
</table>

<script>
document.getElementById("backends-tab").className = "active";

var intervalId = 0;
var table = null;
var refresh = function () {
    table.ajax.reload();
    document.getElementById("last-updated").textContent = new Date();
};

$(document).ready(function() {
    table = $('#backends').DataTable({
        ajax: { url: "/query_backends?query_id={{query_id}}&json",
                dataSrc: "backend_states",
              },
        "columns": [ {data: 'host'},
                     {data: 'num_instances'},
                     {data: 'num_remaining_instances'},
                     {data: 'done'},
                     {data: 'peak_mem_consumption', render: renderSize},
                     {data: 'time_since_last_heard_from'}],
        "order": [[ 0, "desc" ]],
        "pageLength": 100
    });
    intervalId = setInterval( refresh, 1000 );
});

function toggleRefresh() {
    if (document.getElementById("toggle").checked == true) {
        intervalId = setInterval(refresh, 1000);
        document.getElementById("refresh_on").textContent = "Auto-refresh on";
    } else {
        clearInterval(intervalId);
        document.getElementById("refresh_on").textContent = "Auto-refresh off";
    }
}

</script>
{{/backend_states}}

{{^backend_states}}
<div class="alert alert-info" role="alert">
Query <strong>{{query_id}}</strong> has either completed or has no backends or has not
started any backends yet.
</div>
{{/backend_states}}

{{> www/common-footer.tmpl }}
