aboutsummaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
Diffstat (limited to 'static')
-rw-r--r--static/javascript/mauve_utils.js242
-rw-r--r--static/stylesheets/bytemark.css9
-rw-r--r--static/stylesheets/mauve.css20
3 files changed, 217 insertions, 54 deletions
diff --git a/static/javascript/mauve_utils.js b/static/javascript/mauve_utils.js
index 45a651d..cd0d52b 100644
--- a/static/javascript/mauve_utils.js
+++ b/static/javascript/mauve_utils.js
@@ -3,62 +3,234 @@ function updateDate() {
//
// Date.getTime() returns *milliseconds*
//
- var this_date = workoutDate( $('#n_hours').val(), $('#type_hours').val() );
- $('#ack_until_text').html("(until "+humanDate(this_date)+")");
- $('#ack_until').val(this_date.getTime()/1000);
+ var this_date = workoutDate( $( '#n_hours' ).val(), $( '#type_hours' ).val() );
+ $( '#ack_until' ).val( this_date.getTime()/1000 );
+
+ //
+ // Use a asynchronous ajax convert a date to a human string. NB Date.getTime()
+ // returns *milliseconds*
+ //
+ $.ajax( {
+ url: '/ajax/time_to_s_human/'+this_date.getTime()/1000,
+ timeout: 1000,
+ success: function( data ) { $( '#ack_until_text' ).html( "( until "+data+" )" ); },
+ error: function( a,b,c ) { $( '#ack_until_text' ).html( "( until "+this_date.toString()+" )" ); }
+ } );
return false;
}
-function workoutDate(h, t) {
- var new_date = null;
+function workoutDate( h, type ) {
- h = new Number(h);
- h = ( h > 300 ? 300 : h );
+ n = new Number( h );
+ n *= 3600 * 1000;
- //
- // Use a synchronous ajax request to fetch the date. Note that
- // Date.getTime() returns milliseconds..
+ if ( type == null ) {
+ type = "wallclock" ;
+ }
+
+ var step = 3600 * 1000;
//
- $.ajax({
- url: '/ajax/time_in_x_hours/'+h+"/"+t,
- async: false,
- success: function(data) { new_date = new Date ( new Number(data) * 1000 ); }
- });
+ // Get the time now, in milliseconds
+ //
+ var d = new Date();
+ var t = d.getTime();
+ //
+ // Can't ack longer than a week
+ //
+ var maxDate = new Date( d.getTime() + 1000 * 86400 * 8 )
- return new_date;
-}
+ //
+ // Work out how much time to subtract now
+ //
+ while ( n >= 0 && t < maxDate.getTime() ) {
+ //
+ // If we're currently OK, and we won't be OK after the next step ( or
+ // vice-versa ) decrease step size, and try again
+ //
+ if ( doTimeTest( t, type ) != doTimeTest( t+step, type ) ) {
+ //
+ // Unless we're on the smallest step, try a smaller one.
+ //
+ if ( step > 1000 ) {
+ step /= 60;
+
+ } else {
+ if ( doTimeTest( t, type ) ) n -= step;
+ t += step;
+
+ //
+ // Set the step size back to an hour
+ //
+ step = 3600*1000;
+ }
-function humanDate(d) {
- var new_date = null;
+ continue;
+ }
- if ( d == null ) {
- d = new Date();
+ //
+ // Decrease the time by the step size if we're currently OK.
+ //
+ if ( doTimeTest( t, type ) ) n -= step;
+ t += step;
}
- //
- // Use a synchronous ajax convert a date to a human string. NB Date.getTime()
- // returns *milliseconds*
//
- $.ajax({
- url: '/ajax/time_to_s_human/'+d.getTime()/1000,
- async: false,
- success: function(data) { new_date = data; }
- });
+ // Substract any overshoot.
+ //
+ if ( n < 0 ) t += n;
- return new_date;
+ //
+ // Make sure we can't ack alerts too far in the future.
+ //
+ return ( t > maxDate.getTime() ? maxDate : new Date( t ) );
}
-function fetchDetail(a) {
+function fetchDetail( a ) {
// Use a synchronous ajax request to fetch the date.
- $.get('/ajax/alerts_table_alert_detail/'+a,
- function(data) {
- $('#tr_summary_'+a).after(data);
+ $.get( '/ajax/alerts_table_alert_detail/'+a,
+ function( data ) {
+ $( '#tr_summary_'+a ).after( data );
// Only fetch the data once.
- $('#a_detail_'+a).attr("onclick",null).click(function() { $('#tr_detail_'+a).toggle(); return false; });
+ $( '#a_detail_'+a ).attr( "onclick",null ).click( function() { $( '#tr_detail_'+a ).toggle(); return false; } );
+ } );
+
+ return false;
+}
+
+//
+// This expects its arguments as a time in milliseconds, and a type of "working", "daytime", or something else.
+//
+function doTimeTest( t, type ) {
+
+ var d = new Date( t );
+ var r = false;
+
+ switch ( type ) {
+ case "working":
+ r = ( d.getDay() > 0 && d.getDay() < 6 &&
+ ( ( d.getHours() >= 9 && d.getHours() <= 16 ) ||
+ ( d.getHours() == 8 && d.getMinutes() >= 30 )
+ ) );
+ break;
+
+ case "daytime":
+ r = ( d.getHours() >= 8 && d.getHours() <= 21 );
+ break;
+
+ default:
+ r = true;
+ }
+
+ return r;
+}
+
+
+//
+// Updates the alerts table
+//
+function updateAlertsTable(alert_type, group_by) {
+
+ //
+ // Do nothing if there is a checked box.
+ //
+ if ( $('input.alert:checked').length ) {
+ return false;
+ }
+
+ $.ajax( {
+ url: '/ajax/alerts_table/'+alert_type+'/'+group_by,
+ timeout: 5000,
+ success: function( data ) {
+ if ( "" == data || null == data ) {
+ showError("No data returned by web server when updating alerts table.", "updateAlertsTable");
+ } else {
+ $('#alerts_table').replaceWith(data);
+ clearError("updateAlertsTable");
+ updateAlertCounts();
+ }
+ },
+ error: function( a,b,c ) {
+ if ( "timeout" == b ) {
+ showError("Web server timed out when updating alerts table.", "updateAlertsTable");
+ } else {
+ showError("Got "+a.status+" "+a.statusText+" when updating alerts table.", "updateAlertsTable");
+ }
+ },
+ });
+
+ return false;
+}
+
+//
+// Updates the alerts title tag
+//
+function updateAlertCounts() {
+ $.ajax( {
+ url: '/ajax/alert_counts',
+ timeout: 5000,
+ success: function(counts) {
+ if ( "" == counts || null == counts) {
+ showError("No data returned by web server when updating alert counts.", "updateAlertCounts");
+ } else {
+ $('#count_raised').html(counts[0]+counts[1]+counts[2]+"");
+ $('#count_ackd').html(counts[3]+"");
+ $('#count_cleared').html(counts[4]+"");
+ $('title').html("Mauve: [ "+counts[0]+" / "+counts[1]+" / "+counts[2]+" ] Alerts");
+ clearError("updateAlertCounts");
+ }
+ },
+ error: function( a,b,c ) {
+ if ( "timeout" == b ) {
+ showError("Web server timed out when updating alert counts.", "updateAlertCounts");
+ } else {
+ showError("Got "+a.status+" "+a.statusText+" when updating alert counts.", "updateAlertCounts");
+ }
+ },
});
return false;
}
+
+//
+//
+//
+function showError(text, func) {
+
+ if ( null == text || "" == text ) return false;
+
+
+ // We need to add the p element.
+ if ( 0 == $('div.flash.error p#'+func).length ) {
+ // ugh.. standard DOM stuff.
+ var p = document.createElement('p');
+ p.setAttribute("id",func);
+ $('div.flash.error').append(p);
+ }
+
+ $('p#'+func).html(text);
+ // Show the error box
+ $('div.flash.error').fadeIn(2000);
+
+ return false;
+}
+
+function clearError(func) {
+ //
+ // Remove the element if it exists.
+ //
+ if ( $('div.flash.error p#'+func).length ) {
+ $('div.flash.error p#'+func).remove();
+ }
+
+ if ( $('div.flash.error').contents().length == 0 ) {
+ $('div.flash.error').hide();
+ }
+
+ return false;
+}
+
+
+
diff --git a/static/stylesheets/bytemark.css b/static/stylesheets/bytemark.css
index e4a14cb..365d3aa 100644
--- a/static/stylesheets/bytemark.css
+++ b/static/stylesheets/bytemark.css
@@ -64,10 +64,15 @@ h2 a {
h3, th {
font-weight: bold;
- font-size: small;
+ font-size: normal;
background-color: #E4E4E4;
color: black;
}
+
+th {
+ font-size: small;
+}
+
h3 {
padding: 3px 5px;
margin: 5px 5px 0px 5px;
@@ -96,7 +101,7 @@ div#navbar {
margin: -5px -5px 5px -5px;
padding-left: 15px;
background-color: #666;
- font-size: 14px;
+ font-size: small;
}
div#navbar ul {
diff --git a/static/stylesheets/mauve.css b/static/stylesheets/mauve.css
index b0764db..50f5da3 100644
--- a/static/stylesheets/mauve.css
+++ b/static/stylesheets/mauve.css
@@ -46,20 +46,6 @@ tr.detail {
border-top-width: thin;
}
-div.error {
- border: #c66dff medium solid;
- background-color: #e0b0ff;
-}
-
-div.notice {
- border: #c66dff medium solid;
- background-color: #e0b0ff;
-}
-
-div.error p, div.notice p {
- background-color: transparent;
-}
-
.hidden {
display: none;
}
@@ -78,18 +64,18 @@ div.notice {
background-image: url('/images/information.png');
}
-div.notice, div.error {
+div.flash {
margin: 5px 5px 0px;
padding: 0px;
padding-left: 20px;
color: black;
- font-size: 12px;
+ font-size: large;
background-position: 5px;
background-repeat: no-repeat;
min-height: 20px;
}
-div.error p, div.notice p {
+div.flash p {
background-color: transparent;
}