conjur-asset-ui-api 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Rakefile +2 -0
- data/compile_ls +5 -1
- data/conjur-asset-ui.gemspec +1 -0
- data/lib/conjur-asset-ui-version.rb +1 -1
- data/lib/conjur/webserver/home.rb +19 -13
- data/lib/conjur/webserver/login.rb +7 -0
- data/lib/conjur/webserver/renderer.rb +34 -0
- data/livescript/views/audit.ls +31 -19
- data/public/_client_code.html +37 -0
- data/public/_client_libs.html +21 -0
- data/public/css/styles.less +23 -10
- data/public/index.html.erb +71 -0
- data/public/js/main.js +33 -70
- data/public/js/models/groupRecord.js +35 -0
- data/public/js/models/hostRecord.js +26 -0
- data/public/js/models/layerRecord.js +38 -0
- data/public/js/models/record.js +36 -23
- data/public/js/models/userRecord.js +26 -0
- data/public/js/models/variableRecord.js +39 -0
- data/public/js/views/audit.js +53 -33
- data/public/js/views/dashboard.js +32 -5
- data/public/js/views/group.js +2 -1
- data/public/js/views/host.js +3 -2
- data/public/js/views/layer.js +3 -3
- data/public/js/views/owned.js +77 -0
- data/public/js/views/permissions.js +98 -36
- data/public/js/views/resource.js +3 -0
- data/public/js/views/user.js +3 -4
- data/spec/javascripts/helpers/.gitkeep +0 -0
- data/spec/javascripts/support/jasmine.yml +112 -0
- data/spec/javascripts/support/jasmine_helper.rb +22 -0
- data/spec/javascripts/support/run.html.erb +23 -0
- data/spec/javascripts/views/AuditSpec.js +22 -0
- data/spec/javascripts/views/AuditSpec.ls +18 -0
- metadata +39 -4
- data/public/index.html +0 -121
data/public/js/main.js
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
*/
|
4
4
|
var namespace = NamespaceModel();
|
5
5
|
|
6
|
+
function errback(err) {
|
7
|
+
console.log("error:", err);
|
8
|
+
}
|
9
|
+
|
6
10
|
var kind = "";
|
7
11
|
var lists = {
|
8
12
|
"groups": new ResourceListModel("group"),
|
@@ -13,6 +17,7 @@ var lists = {
|
|
13
17
|
"hosts": new ResourceListModel("host")
|
14
18
|
};
|
15
19
|
var conjurConfiguration;
|
20
|
+
var userId;
|
16
21
|
var components = {};
|
17
22
|
var router;
|
18
23
|
var globalIds;
|
@@ -48,6 +53,7 @@ $(document).ready(function() {
|
|
48
53
|
}
|
49
54
|
|
50
55
|
conjurConfiguration = JSON.parse(decodeURIComponent(readCookie('conjur_configuration')).replace(/\+/g, ' '));
|
56
|
+
userId = decodeURIComponent(readCookie('conjur_userid'));
|
51
57
|
|
52
58
|
function createEndpoints(){
|
53
59
|
endpoints = {};
|
@@ -113,25 +119,25 @@ $(document).ready(function() {
|
|
113
119
|
});
|
114
120
|
}
|
115
121
|
|
116
|
-
function activateRecord(id, componentFunction) {
|
117
|
-
/* console.log("Record",
|
122
|
+
function activateRecord(k, id, componentFunction) {
|
123
|
+
/* console.log("Record", k, " :", id); */
|
124
|
+
|
125
|
+
$('#inlineSearchContainer').show();
|
126
|
+
kind = pluralize(k);
|
118
127
|
setActiveNav(kind);
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
document.getElementById('content')
|
126
|
-
);
|
127
|
-
}
|
128
|
+
|
129
|
+
var model;
|
130
|
+
if ( Record[_.capitalize(k)] )
|
131
|
+
model = new Record[_.capitalize(k)](id);
|
132
|
+
else
|
133
|
+
model = new Record.Generic(kind, id);
|
128
134
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
+
model.fetch(function(record) {
|
136
|
+
var component = componentFunction(record);
|
137
|
+
React.renderComponent(
|
138
|
+
component,
|
139
|
+
document.getElementById('content')
|
140
|
+
);
|
135
141
|
}, function(status, text, xhr){
|
136
142
|
if(status == 403){
|
137
143
|
window.flash = "You are not authorized to view " + kind + ":" + id + ".";
|
@@ -176,9 +182,7 @@ $(document).ready(function() {
|
|
176
182
|
},
|
177
183
|
|
178
184
|
user: function(user){
|
179
|
-
|
180
|
-
kind = "users";
|
181
|
-
activateRecord(user, function(record, callback){
|
185
|
+
activateRecord("user", user, function(record){
|
182
186
|
return <User data={record}/>;
|
183
187
|
});
|
184
188
|
},
|
@@ -192,16 +196,8 @@ $(document).ready(function() {
|
|
192
196
|
},
|
193
197
|
|
194
198
|
group: function(group) {
|
195
|
-
|
196
|
-
|
197
|
-
activateRecord(group, function(record, callback) {
|
198
|
-
$.ajax({
|
199
|
-
url: "/api/authz/" + conjurConfiguration.account + "/roles/group/" + record.id + "?members",
|
200
|
-
success: function(result) {
|
201
|
-
callback(<Group data={{group: record, members: result}} />);
|
202
|
-
},
|
203
|
-
error: error
|
204
|
-
});
|
199
|
+
activateRecord("group", group, function(record) {
|
200
|
+
return <Group data={record} />;
|
205
201
|
});
|
206
202
|
},
|
207
203
|
|
@@ -214,9 +210,9 @@ $(document).ready(function() {
|
|
214
210
|
},
|
215
211
|
|
216
212
|
host: function(host){
|
217
|
-
|
218
|
-
|
219
|
-
|
213
|
+
activateRecord("host", host, function(record) {
|
214
|
+
return <Host data={record}/>;
|
215
|
+
});
|
220
216
|
},
|
221
217
|
|
222
218
|
hosts: function() {
|
@@ -228,24 +224,8 @@ $(document).ready(function() {
|
|
228
224
|
},
|
229
225
|
|
230
226
|
layer: function(layer) {
|
231
|
-
|
232
|
-
|
233
|
-
activateRecord(layer, function(record, callback) {
|
234
|
-
var id = record.id.split(':')[2];
|
235
|
-
async.map(['@/layer/' + record.id + '/use_host', '@/layer/' + record.id + '/admin_host' ],
|
236
|
-
function(role, cb) {
|
237
|
-
$.ajax({
|
238
|
-
url: "/api/authz/" + conjurConfiguration.account + "/roles/" + role + "?members",
|
239
|
-
success: function(result) { cb(null, result) },
|
240
|
-
error: cb
|
241
|
-
});
|
242
|
-
},
|
243
|
-
function(err, results) {
|
244
|
-
if ( err )
|
245
|
-
error(err);
|
246
|
-
else
|
247
|
-
callback(<Layer data={{layer: record, users: _.pluck(results[0], 'member'), admins: _.pluck(results[1], 'member')}} />);
|
248
|
-
});
|
227
|
+
activateRecord("layer", layer, function(record) {
|
228
|
+
return <Layer data={record} />;
|
249
229
|
});
|
250
230
|
},
|
251
231
|
|
@@ -258,25 +238,8 @@ $(document).ready(function() {
|
|
258
238
|
},
|
259
239
|
|
260
240
|
variable: function(variable) {
|
261
|
-
|
262
|
-
|
263
|
-
activateRecord(variable, function(record, callback) {
|
264
|
-
async.map(['execute', 'update'], function(privilege, cb) {
|
265
|
-
$.ajax({
|
266
|
-
url: "/api/authz/" + conjurConfiguration.account + "/roles/allowed_to/" + privilege + "/variable/" + record.id,
|
267
|
-
success: function(result) {
|
268
|
-
cb(null, result);
|
269
|
-
},
|
270
|
-
error: cb
|
271
|
-
});
|
272
|
-
},
|
273
|
-
function(err, results) {
|
274
|
-
if ( err ) return error(err);
|
275
|
-
|
276
|
-
var updaters = results[1];
|
277
|
-
var fetchers = _.difference(results[0], updaters);
|
278
|
-
callback(<Variable data={{variable: record, fetchers: fetchers, updaters: updaters}} />);
|
279
|
-
});
|
241
|
+
activateRecord("variable", variable, function(record) {
|
242
|
+
return <Variable data={record} />;
|
280
243
|
});
|
281
244
|
},
|
282
245
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
if (typeof $ === "undefined") { throw new Error("jQuery is required") }
|
2
|
+
|
3
|
+
Record.Group = function(args) {
|
4
|
+
var superArguments = Array.prototype.slice.call(arguments);
|
5
|
+
superArguments.unshift("group");
|
6
|
+
Record.Generic.apply(this, superArguments);
|
7
|
+
}
|
8
|
+
|
9
|
+
Record.Group.prototype = Object.create(Record.Generic.prototype);
|
10
|
+
Record.Group.prototype.constructor = Record.Group;
|
11
|
+
|
12
|
+
Record.Group.prototype.fetch = function(callback) {
|
13
|
+
var self = this;
|
14
|
+
var id = this.id;
|
15
|
+
|
16
|
+
async.parallel([
|
17
|
+
this.attributes.bind(this),
|
18
|
+
this.ownedResources.bind(this),
|
19
|
+
function(cb) {
|
20
|
+
$.ajax({
|
21
|
+
url: "/api/authz/" + conjurConfiguration.account + "/roles/group/" + id + "?members",
|
22
|
+
success: function(result) {
|
23
|
+
cb(null, result);
|
24
|
+
},
|
25
|
+
error: cb
|
26
|
+
});
|
27
|
+
}
|
28
|
+
],
|
29
|
+
function(err, results) {
|
30
|
+
if ( err )
|
31
|
+
return errback(err);
|
32
|
+
|
33
|
+
callback({ group: results[0], owned: results[1], members: results[2] });
|
34
|
+
});
|
35
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
if (typeof $ === "undefined") { throw new Error("jQuery is required") }
|
2
|
+
|
3
|
+
Record.Host = function(args) {
|
4
|
+
var superArguments = Array.prototype.slice.call(arguments);
|
5
|
+
superArguments.unshift("host");
|
6
|
+
Record.Generic.apply(this, superArguments);
|
7
|
+
}
|
8
|
+
|
9
|
+
Record.Host.prototype = Object.create(Record.Generic.prototype);
|
10
|
+
Record.Host.prototype.constructor = Record.Host;
|
11
|
+
|
12
|
+
Record.Host.prototype.fetch = function(callback) {
|
13
|
+
var self = this;
|
14
|
+
var id = this.id;
|
15
|
+
|
16
|
+
async.parallel([
|
17
|
+
this.attributes.bind(this),
|
18
|
+
this.ownedResources.bind(this)
|
19
|
+
],
|
20
|
+
function(err, results) {
|
21
|
+
if ( err )
|
22
|
+
return errback(err);
|
23
|
+
|
24
|
+
callback({host: results[0], owned: results[1]});
|
25
|
+
});
|
26
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
if (typeof $ === "undefined") { throw new Error("jQuery is required") }
|
2
|
+
|
3
|
+
Record.Layer = function(args) {
|
4
|
+
var superArguments = Array.prototype.slice.call(arguments);
|
5
|
+
superArguments.unshift("layer");
|
6
|
+
Record.Generic.apply(this, superArguments);
|
7
|
+
}
|
8
|
+
|
9
|
+
Record.Layer.prototype = Object.create(Record.Generic.prototype);
|
10
|
+
Record.Layer.prototype.constructor = Record.Layer;
|
11
|
+
|
12
|
+
Record.Layer.prototype.fetch = function(callback) {
|
13
|
+
var self = this;
|
14
|
+
var id = this.id;
|
15
|
+
|
16
|
+
function members(role) {
|
17
|
+
return function(cb) {
|
18
|
+
$.ajax({
|
19
|
+
url: "/api/authz/" + conjurConfiguration.account + "/roles/" + role + "?members",
|
20
|
+
success: function(result) { cb(null, result) },
|
21
|
+
error: cb
|
22
|
+
});
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
async.parallel([
|
27
|
+
this.attributes.bind(this),
|
28
|
+
this.ownedResources.bind(this),
|
29
|
+
members('@/layer/' + id + '/use_host'),
|
30
|
+
members('@/layer/' + id + '/use_host')
|
31
|
+
],
|
32
|
+
function(err, results) {
|
33
|
+
if ( err )
|
34
|
+
return errback(err);
|
35
|
+
|
36
|
+
callback({ layer: results[0], owned: results[1], users: _.pluck(results[2], 'member'), admins: _.pluck(results[3], 'member') });
|
37
|
+
});
|
38
|
+
}
|
data/public/js/models/record.js
CHANGED
@@ -1,26 +1,39 @@
|
|
1
1
|
if (typeof $ === "undefined") { throw new Error("jQuery is required") }
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
3
|
+
Record = {};
|
4
|
+
|
5
|
+
Record.Generic = function(kind, id) {
|
6
|
+
this.kind = kind;
|
7
|
+
this.id = id;
|
8
|
+
}
|
9
|
+
|
10
|
+
Record.Generic.prototype.attributes = function(callback) {
|
11
|
+
var id = this.id;
|
12
|
+
$.ajax({
|
13
|
+
url: "/api/" + kind + "/" + encodeURIComponent(id),
|
14
|
+
success: function(data) {
|
15
|
+
callback(null, data);
|
16
|
+
},
|
17
|
+
error: callback
|
18
|
+
});
|
19
|
+
}
|
20
|
+
|
21
|
+
Record.Generic.prototype.ownedResources = function(callback) {
|
22
|
+
var id = this.id;
|
23
|
+
var roleid = [ this.kind, this.id ].join(':')
|
24
|
+
$.ajax({
|
25
|
+
url: "/api/authz/" + conjurConfiguration.account + "/resources?owner=" + roleid,
|
26
|
+
success: function(result) {
|
27
|
+
callback(null, result);
|
28
|
+
},
|
29
|
+
error: callback
|
30
|
+
});
|
31
|
+
}
|
32
|
+
|
33
|
+
Record.Generic.prototype.fetch = function(callback) {
|
34
|
+
this.attributes(function(err, data) {
|
35
|
+
if ( err )
|
36
|
+
return errback(err);
|
37
|
+
callback(data);
|
38
|
+
});
|
26
39
|
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
if (typeof $ === "undefined") { throw new Error("jQuery is required") }
|
2
|
+
|
3
|
+
Record.User = function(args) {
|
4
|
+
var superArguments = Array.prototype.slice.call(arguments);
|
5
|
+
superArguments.unshift("user");
|
6
|
+
Record.Generic.apply(this, superArguments);
|
7
|
+
}
|
8
|
+
|
9
|
+
Record.User.prototype = Object.create(Record.Generic.prototype);
|
10
|
+
Record.User.prototype.constructor = Record.User;
|
11
|
+
|
12
|
+
Record.User.prototype.fetch = function(callback) {
|
13
|
+
var self = this;
|
14
|
+
var id = this.id;
|
15
|
+
|
16
|
+
async.parallel([
|
17
|
+
this.attributes.bind(this),
|
18
|
+
this.ownedResources.bind(this)
|
19
|
+
],
|
20
|
+
function(err, results) {
|
21
|
+
if ( err )
|
22
|
+
return errback(err);
|
23
|
+
|
24
|
+
callback({user: results[0], owned: results[1]});
|
25
|
+
});
|
26
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
if (typeof $ === "undefined") { throw new Error("jQuery is required") }
|
2
|
+
|
3
|
+
Record.Variable = function(args) {
|
4
|
+
var superArguments = Array.prototype.slice.call(arguments);
|
5
|
+
superArguments.unshift("variable");
|
6
|
+
Record.Generic.apply(this, superArguments);
|
7
|
+
}
|
8
|
+
|
9
|
+
Record.Variable.prototype = Object.create(Record.Generic.prototype);
|
10
|
+
Record.Variable.prototype.constructor = Record.Variable;
|
11
|
+
|
12
|
+
Record.Variable.prototype.fetch = function(callback) {
|
13
|
+
var self = this;
|
14
|
+
var id = this.id;
|
15
|
+
|
16
|
+
function members(privilege) {
|
17
|
+
return function(cb) {
|
18
|
+
$.ajax({
|
19
|
+
url: "/api/authz/" + conjurConfiguration.account + "/roles/allowed_to/" + privilege + "/variable/" + id,
|
20
|
+
success: function(result) {
|
21
|
+
cb(null, result);
|
22
|
+
},
|
23
|
+
error: cb
|
24
|
+
});
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
async.parallel([
|
29
|
+
this.attributes.bind(this),
|
30
|
+
members("execute"),
|
31
|
+
members("update")
|
32
|
+
],
|
33
|
+
function(err, results) {
|
34
|
+
if ( err )
|
35
|
+
return errback(err);
|
36
|
+
|
37
|
+
callback({variable: results[0], fetchers: results[1], updaters: results[2]});
|
38
|
+
});
|
39
|
+
}
|
data/public/js/views/audit.js
CHANGED
@@ -1,10 +1,21 @@
|
|
1
1
|
// Generated by LiveScript 1.2.0
|
2
2
|
(function(){
|
3
|
-
var ref$, table, div, th, tr, td, thead, tbody, section, h3, time, map, each, unique, isType, join,
|
3
|
+
var ref$, table, div, th, tr, td, thead, tbody, section, h3, time, map, each, unique, isType, join, compact_fields, extended_fields, FieldsMixin, AuditTableHeader, Timestamp, wrapArray, AuditEntry, newEventSet, AuditTable, GlobalAudit, urlOfRole, urlOfResource, AuditBox, out$ = typeof exports != 'undefined' && exports || this, slice$ = [].slice;
|
4
4
|
ref$ = React.DOM, table = ref$.table, div = ref$.div, th = ref$.th, tr = ref$.tr, td = ref$.td, thead = ref$.thead, tbody = ref$.tbody, section = ref$.section, h3 = ref$.h3, time = ref$.time;
|
5
5
|
ref$ = require('prelude-ls'), map = ref$.map, each = ref$.each, unique = ref$.unique, isType = ref$.isType, join = ref$.join;
|
6
|
-
|
6
|
+
compact_fields = ['user', 'action', 'entities'];
|
7
|
+
extended_fields = ['timestamp', 'user', 'acting_as', 'action', 'entities', 'privilege'];
|
8
|
+
FieldsMixin = {
|
9
|
+
fields: function(){
|
10
|
+
if (this.props.compact) {
|
11
|
+
return compact_fields;
|
12
|
+
} else {
|
13
|
+
return extended_fields;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
};
|
7
17
|
AuditTableHeader = React.createClass({
|
18
|
+
mixins: [FieldsMixin],
|
8
19
|
displayName: 'AuditTableHeader',
|
9
20
|
render: function(){
|
10
21
|
return thead({}, tr({}, map(function(it){
|
@@ -12,7 +23,7 @@
|
|
12
23
|
key: it
|
13
24
|
}, it.replace('_', ' '));
|
14
25
|
})(
|
15
|
-
fields)));
|
26
|
+
this.fields())));
|
16
27
|
}
|
17
28
|
});
|
18
29
|
Timestamp = React.createClass({
|
@@ -21,7 +32,7 @@
|
|
21
32
|
var ts;
|
22
33
|
ts = moment(this.props.time);
|
23
34
|
return time({
|
24
|
-
|
35
|
+
dateTime: ts.format(),
|
25
36
|
title: ts.calendar()
|
26
37
|
}, [ts.fromNow()]);
|
27
38
|
}
|
@@ -33,43 +44,49 @@
|
|
33
44
|
return [it];
|
34
45
|
}
|
35
46
|
};
|
36
|
-
AuditEntry = React.createClass({
|
47
|
+
out$.AuditEntry = AuditEntry = React.createClass({
|
48
|
+
mixins: [FieldsMixin],
|
37
49
|
displayName: 'AuditEntry',
|
38
|
-
transformedProps: function(){
|
39
|
-
var ref$;
|
40
|
-
return ref$ = clone$(this.props), ref$.entity = this.props.resource || this.props.role, ref$;
|
41
|
-
},
|
42
50
|
transformField: function(key, value){
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
case
|
55
|
-
|
56
|
-
|
57
|
-
|
51
|
+
var that;
|
52
|
+
switch (key) {
|
53
|
+
case 'entities':
|
54
|
+
return [
|
55
|
+
(that = this.props.resource) != null ? ResourceLink({
|
56
|
+
data: that
|
57
|
+
}) : void 8, (that = this.props.role) != null ? RoleLink({
|
58
|
+
id: that
|
59
|
+
}) : void 8
|
60
|
+
];
|
61
|
+
case 'user':
|
62
|
+
case 'acting_as':
|
63
|
+
if (value != null) {
|
64
|
+
return RoleLink({
|
65
|
+
id: value
|
66
|
+
});
|
67
|
+
}
|
68
|
+
break;
|
69
|
+
case 'timestamp':
|
70
|
+
if (value != null) {
|
71
|
+
return Timestamp({
|
72
|
+
time: value
|
73
|
+
});
|
74
|
+
}
|
75
|
+
break;
|
58
76
|
default:
|
59
77
|
return value;
|
60
78
|
}
|
61
79
|
},
|
62
80
|
render: function(){
|
63
|
-
var
|
64
|
-
props = this.transformedProps();
|
81
|
+
var this$ = this;
|
65
82
|
return tr({
|
66
83
|
className: this.props.action
|
67
84
|
}, map(function(it){
|
68
|
-
return td({
|
85
|
+
return td.apply(null, [{
|
69
86
|
key: it
|
70
|
-
}
|
87
|
+
}].concat(slice$.call(wrapArray(this$.transformField(it, this$.props[it])))));
|
71
88
|
})(
|
72
|
-
fields));
|
89
|
+
this.fields()));
|
73
90
|
}
|
74
91
|
});
|
75
92
|
newEventSet = function(){
|
@@ -88,7 +105,7 @@
|
|
88
105
|
};
|
89
106
|
return evts;
|
90
107
|
};
|
91
|
-
AuditTable = React.createClass({
|
108
|
+
out$.AuditTable = AuditTable = React.createClass({
|
92
109
|
displayName: 'AuditTable',
|
93
110
|
getInitialState: function(){
|
94
111
|
return {
|
@@ -96,6 +113,8 @@
|
|
96
113
|
};
|
97
114
|
},
|
98
115
|
render: function(){
|
116
|
+
var compact;
|
117
|
+
compact = this.props.compact;
|
99
118
|
return section({
|
100
119
|
className: 'audit'
|
101
120
|
}, [
|
@@ -103,12 +122,13 @@
|
|
103
122
|
className: 'audit-table'
|
104
123
|
}, [
|
105
124
|
AuditTableHeader({
|
106
|
-
key: 'thead'
|
125
|
+
key: 'thead',
|
126
|
+
compact: compact
|
107
127
|
}), tbody({
|
108
128
|
key: 'tbody'
|
109
129
|
}, this.state.events.map(function(it){
|
110
130
|
var ref$;
|
111
|
-
return new AuditEntry((ref$ = clone$(it), ref$.key = it.id, ref$));
|
131
|
+
return new AuditEntry((ref$ = clone$(it), ref$.key = it.id, ref$.compact = compact, ref$));
|
112
132
|
}))
|
113
133
|
])
|
114
134
|
]);
|
@@ -180,7 +200,7 @@
|
|
180
200
|
roles.concat(resources)));
|
181
201
|
return AuditTable({
|
182
202
|
src: roleSrcs.concat(resSrcs),
|
183
|
-
caption: "Recent
|
203
|
+
caption: "Recent Activity"
|
184
204
|
});
|
185
205
|
}
|
186
206
|
});
|