{{!-- 
  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}}
	<label class="no-margin label-size13-weightbold"> Deleted Date  &nbsp;&nbsp;:  {{objectCreatedDate}}</label>
	<label class="no-margin label-size13-weightbold" > Deleted 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-left">
			<h3>Old Value</h3>
			<ol class="unstyled data">
			{{#each collection}}
					<li class="change-row">{{./this.attributes.previousValue}}</li>
			{{/each}}	
			</ol>
		</div>  
	</div>
{{/if}}	

{{#if oldPolicyValidityPeriod}}
    <h5>Validity Period :</h5>
    <div class="diff validityPeriod" >
        <div class="diff-right diff-list" data-id="diff">
            <h3>Old Value</h3>
            {{#each oldPolicyValidityPeriod}}
                <ol class="unstyled data">
                    <li class="change-row"><i>Start Date</i>:
                        {{#if this.startTime}}
                            <span class="startTime">{{this.startTime}}</span><span>,</span>
                        {{else}}
                            --
                        {{/if}}
                    </li>
                    <li class="change-row"><i>End Date</i>:
                        {{#if this.endTime}}
                            <span class="endTime">{{this.endTime}}</span><span>,</span>
                        {{else}}
                            --
                        {{/if}}
                    </li>
                    <li class="change-row"><i>Time Zone</i>:
                        {{#if this.timeZone}}
                            <span class="timeZone">{{this.timeZone}}</span><span>,</span>
                        {{else}}
                            --
                        {{/if}}
                    </li>
                </ol><br/>
            {{/each}}
        </div>
    </div>
{{/if}}

{{#if oldPolicyCondition}}
    <h5>Policy Conditions :</h5>
    <div class="diff diff-perms" >
        <div class="diff-right diff-list" data-id="diff">
            <h3>Old Value</h3>
            {{#each oldPolicyCondition}}
                <li class="change-row">
                    {{#if this.type}}
                        {{this.type}} : [{{this.values}}]
                    {{else}}
                        --
                    {{/if}}
                </li>
            {{/each}}
        </div>
    </div>
{{/if}}

{{#if oldPolicyItems}}
	<h5>Allow PolicyItems :</h5>
	<div class="diff diff-perms">
		<div class="diff-right" data-id="diff">
			<h3>Old Value</h3>
			{{#each oldPolicyItems}}
				<ol class="unstyled data">
                                                        <li class="change-row"><i>Roles</i>:
                                                                {{#if_eq this.roles compare=0}}
                                                                        &lt;empty&gt;
                                                                {{else}}
                                                                        {{#each this.roles}}
                                                                                <span class="rolename">{{this}}</span><span>,</span>
                                                                        {{/each}}
                                                                {{/if_eq}}
                                                        </li>
							<li class="change-row"><i>Groups</i>:
								{{#if_eq this.groups compare=0}}
									&lt;empty&gt; 
								{{else}}
									{{#each this.groups}}  
											<span class="groupname">{{this}}</span><span>,</span>
									{{/each}}
								{{/if_eq}}
							</li>
							<li class="change-row"><i>Users</i>:
								{{#if_eq this.users compare=0}}
									&lt;empty&gt;	 
								{{else}}
									{{#each this.users}}  
											<span class="username">{{this}}</span><span>,</span>
									{{/each}}
								{{/if_eq}}
							</li>
							<li class="change-row"><i>Permissions</i>:
								{{#each this.permissions}}
									<span class="perm">{{this}}</span> <span>,</span>
								{{/each}}
							</li>
							{{#if this.conditions}}
								<li class="change-row">
									<i>Conditions</i>:
										{{#each this.conditions}}
											<span class="condition">{{this.type}} : [{{this.values}}]</span><span>,</span>
										{{/each}}
								</li>
							{{/if}}	
							<li class="change-row"><i>Delegate Admin</i>: {{this.delegateAdmin}}</li>
					</ol><br/>
		{{/each}}
		</div>
	</div>
{{/if}}
<!-- Masking Policy Items -->
{{#if oldMaskPolicyItems}}
	<h5>Masking Policy Items :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>old Value</h3>
				{{#each oldMaskPolicyItems}}
					<ol class="unstyled data">
                                                <li class="change-row"><i>Roles</i>:
                                                        {{#if_eq this.roles compare=0}}
                                                                &lt;empty&gt;
                                                        {{else}}
                                                                {{#each this.roles}}
                                                                        <span class="rolename">{{this}}</span><span>,</span>
                                                                {{/each}}
                                                        {{/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 oldRowFilterPolicyItems}}
	<h5>Row Level Filter Policy Items :</h5>
	<div class="diff diff-perms" >
		<div class="diff-right diff-list" data-id="diff">
			<h3>Old Value</h3>
			{{#each oldRowFilterPolicyItems}}
				<ol class="unstyled data">
                                                <li class="change-row"><i>Roles</i>:
                                                        {{#if_eq this.roles compare=0}}
                                                                &lt;empty&gt;
                                                        {{else}}
                                                                {{#each this.roles}}
                                                                        <span class="rolename">{{this}}</span><span>,</span>
                                                                {{/each}}
                                                        {{/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}}	

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

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

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

</div>
