/** * Provides functions for site upgrades performed through XHR */ elgg.provide('elgg.upgrades'); // The already displayed messages are saved here elgg.upgrades.errorMessages = []; elgg.upgrades.init = function () { $('#upgrade-run').click(elgg.upgrades.run); }; /** * Initializes the XHR upgrade feature * * @param {Object} e Event object */ elgg.upgrades.run = function(e) { e.preventDefault(); // The total amount of items to be upgraded var total = $('#upgrade-total').text(); // Initialize progressbar $('.elgg-progressbar').progressbar({ value: 0, max: total }); // Replace button with spinner when upgrade starts $('#upgrade-run').addClass('hidden'); $('#upgrade-spinner').removeClass('hidden'); // Start upgrade from offset 0 elgg.upgrades.upgradeBatch(0); }; /** * Fires the ajax action to upgrade a batch of items. * * @param {Number} offset The next upgrade offset */ elgg.upgrades.upgradeBatch = function(offset) { var options = { data: { offset: offset }, dataType: 'json' }; options.data = elgg.security.addToken(options.data); var upgradeCount = $('#upgrade-count'); var action = $('#upgrade-run').attr('href'); options.success = function(json) { // Append possible errors after the progressbar if (json.system_messages.error.length) { // Display only the errors that haven't already been shown $(json.system_messages.error).each(function(key, message) { if (jQuery.inArray(message, elgg.upgrades.errorMessages) === -1) { var msg = '
  • ' + message + '
  • '; $('#upgrade-messages').append(msg); // Add this error to the displayed errors elgg.upgrades.errorMessages.push(message); } }); } // Increase success statistics var numSuccess = $('#upgrade-success-count'); var successCount = parseInt(numSuccess.text()) + json.output.numSuccess; numSuccess.text(successCount); // Increase error statistics var numErrors = $('#upgrade-error-count'); var errorCount = parseInt(numErrors.text()) + json.output.numErrors; numErrors.text(errorCount); // Increase total amount of processed items var numProcessed = successCount + errorCount; upgradeCount.text(numProcessed); // Increase the progress bar $('.elgg-progressbar').progressbar({ value: numProcessed }); var total = $('#upgrade-total').text(); var percent = 100; if (numProcessed < total) { percent = parseInt(numProcessed * 100 / total); /** * Start next upgrade call. Offset is the total amount of erros so far. * This prevents faulty items from causing the same error again. */ elgg.upgrades.upgradeBatch(errorCount); } else { $('#upgrade-spinner').addClass('hidden'); if (errorCount > 0) { // Upgrade finished with errors. Give instructions on how to proceed. elgg.register_error(elgg.echo('upgrade:finished_with_errors')); } else { // Upgrade is finished. Make one more call to mark it complete. elgg.action(action, {'upgrade_completed': 1}); elgg.system_message(elgg.echo('upgrade:finished')); } } // Increase percentage $('#upgrade-counter').text(percent + '%'); }; // We use post() instead of action() so we can catch error messages // and display them manually underneath the upgrade view. return elgg.post(action, options); }; elgg.register_hook_handler('init', 'system', elgg.upgrades.init);