conjur-asset-ui 1.3.1 → 1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -3
  3. data/Gemfile +1 -3
  4. data/README.md +0 -34
  5. data/Rakefile +1 -69
  6. data/conjur-asset-ui.gemspec +1 -1
  7. data/lib/conjur-asset-ui-version.rb +1 -1
  8. data/lib/conjur/command/ui.rb +1 -1
  9. data/lib/conjur/webserver/server.rb +8 -14
  10. data/public/_client_code.html +42 -0
  11. data/public/_client_libs.html +15 -2
  12. data/public/css/bootstrap.css +7 -0
  13. data/public/css/styles.less +4 -170
  14. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  15. data/public/fonts/glyphicons-halflings-regular.svg +229 -0
  16. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  17. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  18. data/public/index.html.erb +7 -5
  19. data/public/js/init.js +97 -183
  20. data/public/js/lib/JSXTransformer.js +10862 -0
  21. data/public/js/lib/async.js +958 -0
  22. data/public/js/lib/backbone.js +2 -0
  23. data/public/js/lib/bootstrap.js +6 -0
  24. data/public/js/lib/less.js +16 -0
  25. data/public/js/lib/moment.js +7768 -0
  26. data/public/js/lib/react-bootstrap.js +5346 -0
  27. data/public/js/lib/react-bootstrap.min.js +4 -0
  28. data/public/js/lib/sorted-set.no-require.js +28 -3
  29. data/public/js/lib/underscore-min.js +6 -0
  30. data/public/js/lib/underscore.string.min.js +1 -0
  31. data/public/js/main.js +57 -0
  32. data/public/js/models/groupRecord.js +11 -12
  33. data/public/js/models/hostRecord.js +7 -6
  34. data/public/js/models/layerRecord.js +11 -12
  35. data/public/js/models/namespace.js +0 -2
  36. data/public/js/models/policyList.js +1 -3
  37. data/public/js/models/policyRecord.js +7 -6
  38. data/public/js/models/record.js +23 -24
  39. data/public/js/models/resourceList.js +10 -28
  40. data/public/js/models/userList.js +2 -7
  41. data/public/js/models/userRecord.js +8 -7
  42. data/public/js/models/variableList.js +7 -18
  43. data/public/js/models/variableRecord.js +12 -13
  44. data/public/js/routers.js +26 -72
  45. data/public/js/views/annotations.js +27 -38
  46. data/public/js/views/audit.js +17 -23
  47. data/public/js/views/dashboard.js +58 -94
  48. data/public/js/views/generic.js +9 -16
  49. data/public/js/views/group.js +55 -94
  50. data/public/js/views/groups.js +7 -3
  51. data/public/js/views/host.js +44 -75
  52. data/public/js/views/hosts.js +6 -2
  53. data/public/js/views/layer.js +82 -127
  54. data/public/js/views/layers.js +6 -2
  55. data/public/js/views/mixins/search.js +5 -12
  56. data/public/js/views/mixins/tabs.js +55 -95
  57. data/public/js/views/navSearch.js +5 -16
  58. data/public/js/views/owned.js +8 -14
  59. data/public/js/views/permissions.js +178 -244
  60. data/public/js/views/policies.js +4 -2
  61. data/public/js/views/policy.js +38 -65
  62. data/public/js/views/resource.js +34 -49
  63. data/public/js/views/role.js +37 -52
  64. data/public/js/views/searchResults.js +138 -205
  65. data/public/js/views/time.js +13 -26
  66. data/public/js/views/user.js +55 -178
  67. data/public/js/views/users.js +7 -2
  68. data/public/js/views/variable.js +45 -226
  69. data/public/js/views/variables.js +8 -4
  70. metadata +19 -18
  71. data/.jshintrc +0 -41
  72. data/bower.json +0 -93
  73. data/features/navigation_bar.feature +0 -31
  74. data/features/step_definitions/custom_step.rb +0 -32
  75. data/features/support/env.rb +0 -38
  76. data/features/support/hooks.rb +0 -30
  77. data/features/support/world.rb +0 -17
  78. data/gulpfile.js +0 -140
  79. data/package.json +0 -47
  80. data/preprocessor.js +0 -7
  81. data/public/js/views/chart.js +0 -471
