{{!-- 
  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 data-id="policyTypeTab">
		<ul class="nav nav-tabs tabs clearfix">
		{{#showRowLevelTab .}}
			<li data-tab="rowLevelFilter" class=""><a data-toggle="tab"
				href="#rowLevelFilter">Row Level Filter</a></li>
		{{/showRowLevelTab}}
		
		{{#showMaskingTab .}}
			<li data-tab="masking" class=""><a data-toggle="tab"
				href="#masking">Masking</a></li>
		{{/showMaskingTab}}
		{{#if isRenderAccessTab}}
			<li data-tab="access" class="active"><a data-toggle="tab"
				href="#access">Access</a></li>
		{{/if}}		
		</ul>
</div>
<h3 class="wrap-header bold"> {{tt 'lbl.listOfPolicies'}} : {{rangerService.attributes.name}} </h3>
<div class="wrap non-collapsible m-height ">
	<div>
        <div class="row-fluid margin-bottom-11">
            <div class="span9">
                <div class="visual_search"></div>
            </div>
            <div class="span1">
                <i class="icon-info-sign searchInfo margin-left-min-30" title="Search Filter Hints" data-id="searchInfo"> </i>
            </div>
            <div class="span2">
                <div class="clearfix btn-right">
                    {{#if isAddNewPolicyButtonShow}}
                            <a data-js="addNewPolicy" href="#!/service/{{rangerService.id}}/policies/create/{{this.rangerPolicyType}}" class="btn btn-primary " type="button">{{tt 'lbl.addNewPolicy'}} </a>
                    {{/if}}
                </div>
            </div>
        </div>
                <div data-id="r_table"></div>
	</div>
</div>

