KT.content = (function () { var draw_syncing = function (repo_id, progress, task_id) { var element = $("#repo-" + repo_id).find(".result"), cancelButton = $("").attr("class", "cancel_sync").text(katelloI18n.cancel), progressBar = $("").attr("class", "progress").text(" "); if (task_id !== undefined) { progressBar.attr("href", tfm.tools.foremanUrl("/foreman_tasks/tasks/" + task_id)); } progress = progress ? progress : 0; progressBar.progressbar({ value: progress, }); element.find(".result-info").html(""); element.find(".result-info").append(progressBar); element.find(".info-tipsy").addClass("hidden"); if (KT.permissions.syncable) { element.find(".result-info").append(cancelButton); } }, updateRepo = function ( repo_id, starttime, duration, progress, display_size, packages, size, task_id ) { var repo = $("#repo-" + repo_id); update_item(repo, starttime, duration, progress, display_size, packages, size, task_id); }, finishRepo = function (repo_id, state, duration, raw_state, error_details, task_id) { var element = $("#repo-" + repo_id); var messages = []; var url = tfm.tools.foremanUrl("/foreman_tasks/tasks/" + task_id); state = '' + state + ""; element.find(".result .result-info").html(state); fadeUpdate(element.find(".duration"), duration); if (raw_state === "error") { element.find(".result .info-tipsy").removeClass("hidden"); KT.utils.forEach(error_details["messages"], function (message) { messages.push("
  • " + message + "
  • "); }); element.find(".result .info-tipsy ul").html(messages.join("")); } }, update_item = function ( element, starttime, duration, progress, display_size, packages, size, task_id ) { var pg = element.find(".progress"), value = pg.find(".ui-progressbar-value"); starttime = starttime === null ? katelloI18n.no_start_time : starttime; if (task_id !== undefined) { pg.attr("href", tfm.tools.foremanUrl("/foreman_tasks/tasks/" + task_id)); } fadeUpdate(element.find(".start_time"), starttime); // clear duration during active sync fadeUpdate(element.find(".duration"), ""); fadeUpdate(element.find(".size"), display_size); element.find(".size").data("size", size); element .find(".info-tipsy") .attr("href", tfm.tools.foremanUrl("/foreman_tasks/tasks/" + task_id)); progress = progress === 100 ? 99 : progress; value.show(); value.animate({ width: progress }, { queue: false, duration: "slow", easing: "easeInSine" }); }, updateProduct = function (prod_id, done, percent, size) { var product_element = $("#product-" + prod_id), element = product_element.find(".result"), oldpg = element.find(".progress"); if (size) { size = KT.utils.reduce( $("table") .find("[data-product_id=" + prod_id + "]") .find(".size"), function (memo, num) { return $(num).data("size") + memo; }, 0 ); fadeUpdate(product_element.find(".size"), KT.common.to_human_readable_bytes(size)); } else if (done) { element.html(""); } else { if (oldpg.length === 0) { element.html($("
    ").attr("class", "progress").text(" ")); element.find(".progress").progressbar({ value: 0 }); } else { var value = oldpg.find(".ui-progressbar-value"); percent = percent === 100 ? 99 : percent; value.animate( { width: percent }, { queue: false, duration: "slow", easing: "easeInSine" } ); } } }, fadeUpdate = function (element, text) { //element.fadeOut('fast').text(text); //element.fadeIn('fast'); element.text(text); }, select_all = function () { $("#products_table").find("input[type=checkbox]").prop("checked", true); KT.content.select_repo(); }, select_none = function () { $("#products_table").find("input[type=checkbox]").removeAttr("checked"); KT.content.select_repo(); }, select_repo = function () { if ($("input[name='repoids[]']:checked").length > 0) { $("#sync_button").removeClass("disabled"); } else { $("#sync_button").addClass("disabled"); } }, reset_products = function (status_set) { var products = {}; $.each(status_set, function (index, item) { var pid = item.product_id; if (products[pid] === undefined) { products[pid] = []; } if (item.is_running) { products[pid].push(item.progress.progress); } }); $.each(products, function (prod_id, percentages) { var total = 0; $.each(percentages, function (i, val) { total += val; }); updateProduct(prod_id, percentages.length === 0, total / percentages.length); }); }, showOnlySyncing = function () { $("#products_table").find("tbody").find("tr").hide(); $.each(KT.content_actions.getSyncing(), function (index, repoid) { var repo = $("#repo-" + repoid); showChain(repo); }); }, showChain = function (element) { element.show().addClass("expanded").removeClass("collapsed"); $.each(element.attr("class").split(" "), function (index, claz) { if (claz.indexOf("child-of-") === 0) { var found = claz.split("child-of-")[1]; showChain($("#" + found)); } }); }, showAll = function () { var rows = $("#products_table") .find("tbody") .find("tr") .show() .removeClass("expanded") .addClass("collapsed"); $("#products_table").treeTable({ clickableNodeNames: true, indent: 15, }); }, expand_all = function () { var sync_toggle = $("#sync_toggle"); if ($(sync_toggle).is(":checked")) { $(sync_toggle).removeAttr("checked"); KT.content.showAll(); } $("#products_table") .find("tr") .removeClass("collapsed") .addClass("expanded") .each(function () { $(this).expand(); }); }, collapse_all = function () { $("#products_table") .find("tr") .removeClass("expanded") .addClass("collapsed") .each(function () { $(this).collapse(); }); }; return { updateProduct: updateProduct, updateRepo: updateRepo, finishRepo: finishRepo, select_all: select_all, select_none: select_none, select_repo: select_repo, draw_syncing: draw_syncing, reset_products: reset_products, showOnlySyncing: showOnlySyncing, showAll: showAll, expand_all: expand_all, collapse_all: collapse_all, }; })(); // Setup initial state KT.content_actions = (function () { var syncing = [], updater, getOrg = function () { return $("#organization_id").val(); }, addSyncing = function (repo_ids) { if (repo_ids.length === 0) { return; } //nothing in the list before adding and updater already exists var start = syncing.length === 0 && updater; $.each(repo_ids, function (index, id) { syncing.push(id + ""); }); if (!updater) { startUpdater(); } else if (start) { updater.restart(); } }, removeSyncing = function (repo_id) { syncing.splice($.inArray(repo_id + "", syncing), 1); if (syncing.length === 0 && updater) { updater.stop(); } }, getSyncing = function () { return syncing; }, cancelSync = function (repo_id) { var button = $("#repo-" + repo_id).find(".result .cancel_sync"); if (!$(button).hasClass("disabled")) { button.addClass("disabled"); $.ajax({ type: "DELETE", url: tfm.tools.foremanUrl( "/katello/sync_management/" + repo_id + "?organization_id=" + getOrg() ), dataType: "json", success: function (data) {}, error: function (data) { button.removeClass("disabled"); }, }); } }, startUpdater = function () { if (syncing.length === 0) { return; } var url = tfm.tools.foremanUrl("/katello/sync_management/sync_status"); updater = $.PeriodicalUpdater( url, { data: function () { return { repoids: getSyncing(), organization_id: getOrg() }; }, method: "get", type: "json", global: false, }, function (data, success) { if (success === "notmodified") { return; } $.each(data, function (index, repo) { // Only stop when we reach 100% and the finish_time is done sometimes they are not both complete if (!repo.is_running && repo.raw_state !== "waiting") { removeSyncing(repo.id); KT.content.updateRepo( repo.id, repo.start_time, repo.duration, repo.progress.progress, repo.display_size, repo.packages, repo.size, repo.sync_id ); KT.content.finishRepo( repo.id, repo.state, repo.duration, repo.raw_state, repo.error_details, repo.sync_id ); KT.content.updateProduct(repo.product_id, false, false, true); } else { KT.content.updateRepo( repo.id, repo.start_time, repo.duration, repo.progress.progress, repo.display_size, repo.packages, repo.size, repo.sync_id ); } }); KT.content.reset_products(data); }, function () { updater.stop(); } ); }; return { cancelSync: cancelSync, addSyncing: addSyncing, startUpdater: startUpdater, getSyncing: function () { return syncing; }, }; })(); var ids = []; $.each(KT.repo_status, function (repo_id, status) { if (status.is_running) { ids.push(repo_id); KT.content.draw_syncing(repo_id, status.progress.progress, status.sync_id); } }); KT.content.reset_products(KT.repo_status); KT.content_actions.addSyncing(ids); $("#select_all").click(KT.content.select_all); $("#select_none").click(KT.content.select_none); $("#collapse_all").click(KT.content.collapse_all); $("#expand_all").click(KT.content.expand_all); KT.content.showAll(); KT.content.select_repo(); $("#products_table").delegate(".cancel_sync", "click", function () { var repo_id = $(this).parents("tr").attr("data-id"); KT.content_actions.cancelSync(repo_id, $(this)); }); $("#sync_product_form") .bind("ajax:success", function (evt, data, status, xhr) { var ids = []; $.each(data, function (index, item) { ids.push(item.id); KT.content.draw_syncing(item.id, 0, undefined); KT.content.updateProduct(item.product_id, false, 0); }); KT.content_actions.addSyncing(ids); }) .bind("ajax:beforeSend", function (evt, data, status, xhr) { if ($("input[name='repoids[]']:checked").length === 0) { return false; } }); $("#sync_toggle").change(function () { var img = ""; $("#sync_toggle_cont").append(img); if ($(this).is(":checked")) { KT.content.showOnlySyncing(); } else { KT.content.showAll(); } $("#sync_toggle_cont").find("img").remove(); }); $.each($("input[name='repoids[]']"), function (index, checkbox) { $(checkbox).click(KT.content.select_repo); });