<!--
 * 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.
-->
<div>
    <div class="clearfix">
        <div class="form-group pull-right no-margin">
            {{#unless columnOpts.el}}
            <div data-id="control" class="pull-right"></div>
            {{/unless}}
        </div>
    </div>
    <div class="position-relative thick-border">
        <div data-id="r_tableList" class="table-responsive tableBorder"> </div>
        {{#if includeTableLoader}}
        <div data-id="r_tableSpinner" class="fontLoader for-ignore">
            <i class="fa fa-refresh fa-spin-custom"></i>
        </div>
        {{/if}}
    </div>
    {{#if includePagination}}
    <div class="row clearfix banded pagination-box">
        <div class="col-sm-4">
            <div data-id="r_footerRecords" class="margin-top-10"></div>
        </div>
        <div class="col-sm-8">
            <div class="inline-content-fr">
                <div data-id="r_pagination" data-id="paginationDiv" class="inline"></div>
                {{#if includeGotoPage}}
                <div class="inline col-sm-4" data-id="paginationDiv" style="display:none">
                    <div class="input-group" data-id="goToPageDiv">
                        <input type="text" class="form-control number-input" data-id="gotoPage" placeholder="Goto Page" />
                        <span class="input-group-btn">
                            <button class="btn btn-default" type="button" data-id="gotoPagebtn" title="Goto Page" disabled="disabled">Go!</button>
                        </span>
                    </div>
                </div>
                {{/if}}
                {{#if includePageSize}}
                <div class="inline">
                    <div class="inline-content">
                        <span class="control-label-sm inline ">Page Limit :</span>
                        <div class="select inline" style="width: 80px;">
                            <select data-id="pageSize" class="form-control"></select>
                        </div>
                    </div>
                </div>
                {{/if}}
            </div>
        </div>
    </div>
    {{/if}} {{#if includeAtlasPagination}}
    <div class="row pagination-box">
        <div class="col-sm-4">
            <span class="labelShowRecord pull-left" data-id="pageRecordText"> </span>
        </div>
        <div class="col-sm-8">
            <div class="inline-content-fr">
                <div class="backgrid-paginator inline">
                    <ul class="" data-id="paginationDiv" style="display:none">
                        <li>
                            <button type="button" data-id="previousData" title="Previous" disabled=true>
                                <i class="fa fa-angle-left" aria-hidden="true"></i>
                            </button>
                        </li>
                        <li class="active">
                            <a href="javascript:void(0)" data-id="activePage"></a>
                        </li>
                        <li>
                            <button type="button" data-id="nextData" title="Next">
                                <i class="fa fa-angle-right" aria-hidden="true"></i>
                            </button>
                        </li>
                    </ul>
                </div>
                {{#if includeAtlasGotoPage}}
                <div class="inline col-sm-4" data-id="paginationDiv" style="display:none">
                    <div class="input-group" data-id="goToPageDiv">
                        <input type="text" class="form-control number-input" data-id="gotoPage" placeholder="Goto Page" />
                        <span class="input-group-btn">
                            <button class="btn btn-default" type="button" data-id="gotoPagebtn" title="Goto Page" disabled="disabled">Go!</button>
                        </span>
                    </div>
                </div>
                {{/if}} {{#if includeAtlasPageSize}}
                <div class="inline">
                    <div class="form-group inline-content">
                        <span class="control-label-sm inline ">Page Limit :</span>
                        <div class="inline" style="width: 80px;">
                            <select data-id="showPage" multiple="multiple" class="form-control">
                            </select>
                        </div>
                    </div>
                </div>
                {{/if}}
            </div>
        </div>
    </div>
    {{/if}}
</div>