
<!--
Copyright 2017-present Open Networking Foundation

Licensed 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.
-->
<div ng-show="vm.data.length > 0 && vm.loader == false">
    <div class="row" ng-if="vm.config.filter == 'fulltext'">
        <div class="col-xs-12">
            <input
                    class="form-control"
                    placeholder="Type to search.."
                    type="text"
                    ng-model="vm.query"/>
        </div>
    </div>
    <div class="table-responsive">
        <table ng-class="vm.classes">
        <thead>
        <tr>
            <th ng-repeat="col in vm.config.columns">
                {{col.label}}
                <div ng-if="vm.config.order">
                    <a href="" ng-click="vm.orderBy = col.prop; vm.reverse = false">
                      <i class="fa fa-chevron-up"></i>
                    </a>
                    <a href="" ng-click="vm.orderBy = col.prop; vm.reverse = true">
                      <i class="fa fa-chevron-down"></i>
                    </a>
                </div>
            </th>
            <th ng-if="vm.config.actions">Actions:</th>
        </tr>
        </thead>
        <tbody ng-if="vm.config.filter == 'field'">
            <tr>
                <td ng-repeat="col in vm.config.columns">
                    <input
                            ng-if="col.type !== 'boolean' && col.type !== 'array' && col.type !== 'object' && col.type !== 'custom'"
                            class="form-control"
                            placeholder="Type to search by {{col.label}}"
                            type="text"
                            ng-model="vm.query[col.prop]"/>
                    <select
                            ng-if="col.type === 'boolean'"
                            class="form-control"
                            ng-model="vm.query[col.prop]">
                        <option value="">-</option>
                        <option value="true">True</option>
                        <option value="false">False</option>
                    </select>
                </td>
                <td ng-if="vm.config.actions"></td>
            </tr>
        </tbody>
        <tbody>
        <tr ng-class="{active: vm.config.selectedRow == $index}" ng-repeat="item in (vm.config.filteredData = (vm.data | filter:vm.query | orderBy:vm.orderBy:vm.reverse | pagination:vm.currentPage * vm.config.pagination.pageSize | limitTo: (vm.config.pagination.pageSize || vm.data.length))) track by $index">
            <td ng-repeat="col in vm.config.columns" xos-link-wrapper>
                <span ng-if="!col.type || col.type === 'text'">{{item[col.prop]}}</span>
                <span ng-if="col.type === 'boolean'">
                    <i class="fa"
                       ng-class="{'fa-ok': item[col.prop], 'fa-remove': !item[col.prop]}">
                    </i>
                  </span>
                <span ng-if="col.type === 'date'">
                    {{item[col.prop] | date:'H:mm MMM d, yyyy'}}
                  </span>
                <span ng-if="col.type === 'array'">
                    {{item[col.prop] | arrayToList}}
                  </span>
                <span ng-if="col.type === 'object'">
                    <dl class="dl-horizontal">
                      <span ng-repeat="(k,v) in item[col.prop]">
                        <dt>{{k}}</dt>
                        <dd>{{v}}</dd>
                      </span>
                    </dl>
                  </span>
                <span ng-if="col.type === 'custom'">
                    {{item[col.prop + '-formatted']}}
                    <i class="ng-hide">{{col.formatter(item)}}</i>
                  </span>
                <span ng-if="col.type === 'icon'">
                    <i class="fa fa-{{col.formatter(item)}}">
                    </i>
                </span>
                <div class="xos-table-hover" ng-if="col.hover">
                    <div class="alert alert-info">
                        {{col.hover(item)}}
                    </div>
                </div>
            </td>
            <td class="xos-table-actions" ng-if="vm.config.actions">
                <a href=""
                   ng-repeat="action in vm.config.actions"
                   ng-click="action.cb(item)"
                   title="{{action.label}}">
                    <i
                            class="fa fa-{{action.icon}}"
                            style="color: {{action.color}};"></i>
                </a>
            </td>
        </tr>
        </tbody>
    </table>
    <xos-pagination
            ng-if="vm.config.pagination"
            page-size="vm.config.pagination.pageSize"
            total-elements="vm.data.length"
            change="vm.goToPage">
    </xos-pagination>
    </div>
</div>
<div ng-show="(vm.data.length == 0 || !vm.data) && vm.loader == false">
    <xos-alert config="{type: 'info'}" show="true">
        No data to show.
    </xos-alert>
</div>
<div ng-show="vm.loader == true">
    <div class="loader"></div>
</div>