Class.subclass( Page.Base, "Page.Home", {
bar_width: 100,
onInit: function() {
// called once at page load
this.worker = new Worker('js/home-worker.js');
this.worker.onmessage = this.render_upcoming_events.bind(this);
var html = '';
html += '
';
// header stats
html += '';
html += '';
// active jobs
html += '
';
html += 'Active Jobs';
html += '';
html += '
';
html += '';
html += '';
// queued jobs
html += '
';
html += '
';
html += 'Event Queues';
html += '';
html += '
';
html += '';
html += '';
html += '
';
// upcoming events
html += '
';
html += '
';
html += '';
html += '
'; // container
this.div.html( html );
},
onActivate: function(args) {
// page activation
if (!this.requireLogin(args)) return true;
if (!args) args = {};
this.args = args;
app.setWindowTitle('Home');
app.showTabBar(true);
this.upcoming_offset = 0;
// presort some stuff for the filter menus
app.categories.sort( function(a, b) {
// return (b.title < a.title) ? 1 : -1;
return a.title.toLowerCase().localeCompare( b.title.toLowerCase() );
} );
app.plugins.sort( function(a, b) {
// return (b.title < a.title) ? 1 : -1;
return a.title.toLowerCase().localeCompare( b.title.toLowerCase() );
} );
// render upcoming event filters
var html = '';
html += 'Upcoming Events';
html += '
';
html += '
';
html += '
';
html += '
';
html += '';
$('#d_home_upcoming_header').html( html );
setTimeout( function() {
$('#fe_home_keywords').keypress( function(event) {
if (event.keyCode == '13') { // enter key
event.preventDefault();
$P().set_search_filters();
}
} );
}, 1 );
// refresh datas
$('#d_home_active_jobs').html( this.get_active_jobs_html() );
this.refresh_upcoming_events();
this.refresh_header_stats();
this.refresh_event_queues();
return true;
},
refresh_header_stats: function() {
// refresh daemons stats in header fieldset
var html = '';
var stats = app.state ? (app.state.stats || {}) : {};
var servers = app.servers || {};
html += '';
$('#d_home_header_stats').html( html );
},
refresh_upcoming_events: function() {
// send message to worker to refresh upcoming
this.worker_start_time = hires_time_now();
this.worker.postMessage({
default_tz: app.tz,
schedule: app.schedule,
state: app.state,
categories: app.categories,
plugins: app.plugins
});
},
nav_upcoming: function(offset) {
// refresh upcoming events with new offset
this.upcoming_offset = offset;
this.render_upcoming_events({
data: this.upcoming_events
});
},
set_search_filters: function() {
// grab values from search filters, and refresh
var args = this.args;
args.plugin = $('#fe_home_plugin').val();
if (!args.plugin) delete args.plugin;
args.target = $('#fe_home_target').val();
if (!args.target) delete args.target;
args.category = $('#fe_home_cat').val();
if (!args.category) delete args.category;
args.keywords = $('#fe_home_keywords').val();
if (!args.keywords) delete args.keywords;
this.nav_upcoming(0);
},
render_upcoming_events: function(e) {
// receive data from worker, render table now
var self = this;
var html = '';
var now = app.epoch || hires_time_now();
var args = this.args;
this.upcoming_events = e.data;
/*var elapsed = now - this.worker_start_time;
delete this.worker_start_time;
Debug.trace('Home', "Worker elapsed time: " + elapsed + ' sec for ' + app.schedule.length + ' events.');*/
// apply filters
var events = [];
for (var idx = 0, len = e.data.length; idx < len; idx++) {
var stub = e.data[idx];
var item = find_object( app.schedule, { id: stub.id } ) || {};
// category filter
if (args.category && (item.category != args.category)) continue;
// plugin filter
if (args.plugin && (item.plugin != args.plugin)) continue;
// server group filter
if (args.target && (item.target != args.target)) continue;
// keyword filter
var words = [item.title, item.username, item.notes, item.target].join(' ').toLowerCase();
if (args.keywords && words.indexOf(args.keywords.toLowerCase()) == -1) continue;
events.push( stub );
} // foreach item in schedule
var size = get_inner_window_size();
var col_width = Math.floor( ((size.width * 0.9) + 50) / 7 );
var cols = ['Event Name', 'Category', 'Plugin', 'Target', 'Scheduled Time', 'Countdown', 'Actions'];
var limit = 25;
html += this.getPaginatedTable({
resp: {
rows: events.slice(this.upcoming_offset, this.upcoming_offset + limit),
list: {
length: events.length
}
},
cols: cols,
data_type: 'pending event',
limit: limit,
offset: this.upcoming_offset,
pagination_link: '$P().nav_upcoming',
callback: function(stub, idx) {
var item = find_object( app.schedule, { id: stub.id } ) || {};
// var dargs = get_date_args( stub.epoch );
var margs = moment.tz(stub.epoch * 1000, item.timezone || app.tz);
var actions = [
'Edit Event'
];
var cat = item.category ? find_object( app.categories, { id: item.category } ) : null;
var group = item.target ? find_object( app.server_groups, { id: item.target } ) : null;
var plugin = item.plugin ? find_object( app.plugins, { id: item.plugin } ) : null;
var nice_countdown = 'Now';
if (stub.epoch > now) {
nice_countdown = get_text_from_seconds_round( Math.max(60, stub.epoch - now), false );
}
if (group && item.multiplex) {
group = copy_object(group);
group.multiplex = 1;
}
var tds = [
'