var done = false; function update() { $.getJSON("/status", function(data) { handleData(data); }).always(function() { if(!done){ window.setTimeout(update, 1000); } }); } $(function() { $(".repo-progress").progress({ text: { active : 'Migrated or failed {value} of {total} repositories', success : '{total} repositories migrated or failed!' }, total: $(".repo-progress").data("total"), value: 0 }); }); function handleData(data) { if(Object.keys(data.finished).length + Object.keys(data.failed).length === $(".repo-progress").progress('get total')) { $(".repo-progress").progress('complete'); done = true; } else { $(".repo-progress").progress('set progress', Object.keys(data.finished).length + Object.keys(data.failed).length); } data.pending.forEach(function(repo) { var content = contentFromRepo(repo); if (!content.hasClass("pending")) { content.html(renderPending().html()); content.addClass("pending"); } }); forEach(data.failed, function (repo, errormsg) { var content = contentFromRepo(repo); if (!content.hasClass("failed")) { content.html(renderFailed(errormsg).html()); content.addClass("failed"); } }); forEach(data.running, function (repo, report) { var content = handleNonPending(repo, report); if (content.find(".comment-progress").progress('get total') !== report.total_comments) { content.find(".comment-progress").progress('set total', report.total_comments) } if (content.find(".issue-progress").progress('get total') !== report.total_issues) { content.find(".issue-progress").progress('set total', report.total_issues) } content.find(".comment-progress").progress('set progress', report.migrated_comments + report.failed_comments); content.find(".issue-progress").progress('set progress', report.migrated_issues + report.failed_issues); }); forEach(data.finished, function (repo, report) { var content = handleNonPending(repo, report); if (content.find(".comment-progress").progress('get total') !== report.total_comments) { content.find(".comment-progress").progress('set total', report.total_comments) } if (content.find(".issue-progress").progress('get total') !== report.total_issues) { content.find(".issue-progress").progress('set total', report.total_issues) } content.find(".comment-progress").progress('set progress', report.migrated_comments + report.failed_comments); content.find(".issue-progress").progress('set progress', report.migrated_issues + report.failed_issues); content.find(".issue-progress").progress('complete'); content.find(".comment-progress").progress('complete'); }); } function forEach(object, callback) { for(var prop in object) { if(object.hasOwnProperty(prop)) { callback(prop, object[prop]); } } } function handleNonPending(repo, report) { var content = contentFromRepo(repo); if(!content.hasClass("non-pending")) { content.html(renderNonPending().html()); content.find(".issue-progress").progress({ text: { active : 'Migrated {value} of {total} issues', success : '{total} issues migrated!' }, total: report.total_issues, value: report.migrated_issues + report.failed_issues, }); content.find(".comment-progress").progress({ text: { active : 'Migrated {value} of {total} comments', success : '{total} comments migrated!' }, total: report.total_comments+1, value: report.migrated_comments + report.failed_comments, }); content.addClass("non-pending"); } content.find(".failed-issues").text(report.failed_issues); content.find(".failed-comments").text(report.failed_comments); return content } function contentFromRepo(repo) { return $(".repo-content[data-repo='" + repo + "']") } function renderPending() { return $("#content-pending").clone(); } function renderFailed(errormsg) { var failed = $("#content-failed").clone(); failed.find(".errormsg").text(errormsg); return failed } function renderNonPending() { return $("#content-nonpending").clone(); } $(update());