Repository: ranger Updated Branches: refs/heads/master b7c425945 -> 55329a3e1
RANGER-1576 : Show attribute values to tags column in audit log Signed-off-by: Velmurugan Periasamy <v...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/ranger/repo Commit: http://git-wip-us.apache.org/repos/asf/ranger/commit/55329a3e Tree: http://git-wip-us.apache.org/repos/asf/ranger/tree/55329a3e Diff: http://git-wip-us.apache.org/repos/asf/ranger/diff/55329a3e Branch: refs/heads/master Commit: 55329a3e13580f014e282d319dc3168bb3e55507 Parents: b7c4259 Author: Gautam Borad <gau...@apache.org> Authored: Fri May 12 17:24:49 2017 +0530 Committer: Velmurugan Periasamy <v...@apache.org> Committed: Sat May 13 00:02:46 2017 -0400 ---------------------------------------------------------------------- .../src/main/webapp/scripts/utils/XAUtils.js | 51 ++++++- .../webapp/scripts/views/reports/AuditLayout.js | 141 ++++++++++++++----- security-admin/src/main/webapp/styles/xa.css | 35 ++++- 3 files changed, 182 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ranger/blob/55329a3e/security-admin/src/main/webapp/scripts/utils/XAUtils.js ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/scripts/utils/XAUtils.js b/security-admin/src/main/webapp/scripts/utils/XAUtils.js index 08aa95a..03e218d 100644 --- a/security-admin/src/main/webapp/scripts/utils/XAUtils.js +++ b/security-admin/src/main/webapp/scripts/utils/XAUtils.js @@ -1289,10 +1289,51 @@ define(function(require) { return !_.isUndefined(obj['resources']) && !_.isEmpty(obj['resources']) && !_.isNull(obj['resources']) ? false : true; }; - XAUtils.removeEmptySearchValue = function(arr) { - return _.reject(arr,function(m){ - return (m.get('value')==""); - }); + XAUtils.removeEmptySearchValue = function(arr) { + return _.reject(arr,function(m){ + return (m.get('value')==""); + }); + }; + XAUtils.showAuditLogTags = function(rawValue, model) { + var showMoreLess = false, id = model.id, tagLabels = ''; + var tagNames = _.pluck(rawValue, 'type'); + if (!_.isUndefined(rawValue)) { + var tagArr = _.map(rawValue, function(tag, i) { + if(tag.attributes && !_.isEmpty(tag.attributes)){ + tagLabels = '<a href="javascript:void(0)" data-name="tags" data-id="'+model.id+''+i+'" class="tagsColumn">'+tag.type+'</a>'; + }else{ + tagLabels = tag.type; + } + tagLabels += (i+1 < rawValue.length) ? ' , ' : ''; + if (i >= 4){ + return '<span class="float-left-margin-1" audit-log-id="' + + id + '" style="display:none;">' + tagLabels + + '</span>'; + } + else{ + if (i == 3 && rawValue.length > 4) { + showMoreLess = true; + return '<span class="float-left-margin-1" audit-log-id="' + + id + '">' + tagLabels + '</span>'; + } else{ + return '<span class="float-left-margin-1" audit-log-id="' + + id + '">' + tagLabels + '</span>'; + } + } + }); + if (showMoreLess) { + tagArr.push('<span class="float-left-margin-1"><a href="javascript:void(0);" data-id="showMore" class="" audit-log-id="' + + id + + '"><code style=""> + More..</code></a></span><span class="float-left-margin-1"><a href="javascript:void(0);" data-id="showLess" class="" audit-log-id="' + + id + + '" style="display:none;"><code> - Less..</code></a></span>'); + } + tagArr.unshift('<div data-id="tagDiv" class="popovertag">'); + tagArr.push('</div>'); + return tagArr.length ? tagArr.join(' ') : '--'; + } else{ + return '--'; + } }; return XAUtils; -}); +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ranger/blob/55329a3e/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js ---------------------------------------------------------------------- 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 b98e2cc..40f56dd 100644 --- a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js +++ b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js @@ -84,8 +84,10 @@ define(function(require) { tab : '.nav-tabs', refreshTable : '[data-id="refreshTable"]', quickFilter : '[data-id="quickFilter"]', - visualSearch : '.visual_search', - 'iconSearchInfo' : '[data-id="searchInfo"]', + visualSearch : '.visual_search', + 'iconSearchInfo' : '[data-id="searchInfo"]', + btnShowMore : '[data-id="showMore"]', + btnShowLess : '[data-id="showLess"]', }, @@ -95,6 +97,8 @@ define(function(require) { events['click ' + this.ui.refresh] = 'onRefresh'; events['click ' + this.ui.searchBtn] = 'onSearch'; events['click '+this.ui.tab+' a'] = 'onTabChange'; + events['click ' + this.ui.btnShowMore] = 'onShowMore'; + events['click ' + this.ui.btnShowLess] = 'onShowLess'; return events; }, @@ -111,15 +115,15 @@ define(function(require) { var date = new Date().toString(); this.timezone = date.replace(/^.*GMT.*\(/, "").replace(/\)$/, ""); this.initializeServiceDefColl(); - if(_.isUndefined(App.vsHistory)){ - var startDateModel = new Backbone.Model({'category':'Start Date', value:Globalize.format(new Date(),"MM/dd/yyyy")}); - App.vsHistory = {'bigData':[startDateModel], 'admin':[], 'loginSession':[], 'plugin':[],'pluginStatus':[]}; - } + if(_.isUndefined(App.vsHistory)){ + var startDateModel = new Backbone.Model({'category':'Start Date', value:Globalize.format(new Date(),"MM/dd/yyyy")}); + App.vsHistory = {'bigData':[startDateModel], 'admin':[], 'loginSession':[], 'plugin':[],'pluginStatus':[]}; + } }, /** all events binding here */ bindEvents : function() { - //this.listenTo(this.collection, "change:foo", this.render, this); + this.listenTo(this.accessAuditList, "sync",this.showTagsAttributes, this); }, initializeServiceDefColl : function() { @@ -142,6 +146,7 @@ define(function(require) { this.addSearchForBigDataTab(); this.modifyTableForSubcolumns(); } + this.showTagsAttributes(); }, modifyTableForSubcolumns : function(){ @@ -157,7 +162,7 @@ define(function(require) { <th class="renderable aip" > </th>\ <th class="renderable aip" > </th>\ <th class="renderable ruser"></th>\ - <th class="renderable cip"> </th>\ + <th class="renderable ruser"></th>\ </tr>'); }, modifyPluginStatusTableSubcolumns : function(){ @@ -178,15 +183,16 @@ define(function(require) { switch (tab) { case "#bigData": this.currentTab = '#bigData'; - //Remove empty search values on tab changes for visual search. - App.vsHistory.bigData = XAUtils.removeEmptySearchValue(App.vsHistory.bigData); + //Remove empty search values on tab changes for visual search. + App.vsHistory.bigData = XAUtils.removeEmptySearchValue(App.vsHistory.bigData); this.ui.visualSearch.show(); this.ui.visualSearch.parents('.well').show(); this.renderBigDataTable(); this.modifyTableForSubcolumns(); this.addSearchForBigDataTab(); - this.listenTo(this.accessAuditList, "request", that.updateLastRefresh) + this.listenTo(this.accessAuditList, "request", that.updateLastRefresh); this.ui.iconSearchInfo.show(); + this.showTagsAttributes(); break; case "#admin": this.currentTab = '#admin'; @@ -830,6 +836,9 @@ define(function(require) { }, onClick: function (e) { var self = this; + if($(e.target).hasClass('tagsColumn') || $(e.target).closest('td').hasClass("tagsColumn")){ + return; + } var policyId = this.model.get('policyId'); if(policyId == -1){ return; @@ -1005,36 +1014,47 @@ define(function(require) { sortable:false, editable:false }, - eventCount : { - label : 'Event Count', - cell: "string", + clusterName : { + label : localization.tt("lbl.clusterName"), + cell: 'html', click : false, drag : false, sortable:false, - editable:false + editable:false, + formatter: _.extend({}, Backgrid.CellFormatter.prototype, { + fromRaw: function (rawValue, model) { + rawValue = _.escape(rawValue); + return '<span title="'+rawValue+'">'+rawValue+'</span>'; + } + }), }, - tags : { - label : 'Tags', + eventCount : { + label : 'Event Count', cell: "string", click : false, drag : false, sortable:false, editable:false }, - clusterName : { - label : localization.tt("lbl.clusterName"), - cell: 'html', + tags : { + label : 'Tags', + cell: Backgrid.HtmlCell.extend({ + className : 'tagsColumn' + }), 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>'; + if(_.isUndefined(rawValue)){ + return '<center>--</center>'; + } + return XAUtils.showAuditLogTags(_.sortBy(JSON.parse(rawValue), 'type'), model); } }), }, + }; return this.accessAuditList.constructor.getTableCols(cols, this.accessAuditList); }, @@ -1212,6 +1232,20 @@ define(function(require) { editable:false, sortable: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>'; + } + }), + }, httpRetCode : { cell : 'html', label : localization.tt('lbl.httpResponseCode'), @@ -1231,20 +1265,7 @@ define(function(require) { editable:false, sortable: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>'; - } - }), - }, + }; return this.policyExportAuditList.constructor.getTableCols(cols, this.policyExportAuditList); @@ -1502,10 +1523,56 @@ define(function(require) { delete collection.queryParams[obj.label]; }); }, - updateLastRefresh : function(){ this.ui.lastUpdateTimeLabel.html(Globalize.format(new Date(), "MM/dd/yyyy hh:mm:ss tt")); }, + showTagsAttributes : function(reset){ + var that = this; + this.accessAuditList.each(function(model){ + if(!_.isUndefined(model.get('tags'))){ + var tagData = JSON.parse(model.get('tags')); + _.each(_.sortBy(tagData, 'type'), function(e, i){ + var $table = $('<div class="popover-heading" data-id="'+model.id+'">Attribute Details</div><table class="table table-bordered table-condensed tag-attr-table" style="margin-left:-5px;"><tbody></tr><tr><td>Name</td><td>Value</td></tr></tbody></table>'), + $tbody = $table.find('tbody'); + var $tr = ''; + _.each(e.attributes, function(val, key){ + $tr += ('<tr><td>'+_.escape(key)+'</td><td>'+ _.escape(val) +'</td></tr>'); + }); + $tbody.append($($tr)); + that.$el.find('table a[data-name="tags"][data-id="'+model.id+''+i+'"]').popover({ + content: $table, + html: true, + trigger: 'click', + placement: 'bottom', + container: 'body', + }).on("click", function(e){ + e.stopPropagation(); + $('[data-name="tags"]').not(this).popover('hide'); + $('.popover').find(".popover-content").addClass("tag-attr-popover"); + + }).on("focusout", function(e){ + $(e.target).popover('hide'); + }); + + + }); + } + }); + }, + onShowMore : function(e){ + var id = $(e.currentTarget).attr('audit-log-id'); + this.rTableList.$el.find('[audit-log-id="'+id+'"]').show(); + $('[data-id="showLess"][audit-log-id="'+id+'"]').show(); + $('[data-id="showMore"][audit-log-id="'+id+'"]').hide(); + $('[data-id="showMore"][audit-log-id="'+id+'"]').parents('div[data-id="tagDiv"]').addClass('set-height-groups'); + }, + onShowLess : function(e){ + var id = $(e.currentTarget).attr('audit-log-id'); + this.rTableList.$el.find('[audit-log-id="'+id+'"]').slice(4).hide(); + $('[data-id="showLess"][audit-log-id="'+id+'"]').hide(); + $('[data-id="showMore"][audit-log-id="'+id+'"]').show(); + $('[data-id="showMore"][audit-log-id="'+id+'"]').parents('div[data-id="tagDiv"]').removeClass('set-height-groups') + }, /** on close */ onClose : function() { clearInterval(this.timerId); http://git-wip-us.apache.org/repos/asf/ranger/blob/55329a3e/security-admin/src/main/webapp/styles/xa.css ---------------------------------------------------------------------- diff --git a/security-admin/src/main/webapp/styles/xa.css b/security-admin/src/main/webapp/styles/xa.css index 06ef1d0..c70c0bc 100644 --- a/security-admin/src/main/webapp/styles/xa.css +++ b/security-admin/src/main/webapp/styles/xa.css @@ -2147,9 +2147,38 @@ td.subgrid-custom-cell{ text-transform: capitalize; } .importbtn{ - margin-right: 5px ; - margin-top:-2px; + margin-right: 5px ; + margin-top:-2px; } .text-decoration:hover{ - text-decoration: none; + text-decoration: none; +} +.taginfo td, .taginfo th{ + text-align: center; + vertical-align: middle; +} +.font-weight-100{ + font-weight: 100 +} +.float-left-margin-1{ + float: left; + margin: 1px; +} +.tag-attr-popover{ + padding: 5px; +} +.popover-heading { + font-weight: bold; + margin: 1px; +} +.tag-attr-table{ + border-color: transparent; + border-top-color: #dddddd; +} + +.tag-attr-popover .table{ + margin-bottom:0; } +.tag-attr-popover .table td:first-child{ + border-left-color:transparent; +} \ No newline at end of file