2 <html xmlns:ng="http://angularjs.org">
3 <script src="http://code.angularjs.org/angular-0.9.17.min.js" ng:autobind></script>
6 function user($xhr,$resource,$log) {
11 self.r.CRM_search = $resource('/g/CRM_search/:username', {username:'@search_username'});
12 self.CRM_search = function(username) {
13 if ( ! username ) username = self.search_username;
14 $log.info( 'CRM_search', username );
16 self.message.CRM = 'search for '+username;
17 self.r.CRM_search.query({username: username}, function(CRM) {
19 $log.info( 'CRM', CRM )
21 self.message.CRM = 'no results';
24 self.message.CRM = null;
25 if ( CRM.length == 1 ) {
26 self.selected_username = CRM[0].USERNAME;
27 $log.info( 'auto-selected ', self.selected_username );
32 self.r.LDAP_search = $resource('/g/LDAP_search/:username', {username:'@selected_username'});
33 self.LDAP_search = function(username) {
34 if ( self.selected_username == username ) {
35 $log.error("LDAP_search - not changed", username);
39 if ( ! username ) username = self.selected_username;
42 self.message.LDAP = 'no username';
45 $log.info( 'LDAP_search', username );
47 self.selected_username = username;
48 self.message.LDAP = 'search '+username;
49 self.r.LDAP_search.query({ username: username }, function(LDAP) {
51 $log.info( 'LDAP', LDAP );
52 if ( self.LDAP.length == 0 ) {
53 self.message.LDAP ='no results for '+username;
56 self.cpe.parser = LDAP[0]._cpe_parser;
57 self.cpe.table_name = 'cpe_' + LDAP[0]._cpe_parser;
58 self.username = LDAP[0].cn;
59 self.message.LDAP = null;
60 $log.info( 'cpe', self.cpe );
63 self.$watch('selected_username', self.LDAP_search );
65 self.gnuplot_draw = function(h_cols) {
66 $log.info( 'gnuplot_draw', h_cols );
68 self.gnuplot.cols = h_cols;
70 $log.warn("no columns for gnuplot");
74 var cols = [ 'timestamp' ];
75 for ( var i = 0; i < h_cols.length; i++ ) {
76 cols.push( 'h->\'' + h_cols[i] + '\' as "' + h_cols[i] + '"' );
78 self.gnuplot.sql = 'select ' + cols.join(',') + ' from cpe_' + self.cpe.parser + ' where username = \'' + self.username + '\' order by timestamp desc limit 100';
79 $log.info( 'gnuplot', cols, self.gnuplot );
81 self.$watch('gnuplot.sql', function() {
82 if ( ! self.gnuplot ) return;
83 self.message.gnuplot = self.gnuplot.cols.join(' ');
84 self.gnuplot.img = '/gnuplot?hide=1;with=points;sql=' + self.gnuplot.sql;
87 self.r.table = $resource('/table/:table');
88 self.table_update = function () {
89 if ( ! self.username || ! self.cpe.table_name ) return;
91 self.message.ping = self.username+' loading';
92 self.r.table.get({ username: self.username, table: 'ping', limit: 1 }, function(ping) {
93 $log.info('ping', ping);
94 self.message.ping = null;
96 for(var i = 0; i <= ping.columns.length; i++) {
97 hash[ping.columns[i]] = ping.rows[0][i];
100 $log.info('ping hash', hash);
103 self.message.table = self.username + ' loading from ' + self.cpe.table_name;
104 self.r.table.get({ username: self.username, table: self.cpe.table_name, limit: self.cpe_limit }, function(table) {
105 $log.info( 'table', table );
106 self.cpe.table = table;
107 self.message.table = null;
108 if ( table.rows.length == 0 ) {
109 self.message.table = 'no results for '+self.username;
113 if ( h_cols = self.cpe_hash[self.cpe.parser] ) {
114 self.gnuplot_draw( h_cols );
116 self.message.gnuplot = 'no graph for ' + self.cpe.parser;
120 self.$watch('username', self.table_update );
122 this.clear = function() {
128 this.clear_LDAP = function() {
129 $log.info('clear_LDAP');
131 self.selected_username = null;
139 self.$watch('selected_username', function() {
140 if ( self.selected_username == null ) self.clear_LDAP();
144 self.$watch('cpe_limit', function() {
145 $log.info( 'cpe_limit', self.cpe_limit );
160 'Davolink': [ 'Max_down', 'Max_up' ],
161 'EasyGateway': [ 'upstreamCurrRate', 'upstreamMaxRate', 'upstreamNoiseMargin' ],
164 this.keys = function(h) {
165 if ( angular.isArray(h) ) h = h[0];
167 for(i in h) if (h.hasOwnProperty(i))
176 user.$inject = ['$xhr','$resource','$log'];
178 // http://jsfiddle.net/gronky/cLEck/
179 angular.formatter('include', {
180 parse: function(apply, value, list) {
181 angular.Array[apply ? 'add' : 'remove'](list, value);
184 format: function(apply, value, list) {
185 return angular.Array.indexOf(list, value) != -1;
191 <style type="text/css">
194 border-collapse:collapse;
198 border-bottom: 2px solid gray;
202 border-left: 1em solid white;
203 border-right: 1em solid white;
230 .panel_right ul > li {
231 list-style-type: none;
234 .panel_right > label {
244 <div ng:controller="user">
246 <form ng:submit="CRM_search()">
247 <label for="args">username:
248 <input type="text" name="search_username" placeholder="test" size="10" autofocus ng:required />
250 <input type="submit" value="search in CRM">
251 <input type="reset" ng:click="clear()" value="clear">
253 <span id="message" ng:show="message.$size()" ng:click="message={}" title="click to close">
254 <div ng:repeat="(category,status) in message" ng:show="status"><b>{{category}}</b> {{status}}</div>
260 <div class="panel_right" ng:show="CRM">
263 <input type=checkbox name=show_columns>
265 <ul ng:show="show_columns">
266 <li ng:repeat="c in keys(CRM)" ng:show="columns.indexOf(c) < 0" ng:click="columns.push(c)">{{c}}
270 <table ng:show="CRM">
272 <th ng:repeat="c in columns" ng:click="columns.$remove(c)">{{c}}</th>
274 <tr ng:repeat="u in CRM" ng:click="LDAP_search(u.USERNAME)" ng:class-even="'zebra'">
275 <td ng:repeat="c in columns" ng:show="! selected_username || selected_username == u.USERNAME">{{u[c]}}</td>
279 <input type=button value="Show ALL results, not just {{selected_username}}" ng:click="selected_username=''" ng:show="selected_username">
281 <div ng:show="selected_username">
283 <h2><tt>{{selected_username}}</tt> LDAP entry</h2>
286 <li ng:repeat="c in keys(LDAP)"><tt>{{c}}</tt> {{LDAP[0][c]}}</li>
289 <div ng:show="cpe.ping">
290 ping <tt>{{cpe.ping.ip}}</tt> rtt <tt>{{cpe.ping.rtt}}</tt> at <tt>{{cpe.ping.timestamp}}</tt>
293 <div class="panel_right" ng:show="cpe.table">
296 <input type=checkbox name=show_gnuplot_cols>
298 <ul ng:show="show_gnuplot_cols">
299 <input type=button ng:click="gnuplot_draw(gnuplot.cols)" value="Redraw graph">
300 <li ng:repeat="(k,v) in cpe.table.rows[0][cpe.table.hash_col]">
302 <input type="checkbox" name="gnuplot_cols" ng:format="include:k:gnuplot.cols" ng:change="$log.debug(gnuplot_cols)">
306 <input type=button ng:click="gnuplot_draw(gnuplot.cols)" value="Redraw graph">
310 <ng:include src="gnuplot.img" ng:show="gnuplot.img" onload="message.gnuplot = null" ></ng:include>
312 <h2 ng:show="cpe.table_name">{{cpe.table_name}} {{username}}</h2>
314 <table ng:show="cpe.table">
316 <th ng:repeat="c in cpe.table.columns">{{c}}</th>
318 <tr ng:repeat="r in cpe.table.rows" ng:class-even="'zebra'">
319 <td ng:repeat="v in r">{{v}}</td>
322 <td colspan="{{cpe.table.columns.length}}">
324 <label>1<input name="cpe_limit" type="radio" value=1></label>
325 · · ·
326 <label>5<input name="cpe_limit" type="radio" value=5></label>
327 · · ·
328 <label>10<input name="cpe_limit" type="radio" value=10></label>
335 <input type=checkbox name=debug value=1>