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

table.table.table-body-hover.table-clickable.table-activable
  thead
    tr
      th Start Time
      th End Time
      th Duration
      th Name
      th Bytes received
      th Records received
      th Bytes sent
      th Records sent
      th Tasks
      th Status

  tbody(ng-repeat="v in job.vertices" ng-class="{ active: v.id == nodeid }" ng-click="changeNode(v.id)")
    tr(ng-if="v.type == 'regular'")
      td
        span(ng-if="v['start-time'] > -1") {{ v['start-time'] | amDateFormat:'YYYY-MM-DD, H:mm:ss' }}
      td
        span(ng-if="v['end-time'] > -1") {{ v['end-time'] | amDateFormat:'YYYY-MM-DD, H:mm:ss' }}
      td
        span(ng-if="v.duration > -1" title="{{v.duration | humanizeDuration:false}}") {{v.duration | humanizeDuration:true}}

      td.td-long {{ v.name | humanizeText }}
      td(title="{{v.metrics['read-bytes']}} bytes") {{ v.metrics['read-bytes'] | humanizeBytes }}
      td {{ v.metrics['read-records'] | number }}
      td(title="{{v.metrics['write-bytes']}} bytes") {{ v.metrics['write-bytes'] | humanizeBytes }}
      td {{ v.metrics['write-records'] | number }}
      td
        .label-group
          bs-label(status="{{status}}" ng-repeat="(index, status) in stateList") {{v.tasks[status]}}

      td 
        bs-label(status="{{v.status}}") {{v.status}}
    tr(ng-if="nodeid && v.id == nodeid")
      td(colspan="10")
        div(ng-include=" 'partials/jobs/job.plan.node.subtasks.html' ")
