You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ni...@apache.org on 2020/01/30 13:22:42 UTC

[ranger] branch master updated: RANGER-2670 : Bookmark functionality for Report Tab and Add sort By query param in URL.

This is an automated email from the ASF dual-hosted git repository.

ni3galave pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 8445329  RANGER-2670 : Bookmark functionality for Report Tab and Add sort By query param in URL.
8445329 is described below

commit 84453294076e1bfe4739a0008543a8402292014b
Author: Nitin Galave <ni...@apache.org>
AuthorDate: Wed Jan 29 17:13:06 2020 +0530

    RANGER-2670 : Bookmark functionality for Report Tab and Add sort By query param in URL.
---
 .../main/java/org/apache/ranger/biz/XUserMgr.java  |  10 +-
 .../org/apache/ranger/service/XTrxLogService.java  |   2 +
 .../scripts/collection_bases/VXTrxLogListBase.js   |   2 +-
 .../webapp/scripts/collections/XABaseCollection.js |   3 +-
 .../main/webapp/scripts/controllers/Controller.js  |   5 +-
 .../webapp/scripts/modules/globalize/message/en.js |  10 +-
 .../src/main/webapp/scripts/routers/Router.js      |   2 +-
 .../src/main/webapp/scripts/utils/XAUtils.js       |  64 +++-
 .../webapp/scripts/views/kms/KMSTableLayout.js     |   8 +
 .../views/permissions/ModulePermsTableLayout.js    |   5 +-
 .../views/policies/RangerPolicyTableLayout.js      |   5 +-
 .../views/reports/AuditAccessLogDetailView.js      |  86 ++++++
 .../webapp/scripts/views/reports/AuditLayout.js    | 340 ++++++++++++++-------
 .../scripts/views/reports/UserAccessLayout.js      | 175 +++++++----
 .../webapp/scripts/views/users/UserTableLayout.js  |   7 +-
 security-admin/src/main/webapp/styles/xa.css       |   7 +
 .../reports/AuditAccessLogDetail_tmpl.html         | 214 +++++++++++++
 .../templates/reports/UserAccessLayout_tmpl.html   |   2 +-
 18 files changed, 754 insertions(+), 193 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
old mode 100644
new mode 100755
index 037c591..1c29d82
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -1752,8 +1752,10 @@ public class XUserMgr extends XUserMgrBase {
 		} catch (Exception e){
 			logger.error("Error getting the exact match of user =>"+e);
 		}
