public/js/views/searchResults.js in conjur-asset-ui-1.3.0 vs public/js/views/searchResults.js in conjur-asset-ui-1.3.1
- old
+ new
@@ -1,145 +1,212 @@
/**@jsx React.DOM*/
+/* global conjur, React, jQuery, _ */
-var SearchGroupTitle = React.createClass({
- render: function(){
- return <span>{this.title()}</span>
- },
- title: function(){
- var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
- words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
- return words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')';
- }
-});
+(function(conjur, React, $, _) {
+ 'use strict';
-var SearchGroupHeading = React.createClass({
- render: function(){
- var targetId = "#search-collapse-" + this.props.data.kind;
- return <div className="panel-heading">
- <h4 className="panel-title">
- <a data-toggle="collapse" data-target={targetId}
- className={'group-heading' + this.props.data.kind}>
- <SearchGroupTitle data={this.props.data} />
- </a>
- </h4>
- </div>;
- },
+ var ResourceLink = conjur.views.ResourceLink,
+ RoleLink = conjur.views.RoleLink;
- title: function(){
- var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
- words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
- return words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')';
- }
-});
+ var SearchGroupTitle = React.createClass({
+ render: function() {
+ return (
+ <span>{this.title()}</span>
+ );
+ },
-var SearchResultItem = React.createClass({
- render: function(){
- return <div className="item">
- <h4> { this.titleLink() } </h4>
- <div className="details">
- <strong> ID: </strong> <ResourceLink data={this.props.data.id} noIcon="true"/>
- <strong> Owner: </strong> <RoleLink id={this.props.data.owner} noIcon="true"/>
- </div>
- <div className="comment">
- {this.commentText()}
- </div>
- </div>;
- },
+ title: function() {
+ var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
- commentText: function(){
- var annots = this.annotationsMap();
- return annots['description'] || "";
- },
+ words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
- titleLink: function(){
- var annots = this.annotationsMap();
- return <ResourceLink data={this.props.data.id} text={annots['name']}/>
- },
+ return (
+ words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')'
+ );
+ }
+ });
- annotationsMap: function(){
- if(this._annotationsMap) return this._annotationsMap;
- var map = this._annotationsMap = {};
- (this.props.data.annotations || []).forEach(function(a){
- map[a.name] = a.value;
+ var SearchGroupHeading = React.createClass({
+ render: function() {
+ var targetId = '#search-collapse-' + this.props.data.kind;
+
+ return (
+ <div className="panel-heading">
+ <h4 className="panel-title">
+ <a data-toggle="collapse"
+ data-target={targetId}
+ className={'group-heading' + this.props.data.kind}>
+ <SearchGroupTitle data={this.props.data} />
+ </a>
+ </h4>
+ </div>
+ );
+ },
+
+ title: function() {
+ var words = this.props.data.kind.replace(/[-_]/, ' ').split(' ');
+
+ words[words.length - 1] = conjur.utils.pluralize(words[words.length - 1]);
+
+ return (
+ words.map(_.str.capitalize).join(' ') + ' (' + this.props.data.items.length + ')'
+ );
+ }
});
- return map;
- }
-});
-// accepts props like data: { kind:"", items:[] }
-var SearchGroup = React.createClass({
- render: function(){
- var id = "search-group-" + this.props.data.kind;
- var items = this.props.data.items.map(function(r){
- return <SearchResultItem data={r}/>
- })
- return <div id={id} className="panel panel-default search-group">
- <SearchGroupHeading data={this.props.data}/>
- <div id={"search-collapse-" + this.props.data.kind} className="panel-collapse collapse in">
- <div className="panel-body">
- {items}
- </div>
- </div>
- </div>;
- }
-});
+ var SearchResultItem = React.createClass({
+ render: function() {
+ return (
+ <div className="item">
+ <h4>{this.titleLink()}</h4>
+ <div className="details">
+ <strong> ID: </strong> <ResourceLink data={this.props.data.id}
+ noIcon="true" />
+ <strong> Owner: </strong> <RoleLink id={this.props.data.owner}
+ noIcon="true" />
+ </div>
+ <div className="comment">
+ {this.commentText()}
+ </div>
+ </div>
+ );
+ },
-var SearchResults = React.createClass({
- render: function() {
- var results = this.props.data.results;
- var grouped = _.groupBy(results, function(r){
- return r.id.split(':')[1];
+ commentText: function() {
+ var annots = this.annotationsMap();
+
+ return annots.description || '';
+ },
+
+ titleLink: function(){
+ var annots = this.annotationsMap();
+
+ return (
+ <ResourceLink data={this.props.data.id} text={annots.name} />
+ );
+ },
+
+ annotationsMap: function(){
+ if (this._annotationsMap) {
+ return this._annotationsMap;
+ }
+
+ var map = this._annotationsMap = {};
+
+ (this.props.data.annotations || []).forEach(function(a) {
+ map[a.name] = a.value;
+ });
+
+ return map;
+ }
});
- // Don't care about these
- delete grouped['environment-variables']
- delete grouped['notification']
- delete grouped['queue']
- var groups = _.map(grouped,function(items, key){
- var data = {items:items, kind: key}; // - prevent editor barfing
- return <SearchGroup data={data}/>
+ // accepts props like data: { kind:"", items:[] }
+ var SearchGroup = React.createClass({
+ render: function() {
+ var id = 'search-group-' + this.props.data.kind;
+
+ var items = this.props.data.items.map(function(r) {
+ return (
+ <SearchResultItem data={r}/>
+ );
+ });
+
+ return (
+ <div id={id} className="panel panel-default search-group">
+ <SearchGroupHeading data={this.props.data}/>
+ <div id={'search-collapse-' + this.props.data.kind}
+ className="panel-collapse collapse in">
+ <div className="panel-body">
+ {items}
+ </div>
+ </div>
+ </div>
+ );
+ }
});
- var scores = {
- 'policy': 1,
- 'layer': 2,
- 'group': 3,
- 'host': 4,
- 'user': 5,
- 'variable': 6,
- 'key_pair': 7
- };
- groups.sort(function(a, b) {
- return ( scores[a.props.data.kind] || 100 ) - ( scores[b.props.data.kind] || 100 );
+
+ var SearchResults = this.SearchResults = React.createClass({
+ render: function() {
+ var results = this.props.data.results;
+
+ var grouped = _.groupBy(results, function(r) {
+ return r.id.split(':')[1];
+ });
+
+ // Don't care about these
+ delete grouped['environment-variables'];
+ delete grouped.notification;
+ delete grouped.queue;
+
+ var groups = _.map(grouped, function(items, key) {
+ var data = {items: items, kind: key}; // - prevent editor barfing
+ return <SearchGroup data={data}/>;
+ });
+
+ var scores = {
+ 'policy': 1,
+ 'layer': 2,
+ 'group': 3,
+ 'host': 4,
+ 'user': 5,
+ 'variable': 6,
+ 'key_pair': 7
+ };
+
+ groups.sort(function(a, b) {
+ return (
+ (scores[a.props.data.kind] || 100) -
+ (scores[b.props.data.kind] || 100)
+ );
+ });
+
+ var toc = groups.map(function(g) {
+ var gid = '#search-group-' + g.props.data.kind;
+
+ return (
+ <div className="toc-item">
+ <a href={gid}><SearchGroupTitle data={g.props.data} /></a>
+ </div>
+ );
+ });
+
+ var heading = 'Found ' + this.props.data.results.length +
+ ' resources matching "' + this.props.data.search + '"';
+
+ return (
+ <div id="searchResults">
+ <div className="searchResults">
+ <h3> { heading } </h3>
+ <div className="search-results-toc">
+ {toc}
+ </div>
+ <div className="search-results">
+ {groups}
+ </div>
+ </div>
+ </div>
+ );
+ }
});
- var toc = groups.map(function(g) {
- var gid = "#search-group-" + g.props.data.kind;
- return <div className="toc-item">
- <a href={gid}><SearchGroupTitle data={g.props.data} /></a>
- </div>
- });
- var heading = "Found " + this.props.data.results.length +
- " resources matching \"" + this.props.data.search + "\"";
- return (
- <div id="searchResults">
- <div className="searchResults">
- <h3> { heading } </h3>
- <div className="search-results-toc">
- {toc}
- </div>
- <div className="search-results">
- {groups}
- </div>
- </div>
- </div>
- );
- }
-});
-SearchResults.search = function(search, container){
- container = container || document.getElementById('content');
- $.get(conjur.app.endpoints.authz("resources", {search: search.replace('-',' ')}), function(results){
+ SearchResults.search = function(search, container) {
+ container = container || document.getElementById('content');
- var data = {search: search, results: results};
- React.renderComponent(<SearchResults data={data}/>, container);
- });
-}
+ $.get(
+ conjur.app.endpoints.authz('resources', {search: search.replace('-',' ')}),
+ function(results) {
+ var data = {search: search, results: results};
+ React.renderComponent(<SearchResults data={data}/>, container);
+ }
+ );
+ };
+
+
+}).bind(conjur.views)
+(
+ conjur,
+ React,
+ jQuery,
+ _
+);