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

nav.navbar.navbar-default.navbar-fixed-top.navbar-main
  #fold-button.btn.btn-default.navbar-btn.pull-left(ng-click='showSidebar()')
    i.fa.fa-navicon

  .navbar-title
    | Completed Jobs

#content-inner
  table.table.table-hover.table-clickable
    thead
      tr
        th Start Time
        th End Time
        th Duration
        th Job Name
        th Job ID
        th Tasks
        th Status

    tbody
      tr(ng-repeat="job in jobs|orderBy:\"'end-time'\":true" ui-sref="single-job.plan.subtasks({ jobid: job.jid })")
        td {{job['start-time'] | amDateFormat:'YYYY-MM-DD, H:mm:ss'}}
        td {{job['end-time'] | amDateFormat:'YYYY-MM-DD, H:mm:ss'}}
        td(title="{{job.duration | humanizeDuration:false}}") {{job.duration | humanizeDuration:true}}
        td {{job.name}}
        td {{job.jid}}
        td.label-group
          bs-label(status="{{status}}" ng-repeat="(status, value) in job.tasks") {{value}}
        td 
          bs-label(status="{{job.state}}") {{job.state}}
