var taskIndex = 0, currentcl, jobstateenum, jobpriorityenum, jobJson, jobResultsJson; var enumsUrl = "/automation.svc/admin/EnumValues", jobStateEnumDataType = "RSG.Pipeline.Automation.Common.Jobs.JobState", jobPriorityEnumDataType = "RSG.Pipeline.Automation.Common.Jobs.JobPriority", monitorUrlPath = "/automation.svc/admin/monitor", monitorTaskName = "MonitoringTaskStatus"; function onTimerTasks(runOnce) { $.ajax({ type: "GET", url: monitorUrlPath, dataType: "json", success: function(json) { jobJson = {}; jobResultsJson = {}; var table1 = $("#tasklist1").dataTable(); table1.fnClearTable(); $.each(json, function(i, item) { table1.fnAddData([i, item.Name, item.AvailableJobCount], false); }); //table1.fnDraw(); table1.fnStandingRedraw(); var table2 = $("#tasklist2").dataTable(); table2.children("tbody").find("*").unbind(); table2.off("draw").on("draw", updateTasksTable); table2.fnClearTable(); var taskDetail = json[taskIndex]; //var datetimeSeparator = "
"; - breaking sorting var datetimeSeparator = " "; // process jobs results $.each(taskDetail.JobResults, function(i, jobResult) { if (jobResultsJson.hasOwnProperty(jobResult.JobId)) jobResultsJson[jobResult.JobId].push(jobResult.SubmittedChangelistNumber); else jobResultsJson[jobResult.JobId] = [jobResult.SubmittedChangelistNumber]; }); $.each(taskDetail.Jobs, function(i, taskJob) { if (!$("input#" + jobstateenum[taskJob.State]).is(":checked")) return; jobJson[taskJob.ID] = taskJob; if(taskDetail.__type == monitorTaskName) { table2.fnAddData([getChangelistLink(taskJob.Trigger.Changelist), truncate(taskJob.ID, 15), taskJob.ID, taskJob.Trigger.Username, jobpriorityenum[taskJob.Priority], getSortableDatetimeString(toDate(taskJob.Trigger.SubmittedAt), datetimeSeparator), getSortableDatetimeString(toDate(taskJob.CompletedAt), datetimeSeparator), formatSecs(datesDiffInSecs(toDate(taskJob.CompletedAt), toDate(taskJob.Trigger.SubmittedAt))), formatSecs(datesDiffInSecs(toDate(taskJob.CompletedAt), toDate(taskJob.ProcessedAt))), jobstateenum[taskJob.State], "" ], false); } else { if(typeof taskJob !== "undefined") { //if(job != undefined) { table2.fnAddData([0, //job.Trigger.Changelist, truncate(taskJob.ID, 15), taskJob.ID, taskJob.Trigger.Username, jobpriorityenum[taskJob.Priority], getSortableDatetimeString(toDate(taskJob.Trigger.SubmittedAt), datetimeSeparator), getSortableDatetimeString(toDate(taskJob.CompletedAt), datetimeSeparator), formatSecs(datesDiffInSecs(toDate(taskJob.CompletedAt), toDate(taskJob.Trigger.SubmittedAt))), formatSecs(datesDiffInSecs(toDate(taskJob.CompletedAt), toDate(taskJob.ProcessedAt))), jobstateenum[taskJob.State], "" ], false); } } }); if (runOnce) table2.fnDraw(); else table2.fnStandingRedraw(); } // end of ajax success: }); if (!runOnce) setTimeout(onTimerTasks, reloadInterval); } function initTasks() { //get the jobstate enum list $.ajax({ type: "GET", url: enumsUrl, data: {type: jobStateEnumDataType}, dataType: "json", async: false, success: function(json) { jobstateenum = {}; $.each(json, function(i, item) { jobstateenum[item.Key] = item.Value; }); } }); $.ajax({ type: "GET", url: enumsUrl, data: {type: jobPriorityEnumDataType}, dataType: "json", async: false, success: function(json) { jobpriorityenum = {}; $.each(json, function(i, item) { jobpriorityenum[item.Key] = item.Value; }); } }); //create the tables with the correct headers var tabledataList1 = {"aoColumns" : [], "bAutoWidth": false, "bFilter": false, "bSort": false, "bInfo": false, "bPaginate": false}; tabledataList1.aoColumns.push({ "sTitle": "Index", "sWidth": "10%"}); tabledataList1.aoColumns.push({ "sTitle": "Task", "sWidth": "80%" }); tabledataList1.aoColumns.push({ "sTitle": "Open Jobs", "sWidth": "10%" }); $("#tasklist1").dataTable(tabledataList1); var tabledataList2 = { "aoColumns" : [], "bStateSave": true, "bAutoWidth": false, "bProcessing": true, "sDom": '<"top"plf<"clear">>rt<"bottom"ip<"clear">>' }; tabledataList2.aoColumns.push({"sTitle": "Changelist", "sWidth": "10%", "sClass": "data-chlist"}); tabledataList2.aoColumns.push({"sTitle": "ID", "sWidth": "10%", "sClass": "data-id"}); tabledataList2.aoColumns.push({"bVisible": false, "sClass": "data-id"}); tabledataList2.aoColumns.push({"sTitle": "User", "sWidth": "10%", "sClass": "data-username"}); tabledataList2.aoColumns.push({"sTitle": "Priority", "sWidth": "10%"}); tabledataList2.aoColumns.push({"sTitle": "Submitted At", "sWidth": "10%", "sType": "date"}); tabledataList2.aoColumns.push({"sTitle": "Completed At", "sWidth": "10%", "sType": "date"}); tabledataList2.aoColumns.push({"sTitle": "Turnaround Time", "sWidth": "10%"}); tabledataList2.aoColumns.push({"sTitle": "Processing Time", "sWidth": "10%"}); tabledataList2.aoColumns.push({"sTitle": "State", "sWidth": "10%", "sClass": "data-state"}); tabledataList2.aoColumns.push({"sTitle": "Action", "sWidth": "5%", "sClass": "data-view"}); // Unbind all events before each draw - not sure if that works tabledataList2["fnPreDrawCallback"] = function() {$("#tasklist2 tbody").find("*").unbind();}; $("#tasklist2").dataTable(tabledataList2); $("#joblist input[type=checkbox]").change(function() { // Run only once to avoid breaking the periodical timeout onTimerTasks(true); }); onTimerTasks(false); } // Called when the tasks table is being redrawn - adds additional styling and hover user/files info function updateTasksTable() { //console.log("updateTasksTable() called"); var table2 = $("#tasklist2").dataTable(); var rows = $("#tasklist2 tbody tr"); $.each(rows, function(i, row) { // Add coloured classes to each state var state = $(row).find("td.data-state").text().toLowerCase(); $(row).removeClass().addClass(state); //console.log(table2.fnGetData(this)[3]); var rowData = table2.fnGetData(this); var currentJobId = ""; if (rowData) currentJobId = rowData[2]; //console.log(currentJobId); var idTd = $(row).find("td.data-id"); idTd.attr("title", "Click for a list of affected Files"); idTd.unbind().bind("click", function() { if (jobJson[currentJobId]) { showJobFilesList(jobJson[currentJobId], $(this)); $(this).children("div.job-files").fadeIn("fast"); } }); idTd.bind("mouseleave", function(e) { $(this).children("div.job-files") .fadeOut("fast") .remove(); }); // var chListTd = $(row).find("td.data-chlist"); chListTd.unbind().bind("mouseenter", function() { if (jobResultsJson.hasOwnProperty(currentJobId)) { showJobResultsList(jobResultsJson[currentJobId], $(this)); $(this).children("div.job-results").fadeIn("fast"); } }); chListTd.bind("mouseleave", function(e) { $(this).children("div.job-results") .fadeOut("fast") .remove(); }); // var button = $(row).find("td.data-view button"); button.unbind().bind("click", function() { addJob(currentJobId); }); button.button(); // add the user div to the respective table's td var userTd = $(row).find("td.data-username"); userTd.unbind().bind("mouseover", function() { createUserInfoDiv($(this).text(), $(this)); $(this).children("div.user").fadeIn("fast"); }); userTd.bind("mouseleave", function() { $(this).children("div.user") .fadeOut("fast") .remove(); }); }); } function showJobFilesList(job, element) { var tableDiv = $("
") .addClass("job-files"); var table = $(""); table.append( $("").append( $("") .addClass(function() { return ((i%2) ? "odd" : "even"); }) .append( $("
").html("Files Processed (ID: " + job.ID + ")") ) ); $.each(job.Trigger.Files, function(i, file) { $("
").text(file) ) .appendTo(table) }); table.appendTo(tableDiv); tableDiv.appendTo(element); } function showJobResultsList(jobResult, element) { var tableDiv = $("
") .addClass("job-results"); var table = $(""); table.append( $("").append( $("") .addClass(function() { return ((i%2) ? "odd" : "even"); }) .append( $("
").html("Submitted Changelists") ) ); $.each(jobResult, function(i, changelist) { $("
").html(getChangelistLink(changelist)) ) .appendTo(table) }); table.appendTo(tableDiv); tableDiv.appendTo(element); }