@@ -1,12 +1,14 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React */
3
2
 
4
3
  (function(conjur, React) {
5
4
  'use strict';
6
5
 
7
6
  var GenericList = conjur.views.GenericList;
8
7
 
9
- this.PolicyBox = React.createClass({
8
+ var PolicyBox = this.PolicyBox = React.createClass({
9
+ /*getInitialState: function() {
10
+ return { currentNamespace: "", members: [] };
11
+ },*/
10
12
  render: function() {
11
13
  return (
12
14
  <div className="policyBox">
@@ -1,70 +1,43 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React, ReactBootstrap, _ */
3
2
 
4
- (function(conjur, React, ReactBootstrap, _) {
5
- 'use strict';
6
-
7
- var TabbedArea = ReactBootstrap.TabbedArea,
8
- TabPane = ReactBootstrap.TabPane,
9
- Tab = conjur.views.mixins.Tab,
10
- RoleLink = conjur.views.RoleLink,
11
- AuditBox = window.AuditBox;
12
-
13
- this.Policy = React.createClass({
14
- mixins: [Tab],
15
-
16
- render: function() {
17
- var policy = this.props.data.policy,
18
- id = policy.id.split(':')[2];
19
-
20
- //TODO: policy loader
21
- //TODO in CLI: why not save text of policy as an annotation?
22
- var overviewTab = (
23
- <TabPane key="overview" tab="Overview">
24
- <dl className="dl-horizontal">
25
- <dt>Owner</dt>
26
- <dd><RoleLink id={policy.id}/></dd>
27
- </dl>
28
- </TabPane>
29
- );
30
-
31
- var permissionsTab = this.permissionsTab(policy.id),
32
- membershipsTab = this.membershipsTab(policy.id),
33
- annotationsTab = this.annotationsTab(),
34
- ownedTab = this.ownedTab();
35
-
36
- var auditTab = (
37
- <TabPane key="audit" tab="Recent Activity">
3
+ var Policy = React.createClass({
4
+ mixins: [conjur.views.mixins.Tab],
5
+ render: function() {
6
+ var policy = this.props.data.policy;
7
+ var id = policy.id.split(':')[2];
8
+
9
+ //TODO: policy loader
10
+ //TODO in CLI: why not save text of policy as an annotation?
11
+ var overview_tab =
12
+ <TabPane key="overview" tab="Overview">
13
+ <dl className="dl-horizontal">
14
+ <dt>Owner</dt>
15
+ <dd><RoleLink id={policy.id}/></dd>
16
+ </dl>
17
+ </TabPane>;
18
+
19
+ var permissions_tab = this.permissions_tab(policy.id);
20
+ var memberships_tab = this.memberships_tab(policy.id);
21
+ var annotations_tab = this.annotations_tab();
22
+ var owned_tab = this.owned_tab();
23
+
24
+ var audit_tab =
25
+ <TabPane key="audit" tab="Recent Activity">
38
26
  <div className="audit auditGroup">
39
27
  <AuditBox roles={[policy.id]} tabview={true} />
40
28
  </div>
41
- </TabPane>
42
- );
43
-
44
- var tabs = _.compact([
45
- overviewTab,
46
- ownedTab,
47
- membershipsTab,
48
- permissionsTab,
49
- annotationsTab,
50
- auditTab
51
- ]);
52
-
53
- return (
54
- <div className="policy">
55
- <h2>Policy {id}</h2>
56
- <TabbedArea defaultActiveKey="overview">
57
- {tabs}
58
- </TabbedArea>
59
- </div>
60
- );
61
- }
62
- });
63
-
64
- }).bind(conjur.views)
65
- (
66
- conjur,
67
- React,
68
- ReactBootstrap,
69
- _
70
- );
29
+ </TabPane>;
30
+ var tabs = _.compact( [ overview_tab, owned_tab, memberships_tab, permissions_tab,
31
+ annotations_tab, audit_tab
32
+ ] );
33
+
34
+ return (
35
+ <div className="policy">
36
+ <h2>Policy {id}</h2>
37
+ <TabbedArea defaultActiveKey="overview">
38
+ {tabs}
39
+ </TabbedArea>
40
+ </div>
41
+ );
42
+ }
43
+ });
@@ -1,54 +1,39 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React, _ */
3
2
 
4
- (function(conjur, React, _) {
5
- 'use strict';
6
-
7
- /**
8
- Renders a link to the resource with id given by this.props.data.
9
-
10
- Includes a slick little icon for the following kinds:
11
- TODO which kinds?
12
- **/
13
- this.ResourceLink = React.createClass({
14
- render: function() {
15
- var resourceId = this.props.id || this.props.data.id || this.props.data;
16
-
17
- var tokens = resourceId.split(':'),
18
- kind = tokens[1],
19
- id = tokens[tokens.length - 1],
20
- text = this.props.text || id;
21
-
22
- var knownTypes = ['user', 'group', 'layer', 'host', 'variable', 'policy'],
23
- resourceIsKnown = _.contains(knownTypes, kind);
24
-
25
- // we shouldn't build links to for unsupported resources
26
- var href = '/ui/' + conjur.utils.pluralize(kind) + '/' + window.encodeURIComponent(id);
27
- var classes = ['resource-link'];
28
-
29
- if (!this.props.noIcon) {
30
- if (resourceIsKnown) {
31
- classes.push(kind);
32
- } else {
33
- classes.push('abstract');
34
-
35
- if (text === id) {
36
- text = [kind, text].join(':'); // prepend kind to id
37
- }
38
- }
39
- } else if (text === id) {
40
- text = [kind, text].join(':'); // prepend kind to id
3
+ /**
4
+ Renders a link to the resource with id given by this.props.data.
5
+
6
+ Includes a slick little icon for the following kinds:
7
+ TODO which kinds?
8
+ **/
9
+ var ResourceLink = React.createClass({
10
+ render: function(){
11
+ var resourceId = this.props.id || this.props.data.id || this.props.data;
12
+
13
+ var tokens = resourceId.split(':');
14
+ var kind = tokens[1];
15
+ var id = tokens[tokens.length - 1];
16
+ var text = this.props.text || id;
17
+
18
+ var known_types=['user','group','layer','host','variable','policy'];
19
+ var resource_is_known = _.contains(known_types, kind);
20
+
21
+ // we shouldn't build links to for unsupported resources
22
+ var href = "/ui/" + conjur.utils.pluralize(kind) + "/" + encodeURIComponent(id);
23
+ var classes = [ 'resource-link' ];
24
+ if( !this.props.noIcon ) {
25
+ if (resource_is_known) {
26
+ classes.push(kind);
27
+ } else {
28
+ classes.push('abstract');
29
+ if (text==id) {
30
+ text=[kind,text].join(":"); // prepend kind to id
41
31
  }
42
-
43
- return (
44
- <a className={classes.join(' ')} href={href}>{text}</a>
45
- );
46
32
  }
47
- });
33
+ } else if (text==id) {
34
+ text=[kind,text].join(":"); // prepend kind to id
35
+ }
48
36
 
49
- }).bind(conjur.views)
50
- (
51
- conjur,
52
- React,
53
- _
54
- );
37
+ return <a className={classes.join(' ')} href={href}>{text}</a>
38
+ }
39
+ });
@@ -1,56 +1,41 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React, _ */
3
2
 
4
- (function(conjur, React, _) {
5
- 'use strict';
6
-
7
- /** render a link to the role represented by this.props.id
8
- Example: <RoleLink id='ci:user:jon'/>
9
- */
10
- this.RoleLink = React.createClass({
11
- render: function() {
12
- var tokens = this.props.id.split(':'),
13
- kind = tokens[1],
14
- id = tokens[tokens.length-1];
15
-
16
- if (tokens.length === 1) { // just username
17
- kind = 'user';
18
- id = tokens[0];
3
+ /** render a link to the role represented by this.props.id
4
+ Example: <RoleLink id="ci:user:jon"/>
5
+ */
6
+ var RoleLink = React.createClass({
7
+ render: function() {
8
+ var tokens = this.props.id.split(":");
9
+ var kind = tokens[1];
10
+ var id = tokens[tokens.length-1];
11
+ if (tokens.length==1) { // just username
12
+ kind="user";
13
+ id=tokens[0];
14
+ }
15
+
16
+ // TODO: shouldn't point to unknown types
17
+ var href = "/ui/" + conjur.utils.pluralize(kind) + "/" + encodeURIComponent(id);
18
+ var classes = ["role-link"];
19
+
20
+ var known_types=['user','group','layer','host','policy'];
21
+ var kind_is_known = _.contains(known_types, kind);
22
+ var text = id;
23
+
24
+ if( !this.props.noIcon ) {
25
+ if (kind_is_known) {
26
+ classes.push(kind);
27
+ } else {
28
+ classes.push('abstract'); // we have no picture for abstract role yet
29
+ if (text==id) {
30
+ text=[kind,text].join(":"); // prepend kind to id
19
31
  }
20
-
21
- // TODO: shouldn't point to unknown types
22
- var href = '/ui/' + conjur.utils.pluralize(kind) + '/' + window.encodeURIComponent(id);
23
-
24
- var classes = ['role-link'],
25
- knownTypes = ['user','group','layer','host','policy'],
26
- kindIsKnown = _.contains(knownTypes, kind),
27
- text = id;
28
-
29
- if (!this.props.noIcon) {
30
- if (kindIsKnown) {
31
- classes.push(kind);
32
- } else {
33
- classes.push('abstract'); // we have no picture for abstract role yet
34
-
35
- if (text === id) {
36
- text = [kind, text].join(':'); // prepend kind to id
37
- }
38
- }
39
- } else if (text === id) {
40
- text = [kind, text].join(':'); // prepend kind to id
41
- }
42
-
43
- return (
44
- <a className={classes.join(' ')} href={href}>
45
- {text}
46
- </a>
47
- );
48
32
  }
49
- });
50
-
51
- }).bind(conjur.views)
52
- (
53
- conjur,
54
- React,
55
- _
56
- );
33
+ } else if (text==id) {
34
+ text=[kind,text].join(":"); // prepend kind to id
35
+ }
36
+
37
+ return <a className={classes.join(' ')} href={href}>
38
+ {text}
39
+ </a>;
40
+ }
41
+ });
@@ -1,212 +1,145 @@
1
1
  /**@jsx React.DOM*/
2
- /* global conjur, React, jQuery, _ */
3
2
 
4
-
5
- (function(conjur, React, $, _) {
6
- 'use strict';
7
-
8
- var ResourceLink = conjur.views.ResourceLink,
9
- RoleLink = conjur.views.RoleLink;
10
-
11
- var SearchGroupTitle = React.createClass({
12
- render: function() {
13
- return (
14
- <span>{this.title()}</span>
15
- );
16
- },
17
-
18
- title: function() {
19
- var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
20
-
21
- words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
22
-
23
- return (
24
- words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')'
25
- );
26
- }
3
+ var SearchGroupTitle = React.createClass({
4
+ render: function(){
5
+ return <span>{this.title()}</span>
6
+ },
7
+
8
+ title: function(){
9
+ var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
10
+ words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
11
+ return words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')';
12
+ }
13
+ });
14
+
15
+ var SearchGroupHeading = React.createClass({
16
+ render: function(){
17
+ var targetId = "#search-collapse-" + this.props.data.kind;
18
+ return <div className="panel-heading">
19
+ <h4 className="panel-title">
20
+ <a data-toggle="collapse" data-target={targetId}
21
+ className={'group-heading' + this.props.data.kind}>
22
+ <SearchGroupTitle data={this.props.data} />
23
+ </a>
24
+ </h4>
25
+ </div>;
26
+ },
27
+
28
+ title: function(){
29
+ var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
30
+ words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
31
+ return words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')';
32
+ }
33
+ });
34
+
35
+ var SearchResultItem = React.createClass({
36
+ render: function(){
37
+ return <div className="item">
38
+ <h4> { this.titleLink() } </h4>
39
+ <div className="details">
40
+ <strong> ID: </strong> <ResourceLink data={this.props.data.id} noIcon="true"/>
41
+ <strong> Owner: </strong> <RoleLink id={this.props.data.owner} noIcon="true"/>
42
+ </div>
43
+ <div className="comment">
44
+ {this.commentText()}
45
+ </div>
46
+ </div>;
47
+ },
48
+
49
+ commentText: function(){
50
+ var annots = this.annotationsMap();
51
+ return annots['description'] || "";
52
+ },
53
+
54
+ titleLink: function(){
55
+ var annots = this.annotationsMap();
56
+ return <ResourceLink data={this.props.data.id} text={annots['name']}/>
57
+ },
58
+
59
+ annotationsMap: function(){
60
+ if(this._annotationsMap) return this._annotationsMap;
61
+ var map = this._annotationsMap = {};
62
+ (this.props.data.annotations || []).forEach(function(a){
63
+ map[a.name] = a.value;
27
64
  });
28
-
29
- var SearchGroupHeading = React.createClass({
30
- render: function() {
31
- var targetId = '#search-collapse-' + this.props.data.kind;
32
-
33
- return (
34
- <div className="panel-heading">
35
- <h4 className="panel-title">
36
- <a data-toggle="collapse"
37
- data-target={targetId}
38
- className={'group-heading' + this.props.data.kind}>
39
- <SearchGroupTitle data={this.props.data} />
40
- </a>
41
- </h4>
42
- </div>
43
- );
44
- },
45
-
46
- title: function() {
47
- var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
48
-
49
- words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
50
-
51
- return (
52
- words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')'
53
- );
54
- }
65
+ return map;
66
+ }
67
+ });
68
+
69
+ // accepts props like data: { kind:"", items:[] }
70
+ var SearchGroup = React.createClass({
71
+ render: function(){
72
+ var id = "search-group-" + this.props.data.kind;
73
+ var items = this.props.data.items.map(function(r){
74
+ return <SearchResultItem data={r}/>
75
+ })
76
+ return <div id={id} className="panel panel-default search-group">
77
+ <SearchGroupHeading data={this.props.data}/>
78
+ <div id={"search-collapse-" + this.props.data.kind} className="panel-collapse collapse in">
79
+ <div className="panel-body">
80
+ {items}
81
+ </div>
82
+ </div>
83
+ </div>;
84
+ }
85
+ });
86
+
87
+ var SearchResults = React.createClass({
88
+ render: function() {
89
+ var results = this.props.data.results;
90
+ var grouped = _.groupBy(results, function(r){
91
+ return r.id.split(':')[1];
55
92
  });
56
-
57
- var SearchResultItem = React.createClass({
58
- render: function() {
59
- return (
60
- <div className="item">
61
- <h4>{this.titleLink()}</h4>
62
- <div className="details">
63
- <strong> ID: </strong> <ResourceLink data={this.props.data.id}
64
- noIcon="true" />
65
- <strong> Owner: </strong> <RoleLink id={this.props.data.owner}
66
- noIcon="true" />
67
- </div>
68
- <div className="comment">
69
- {this.commentText()}
70
- </div>
71
- </div>
72
- );
73
- },
74
-
75
- commentText: function() {
76
- var annots = this.annotationsMap();
77
-
78
- return annots.description || '';
79
- },
80
-
81
- titleLink: function(){
82
- var annots = this.annotationsMap();
83
-
84
- return (
85
- <ResourceLink data={this.props.data.id} text={annots.name} />
86
- );
87
- },
88
-
89
- annotationsMap: function(){
90
- if (this._annotationsMap) {
91
- return this._annotationsMap;
92
- }
93
-
94
- var map = this._annotationsMap = {};
95
-
96
- (this.props.data.annotations || []).forEach(function(a) {
97
- map[a.name] = a.value;
98
- });
99
-
100
- return map;
101
- }
93
+ // Don't care about these
94
+ delete grouped['environment-variables']
95
+ delete grouped['notification']
96
+ delete grouped['queue']
97
+
98
+ var groups = _.map(grouped,function(items, key){
99
+ var data = {items:items, kind: key}; // - prevent editor barfing
100
+ return <SearchGroup data={data}/>
102
101
  });
103
-
104
- // accepts props like data: { kind:"", items:[] }
105
- var SearchGroup = React.createClass({
106
- render: function() {
107
- var id = 'search-group-' + this.props.data.kind;
108
-
109
- var items = this.props.data.items.map(function(r) {
110
- return (
111
- <SearchResultItem data={r}/>
112
- );
113
- });
114
-
115
- return (
116
- <div id={id} className="panel panel-default search-group">
117
- <SearchGroupHeading data={this.props.data}/>
118
- <div id={'search-collapse-' + this.props.data.kind}
119
- className="panel-collapse collapse in">
120
- <div className="panel-body">
121
- {items}
122
- </div>
123
- </div>
124
- </div>
125
- );
126
- }
102
+ var scores = {
103
+ 'policy': 1,
104
+ 'layer': 2,
105
+ 'group': 3,
106
+ 'host': 4,
107
+ 'user': 5,
108
+ 'variable': 6,
109
+ 'key_pair': 7
110
+ };
111
+ groups.sort(function(a, b) {
112
+ return ( scores[a.props.data.kind] || 100 ) - ( scores[b.props.data.kind] || 100 );
127
113
  });
128
-
129
- var SearchResults = this.SearchResults = React.createClass({
130
- render: function() {
131
- var results = this.props.data.results;
132
-
133
- var grouped = _.groupBy(results, function(r) {
134
- return r.id.split(':')[1];
135
- });
136
-
137
- // Don't care about these
138
- delete grouped['environment-variables'];
139
- delete grouped.notification;
140
- delete grouped.queue;
141
-
142
- var groups = _.map(grouped, function(items, key) {
143
- var data = {items: items, kind: key}; // - prevent editor barfing
144
- return <SearchGroup data={data}/>;
145
- });
146
-
147
- var scores = {
148
- 'policy': 1,
149
- 'layer': 2,
150
- 'group': 3,
151
- 'host': 4,
152
- 'user': 5,
153
- 'variable': 6,
154
- 'key_pair': 7
155
- };
156
-
157
- groups.sort(function(a, b) {
158
- return (
159
- (scores[a.props.data.kind] || 100) -
160
- (scores[b.props.data.kind] || 100)
161
- );
162
- });
163
-
164
- var toc = groups.map(function(g) {
165
- var gid = '#search-group-' + g.props.data.kind;
166
-
167
- return (
168
- <div className="toc-item">
169
- <a href={gid}><SearchGroupTitle data={g.props.data} /></a>
170
- </div>
171
- );
172
- });
173
-
174
- var heading = 'Found ' + this.props.data.results.length +
175
- ' resources matching "' + this.props.data.search + '"';
176
-
177
- return (
178
- <div id="searchResults">
179
- <div className="searchResults">
180
- <h3> { heading } </h3>
181
- <div className="search-results-toc">
182
- {toc}
183
- </div>
184
- <div className="search-results">
185
- {groups}
186
- </div>
187
- </div>
188
- </div>
189
- );
190
- }
114
+ var toc = groups.map(function(g) {
115
+ var gid = "#search-group-" + g.props.data.kind;
116
+ return <div className="toc-item">
117
+ <a href={gid}><SearchGroupTitle data={g.props.data} /></a>
118
+ </div>
191
119
  });
192
-
193
- SearchResults.search = function(search, container) {
194
- container = container || document.getElementById('content');
195
-
196
- $.get(
197
- conjur.app.endpoints.authz('resources', {search: search.replace('-',' ')}),
198
- function(results) {
199
- var data = {search: search, results: results};
200
- React.renderComponent(<SearchResults data={data}/>, container);
201
- }
202
- );
203
- };
204
-
205
-
206
- }).bind(conjur.views)
207
- (
208
- conjur,
209
- React,
210
- jQuery,
211
- _
212
- );
120
+ var heading = "Found " + this.props.data.results.length +
121
+ " resources matching \"" + this.props.data.search + "\"";
122
+ return (
123
+ <div id="searchResults">
124
+ <div className="searchResults">
125
+ <h3> { heading } </h3>
126
+ <div className="search-results-toc">
127
+ {toc}
128
+ </div>
129
+ <div className="search-results">
130
+ {groups}
131
+ </div>
132
+ </div>
133
+ </div>
134
+ );
135
+ }
136
+ });
137
+
138
+ SearchResults.search = function(search, container){
139
+ container = container || document.getElementById('content');
140
+ $.get(conjur.app.endpoints.authz("resources", {search: search.replace('-',' ')}), function(results){
141
+
142
+ var data = {search: search, results: results};
143
+ React.renderComponent(<SearchResults data={data}/>, container);
144
+ });
145
+ }