{{!-- 
  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 class="diff-content">
	<b>Policy ID :&nbsp;&nbsp;</b><label class="label label-ranger"> {{objectId}}</label>
	<label class="no-margin label-size13-weightbold">Policy Name : {{policyName}}</label>
    {{#if zoneName}}
        <label class="no-margin label-size13-weightbold" > Zone Name  &nbsp;&nbsp;:  {{zoneName}}</label>
    {{/if}}
	{{#if repositoryType}}
	<label class="no-margin label-size13-weightbold">Repository Type : {{repositoryType}}</label>
	{{/if}}
	<label class="no-margin label-size13-weightbold"> Created Date  &nbsp;&nbsp;:  {{objectCreatedDate}}</label>
	<label class="no-margin label-size13-weightbold" > Created By  &nbsp;&nbsp;:  {{userName}}</label>
{{#if collection.length}}
	<h5>Policy Details :</h5>
	<div class="diff">
		<div class="diff-left">
			<h3>Fields</h3>
			<ol class="attr">
			{{#each collection}}
				<li class="change-row">{{./this.attributes.attributeName}}</li>
			{{/each}}	
			</ol>
		</div>
		<div class="diff-right">
			<h3>New Value</h3>
			<ol class="unstyled data">
			{{#each collection}}
				<li class="change-row">{{./this.attributes.newValue}}</li>
			{{/each}}	
			</ol>
		</div>
	</div>
{{/if}}	
{{#if newPolicyValidityPeriod}}
    <h5>Validity Period :</h5>
    <div class="diff diff-perms" >
        <div class="diff-right diff-list" data-id="diff">
            <h3>New Value</h3>
            {{#each newPolicyValidityPeriod}}
                <ol class="unstyled data">
                    <li class="change-row">Start Date:
                        {{#if this.startTime}}
                            {{this.startTime}}
                        {{else}}
                            --
                        {{/if}}
                    </li>
                    <li class="change-row">End Date:
                        {{#if this.endTime}}
                            {{this.endTime}}
                        {{else}}
                            --
                        {{/if}}
                    </li>
                    <li class="change-row">Time Zone:
                        {{#if this.timeZone}}
                            {{this.timeZone}}
                        {{else}}
                            --
                        {{/if}}
                    </li>
                </ol><br/>
            {{/each}}
        </div>
    </div>
{{/if}}
{{#if newPolicyConditions}}
    <h5>Policy Conditions :</h5>
    <div class="diff diff-perms" >
        <div class="diff-right diff-list" data-id="diff">
            <h3>New Value</h3>
            {{#each newPolicyConditions}}
                <li class="change-row">
                    {{#if this.type}}
                        {{this.type}} : [{{this.values}}]
                    {{else}}
                        --
                    {{/if}}
                </li>
            {{/each}}
        </div>
    </div>
{{/if}}
{{#if newPolicyItems}}
	<h5>Allow PolicyItems :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>New Value</h3>
				{{#each newPolicyItems}}
				<ol class="unstyled data">
                                        <li class="change-row">Roles:
                                                {{#if_eq this.roles compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.roles}}
                                                {{/if_eq}}
                                        </li>
                                        <li class="change-row">Groups:
                                                {{#if_eq this.groups compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.groups}}
                                                {{/if_eq}}
                                        </li>
					<li class="change-row">Users:
						{{#if_eq this.users compare=0}}
								&lt;empty&gt;	 
						{{else}}
							{{this.users}}  
						{{/if_eq}}  
					</li>
					<li class="change-row">Permissions:
						{{#each this.permissions}}
							{{this}} <span>,</span>
						{{/each}}
					</li>
					{{#if this.conditions}}
					<li class="change-row">
						Conditions:
							{{#each this.conditions}}
								{{this.type}} : [{{this.values}}]<span>,</span>
							{{/each}}
					</li>
					{{/if}}
					<li class="change-row">Delegate Admin:{{this.delegateAdmin}}</li>
				</ol><br/>
			{{/each}}
		</div>
	</div>
{{/if}}

<!-- Allow Exceptions -->

{{#if newAllowExceptionPolicyItems}}
	<h5>Allow Exceptions :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>New Value</h3>
				{{#each newAllowExceptionPolicyItems}}
				<ol class="unstyled data">
                                        <li class="change-row">Roles:
                                                {{#if_eq this.roles compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.roles}}
                                                {{/if_eq}}
                                        </li>
                                        <li class="change-row">Groups:
                                                {{#if_eq this.groups compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.groups}}
                                                {{/if_eq}}
                                        </li>
					<li class="change-row">Users:
						{{#if_eq this.users compare=0}}
								&lt;empty&gt;	 
						{{else}}
							{{this.users}}  
						{{/if_eq}}  
					</li>
					<li class="change-row">Permissions:
						{{#each this.permissions}}
							{{this}} <span>,</span>
						{{/each}}
					</li>
					{{#if this.conditions}}
					<li class="change-row">
						Conditions:
							{{#each this.conditions}}
								{{this.type}} : [{{this.values}}]<span>,</span>
							{{/each}}
					</li>
					{{/if}}
					<li class="change-row">Delegate Admin:{{this.delegateAdmin}}</li>
				</ol><br/>
			{{/each}}
		</div>
	</div>
{{/if}}

<!-- Deny PolicyItems -->

{{#if newDenyPolicyItems}}
	<h5>Deny PolicyItems :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>New Value</h3>
				{{#each newDenyPolicyItems}}
				<ol class="unstyled data">
                                        <li class="change-row">Roles:
                                                {{#if_eq this.roles compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.roles}}
                                                {{/if_eq}}
                                        </li>
                                        <li class="change-row">Groups:
                                                {{#if_eq this.groups compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.groups}}
                                                {{/if_eq}}
                                        </li>
					<li class="change-row">Users:
						{{#if_eq this.users compare=0}}
								&lt;empty&gt;	 
						{{else}}
							{{this.users}}  
						{{/if_eq}}  
					</li>
					<li class="change-row">Permissions:
						{{#each this.permissions}}
							{{this}} <span>,</span>
						{{/each}}
					</li>
					{{#if this.conditions}}
					<li class="change-row">
						Conditions:
							{{#each this.conditions}}
								{{this.type}} : [{{this.values}}]<span>,</span>
							{{/each}}
					</li>
					{{/if}}
					<li class="change-row">Delegate Admin:{{this.delegateAdmin}}</li>
				</ol><br/>
			{{/each}}
		</div>
	</div>
{{/if}}
<!-- Deny Exception PolicyItems -->
{{#if newDenyExceptionPolicyItems}}
	<h5>Deny Exception PolicyItems:</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>New Value</h3>
				{{#each newDenyExceptionPolicyItems}}
				<ol class="unstyled data">
                                        <li class="change-row">Roles:
                                                {{#if_eq this.roles compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.roles}}
                                                {{/if_eq}}
                                        </li>
                                        <li class="change-row">Groups:
                                                {{#if_eq this.groups compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.groups}}
                                                {{/if_eq}}
                                        </li>
					<li class="change-row">Users:
						{{#if_eq this.users compare=0}}
								&lt;empty&gt;	 
						{{else}}
							{{this.users}}  
						{{/if_eq}}  
					</li>
					<li class="change-row">Permissions:
						{{#each this.permissions}}
							{{this}} <span>,</span>
						{{/each}}
					</li>
					{{#if this.conditions}}
					<li class="change-row">
						Conditions:
							{{#each this.conditions}}
								{{this.type}} : [{{this.values}}]<span>,</span>
							{{/each}}
					</li>
					{{/if}}
					<li class="change-row">Delegate Admin:{{this.delegateAdmin}}</li>
				</ol><br/>
			{{/each}}
		</div>
	</div>
{{/if}}	

<!-- Masking Policy Items -->
{{#if newMaskPolicyItems}}
	<h5>Masking Policy Items :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>New Value</h3>
			{{#each newMaskPolicyItems}}
				<ol class="unstyled data">
                                        <li class="change-row">Roles:
                                                {{#if_eq this.roles compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.roles}}
                                                {{/if_eq}}
                                        </li>
                                        <li class="change-row">Groups:
                                                {{#if_eq this.groups compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.groups}}
                                                {{/if_eq}}
                                        </li>
					<li class="change-row">Users:
						{{#if_eq this.users compare=0}}
								&lt;empty&gt;
						{{else}}
							{{this.users}}
						{{/if_eq}}
					</li>
					<li class="change-row">Accesses:
						{{#each this.accesses}}
							{{this.type}} <span>,</span>
						{{/each}}
					</li>
					{{#if this.dataMaskInfo}}
					<li class="change-row">
					Data Mask Types:
					  <i>
					  	{{this.dataMaskInfo.dataMaskType}}
					  </i>
					</li>
					{{/if}}
				</ol><br/>
			{{/each}}
		</div>
	</div>
{{/if}}

<!--  Row Filter Policy Items-->
{{#if newRowFilterPolicyItems}}
	<h5>Row Level Filter Policy Items :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>New Value</h3>
			{{#each newRowFilterPolicyItems}}
				<ol class="unstyled data">
                                        <li class="change-row">Roles:
                                                {{#if_eq this.roles compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.roles}}
                                                {{/if_eq}}
                                        </li>
                                        <li class="change-row">Groups:
                                                {{#if_eq this.groups compare=0}}
                                                        &lt;empty&gt;
                                                {{else}}
                                                        {{this.groups}}
                                                {{/if_eq}}
                                        </li>
					<li class="change-row">Users:
						{{#if_eq this.users compare=0}}
								&lt;empty&gt;
						{{else}}
							{{this.users}}
						{{/if_eq}}
					</li>
					<li class="change-row">Accesses:
						{{#each this.accesses}}
							{{this.type}} <span>,</span>
						{{/each}}
					</li>
					{{#if this.rowFilterInfo}}
					<li class="change-row">
					Row Level Filter:
					  {{this.rowFilterInfo.filterExpr}}
					</li>
					{{/if}}
				</ol><br/>
			{{/each}}
		</div>
	</div>
{{/if}}

</div>