-		if(vXUserList.getVXUsers().isEmpty()) {
-			searchCriteria.setSortBy("id");
+		if (vXUserList.getVXUsers().isEmpty()) {
+			if (StringUtils.isBlank(searchCriteria.getSortBy())) {
+				searchCriteria.setSortBy("id");
+			}
 			vXUserList = xUserService.searchXUsers(searchCriteria);
 		}
 		if(vXUserList!=null && !hasAccessToModule(RangerConstants.MODULE_USER_GROUPS)){
@@ -1861,7 +1863,9 @@ public class XUserMgr extends XUserMgrBase {
 			logger.error("Error getting the exact match of group =>"+e);
 		}
 		if(vXGroupList.getList().isEmpty()) {
-			searchCriteria.setSortBy("id");
+			if(StringUtils.isBlank(searchCriteria.getSortBy())) {
+				searchCriteria.setSortBy("id");
+			}
 			vXGroupList=xGroupService.searchXGroups(searchCriteria);
 		}
 		
diff --git a/security-admin/src/main/java/org/apache/ranger/service/XTrxLogService.java b/security-admin/src/main/java/org/apache/ranger/service/XTrxLogService.java
index 38884c7..c892813 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/XTrxLogService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/XTrxLogService.java
@@ -179,6 +179,8 @@ public class XTrxLogService extends XTrxLogServiceBase<XXTrxLog, VXTrxLog> {
 		VXTrxLogList vxTrxLogList = new VXTrxLogList();
 		vxTrxLogList.setStartIndex(startIndex);
 		vxTrxLogList.setPageSize(pageSize);
+                vxTrxLogList.setSortBy(searchCriteria.getSortBy());
+                vxTrxLogList.setSortType(searchCriteria.getSortType());
                 if (session != null && (session.isKeyAdmin() || session.isAuditKeyAdmin()) ) {
 			vxTrxLogList.setVXTrxLogs(keyAdminTrxLogList);
 		} else {
diff --git a/security-admin/src/main/webapp/scripts/collection_bases/VXTrxLogListBase.js b/security-admin/src/main/webapp/scripts/collection_bases/VXTrxLogListBase.js
index 8e24b71..328a6a1 100644
--- a/security-admin/src/main/webapp/scripts/collection_bases/VXTrxLogListBase.js
+++ b/security-admin/src/main/webapp/scripts/collection_bases/VXTrxLogListBase.js
@@ -54,7 +54,7 @@ define(function(require){
 			return this.constructor.nonCrudOperation.call(this, url, 'GET', options);
 		},
 		comparator : function(model) {
-			  return -model.get("id");
+                        // return -model.get("id");
 		}
 	},{
 		// static class members
diff --git a/security-admin/src/main/webapp/scripts/collections/XABaseCollection.js b/security-admin/src/main/webapp/scripts/collections/XABaseCollection.js
index 8b7a68d..b497a79 100644
--- a/security-admin/src/main/webapp/scripts/collections/XABaseCollection.js
+++ b/security-admin/src/main/webapp/scripts/collections/XABaseCollection.js
@@ -45,7 +45,8 @@ define(function(require) {
 		 */
 		state : {
 			firstPage: 0,
-			pageSize : XAGlobals.settings.PAGE_SIZE
+                        pageSize : XAGlobals.settings.PAGE_SIZE,
+                        order : 1
 		},
 		mode : 'server',
 		/**
diff --git a/security-admin/src/main/webapp/scripts/controllers/Controller.js b/security-admin/src/main/webapp/scripts/controllers/Controller.js
index 99b69a4..1c3ec62 100755
--- a/security-admin/src/main/webapp/scripts/controllers/Controller.js
+++ b/security-admin/src/main/webapp/scripts/controllers/Controller.js
@@ -56,7 +56,7 @@ define(function(require) {
         },
 	   
 	   //************** Analytics(reports)  Related *********************/
-	   userAccessReportAction : function(){
+           userAccessReportAction : function(tab){
 		   MAppState.set({ 'currentTab' : XAGlobals.AppTabs.AccessManager.value });
 		   var view				= require('views/reports/UserAccessLayout');
 		   var RangerPolicyList = require('collections/RangerPolicyList');
@@ -67,7 +67,8 @@ define(function(require) {
 		   App.rContent.show(new view({
 			   collection : new RangerPolicyList(),
 			   groupList : new VXGroupList(),
-			   userList : new VXUserList()
+                           userList : new VXUserList(),
+                           urlQueryParams : tab.indexOf("?") !== -1 ? tab.substring(tab.indexOf("?") + 1) : undefined,
 		   }));
 	   },
 	   auditReportAction : function(tab){
diff --git a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
index a559248..d8838c0 100644
--- a/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
+++ b/security-admin/src/main/webapp/scripts/modules/globalize/message/en.js
@@ -277,8 +277,13 @@ define(function(require) {
                 roles                           : 'Roles',
                 userWithGrantRolePrivilege      : 'Users (Grant privilege)',
                 groupWithGrantRolePrivilege      : 'Groups (Grant privilege)',
-                applicationType					: 'Application',
-                displayName						: 'Display Name',
+                applicationType                 : 'Application',
+                displayName                     : 'Display Name',
+                auditAccessDetail               : 'Audit Access Log Detail',
+                hiveQuery                       : 'Hive Query',
+                clientIP                        : 'Client IP',
+                eventCount                      : 'Event Count',
+                tags                            : 'Tags',
 
 			},
 			btn : {
@@ -454,6 +459,7 @@ define(function(require) {
                 plsSelectUserToSetVisibility :' Please select user to set visibility or selected user is already visible/hidden.',
                 plsSelectGroupToSetVisibility:' Please select group to set visibility or selected group is already visible/hidden.',
                 activationTimeDelayMsg       : 'Policy is updated but not yet used for any enforcement.',
+                downloadTimeDelayMsg       : 'Policy is updated but not yet downloaded(sync-up with Ranger).',
                 pleaseSelectAccessTypeForTagMasking : 'Please select access type first to enable add masking options.',
                 addUserOrGroupOrRoleForDelegateAdmin      : 'Please select user/group/role for the selected permission(s)',
                 policyLabelsinfo		: 'Enter label of policy',
diff --git a/security-admin/src/main/webapp/scripts/routers/Router.js b/security-admin/src/main/webapp/scripts/routers/Router.js
index 14f4916..7c893e5 100644
--- a/security-admin/src/main/webapp/scripts/routers/Router.js
+++ b/security-admin/src/main/webapp/scripts/routers/Router.js
@@ -35,7 +35,7 @@ function(Backbone, Marionette, localization, MAppState, XAUtil){
 			"!/policymanager/:tag"				: "serviceManagerAction",
 
 			/****** Analytics Report related **********************/
-			"!/reports/userAccess"		: "userAccessReportAction",
+                        "!/reports/:userAccess"		: "userAccessReportAction",
 			
 			/****** Audit Report related **********************/
 			"!/reports/audit/:tab"					: "auditReportAction",
diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
index 5ec258f..0b172eb 100644
--- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js
+++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js
@@ -790,12 +790,6 @@ define(function(require) {
                 var serverParamName = _.findWhere(serverAttrName, {
                         text : m.attributes.category
                 });
-                //  pass label in url params
-                // if(_.isUndefined(serverParamName)) {
-                // 	var serverParamName = _.findWhere(serverAttrName, {
-                // 		label : m.attributes.category
-                // 	});
-                // }
                 var extraParam = {};
                 if (serverParamName && _.has(serverParamName, 'multiple') && serverParamName.multiple) {
                         extraParam[serverParamName.label] = XAUtils.enumLabelToValue(serverParamName.optionsArr, m.get('value'));
@@ -830,6 +824,21 @@ define(function(require) {
                     }
                 })
             })
+
+            if(!_.contains(["vXUsers","vXGroups","roles","vXModuleDef"], collection.modelAttrName)) {
+                //set sortBy value to url
+                if(!_.isUndefined(collection.queryParams) && collection.queryParams.sortBy && !_.isNull(collection.queryParams.sortBy)) {
+                    var sortparams = _.pick(collection.queryParams, 'sortBy');
+                    collection.state.order == 1 ? sortparams['sortType'] = "descending" : sortparams['sortType'] = "ascending";
+                    urlLabelParam = _.extend(urlLabelParam, sortparams)
+                }
+                //set sortKey value to url
+                if(!_.isUndefined(collection.state) && collection.state.sortKey && !_.isNull(collection.state.sortKey) && !_.contains(urlLabelParam, 'sortBy')) {
+                    var sortparams = _.pick(collection.state, 'sortKey');
+                    collection.state.order == 1 ? sortparams['sortType'] = "descending" : sortparams['sortType'] = "ascending";
+                    urlLabelParam = _.extend(urlLabelParam, sortparams)
+                }
+            }
             XAUtils.changeParamToUrlFragment(urlLabelParam, collection.modelName);
 			collection.fetch({
 				reset : true,
@@ -1741,16 +1750,33 @@ define(function(require) {
     }
 
     //remove sort caret on grids
-    XAUtils.backgirdSort = function(col){
+    XAUtils.backgridSort = function(col){
+        if(!_.isUndefined(col.queryParams) && col.queryParams.sortBy && !_.isNull(col.queryParams.sortBy)) {
+                var sortparams = _.pick(col.queryParams, 'sortBy');
+            col.state.order == 1 ? sortparams['sortType'] = "descending" : sortparams['sortType'] = "ascending";
+            XAUtils.changeParamToUrlFragment(sortparams);
+        }
         col.on('backgrid:sort', function(model) {
             // No ids so identify model with CID
-            var cid = model.cid;
+            var cid = model.cid, urlObj = {};
             var filtered = model.collection.filter(function(model) {
                 return model.cid !== cid;
             });
             _.each(filtered, function(model) {
                model.set('direction', null);
             });
+            if(Backbone.history.fragment.indexOf("?") !== -1) {
+                var urlFragment = Backbone.history.fragment.substring(Backbone.history.fragment.indexOf("?") + 1);
+                urlObj = XAUtils.changeUrlToSearchQuery(decodeURIComponent(urlFragment));
+            }
+            urlObj['sortBy'] = model.get('name');
+            if(_.isNull(model.get('direction'))) {
+                delete urlObj.sortType;
+                delete urlObj.sortBy;
+            } else {
+                urlObj['sortType'] = model.get('direction');
+            }
+            XAUtils.changeParamToUrlFragment(urlObj);
         });
     }
 
@@ -1818,11 +1844,6 @@ define(function(require) {
         return query_string;
     }
 
-    //convert URL to visual search query parameter
-    XAUtils.changeUrlToVSSearchQuery = function(urlQuery) {
-        return '"'+decodeURIComponent(urlQuery.replace(/"/g, '\\"').replace(/&/g, '""').replace(/=/g, '":"'))+'"'
-    }
-
     //Return key from serverAttrName for vsSearch
     XAUtils.filterKeyForVSQuery = function(list, key) {
         var value = _.filter(list, function(m) {
@@ -1843,5 +1864,22 @@ define(function(require) {
         }).replace(/\s+/g, '');
     }
 
+    //Set backgrid table sorting direction
+    XAUtils.backgridSortType = function(collection, column) {
+        _.filter(column, function(val, key){
+            if(key == collection.queryParams.sortBy) {
+                val['direction'] =  collection.state.order == 1 ? "descending" : "ascending"
+            }
+        })
+    }
+
+    //Set default sort by and sort order in collection
+    XAUtils.setSorting = function(collectin, sortParams) {
+        _.extend(collectin.queryParams,{ 'sortBy'  :  sortParams.sortBy });
+        if(sortParams.sortType) {
+            sortParams.sortType == "ascending" ? collectin.setSorting(sortParams.sortBy,-1) : collectin.setSorting(sortParams.sortBy,1);
+        }
+    }
+
 	return XAUtils;
 });
\ No newline at end of file
diff --git a/security-admin/src/main/webapp/scripts/views/kms/KMSTableLayout.js b/security-admin/src/main/webapp/scripts/views/kms/KMSTableLayout.js
index 4954b74..ccc7b45 100755
--- a/security-admin/src/main/webapp/scripts/views/kms/KMSTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/kms/KMSTableLayout.js
@@ -251,6 +251,14 @@ define(function(require){
                                 serverAttrName  = [	{text : "Key Name", label :"name", urlLabel : "keyName"}];
 			}
 			var query = (!_.isUndefined(coll.VSQuery)) ? coll.VSQuery : '';
+                        if(!_.isUndefined(this.urlQueryParams)) {
+                                var urlQueryParams = XAUtil.changeUrlToSearchQuery(this.urlQueryParams);
+                                _.map(urlQueryParams, function(val , key) {
+                    if (_.some(serverAttrName, function(m){return m.urlLabel == key})) {
+                        query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    }
+                                });
+                        }
 			var pluginAttr = {
 				      placeholder :placeholder,
 				      container : this.ui.visualSearch,
diff --git a/security-admin/src/main/webapp/scripts/views/permissions/ModulePermsTableLayout.js b/security-admin/src/main/webapp/scripts/views/permissions/ModulePermsTableLayout.js
index 798fe79..9e2260a 100644
--- a/security-admin/src/main/webapp/scripts/views/permissions/ModulePermsTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/permissions/ModulePermsTableLayout.js
@@ -231,9 +231,10 @@ define(function(require){
             if(!_.isUndefined(this.urlQueryParams)) {
                 var urlQueryParams = XAUtil.changeUrlToSearchQuery(this.urlQueryParams);
                 _.map(urlQueryParams, function(val , key) {
-                    query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    if (_.some(serverAttrName, function(m){return m.urlLabel == key})) {
+                        query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    }
                 });
-                    // query += XAUtil.changeUrlToVSSearchQuery(this.urlQueryParams);
             }
             var pluginAttr = {
                                 placeholder :localization.tt('h.searchForPermissions'),
diff --git a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js
index 4ee9487..5162dec 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js
@@ -501,9 +501,10 @@ define(function(require){
             if(!_.isUndefined(this.urlQueryParams)) {
                 var urlQueryParams = XAUtil.changeUrlToSearchQuery(this.urlQueryParams);
                 _.map(urlQueryParams, function(val , key) {
-                    query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    if (_.some(serverAttrName, function(m){return m.urlLabel == key})) {
+                        query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    }
                 });
-                // query += XAUtil.changeUrlToVSSearchQuery(this.urlQueryParams);
             }
 			var pluginAttr = {
                                 placeholder :localization.tt('h.searchForPolicy'),
diff --git a/security-admin/src/main/webapp/scripts/views/reports/AuditAccessLogDetailView.js b/security-admin/src/main/webapp/scripts/views/reports/AuditAccessLogDetailView.js
new file mode 100644
index 0000000..f70103e
--- /dev/null
+++ b/security-admin/src/main/webapp/scripts/views/reports/AuditAccessLogDetailView.js
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+
+define(function(require) {
+        'use strict';
+
+        var Backbone = require('backbone');
+        var XAEnums = require('utils/XAEnums');
+        var XALinks = require('modules/XALinks');
+        var XAGlobals = require('utils/XAGlobals');
+        var localization = require('utils/XALangSupport');
+        var XAUtils = require('utils/XAUtils');
+
+        var AuditAccessLogDetailTmpl = require('hbs!tmpl/reports/AuditAccessLogDetail_tmpl');
+
+        var AuditAccessLogDetailView = Backbone.Marionette.Layout.extend({
+
+            _viewName: 'AuditAccessLogDetailView',
+
+            template: AuditAccessLogDetailTmpl,
+
+            templateHelpers: function() {
+                var that = this;
+                return {
+                    auditaccessDetail : this.auditaccessDetail,
+                    eventTime : Globalize.format(new Date(this.auditaccessDetail.eventTime),  "MM/dd/yyyy hh:mm:ss tt"),
+                    result : this.auditaccessDetail.accessResult == 1 ? 'Allowed' : 'Denied',
+                    hiveQuery : ((this.auditaccessDetail.serviceType === XAEnums.ServiceType.Service_HIVE.label || this.auditaccessDetail.serviceType === XAEnums.ServiceType.Service_HBASE.label) &&
+                                this.auditaccessDetail.aclEnforcer === "ranger-acl" && this.auditaccessDetail.requestData) ? true : false,
+
+                    tag : this.tags ? this.tags.join() : undefined,
+                }
+            },
+
+            ui: {
+                copyQuery : '[data-name="copyQuery"]',
+            },
+
+            /** ui events hash */
+            events : function() {
+                var events = {};
+                events['click ' + this.ui.copyQuery] = 'copyQuery';
+                return events
+            },
+            /**
+             * Initialize a new AuditAccessLogDetailsView Layout
+             * @constructs
+             */
+            initialize: function(options) {
+                console.log("Initialized a Ranger Audit Access Log Details");
+                _.extend(this, _.pick(options, 'auditaccessDetail'));
+                if (this.auditaccessDetail.tags) {
+                    var tag = JSON.parse(this.auditaccessDetail.tags);
+                    this.tags = _.map(tag, function(m) {
+                        return m.type
+                    });
+                }
+            },
+
+            copyQuery: function(e) {
+                XAUtils.copyToClipboard(e , this.auditaccessDetail.requestData);
+            },
+
+            /** on close */
+            onClose: function() {}
+    });
+
+    return AuditAccessLogDetailView;
+});
\ No newline at end of file
diff --git a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
index 7345f5a..e50fa7d 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
@@ -48,6 +48,7 @@ define(function(require) {
 	var vPlugableServiceDiffDetail	= require('views/reports/PlugableServiceDiffDetail');
     var vLoginSessionDetail         = require('views/reports/LoginSessionDetail');
     var RangerZoneList              = require('collections/RangerZoneList');
+    var AuditAccessLogDetail        = require('views/reports/AuditAccessLogDetailView');
 
 	var moment = require('moment');
 	require('bootstrap-datepicker');
@@ -137,21 +138,23 @@ define(function(require) {
             }
             //Add url params to vsHistory
             if(!_.isUndefined(this.tab.split('?')[1])) {
-		App.vsHistory[that.tab.split('?')[0]] = [];
+                App.vsHistory[that.tab.split('?')[0]] = [];
                 var searchFregment = XAUtils.changeUrlToSearchQuery(decodeURIComponent(this.tab.substring(this.tab.indexOf("?") + 1)));
                 _.map (searchFregment, function(val, key) {
-                    if (_.isArray(val)) {
-                        _.map(val, function (v) {
-                            App.vsHistory[that.tab.split('?')[0]].push(new Backbone.Model( {'category': key, 'value' : v}));
-                        })
-                    } else {
-                        App.vsHistory[that.tab.split('?')[0]].push(new Backbone.Model( {'category': key, 'value' : val}));
+                    if (key !== "sortBy" && key !== "sortType" && key !== "sortKey") {
+                        if (_.isArray(val)) {
+                            _.map(val, function (v) {
+                                App.vsHistory[that.tab.split('?')[0]].push(new Backbone.Model( {'category': key, 'value' : v}));
+                            })
+                        } else {
+                            App.vsHistory[that.tab.split('?')[0]].push(new Backbone.Model( {'category': key, 'value' : val}));
+                        }
                     }
                 } )
             }
             //if url params are not present then set a default value in Audit assecc vsHistory
             if(_.isEmpty(App.vsHistory.bigData)){
-                var startDateModel = new Backbone.Model({'category':'startDate', value:Globalize.format(new Date(),"MM/dd/yyyy")});
+                var startDateModel = new Backbone.Model({'category':'Start Date', value:Globalize.format(new Date(),"MM/dd/yyyy")});
                 App.vsHistory['bigData'].push(startDateModel);
             }
         },
@@ -184,6 +187,14 @@ define(function(require) {
 				this.ui.tab.find('li[class="active"]').removeClass();
 				this.ui.tab.find('[href="'+this.currentTab+'"]').parent().addClass('active');
 			} else {
+                var sortObj = {};
+                if(Backbone.history.fragment.indexOf("?") !== -1) {
+                    var sortFragment = Backbone.history.fragment.substring(Backbone.history.fragment.indexOf("?") + 1);
+                    sortObj = _.pick(XAUtils.changeUrlToSearchQuery(decodeURIComponent(sortFragment)), 'sortType','sortBy');
+                }
+                if(!_.isEmpty(sortObj)) {
+                    XAUtils.setSorting(this.accessAuditList, sortObj);
+                }
 				this.renderBigDataTable();
 				this.addSearchForBigDataTab();
 				this.modifyTableForSubcolumns();
@@ -235,12 +246,16 @@ define(function(require) {
         },
 
 		onTabChange : function(e){
-			var that = this, tab;
+                        var that = this, tab, sortObj = {};
 			tab = !_.isUndefined(e) ? $(e.currentTarget).attr('href') : this.currentTab;
 			this.$el.parents('body').find('.datepicker').remove();
             if (!_.isUndefined(e)) {
                     Backbone.history.navigate("!/reports/audit/"+ tab.slice(1), false)
             }
+            if(Backbone.history.fragment.indexOf("?") !== -1) {
+                var sortFragment = Backbone.history.fragment.substring(Backbone.history.fragment.indexOf("?") + 1);
+                sortObj = _.pick(XAUtils.changeUrlToSearchQuery(decodeURIComponent(sortFragment)), 'sortType','sortBy');
+                        }
             switch (tab) {
 				case "#bigData":
 					this.currentTab = '#bigData';
@@ -259,8 +274,11 @@ define(function(require) {
 				case "#admin":
 					this.currentTab = '#admin';
                     App.vsHistory.admin = XAUtils.removeEmptySearchValue(App.vsHistory.admin);
-					this.trxLogList = new VXTrxLogList();
-					this.renderAdminTable();
+                    this.trxLogList = new VXTrxLogList();
+                    if(!_.isEmpty(sortObj)) {
+                        XAUtils.setSorting(this.trxLogList, sortObj);
+                    }
+                    this.renderAdminTable();
 					if(_.isEmpty(App.vsHistory.admin) && _.isUndefined(App.sessionId)){
 			     	    this.trxLogList.fetch({
 							   cache : false
@@ -277,9 +295,14 @@ define(function(require) {
 					this.currentTab = '#loginSession';
                     App.vsHistory.loginSession = XAUtils.removeEmptySearchValue(App.vsHistory.loginSession);
 					this.authSessionList = new VXAuthSession();
-					this.renderLoginSessionTable();
+                    if(!_.isEmpty(sortObj)) {
+                        XAUtils.setSorting(this.authSessionList, sortObj);
+                    } else {
+                        _.extend(this.authSessionList.queryParams,{ 'sortBy'  :  'id' });
 					//Setting SortBy as id and sortType as desc = 1
-					this.authSessionList.setSorting('id',1); 
+                                        this.authSessionList.setSorting('id',1);
+                    }
+                                        this.renderLoginSessionTable();
                     if(_.isEmpty(App.vsHistory.loginSession)){
                         this.authSessionList.fetch({
                         	cache:false,
@@ -294,11 +317,16 @@ define(function(require) {
 					break;
 				case "#agent":
 					this.currentTab = '#agent';
-                                        App.vsHistory.agent = XAUtils.removeEmptySearchValue(App.vsHistory.agent);
+                    App.vsHistory.agent = XAUtils.removeEmptySearchValue(App.vsHistory.agent);
 					this.policyExportAuditList = new VXPolicyExportAuditList();	
 					var params = { priAcctId : 1 };
-					that.renderAgentTable();
+                    if(!_.isEmpty(sortObj)) {
+                        XAUtils.setSorting(this.policyExportAuditList, sortObj);
+                    } else {
+                        _.extend(this.policyExportAuditList.queryParams,{ 'sortBy'  :  'createDate' });
 					this.policyExportAuditList.setSorting('createDate',1);
+                    }
+                    that.renderAgentTable();
                     if(_.isEmpty(App.vsHistory.agent)){
                     this.policyExportAuditList.fetch({
 	                    cache : false,
@@ -317,6 +345,9 @@ define(function(require) {
                      App.vsHistory.pluginStatus = XAUtils.removeEmptySearchValue(App.vsHistory.pluginStatus);
 					 this.ui.visualSearch.show();
 					 this.pluginInfoList = new VXPolicyExportAuditList();
+                     if(!_.isEmpty(sortObj)){
+                        XAUtils.setSorting(this.pluginInfoList, sortObj);
+                     }
                      this.renderPluginInfoTable();
 					 this.modifyPluginStatusTableSubcolumns();
                      XAUtils.customPopover(this.$el.find('[data-id ="policyTimeDetails"]'),'Policy (Time details)',localization.tt('msg.policyTimeDetails'),'left');
@@ -339,12 +370,17 @@ define(function(require) {
                      this.currentTab = '#userSync';
                      this.ui.visualSearch.show();
                      this.userSyncAuditList = new VXUserList();
+                     if(!_.isEmpty(sortObj)) {
+                        XAUtils.setSorting(this.userSyncAuditList, sortObj);
+                     } else {
+                        _.extend(this.userSyncAuditList.queryParams,{ 'sortBy'  :  'eventTime' });
+                        this.userSyncAuditList.setSorting('eventTime',1);
+                     }
                      this.renderUserSyncTable();
                      this.modifyUserSyncTableSubcolumns();
                      //To use existing collection
                      this.userSyncAuditList.url = 'service/assets/ugsyncAudits';
                      this.userSyncAuditList.modelAttrName = 'vxUgsyncAuditInfoList';
-                     this.userSyncAuditList.setSorting('id',1);
                      this.addSearchForUserSyncTab();
                      this.listenTo(this.userSyncAuditList, "request", that.updateLastRefresh);
                      this.listenTo(this.userSyncAuditList, "sync reset", that.showPageDetail);
@@ -768,7 +804,7 @@ define(function(require) {
                                     {text : 'Start Date',label :'startDate', urlLabel : 'startDate'},
                                     {text : 'End Date',label :'endDate', urlLabel : 'endDate'}];
             if(_.isEmpty(App.vsHistory.userSync)){
-                query = '"startDate": "'+Globalize.format(new Date(),"MM/dd/yyyy")+'"';
+                query = '"Start Date": "'+Globalize.format(new Date(),"MM/dd/yyyy")+'"';
                 App.vsHistory.userSync.push(new Backbone.Model({'category':'startDate', value:Globalize.format(new Date(),"MM/dd/yyyy")}));
             }else{
                 _.map(App.vsHistory.userSync, function(a) {
@@ -902,7 +938,6 @@ define(function(require) {
 					});
 				}
 			});
-			this.ui.tableList.addClass("clickable");
 			this.rTableList.show(new XATableLayout({
 				columns: this.getAdminTableColumns(),
 				collection:this.trxLogList,
@@ -912,7 +947,9 @@ define(function(require) {
 					header : XABackgrid,
 					emptyText : 'No service found!!'
 				}
-			}));	
+                        }));
+            //Trigger backgrid sort event
+            XAUtils.backgridSort(this.trxLogList);
 		},
 		getExportImportTemplate : function(trxLogs){
 			var log = trxLogs.models[0],fields = '', values = '', infoJson = {};
@@ -1027,12 +1064,10 @@ define(function(require) {
 				createDate : {
 					label : localization.tt("lbl.date") + '  ( '+this.timezone+' )',
 					cell: "String",
-					click : false,
-					drag : false,
 					editable:false,
                     sortType: 'toggle',
-                    direction: 'descending',
-					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                    sortable : true,
+                    formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 						fromRaw: function (rawValue, model) {
 							return Globalize.format(new Date(model.get('createDate')),  "MM/dd/yyyy hh:mm:ss tt");
 						}
@@ -1085,6 +1120,9 @@ define(function(require) {
                     })
                 }
 			};
+            if (this.trxLogList.queryParams.sortBy && !_.isEmpty(this.trxLogList.queryParams.sortBy)) {
+                XAUtils.backgridSortType(this.trxLogList, cols);
+            }
 			return this.trxLogList.constructor.getTableCols(cols, this.trxLogList);
 		},
 
@@ -1102,51 +1140,66 @@ define(function(require) {
 				},
 				onClick: function (e) {
                     var self = this ;
-                    if($(e.target).hasClass('tagsColumn') || $(e.target).closest('td').hasClass("tagsColumn")){
-                            return;
-                    }
-                    if(this.model.get('repoType')){
-                        var repoType =  this.model.get('repoType');
-                    }
-					var policyId = this.model.get('policyId');
-					if(policyId == -1){
-						return;
-					}
-                    var eventTime = this.model.get('eventTime');
+                    if($(e.target).hasClass('policyIdColumn') || $(e.target).closest('td').hasClass("policyIdColumn")) {
+                        if(this.model.get('repoType')){
+                                    var repoType =  this.model.get('repoType');
+                                }
+                                                var policyId = this.model.get('policyId');
+                                                if(policyId == -1){
+                                                        return;
+                                                }
+                                var eventTime = this.model.get('eventTime');
 
-                    var policyVersion = this.model.get('policyVersion');
+                                var policyVersion = this.model.get('policyVersion');
 
-                    var application = this.model.get('agentId');
+                                var application = this.model.get('agentId');
 
-					var policy = new RangerPolicy({
-						id: policyId,
-						version:policyVersion
-					});
-					var policyVersionList = policy.fetchVersions();
-					var view = new RangerPolicyRO({
-						policy: policy,
-						policyVersionList : policyVersionList,
-                        serviceDefList: that.serviceDefList,
-                        eventTime : eventTime,
-                        repoType : repoType
-					});
-					var modal = new Backbone.BootstrapModal({
-						animate : true, 
-						content		: view,
-						title: localization.tt("h.policyDetails"),
-						okText :localization.tt("lbl.ok"),
-                        allowCancel : true,
-						escape : true
-					}).open();
-                    modal.$el.find('.cancel').hide();
-					var policyVerEl = modal.$el.find('.modal-footer').prepend('<div class="policyVer pull-left"></div>').find('.policyVer');
-					policyVerEl.append('<i id="preVer" class="icon-chevron-left '+ ((policy.get('version')>1) ? 'active' : '') +'"></i><text>Version '+ policy.get('version') +'</text>').find('#preVer').click(function(e){
-						view.previousVer(e);
-					});
-                                        var policyVerIndexAt = policyVersionList.indexOf(policy.get('version'));
-					policyVerEl.append('<i id="nextVer" class="icon-chevron-right '+ (!_.isUndefined(policyVersionList[++policyVerIndexAt])? 'active' : '')+'"></i>').find('#nextVer').click(function(e){
-						view.nextVer(e);
-					});
+                                                var policy = new RangerPolicy({
+                                                        id: policyId,
+                                                        version:policyVersion
+                                                });
+                                                var policyVersionList = policy.fetchVersions();
+                                                var view = new RangerPolicyRO({
+                                                        policy: policy,
+                                                        policyVersionList : policyVersionList,
+                                    serviceDefList: that.serviceDefList,
+                                    eventTime : eventTime,
+                                    repoType : repoType
+                                                });
+                                                var modal = new Backbone.BootstrapModal({
+                                                        animate : true,
+                                                        content		: view,
+                                                        title: localization.tt("h.policyDetails"),
+                                                        okText :localization.tt("lbl.ok"),
+                                    allowCancel : true,
+                                                        escape : true
+                                                }).open();
+                                modal.$el.find('.cancel').hide();
+                                                var policyVerEl = modal.$el.find('.modal-footer').prepend('<div class="policyVer pull-left"></div>').find('.policyVer');
+                                                policyVerEl.append('<i id="preVer" class="icon-chevron-left '+ ((policy.get('version')>1) ? 'active' : '') +'"></i><text>Version '+ policy.get('version') +'</text>').find('#preVer').click(function(e){
+                                                        view.previousVer(e);
+                                                });
+                                                    var policyVerIndexAt = policyVersionList.indexOf(policy.get('version'));
+                                                policyVerEl.append('<i id="nextVer" class="icon-chevron-right '+ (!_.isUndefined(policyVersionList[++policyVerIndexAt])? 'active' : '')+'"></i>').find('#nextVer').click(function(e){
+                                                        view.nextVer(e);
+                                                });
+                    } else {
+                        if($(e.target).hasClass('tagsColumn') || $(e.target).closest('td').hasClass("tagsColumn")) {
+                                return;
+                        }
+                        var view = new AuditAccessLogDetail({
+                            auditaccessDetail : this.model.attributes,
+                        });
+                        var modal = new Backbone.BootstrapModal({
+                            animate : true,
+                            content     : view,
+                            title: localization.tt("lbl.auditAccessDetail"),
+                            okText :localization.tt("lbl.ok"),
+                            allowCancel : true,
+                            escape : true,
+                        }).open();
+                        modal.$el.find('.cancel').hide();
+                    }
 				}
 			});
 
@@ -1161,14 +1214,17 @@ define(function(require) {
 					emptyText : 'No Access Audit found!'
 				}
 			}));
-		
+            XAUtils.backgridSort(this.accessAuditList);
 		},
 
 		getColumns : function(){
 			var that = this;
 			var cols = {
 					policyId : {
-						cell : "html",
+                                                // cell : "html",
+                                                cell: Backgrid.HtmlCell.extend({
+                                                        className : 'policyIdColumn'
+                                                }),
 						formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 							fromRaw: function (rawValue, model) {
 								if(rawValue == -1){
@@ -1187,15 +1243,19 @@ define(function(require) {
 						sortable : false
 					},
                     policyVersion: {
-                          label : localization.tt("lbl.policyVersion"),
-                          cell: "html",
-                          click: false,
-                          formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-                                      fromRaw: function (rawValue, model) {
-                                              rawValue = _.escape(rawValue);
-                                              return '<span title="'+rawValue+'">'+rawValue+'</span>';
-                                      }
-                              }),
+                        label : localization.tt("lbl.policyVersion"),
+                        cell: "html",
+                        click: false,
+                        formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                            fromRaw: function (rawValue, model) {
+                                rawValue = _.escape(rawValue);
+                                    if(_.isUndefined(rawValue) || _.isEmpty(rawValue)) {
+                                        return '--'
+                                    } else {
+                                        return '<span title="'+rawValue+'">'+rawValue+'</span>';
+                                    }
+                                }
+                            }),
                           drag: false,
                           sortable: false,
                           editable: false,
@@ -1207,8 +1267,7 @@ define(function(require) {
 						drag : false,
 						editable:false,
                         sortType: 'toggle',
-                        direction: 'descending',
-						formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                        formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 							fromRaw: function (rawValue, model) {
 								return Globalize.format(new Date(rawValue),  "MM/dd/yyyy hh:mm:ss tt");
 							}
@@ -1219,14 +1278,16 @@ define(function(require) {
 					cell: "String",
 					click : false,
 					drag : false,
-					editable:false
+                                        editable:false,
+                    sortable : false,
 				},
 					requestUser : {
 						label : 'User',
 						cell: "String",
 						click : false,
 						drag : false,
-						editable:false
+                                                editable:false,
+                        sortable : false,
 					},
 					repoName : {
 						label : 'Name / Type',
@@ -1269,6 +1330,7 @@ define(function(require) {
 						click : false,
 						drag : false,
 						editable:false,
+                        sortable : false,
 						formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 							fromRaw: function (rawValue) {
 								var label = '', html = '';
@@ -1318,19 +1380,23 @@ define(function(require) {
 						sortable:false,
 						editable:false
 					},
-                                        clusterName : {
-                                                label : localization.tt("lbl.clusterName"),
-                                                cell: 'html',
-						click : false,
-						drag : false,
-						sortable:false,
-                                                editable:false,
-                                                formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
-                                                        fromRaw: function (rawValue, model) {
-                                                                rawValue = _.escape(rawValue);
-                                                                return '<span title="'+rawValue+'">'+rawValue+'</span>';
-                                                        }
-                                                }),
+                    clusterName : {
+                        label : localization.tt("lbl.clusterName"),
+                        cell: 'html',
+                        click : false,
+                        drag : false,
+                        sortable:false,
+                        editable:false,
+                        formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                                fromRaw: function (rawValue, model) {
+                                    rawValue = _.escape(rawValue);
+                                    if (_.isUndefined(rawValue) || _.isEmpty(rawValue)) {
+                                        '--'
+                                    } else {
+                                        return '<span title="'+rawValue+'">'+rawValue+'</span>';
+                                    }
+                                }
+                        }),
 					},
                     zoneName: {
 						label : localization.tt("lbl.zoneName"),
@@ -1373,7 +1439,10 @@ define(function(require) {
 							}
 						}),
 					},
-                                };
+            };
+            if (this.accessAuditList.queryParams.sortBy && !_.isEmpty(this.accessAuditList.queryParams.sortBy)) {
+                XAUtils.backgridSortType(this.accessAuditList, cols);
+            }
 			return this.accessAuditList.constructor.getTableCols(cols, this.accessAuditList);
 		},
 		renderLoginSessionTable : function(){
@@ -1388,7 +1457,8 @@ define(function(require) {
 					header : XABackgrid,
 					emptyText : 'No login session found!!'
 				}
-			}));	
+                        }));
+            XAUtils.backgridSort(this.authSessionList);
 		},
 		getLoginSessionColumns : function(){
 			var authStatusList = [],authTypeList = [];
@@ -1407,7 +1477,7 @@ define(function(require) {
                     cell : "html",
                     editable:false,
                     sortType: 'toggle',
-                    direction: 'descending',
+                    sortable : true,
                     formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                         fromRaw: function (rawValue, model) {
                             var sessionId = model.get('id');
@@ -1490,6 +1560,7 @@ define(function(require) {
 					label : localization.tt("lbl.loginTime")+ '   ( '+this.timezone+' )',
 					cell: "String",
 					editable:false,
+                    sortable : false,
 					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 						fromRaw: function (rawValue, model) {
 							return Globalize.format(new Date(model.get('authTime')),  "MM/dd/yyyy hh:mm:ss tt");
@@ -1497,6 +1568,9 @@ define(function(require) {
 					})
 				}
 			};
+            if (this.authSessionList.queryParams.sortBy && !_.isEmpty(this.authSessionList.queryParams.sortBy)) {
+                XAUtils.backgridSortType(this.authSessionList, cols);
+            }
 			return this.authSessionList.constructor.getTableCols(cols, this.authSessionList);
 		},
 		renderAgentTable : function(){
@@ -1510,7 +1584,8 @@ define(function(require) {
 					header : XABackgrid,
 					emptyText : 'No plugin found!'
 				}
-			}));	
+                        }));
+            XAUtils.backgridSort(this.policyExportAuditList);
 		},
 		getAgentColumns : function(){
 			var cols = {
@@ -1524,7 +1599,7 @@ define(function(require) {
 						label : localization.tt('lbl.createDate')+ '   ( '+this.timezone+' )',
 						editable:false,
 						sortType: 'toggle',
-						direction: 'descending'
+                        sortable : true,
 					},
 					repositoryName : {
 						cell : 'html',
@@ -1593,6 +1668,9 @@ define(function(require) {
 
 					
 			};
+            if (this.policyExportAuditList.queryParams.sortBy && !_.isEmpty(this.policyExportAuditList.queryParams.sortBy)) {
+                XAUtils.backgridSortType(this.policyExportAuditList, cols);
+            }
 			return this.policyExportAuditList.constructor.getTableCols(cols, this.policyExportAuditList);
 		},
 		renderPluginInfoTable : function(){
@@ -1608,7 +1686,7 @@ define(function(require) {
                                                 emptyText : 'No plugin status found!'
                                 }
                         }));
-            XAUtils.backgirdSort(this.pluginInfoList);
+            XAUtils.backgridSort(this.pluginInfoList);
                 },
                 getPluginInfoColums : function(){
                         var that = this, cols ={
@@ -1716,6 +1794,20 @@ define(function(require) {
 								|| _.isNull(model.get('info').policyDownloadTime)){
 								return '<center>--</center>';
 							}
+                                                        var downloadDate = new Date(parseInt(model.get('info')['policyDownloadTime']));
+                                                        if(!_.isUndefined(model.get('info')['lastPolicyUpdateTime'])){
+                                                                var lastUpdateDate = new Date(parseInt(model.get('info')['lastPolicyUpdateTime']));
+                                                                if(that.isDateDifferenceMoreThanHr(downloadDate, lastUpdateDate)){
+                                                                        if(moment(downloadDate).diff(moment(lastUpdateDate),'minutes') >= -2) {
+                                                                                return '<span class="text-warning"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.downloadTimeDelayMsg")+'"></i>'
+                                                                                + that.setTimeStamp(downloadDate , moment) +'</span>';
+                                                                        } else {
+                                                                                return '<span class="text-error"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.downloadTimeDelayMsg")+'"></i>'
+                                                                                + that.setTimeStamp(downloadDate , moment)+'</span>';
+                                                                        }
+
+                                                                }
+                                                        }
                                                         return that.setTimeStamp(new Date(parseInt(model.get('info')['policyDownloadTime'])) , moment);
 						}
 					})
@@ -1739,8 +1831,14 @@ define(function(require) {
 							if(!_.isUndefined(model.get('info')['lastPolicyUpdateTime'])){
 								var lastUpdateDate = new Date(parseInt(model.get('info')['lastPolicyUpdateTime']));
 								if(that.isDateDifferenceMoreThanHr(activeDate, lastUpdateDate)){
-									return '<i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.activationTimeDelayMsg")+'"></i>'
-                                                                                + that.setTimeStamp(activeDate , moment);
+                                                                        if(moment(activeDate).diff(moment(lastUpdateDate),'minutes') >= -2) {
+                                                                                return '<span class="text-warning"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.activationTimeDelayMsg")+'"></i>'
+                                                                                + that.setTimeStamp(activeDate , moment) +'</span>';
+                                                                        } else {
+                                                                                return '<span class="text-error"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.activationTimeDelayMsg")+'"></i>'
+                                                                                + that.setTimeStamp(activeDate , moment)+'</span>';
+                                                                        }
+
 								}
 							}
                                                         return that.setTimeStamp(activeDate , moment);
@@ -1783,6 +1881,20 @@ define(function(require) {
 								|| _.isNull(model.get('info').tagDownloadTime)){
 								return '<center>--</center>';
 							}
+                                                        var downloadTagDate = new Date(parseInt(model.get('info')['tagDownloadTime']));
+                                                        if(!_.isUndefined(model.get('info')['lastTagUpdateTime'])){
+                                                                var lastUpdateDate = new Date(parseInt(model.get('info')['lastTagUpdateTime']));
+                                                                if(that.isDateDifferenceMoreThanHr(downloadTagDate, lastUpdateDate)){
+                                                                        if(moment(downloadTagDate).diff(moment(lastUpdateDate),'minutes') >= -2) {
+                                                                                return '<span class="text-warning"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.downloadTimeDelayMsg")+'"></i>'
+                                                                                + that.setTimeStamp(downloadTagDate , moment) +'</span>';
+                                                                        } else {
+                                                                                return '<span class="text-error"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.downloadTimeDelayMsg")+'"></i>'
+                                                                                + that.setTimeStamp(downloadTagDate , moment)+'</span>';
+                                                                        }
+
+                                                                }
+                                                        }
                                                         return that.setTimeStamp(new Date(parseInt(model.get('info')['tagDownloadTime'])) , moment);
 
 						}
@@ -1806,16 +1918,24 @@ define(function(require) {
 								if(!_.isUndefined(model.get('info')['lastTagUpdateTime'])){
 									var lastUpdateDate = new Date(parseInt(model.get('info')['lastTagUpdateTime']));
 									if(that.isDateDifferenceMoreThanHr(activeDate, lastUpdateDate)){
-										return '<i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.activationTimeDelayMsg")+'"></i>'
-                                                                                        + that.setTimeStamp(activeDate , moment);
+                                                                                if(moment(activeDate).diff(moment(lastUpdateDate),'minutes') >= -2) {
+                                                                                        return '<span class="text-warning"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.activationTimeDelayMsg")+'"></i>'
+                                                                                        + that.setTimeStamp(activeDate , moment) +'</span>';
+                                                                                } else {
+                                                                                        return '<span class="text-error"><i class="icon-exclamation-sign activePolicyAlert" title="'+localization.tt("msg.activationTimeDelayMsg")+'"></i>'
+                                                                                        + that.setTimeStamp(activeDate , moment)+'</span>';
+                                                                                }
 									}
 								}
-                                                        return that.setTimeStamp(activeDate , moment);
+                                                                return that.setTimeStamp(activeDate , moment);
 
 						}
 					})
 				},
 			}
+            if (this.pluginInfoList.queryParams.sortBy && !_.isEmpty(this.pluginInfoList.queryParams.sortBy)) {
+                XAUtils.backgridSortType(this.pluginInfoList, cols);
+            }
 			return this.pluginInfoList.constructor.getTableCols(cols, this.pluginInfoList);
 		},
         renderUserSyncTable : function(){
@@ -1831,6 +1951,7 @@ define(function(require) {
                     emptyText : 'No user sync audit found!'
                 }
             }));
+            XAUtils.backgridSort(this.userSyncAuditList);
         },
         getUserSyncColums : function(){
             var cols ={
@@ -1882,8 +2003,8 @@ define(function(require) {
                     click : false,
                     drag : false,
                     editable:false,
+                    sortable : true,
                     sortType: 'toggle',
-                    direction: 'descending',
                     formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                         fromRaw: function (rawValue, model) {
                             return Globalize.format(new Date(rawValue),  "MM/dd/yyyy hh:mm:ss tt");
@@ -1902,6 +2023,9 @@ define(function(require) {
                     }),
                 }
             }
+            if (this.userSyncAuditList.queryParams.sortBy && !_.isEmpty(this.userSyncAuditList.queryParams.sortBy)) {
+                XAUtils.backgridSortType(this.userSyncAuditList, cols);
+            }
             return this.userSyncAuditList.constructor.getTableCols(cols, this.userSyncAuditList);
 
         },
@@ -1934,14 +2058,14 @@ define(function(require) {
         },
 
         isDateDifferenceMoreThanHr : function(date1, date2){
-                var diff = date1 - date2 / 36e5;
-                return parseInt(diff) < 0 ? true : false;
+                var diff = (date1 - date2) / 36e5;
+                return diff < 0 ? true : false;
         },
 
         //Time stamp
         setTimeStamp : function(time, moment) {
             return '<span title="'+Globalize.format(time,  "MM/dd/yyyy hh:mm:ss tt")+'">'+Globalize.format(time,  "MM/dd/yyyy hh:mm:ss tt")
-            + '<div><small style="color : #8c8c8c">'+moment(time).fromNow()+'</small></div></span>'
+            + '<div class="text-muted"><small>'+moment(time).fromNow()+'</small></div></span>'
         },
 
 		onRefresh : function(){
diff --git a/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js b/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
index 5672552..ecda127 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/UserAccessLayout.js
@@ -84,6 +84,7 @@ define(function(require) {'use strict';
 			iconSearchInfo      : '[data-id="searchInfo"]',
 			policyLabels		: '[data-id="policyLabels"]',
 			zoneName			: '[data-id="zoneName"]',
+                        selectUserGroup		: '[data-id="btnUserGroup"]'
 		},
 
 		/** ui events hash */
@@ -108,7 +109,7 @@ define(function(require) {'use strict';
 		 */
 		initialize : function(options) {
 			console.log("initialized a UserAccessLayout Layout");
-			_.extend(this, _.pick(options, 'groupList','userList'));
+                        _.extend(this, _.pick(options, 'groupList','userList', 'urlQueryParams'));
 			this.bindEvents();
 			this.previousSearchUrl = '';
 			this.searchedFlag = false;
@@ -153,14 +154,41 @@ define(function(require) {'use strict';
 
 		onRender : function() {
 			this.initializePlugins();
-			this.setupGroupAutoComplete();
+                        if( this.urlQueryParams) {
+                                this.urlParam = XAUtil.changeUrlToSearchQuery(decodeURIComponent(this.urlQueryParams));
+                                if (this.urlParam['polResource']) {
+                                        this.ui.resourceName.val(this.urlParam['polResource']);
+                                }
+                                if(this.urlParam['policyNamePartial']) {
+                                        this.ui.policyName.val(this.urlParam['policyNamePartial']);
+                                }
+                                if(!_.isUndefined(this.urlParam['user']) && !_.isEmpty(this.urlParam['user'])) {
+                                        this.ui.userName.show();
+                                        this.setupUserAutoComplete();
+                                        this.ui.userGroup.select2('destroy');
+                                        this.ui.userGroup.val('').hide();
+                                        this.ui.selectUserGroup.find('span').first().text('Username')
+                                } else {
+                                        this.ui.userGroup.show();
+                                        this.setupGroupAutoComplete();
+                                        this.ui.userName.select2('destroy');
+                                        this.ui.userName.val('').hide();
+                                        this.ui.selectUserGroup.find('span').first().text('Group')
+                                }
+                        } else {
+                                this.setupGroupAutoComplete();
+                        }
 			this.renderComponentAndPolicyTypeSelect();
-			var policyType = this.ui.policyType.val();
-//			Show policies listing for each service and GET policies for each service
-			_.each(this.policyCollList, function(obj,i){
-				this.renderTable(obj.collName, obj.serviceDefName);
-				this.getResourceLists(obj.collName,obj.serviceDefName,policyType);
-			},this);
+                        if(this.urlQueryParams) {
+                                this.onSearch()
+                        } else {
+                                var policyType = this.ui.policyType.val();
+        //			Show policies listing for each service and GET policies for each service
+                                _.each(this.policyCollList, function(obj,i){
+                                        this.renderTable(obj.collName, obj.serviceDefName);
+                                        this.getResourceLists(obj.collName,obj.serviceDefName,policyType);
+                                },this);
+                        }
 			this.$el.find('[data-js="policyName"]').focus()
 			var urlString = XAUtil.getBaseUrl();
 			if(urlString.slice(-1) == "/") {
@@ -401,6 +429,7 @@ define(function(require) {'use strict';
 						}
 					}),
 					editable : false,
+                                        sortable : false,
 				},
 				resources: {
 					label: 'Resources',
@@ -464,6 +493,7 @@ define(function(require) {'use strict';
 					cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
 					label : localization.tt("lbl.zoneName"),
 					editable : false,
+                                        sortable : false,
 					formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 						fromRaw: function (rawValue, model) {
 							var labels ="";
@@ -575,11 +605,17 @@ define(function(require) {'use strict';
 			var zoneListOptions = _.map(this.rangerZoneList.models, function(m){
 				return { 'id':m.get('name'), 'text':m.get('name')}
 			});
+                        var tags = [];
+                        if (this.urlParam && this.urlParam['policyLabelsPartial'] && !_.isEmpty(this.urlParam['policyLabelsPartial'])) {
+                                tags.push( { 'id' : _.escape( this.urlParam['policyLabelsPartial'] ), 'text' : _.escape( this.urlParam['policyLabelsPartial'] ) } );
+                        }
 			this.ui.componentType.select2({
 				multiple: true,
 				closeOnSelect: true,
 				placeholder: 'Select Component',
 				//maximumSelectionSize : 1,
+                                value : (!_.isUndefined(that.urlParam) && !_.isUndefined(that.urlParam['serviceType']) && !_.isEmpty(that.urlParam['serviceType'])) ?
+                                                this.ui.componentType.val(that.urlParam['serviceType']) : this.ui.componentType.val(""),
 				width: '220px',
 				allowClear: true,
 				data: options
@@ -588,30 +624,62 @@ define(function(require) {'use strict';
 				closeOnSelect: false,
 				maximumSelectionSize : 1,
 				width: '220px',
-				value : this.ui.policyType.val("0"),
+                                value : (!_.isUndefined(that.urlParam) && !_.isUndefined(that.urlParam['policyType']) && !_.isEmpty(that.urlParam['policyType'])) ?
+                                                this.ui.policyType.val(that.urlParam['policyType']) : this.ui.policyType.val("0"),
 				allowClear: false,
 				data: policyTypes
 			});
 			this.ui.policyLabels.select2({
-				multiple: false,
-				closeOnSelect: true,
-				placeholder: 'Select Policy Label',
-				allowClear: true,
-				width: '220px',
-				ajax :{
-					url: "service/plugins/policyLabels",
-					async : false,
-					dataType : 'JSON',
-					data: function (term, page) {
-						return {policyLabel : term};
-					},
-					results: function (data, page) {
-						var results = [];
-						results = data.map(function(m, i){return {id : _.escape(m), text: _.escape(m) };});
-						return {results : results};
-					}
-				}
+                                multiple: true,
+                closeOnSelect : true,
+                placeholder : 'Policy Label',
+                width :'220px',
+                allowClear: true,
+                tokenSeparators: ["," , " "],
+                tags : true,
+                maximumSelectionSize : 1,
+                initSelection : function (element, callback) {
+                    callback(tags);
+                },
+                createSearchChoice: function(term, data) {
+                    term = _.escape(term);
+                    if ($(data).filter(function() {
+                        return this.text.localeCompare(term) === 0;
+                    }).length === 0) {
+                        if($.inArray(term, this.val()) >= 0){
+                            return null;
+                        }else{
+                            return {
+                                id : term,
+                                text: term
+                            };
+                        }
+                    }
+                },
+                ajax: {
+                    url: 'service/plugins/policyLabels',
+                    dataType: 'json',
+                    data: function (term, page) {
+                        return {policyLabel : term};
+                    },
+                    results: function (data, page) {
+                        var results = [] , selectedVals = [];
+                        if(data.resultSize != "0"){
+                            results = data.map(function(m){	return {id : _.escape(m), text: _.escape(m) };	});
+                        }
+                        return {results : results};
+                    },
+                },
+                formatResult : function(result){
+                    return result.text;
+                },
+                formatSelection : function(result){
+                    return result.text;
+                },
 			});
+                        if(this.urlParam && this.urlParam['policyLabelsPartial']) {
+                                this.ui.policyLabels.val(this.urlParam['policyLabelsPartial']).trigger('change');
+                        }
 			this.ui.zoneName.select2({
 				closeOnSelect: false,
 				maximumSelectionSize : 1,
@@ -619,6 +687,8 @@ define(function(require) {'use strict';
 				allowClear: true,
 				data: zoneListOptions,
 				placeholder: 'Select Zone Name',
+                                value : (!_.isUndefined(that.urlParam) && !_.isUndefined(that.urlParam['zoneName']) && !_.isEmpty(that.urlParam['zoneName'])) ?
+                                                this.ui.zoneName.val(that.urlParam['zoneName']) : this.ui.zoneName.val(""),
 			});
 		},
 		onDownload: function(e){
@@ -671,10 +741,7 @@ define(function(require) {'use strict';
 		},	
 		/** on render callback */
 		setupGroupAutoComplete : function(){
-			this.groupArr = this.groupList.map(function(m){
-				return { id : m.get('name') , text : _.escape(m.get('name'))};
-			});
-			var that = this, arr = [];
+                        var that = this;
 			this.ui.userGroup.select2({
 				closeOnSelect : true,
 				placeholder : 'Select Group',
@@ -684,11 +751,8 @@ define(function(require) {'use strict';
 				allowClear: true,
 				// tags : this.groupArr,
 				initSelection : function (element, callback) {
-					var data = [];
-					$(element.val().split(",")).each(function () {
-						var obj = _.findWhere(that.groupArr,{id:this});	
-						data.push({id: obj.text, text: obj.text});
-					});
+                                        var data = {};
+                                        data = {id: element.val(), text: element.val()};
 					callback(data);
 				},
 				ajax: { 
@@ -720,29 +784,20 @@ define(function(require) {'use strict';
 					return 'No group found.';
 				}
 			})//.on('select2-focus', XAUtil.select2Focus);
-		},		
+                        if(this.urlParam && this.urlParam['group'] && !_.isEmpty(this.urlParam['group'])) {
+                                this.ui.userGroup.val(this.urlParam['group']).trigger('change');
+                        }
+                },
 		setupUserAutoComplete : function(){
 			var that = this;
-			var arr = [];
-			this.userArr = this.userList.map(function(m){
-				return { id : m.get('name') , text : _.escape(m.get('name')) };
-			});
 			this.ui.userName.select2({
-//				multiple: true,
-//				minimumInputLength: 1,
 				closeOnSelect : true,
 				placeholder : 'Select User',
-//				maximumSelectionSize : 1,
 				width :'220px',
-				tokenSeparators: [",", " "],
 				allowClear: true,
-				// tags : this.userArr, 
 				initSelection : function (element, callback) {
-					var data = [];
-					$(element.val().split(",")).each(function () {
-						var obj = _.findWhere(that.userArr,{id:this});	
-						data.push({id: obj.text, text: obj.text});
-					});
+                                        var data = {};
+                                        data = {id: element.val(), text: element.val()};
 					callback(data);
 				},
 				ajax: { 
@@ -775,6 +830,9 @@ define(function(require) {'use strict';
 				}
 				
 			})//.on('select2-focus', XAUtil.select2Focus);
+                        if(this.urlParam && this.urlParam['user'] && !_.isEmpty(this.urlParam['user'])) {
+                                this.ui.userName.val(this.urlParam['user']).trigger('change');
+                        }
 		},
 		/** all post render plugin initialization */
 		initializePlugins : function() {
@@ -811,16 +869,23 @@ define(function(require) {'use strict';
 			
 		},
 		onSearch : function(e){
-			var that = this, url = '', urlString = XAUtil.getBaseUrl();
+                        var that = this, url = '', urlString = XAUtil.getBaseUrl(), urlParam = {};
 			//Get search values
-			var groups = (this.ui.userGroup.is(':visible')) ? this.ui.userGroup.select2('val'):undefined;
-			var users = (this.ui.userName.is(':visible')) ? this.ui.userName.select2('val'):undefined;
+                        var groups = (this.ui.selectUserGroup.text().trim() == "Group" ) ? this.ui.userGroup.select2('val'):undefined;
+                        var users = (this.ui.selectUserGroup.text().trim() == "Username") ? this.ui.userName.select2('val'):undefined;
 			var rxName = this.ui.resourceName.val(), policyName = this.ui.policyName.val() , policyType = this.ui.policyType.val(),
 			policyLabel = this.ui.policyLabels.val(), zoneName = this.ui.zoneName.val()
 			var params = {group : groups, user : users, polResource : rxName, policyNamePartial : policyName, policyType: policyType, policyLabelsPartial:policyLabel,
 				zoneName : zoneName};
 			var component = (this.ui.componentType.val() != "") ? this.ui.componentType.select2('val'):undefined;
-            that.initializeRequiredData();
+                        urlParam = _.extend(params, {'serviceType': this.ui.componentType.val()});
+                        _.each(urlParam, function(value, key, obj){
+                                if (value === "" || value  === undefined) {
+                                        delete obj[key];
+                                }
+                        })
+                        XAUtil.changeParamToUrlFragment(urlParam);
+                        that.initializeRequiredData();
             _.each(this.policyCollList, function(obj,i){
                     this.renderTable(obj.collName, obj.serviceDefName);
             },this);
diff --git a/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js b/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
index d1f421f..2b82181 100755
--- a/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/users/UserTableLayout.js
@@ -386,6 +386,7 @@ define(function(require){
 					},
 					editable:false,
 					sortable:false,
+                                        sortType: 'toggle',
 					cell :'uri'						
 				},
 				emailAddress : {
@@ -567,6 +568,7 @@ define(function(require){
                     cell  : Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
                     drag  : false,
                     editable  : false,
+                    sortable : false,
                     formatter : _.extend({}, Backgrid.CellFormatter.prototype, {
                         fromRaw : function (rawValue,model) {
                             return ('<div align="center"><button class="userViewicon" title = "View Users" data-js="showUserList" data-name="' + model.get('name')
@@ -998,9 +1000,10 @@ define(function(require){
             if(!_.isUndefined(this.urlQueryParams) && !_.isEmpty(this.urlQueryParams)) {
                 var urlQueryParams = XAUtil.changeUrlToSearchQuery(this.urlQueryParams);
                 _.map(urlQueryParams, function(val , key) {
-                    query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    if (_.some(serverAttrName, function(m){return m.urlLabel == key})) {
+                        query += '"'+XAUtil.filterKeyForVSQuery(serverAttrName, key)+'":"'+val+'"';
+                    }
                 });
-                // query += XAUtil.changeUrlToVSSearchQuery(this.urlQueryParams);
             }
 			var pluginAttr = {
 				      placeholder :placeholder,
diff --git a/security-admin/src/main/webapp/styles/xa.css b/security-admin/src/main/webapp/styles/xa.css
index f75facb..c8eb397 100644
--- a/security-admin/src/main/webapp/styles/xa.css
+++ b/security-admin/src/main/webapp/styles/xa.css
@@ -2807,6 +2807,13 @@ div#zoneServiceAccordion table thead {
   border-right: 1px solid #ddd;
 }
 
+.text-muted {
+  opacity: 0.7;
+}
+
+.center {
+  text-align: center;
+}
 /*Overriden styles - Use later for bootstrap 3*/
 
 a{
diff --git a/security-admin/src/main/webapp/templates/reports/AuditAccessLogDetail_tmpl.html b/security-admin/src/main/webapp/templates/reports/AuditAccessLogDetail_tmpl.html
new file mode 100644
index 0000000..457dae3
--- /dev/null
+++ b/security-admin/src/main/webapp/templates/reports/AuditAccessLogDetail_tmpl.html
@@ -0,0 +1,214 @@
+{{!--
+  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 id="serviceDetails" class="row-fluid">
+    <p class="formHeader">
+        {{tt 'lbl.auditAccessDetail'}} :
+    </p>
+    <table class="table table-bordered table-condensed">
+        <tbody>
+           <tr>
+                <td>
+                    {{tt 'lbl.policyId'}}
+                </td>
+                {{#compare auditaccessDetail.policyId "eq" '-1'}}
+                    <td> -- </td>
+                {{else}}
+                    <td>
+                        {{auditaccessDetail.policyId}}
+                    </td>
+                {{/compare}}
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.policyVersion'}}
+                </td>
+                <td>
+                    {{#if auditaccessDetail.policyVersion}}
+                        {{auditaccessDetail.policyVersion}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.eventTime'}}
+                </td>
+                <td>
+                    {{eventTime}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.application'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.agentId}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.user'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.requestUser}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.serviceName'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.repoName}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.serviceType'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.serviceType}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.resourcePath'}}
+                </td>
+                <td>
+                    {{#if auditaccessDetail.resourcePath}}
+                        {{auditaccessDetail.resourcePath}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.resourceType'}}
+                </td>
+                <td>
+                    {{#if auditaccessDetail.resourceType}}
+                        {{auditaccessDetail.resourceType}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+            {{#if hiveQuery}}
+                <tr>
+                    <td>
+                        {{tt 'lbl.hiveQuery'}}
+                    </td>
+                    <td>
+                        <span class="pull-right link-tag query-icon copyQuery btn btn-mini" data-name="copyQuery" title="Copy Query">
+                            <i class="icon-copy"></i>
+                        </span>
+                        <span>{{auditaccessDetail.requestData}}</span>
+                    </td>
+                </tr>
+            {{/if}}
+            <tr>
+                <td>
+                    {{tt 'lbl.accessType'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.accessType}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.result'}}
+                </td>
+                <td>
+                    {{result}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.aclEnforcer'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.aclEnforcer}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.agentHost'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.agentHost}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.clientIP'}}
+                </td>
+                <td>
+                    {{#if auditaccessDetail.clientIP}}
+                        {{auditaccessDetail.clientIP}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.clusterName'}}
+                </td>
+                <td>
+                    {{#if auditaccessDetail.clusterName}}
+                        {{auditaccessDetail.clusterName}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.zoneName'}}
+                </td>
+                <td>
+                    {{#if auditaccessDetail.zoneName}}
+                        {{auditaccessDetail.zoneName}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.eventCount'}}
+                </td>
+                <td>
+                    {{auditaccessDetail.eventCount}}
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    {{tt 'lbl.tags'}}
+                </td>
+                <td>
+                    {{#if tag}}
+                        {{tag}}
+                    {{else}}
+                        --
+                    {{/if}}
+                </td>
+            </tr>
+        </tbody>
+    </table>
+</div>
\ No newline at end of file
diff --git a/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html b/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
index befb230..887d1bf 100644
--- a/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
+++ b/security-admin/src/main/webapp/templates/reports/UserAccessLayout_tmpl.html
@@ -76,7 +76,7 @@
 							<div class="controls" data-js="searchBy">
 								<div class="">
 									<div class="btn-group">
-										<button class="btn dropdown-toggle" data-toggle="dropdown">
+                                                                                <button class="btn dropdown-toggle" data-id="btnUserGroup" data-toggle="dropdown">
 											<span>Group</span>
 											<span class="caret"> </span>
 										</button>