summaryrefslogblamecommitdiffstats
path: root/script/taskmanager.js
blob: dd00f864ec8ea82055cf7e8287c1c31a031d98e7 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                      
                        



                                       

                                 

                                        

                                                            



                                                                                                                                                                                                                                     






                                                                                               


                                                              
                           
                                         
         
                           







                                                 

                                                                           

                                

                                    
                       
         
                                                                                                  
                               
                                                     
                                  

                                                   
                                                                  

                                                                                      
                                                           
                                  
                                                   
                 





















                                                                                                                           

                                 









                                                                 

                                 
                                                                                                  








                                                                                                     
                                                                                                            






                                                                                              

                                                                     











                                                                                          
                                                                                                
                                                              


                                                                         

































                                                                                                                           
var tmItems = false;
var tmErrors = 0;
var TM_MAX_ERRORS = 5;
var tmIsRunning = false;

function tmInit()
{
	tmItems = $("div[data-tm-id]");
	if (tmItems.length === 0)
		return;
	tmItems.each(function(i, item) {
		item = $(item);
		if (item.find('.data-tm-icon').length !== 0)
			return;
		if (item.is('[data-tm-progress]')) {
			item.append('<div class="data-tm-progress"><div class="progress"><div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div></div></div>');
		}
		if (item.is('[data-tm-log]')) {
			var lh = item.data('tm-log-height');
			if (!lh) {
				lh = '';
			} else {
				lh = 'min-height:' + lh;
			}
			item.append('<pre class="data-tm-log collapse" style="' + lh + '" />');
		}
		item.prepend('<span class="data-tm-icon" />');
	});
	if (!tmIsRunning) {
		setTimeout(tmUpdate, 50);
	}
	tmIsRunning = true;
}

function tmUpdate()
{
	var active = [];
	tmItems.each(function(i, item) {
		item = $(item);
		var id = item.attr('data-tm-id');
		if (typeof id === 'undefined' || id === false || id === '')
			return;
		active.push(id);
	});
	if (active.length === 0) {
		tmIsRunning = false;
		return;
	}
	$.post('api.php?do=taskmanager', {'ids[]': active, token: TOKEN}, function(data, status) {
		// POST success
		tmIsRunning = tmResult(data, status);
		if (tmIsRunning) {
			setTimeout(tmUpdate, 1000);
		}
	}, 'json').fail(function(jqXHR, textStatus, errorThrown) {
		// POST failure
		console.log("TaskManager Error: " + textStatus + " - " + errorThrown);
		tmIsRunning = (++tmErrors < TM_MAX_ERRORS);
		if (tmIsRunning) {
			setTimeout(tmUpdate, 3000);
		}
	});
}

function tmResult(data, status)
{
	// Bail out on error
	if (typeof data.error !== 'undefined') {
		$('#mainpage').prepend($('<div class="alert alert-danger"/>').append(document.createTextNode(data.error)));
		console.log("Error ERROR");
		return false;
	}
	// No task list is also bad
	if (typeof data.tasks === 'undefined') {
		$('#mainpage').prepend('<div class="alert alert-danger">Internal Error #67452</div>');
		console.log("Error UNEXPECTED");
		return false;
	}
	var lastRunOnError = (tmErrors > TM_MAX_ERRORS);
	// Let's continue handling stuff
	var counter = 0;
	for (var idx in data.tasks) {
		var task = data.tasks[idx];
		if (!task.id)
			continue;
		counter++;
		if (lastRunOnError) {
			task.statusCode = 'TASK_ERROR';
		} else if (task.error) {
			++tmErrors;
			continue;
		} else if (tmErrors > 0) {
			--tmErrors;
		}
		var obj = $('div[data-tm-id="' + task.id + '"]');
		if (!obj)
			continue;
		if (task.statusCode !== 'TASK_WAITING' && task.statusCode !== 'TASK_PROCESSING') {
			obj.attr('data-tm-id', '');
		}
		var icon = obj.find('.data-tm-icon');
		if (icon) {
			if (typeof task.statusCode === 'undefined') {
				icon.attr('class', 'data-tm-icon glyphicon glyphicon-question-sign');
			} else if (task.statusCode === 'TASK_WAITING') {
				icon.attr('class', 'data-tm-icon glyphicon glyphicon-pause');
			} else if (task.statusCode === 'TASK_PROCESSING') {
				icon.attr('class', 'data-tm-icon glyphicon glyphicon-refresh slx-rotation');
			} else if (task.statusCode === 'TASK_FINISHED') {
				icon.attr('class', 'data-tm-icon glyphicon glyphicon-ok');
			} else if (task.statusCode === 'TASK_ERROR') {
				icon.attr('class', 'data-tm-icon glyphicon glyphicon-remove');
			} else {
				icon.attr('class', 'data-tm-icon glyphicon glyphicon-trash');
			}
		} else {
			console.log('Icon for ' + obj + ': ' + icon);
		}
		var progress = obj.find('.data-tm-progress');
		if (progress) {
			var pKey = obj.attr('data-tm-progress');
			if (task.data && task.data[pKey]) {
				tmSetProgress(progress, task.data[pKey], task.statusCode);
			} else {
				tmSetProgress(progress, false, task.statusCode);
			}
		}
		var log = obj.find('.data-tm-log');
		if (log) {
			if (!obj.data('tm-log-fail-only') || task.statusCode === "TASK_ERROR") {
				var lKey = obj.data('tm-log');
				if (task.data && task.data[lKey]) {
					log.text(task.data[lKey]).show();
				}
			}
		}
		var cb = obj.attr('data-tm-callback');
		if (cb && window[cb]) {
			window[cb](task);
		}
	}
	if (lastRunOnError) {
		$('#mainpage').prepend($('<div class="alert alert-danger"/>').append(document.createTextNode(task.error)));
		return false;
	}
	return counter > 0;
}

function tmSetProgress(elem, percent, status)
{
	var outer = '', inner = '';
	if (status === 'TASK_PROCESSING') {
		outer = ' active';
	} else if (status === 'TASK_ERROR') {
		inner = ' progress-bar-danger';
	} else if (status === 'TASK_FINISHED') {
		inner = ' progress-bar-success';
	}
	elem.find('.progress').attr('class', 'progress progress-striped' + outer);
	var bar = elem.find('.progress-bar');
	bar.attr('class', 'progress-bar' + inner);
	if (percent !== false) {
		bar.attr('aria-valuenow', percent);
		bar.attr('style', 'width: ' + percent + '%');
	}
}

tmInit();