<!--
/**
 * 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 class="listTable table" id="entitiesSearchList">
  <thead>
    <tr>
      <th><div class="filtersSearchBox pointer"><input type="checkbox" ng-model="selectedAll" ng-click="checkAll()"/></div></th>
      <th><div class="filtersSearchBox pointer" ng-click="toggleSortOrder()">Name <span class="glyphicon glyphicon-sort"></span></div> </th>
      <th><div class="filtersSearchBox">Tags</div></th>
      <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Cluster</div></th>
      <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Type</div></th>
      <th ng-if="$parent.$parent.$parent.entityType != 'cluster'"><div class="filtersSearchBox">Status</div></th>
    </tr>

  </thead>

  <tbody>
    <tr ng-if="input.length > 0" class="buttonsRow">
      <td class="buttonCell" colspan="9">
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSchedule()" ng-disabled="selectedDisabledButtons.schedule"
           ng-if="$parent.$parent.$parent.entityType != 'cluster'">
          <span class="entypo play"></span> <div>Schedule</div>
        </div>
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeResume()" ng-disabled="selectedDisabledButtons.resume"
           ng-if="$parent.$parent.$parent.entityType != 'cluster'">
          <span class="entypo play"></span> <div>Resume</div>
        </div>
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeSuspend()" ng-disabled="selectedDisabledButtons.suspend"
           ng-if="$parent.$parent.$parent.entityType != 'cluster'">
          <span class="entypo paus"></span> <div>Pause</div>
        </div>
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeEdit()"
          ng-disabled="selectedRows.length === 0 || selectedRows.length > 1 || ($parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode() || !isSuperUser()))"
          ng-class="{disabledEditBtn: $parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode()  || !isSuperUser())}"
          title="{{($parent.$parent.$parent.entityType === 'cluster' && (!isSafeMode() || !isSuperUser())) ? 'Cluster entity update can only be performed by superuser during safemode' : ''}}">
          <span class="entypo cog"></span> <div>Edit</div>
        </div>
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeClone()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1"
          ng-if="$parent.$parent.$parent.entityType != 'cluster'">
          <span class="entypo docs"></span> <div>Copy</div>
        </div>
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="scopeRemove()" ng-disabled="selectedRows.length === 0">
          <span class="entypo trash"></span> <div>Delete</div>
        </div>
        <div class="btn btn-gray btn-xs buttons-to-show" ng-click="download()" ng-disabled="selectedRows.length === 0 || selectedRows.length > 1">
          <span class="entypo down"></span> <div>XML</div>
        </div>
      </td>
    </tr>
  </tbody>
  <tbody>
    <tr ng-if="input.length === 0 && !server.responses.listLoaded">
      <td> loading... </td>
    </tr>
    <tr ng-if="input.length === 0 && server.responses.listLoaded">
      <td> There are no results </td>
    </tr>

    <tr ng-if="input.length !== 0"
        ng-repeat="item in input | filter:{'name':simpleFilter.name} | filter:{'status':simpleFilter.status} |
                          filter:{'list':simpleFilter.tags}"
        class="entityRow"
        ng-class="{
              firstEntityRow:$first, lastEntityRow:$last,
              rowSelected:checkedRow(item.name)
            }"
        ng-class-odd="'oddRow'" ng-class-even="'evenRow'">
      <td class="checkboxCell">
        <input type="checkbox" checklist-model="selectedRows" ng-model="$index"
               checklist-value="{name:item.name, type:item.type, status:item.status}"
               ng-change="checkButtonsToShow()"/>
      </td>
      <td class="nameCell" ng-init="entityType = item.type | uppercase">
        <button type="button" class="btn btn-link" ng-click="goEntityDetails(item.name, item.type)">
          <span ng-class="displayIcon((item.type | uppercase), item.tags.tag)"></span> {{ item.name }}
        </button>
      </td>
      <td>
        <span ng-repeat="tag in item.tags.tag" ng-click="addTag(tag)" class="tag">
          {{ tag }}{{$last ? '' : ', '}}
        </span>
      </td>
      <td ng-if="$parent.$parent.$parent.entityType != 'cluster'">
        <span ng-repeat="cluster in item.clusters.cluster">
          {{ cluster }}{{$last ? '' : ', '}}
        </span>
      </td>
      <td ng-if="$parent.$parent.$parent.entityType != 'cluster'">
        <span ng-repeat="tag in item.tags.tag" ng-init="type = displayType(tag)">
          {{ type | uppercase}}
        </span>
      </td>
      <td class="stateCell" ng-if="$parent.$parent.$parent.entityType != 'cluster'">
        <span ng-class="{'blink-success': item.status == 'RUNNING',
                         'text-success': item.status == 'SUCCEEDED',
                         'blink-warning': item.status == 'SUSPENDED',
                         'blink-danger': item.status == 'UNKNOWN'}">{{ item.status }}</span>
      </td>
    </tr>

    <tr>
      <td ng-if="server.responses.multiRequest[type] > 0 || server.responses.count.pending > 0">
        <div class="spinner" ng-class="{active: server.responses.multiRequest[type] > 0 || server.responses.count.pending > 0}">
          <img src="css/img/ajax-loader_2.gif" />
        </div>
      </td>
    </tr>

    <tr class="paginationRow">
      <td colspan="9">
        <nav class="pull-right">
          <ul class="pagination">
            <li ng-repeat="page in pages"><a href="javascript:void(0);" ng-click="page.enabled ? scopeGoPage(page.index) : void(0)" ng-class="page.enabled ? '' : 'pagDisabled'">{{ page.label }}</a></li>
          </ul>
        </nav>
      </td>
    </tr>
  </tbody>

</table>
