[title] Display reverse job in web page of jobs.
authorSungmin kim <dev.sungmin.kim@samsung.com>
Sat, 20 Apr 2013 09:18:19 +0000 (18:18 +0900)
committerSungmin kim <dev.sungmin.kim@samsung.com>
Sat, 20 Apr 2013 09:18:19 +0000 (18:18 +0900)
dibs-web/app/controllers/jobs_controller.rb
dibs-web/public/index.html
dibs-web/public/javascripts/jobs.js

index 0172bb6e9b4174e36b0ed175a672c0b400621877..0524f58fc77905e93b3e15dbfd2991e85309cd2d 100644 (file)
@@ -140,26 +140,11 @@ class JobsController < ApplicationController
                                                                doc.UserName(job.user_name)
                                                                doc.StartTime(job.start_time)
                                                                doc.EndTime(job.end_time)
-                                                       }
 
-                                                       if job.job_attribute == "MULTI"
-                                                               child_jobs = get_child_job_info(job.job_id)
-                                                               child_jobs.each {|job|
-                                                                       doc.Job {
-                                                                               doc.Id(job.job_id)
-                                                                               doc.Distribution(job.distribution_name)
-                                                                               doc.ProjectName(job.project_name)
-                                                                               doc.JobType(job.job_type)
-                                                                               doc.JobAttribute("CHILD")
-                                                                               doc.ParentJobId(job.parent_job_id)
-                                                                               doc.Os(job.supported_os_name)
-                                                                               doc.Status(job.status)
-                                                                               doc.UserName(job.user_name)
-                                                                               doc.StartTime(job.start_time)
-                                                                               doc.EndTime(job.end_time)
-                                                                       }
-                                                               }
-                                                       end
+                                                               project_list = get_child_job_project_name(job.job_id)
+                                                               doc.ProjectList(project_list)
+                                                       }
+                                                       generate_xml_sub_jobs(doc,job.job_id)
                                                end
                                        end
                                }
@@ -234,7 +219,6 @@ class JobsController < ApplicationController
                doc.JobList {
                        jobs.each {|job_list|
                                job = get_job_info(job_list.id)
-
                                doc.Job {
                                        doc.Id(job.job_id)
                                        doc.Distribution(job.distribution_name)
@@ -247,25 +231,11 @@ class JobsController < ApplicationController
                                        doc.UserName(job.user_name)
                                        doc.StartTime(job.start_time)
                                        doc.EndTime(job.end_time)
-                               }
 
-                               if job_list.job_attribute == "MULTI"
-                                       child_jobs = get_child_job_info(job.job_id)
-                                       child_jobs.each {|job|
-                                               doc.Job {
-                                                       doc.Id(job.job_id)
-                                                       doc.Distribution(job.distribution_name)
-                                                       doc.ProjectName(job.project_name)
-                                                       doc.JobType(job.job_type)
-                                                       doc.JobAttribute("CHILD")
-                                                       doc.Os(job.supported_os_name)
-                                                       doc.Status(job.status)
-                                                       doc.UserName(job.user_name)
-                                                       doc.StartTime(job.start_time)
-                                                       doc.EndTime(job.end_time)
-                                               }
-                                       }
-                               end
+                                       project_list = get_child_job_project_name(job.job_id)
+                                       doc.ProjectList(project_list)
+                               }
+                               generate_xml_sub_jobs(doc,job.job_id)
                        }
                }
        end
@@ -337,25 +307,11 @@ class JobsController < ApplicationController
                                                doc.UserName(job.user_name)
                                                doc.StartTime(job.start_time)
                                                doc.EndTime(job.end_time)
-                                       }
 
-                                       if job_list.job_attribute == "MULTI"
-                                               child_jobs = get_child_job_info(job.job_id)
-                                               child_jobs.each {|job|
-                                                       doc.Job {
-                                                               doc.Id(job.job_id)
-                                                               doc.Distribution(job.distribution_name)
-                                                               doc.ProjectName(job.project_name)
-                                                               doc.JobType(job.job_type)
-                                                               doc.JobAttribute("CHILD")
-                                                               doc.Os(job.supported_os_name)
-                                                               doc.Status(job.status)
-                                                               doc.UserName(job.user_name)
-                                                               doc.StartTime(job.start_time)
-                                                               doc.EndTime(job.end_time)
-                                                       }
-                                               }
-                                       end
+                                               project_list = get_child_job_project_name(job.job_id)
+                                               doc.ProjectList(project_list)
+                                       }
+                                       generate_xml_sub_jobs(doc,job.job_id)
                                }
                        }
                }
@@ -432,6 +388,9 @@ class JobsController < ApplicationController
                                                doc.UserName(job.user_name)
                                                doc.StartTime(job.start_time)
                                                doc.EndTime(job.end_time)
+
+                                               project_list = get_child_job_project_name(job.job_id)
+                                               doc.ProjectList(project_list)
                                        }
                                }
                        }
@@ -515,6 +474,54 @@ class JobsController < ApplicationController
                return job
        end
 
+       def get_child_job_project_name(parent_job_id)
+               project_list = nil
+               job = Job.find_by_sql("SELECT DISTINCT projects.name AS project_name
+                                                                 FROM jobs 
+                                                                 LEFT JOIN projects 
+                                                                   ON jobs.project_id = projects.id
+                                                                 WHERE jobs.parent_job_id = #{parent_job_id}
+                                                                 ORDER BY projects.name")
+               job.each do |job|
+                       if project_list.nil? then
+                               project_list = job.project_name
+                       else
+                               project_list = project_list + ', ' + job.project_name
+                       end
+               end
+               return project_list
+       end
+
+       def get_sub_job_count(job_id)
+               return Job.where(:parent_job_id => job_id).count
+       end
+       
+       def generate_xml_sub_jobs(doc, job_id)
+               sub_job_cnt = get_sub_job_count(job_id)
+               if sub_job_cnt > 0
+                       child_jobs = get_child_job_info(job_id)
+                       child_jobs.each {|job|
+                               doc.Job {
+                                       doc.Id(job.job_id)
+                                       doc.Distribution(job.distribution_name)
+                                       doc.ProjectName(job.project_name)
+                                       doc.JobType(job.job_type)
+                                       doc.JobAttribute("CHILD")
+                                       doc.ParentJobId(job.parent_job_id)
+                                       doc.Os(job.supported_os_name)
+                                       doc.Status(job.status)
+                                       doc.UserName(job.user_name)
+                                       doc.StartTime(job.start_time)
+                                       doc.EndTime(job.end_time)
+
+                                       project_list = get_child_job_project_name(job.job_id)
+                                       doc.ProjectList(project_list)
+                               }
+                               generate_xml_sub_jobs(doc,job.job_id)
+                       }
+               end
+       end
+
        def log_more
                line_cnt = 999
                conti= 1
@@ -578,7 +585,7 @@ class JobsController < ApplicationController
        
                        #read log file
                        log_contents = nil
-                       if start_line < end_line
+                       if start_line <= end_line
                                IO.popen("sed -n \"#{start_line},#{last_line}p\" #{path}") do |sed| 
                                        log_contents = sed.read
                                        if log_contents.include? "=LOG_END" then
index 7b9b8178ca840b9aeeed747c3453455c3b5e036c..1961916907e1c42004dd22e6fc047b43b05f6db5 100644 (file)
@@ -288,7 +288,7 @@ Contributors:
                                        <a href="#" onClick="searchJobDate()" data-role="button" data-mini="true"  data-inline="true">Search</a>
                                </div>
                                <br>
-
+                               <br>
                                <ul id="jobs-job-list" data-role="listview">
                                </ul>
                                <br>
index fb754827d0f15c1434870b0754f80553bc5ee9bf..c3005ab3a1c55c20fbe84328b36b455da2a5ff57 100644 (file)
@@ -310,17 +310,46 @@ function queryJobList(requestUrl, condition, param, queryDistribution, selectedS
                var lastJobId = 0;
                $(xml).find("JobList").find("Job").each(function(){
                        var id = $(this).find("Id").text();
-                       var li = generateHtmlJobList($(this));
+                       var jobAttribute = $(this).find("JobAttribute").text();
+                       var parentJobId = $(this).find("ParentJobId").text();
+                       var li = "";
+                       if(jobAttribute == "CHILD")
+                       {
+                               li = generateHtmlJobList($(this));
+                               console.log("add-child-job parent's id:"+parentJobId);
+                               $("#jobs-li-"+parentJobId+"-sub-job-area").append(li);
+                               $("#jobs-li-"+id).collapsible();
+                               $("#jobs-li-"+id+"-sub-job-button").button();
 
-                       lastJobId = id;
-                       $("#jobs-job-list").append(li).listview('refresh');
+                               $("#jobs-li-link-"+id).popupWindow({ 
+                                       height:900, 
+                                       width:800, 
+                                       top:30, 
+                                       left:50 
+                               });
+                               console.log("add-child-job id:"+id);
+
+                               //Display sub-jobs button
+                               if($("#jobs-li-"+parentJobId+"-sub-job-button-div").hasClass("ui-screen-hidden") == true) {
+                                       $("#jobs-li-"+parentJobId+"-sub-job-button-div").removeClass("ui-screen-hidden");
+                               }
+                       }
+                       else
+                       {
+                               li = generateHtmlJobList($(this));
+
+                               lastJobId = id;
+                               $("#jobs-job-list").append(li).listview('refresh');
+                               $("#jobs-li-"+id+"-sub-job-button").button();
+
+                               $("#jobs-li-link-"+id).popupWindow({ 
+                                       height:900, 
+                                       width:800, 
+                                       top:30, 
+                                       left:50 
+                               });
+                       }
 
-                       $("#jobs-li-link-"+id).popupWindow({ 
-                               height:900, 
-                               width:800, 
-                               top:30, 
-                               left:50 
-                       });
                });
 
                console.log("last job id :"+lastJobId);
@@ -354,17 +383,42 @@ function jobUpdateList(condition, param, distribution, selectedStatus) {
                // Add new job list
                $(xml).find("JobList").find("Job").each(function(){
                        var id = $(this).find("Id").text();
+                       var jobAttribute = $(this).find("JobAttribute").text();
+                       var parentJobId = $(this).find("ParentJobId").text();
                        var li = generateHtmlJobList($(this));
 
-                       $(li).insertBefore(firstLi);
-                       $("#jobs-job-list").listview('refresh');
-                       $("#jobs-li-link-"+id).popupWindow({ 
-                               height:900, 
-                               width:800, 
-                               top:30, 
-                               left:50 
-                       });
-                       console.log("ADD List :"+id);
+                       if(jobAttribute == "CHILD") {
+                               console.log("add-child-job parent's id:"+parentJobId);
+                               $("#jobs-li-"+parentJobId+"-sub-job-area").append(li);
+                               $("#jobs-li-"+id).collapsible();
+                               $("#jobs-li-"+id+"-sub-job-button").button();
+                               $("#jobs-job-list").listview('refresh');
+
+                               $("#jobs-li-link-"+id).popupWindow({ 
+                                       height:900, 
+                                       width:800, 
+                                       top:30, 
+                                       left:50 
+                               });
+                               console.log("add-child-job id:"+id);
+
+                               //Display sub-jobs button
+                               if($("#jobs-li-"+parentJobId+"-sub-job-button-div").hasClass("ui-screen-hidden") == true) {
+                                       $("#jobs-li-"+parentJobId+"-sub-job-button-div").removeClass("ui-screen-hidden");
+                               }
+                       }
+                       else {
+                               $(li).insertBefore(firstLi);
+                               $("#jobs-job-list").listview('refresh');
+                               $("#jobs-li-"+id+"-sub-job-button").button();
+                               $("#jobs-li-link-"+id).popupWindow({ 
+                                       height:900, 
+                                       width:800, 
+                                       top:30, 
+                                       left:50 
+                               });
+                               console.log("ADD List :"+id);
+                       }
                });
 
                // Update working job list
@@ -410,23 +464,25 @@ function jobUpdateList(condition, param, distribution, selectedStatus) {
                                console.log("UPDATE List :"+job_id);
                        }
                        else {
-                               var next_parent_job_li = $("#jobs-li-"+parent_job_id).nextAll(".jobs-li-header").first();
-                               console.log(parent_job_id);
-                               console.log($("#jobs-li-"+parent_job_id));
-                               console.log(next_parent_job_li);
-                               console.log(next_parent_job_li.text());
-
+                               console.log("add-child-job parent's id:"+parent_job_id);
                                var li = generateHtmlJobList($(this));
-
-                               $(li).insertBefore(next_parent_job_li);
+                               $("#jobs-li-"+parent_job_id+"-sub-job-area").append(li);
+                               $("#jobs-li-"+job_id).collapsible();
+                               $("#jobs-li-"+job_id+"-sub-job-button").button();
                                $("#jobs-job-list").listview('refresh');
+
                                $("#jobs-li-link-"+job_id).popupWindow({ 
                                        height:900, 
                                        width:800, 
                                        top:30, 
                                        left:50 
                                });
-                               console.log("ADD child list :"+job_id);
+                               console.log("add-child-job id:"+job_id);
+
+                               //Display sub-jobs button
+                               if($("#jobs-li-"+parent_job_id+"-sub-job-button-div").hasClass("ui-screen-hidden") == true) {
+                                       $("#jobs-li-"+parent_job_id+"-sub-job-button-div").removeClass("ui-screen-hidden");
+                               }
                        }
                });
        });
@@ -536,6 +592,7 @@ function jobsClear() {
        clearJobList();
 }
 
+
 function generateHtmlJobList(xml) {
        var id = xml.find("Id").text();
        var distribution = xml.find("Distribution").text();
@@ -547,6 +604,7 @@ function generateHtmlJobList(xml) {
        var userName = xml.find("UserName").text();
        var startTime = xml.find("StartTime").text();
        var endTime = xml.find("EndTime").text();
+       var projectList = xml.find("ProjectList").text();
        var li = "";
        var font_color = "black";
 
@@ -579,7 +637,7 @@ function generateHtmlJobList(xml) {
        {
                li = '<li class="jobs-li-header" data-role="list-divider" title="'+id+'">'
                        + '<span>'+id+ ' ' +projectName+ '</span><span style="float: right">'+distribution+'</span></li>'
-                       + '<li id="jobs-li-'+id+'" class="jobs-list-data" title="'+id+'">'
+                       + '<li id="jobs-li-'+id+'" class="jobs-list-data" title="'+id+'" data-icon="false">'
                        + '<a href=log.html?jobid='+id+' id="jobs-li-link-'+id+'" class="logWindow" data-ajax="false">'
                        + '<h3>' +projectName+ '</h3>'
                        + '<p>ID : <strong>' +id+ '</strong></p>'
@@ -589,46 +647,61 @@ function generateHtmlJobList(xml) {
                        + '<p id="jobs-li-time-'+id+'">TIME: <strong>' +startTime+ ' ~ '+endTime+ '</strong></p>';
                         
                        li = li + '<p id="jobs-li-status-'+id+'" class="ui-li-aside jobs-li-status"><strong><font color="'+font_color+'">'+jobStatus+'</strong></p>';
-                       li = li + '<div hidden="hidden" class="jobs-li-hidden ui-screen-hidden">'
+                       li = li + '</a>';
+               li = li + '<div id="jobs-li-'+id+'-sub-job-button-div" class="ui-screen-hidden" style="position: absolute; top: 95px; right: 20px;"><button id="jobs-li-'+id+'-sub-job-button" data-inline="true" data-mini="true" data-icon="plus" data-iconpos="notext" data-corners="true" onClick="clickSubJobs('+id+')"></button></div>'
+                       li = li + '<div class="ui-screen-hidden">'
                                + '<p class="jobs-li-hidden-id">'+id+'</p>'
                                + '<p class="jobs-li-hidden-attr">'+jobAttribute+'</p>'
                                + '</div>';
-                       li = li + '</a></li>';
+                       li = li + '</li>';
+                       //For Sub job
+                       li = li + '<li id="jobs-li-'+id+'-child" class="ui-screen-hidden">'
+                               + '<div id="jobs-li-'+id+'-sub-job-area"></div></li>';
        }
        else if(jobAttribute == "MULTI")
        {
                li = '<li class="jobs-li-header" data-role="list-divider" title="'+id+'">'
-                       + '<span>'+id+ ' ' +jobAttribute+ '</span><span style="float: right">'+distribution+'</span></li>'
-                       + '<li id="jobs-li-'+id+'" class="jobs-list-data" title="'+id+'">'
-                       + '<a href=log.html?jobid='+id+' id="jobs-li-link-'+id+'" class="logWindow" data-ajax="false">'
+                       + '<span>'+id+ ' ' +jobAttribute+ '</span><span style="float: right">'+distribution+'</span></li>';
+               li = li + '<li id="jobs-li-'+id+'" class="jobs-list-data" title="'+id+'" data-icon="false">';
+               li = li + '<a href=log.html?jobid='+id+' id="jobs-li-link-'+id+'" class="logWindow" data-ajax="false">'
+                       + '<h3>' +projectList+ '</h3>'
+                       + '<p>ID : <strong>' +id+ '</strong></p>'
+                       + '<p>TYPE : <strong>' +jobType+ '</strong></p>'
                        + '<p>USER : <strong>' +userName+ '</strong></p>'
                        + '<p id="jobs-li-time-'+id+'">TIME: <strong>' +startTime+ ' ~ '+endTime+ '</strong></p>'
-                       + '<p id="jobs-li-attr-'+id+'" hidden="hidden">'+jobAttribute+'</p>';
                        
-                       li = li + '<p id="jobs-li-status-'+id+'" class="ui-li-aside jobs-li-status" title="'+id+'"><strong><font color="'+font_color+'">'+jobStatus+'</strong></p>';
-                       li = li + '<div hidden="hidden" class="jobs-li-hidden ui-screen-hidden">'
-                               + '<p class="jobs-li-hidden-id">'+id+'</p>'
-                               + '<p class="jobs-li-hidden-attr">'+jobAttribute+'</p>'
-                               + '</div>';
-                       li = li + '</a></li>';
+               li = li + '<p id="jobs-li-status-'+id+'" class="ui-li-aside jobs-li-status" title="'+id+'"><strong><font color="'+font_color+'">'+jobStatus+'</strong></p>';
+               li = li + '</a>';
+               li = li + '<div id="jobs-li-'+id+'-sub-job-button-div" class="ui-screen-hidden" style="position: absolute; top: 80px; right: 20px;"><button id="jobs-li-'+id+'-sub-job-button" data-inline="true" data-mini="true" data-icon="plus" data-iconpos="notext" data-corners="true" onClick="clickSubJobs('+id+')"></button></div>'
+               li = li + '<div class="ui-screen-hidden">'
+                       + '<p class="jobs-li-hidden-id">'+id+'</p>'
+                       + '<p class="jobs-li-hidden-attr">'+jobAttribute+'</p>'
+                       + '</div>';
+               li = li + '</li>';
+               //For Sub job
+               li = li + '<li id="jobs-li-'+id+'-child" class="ui-screen-hidden">'
+                               + '<div id="jobs-li-'+id+'-sub-job-area"></div></li>';
        }
        else if(jobAttribute == "CHILD")
        {
-               li = '<li id="jobs-li-'+id+'" class="jobs-list-data" title="'+id+'">'
-                       + '<a href=log.html?jobid='+id+' id="jobs-li-link-'+id+'" class="logWindow" data-ajax="false">'
-                       + '<h3>' +projectName+ '</h3>'
-                       + '<p>ID : <strong>' +id+ '</strong></p>'
+               li = '<div id="jobs-li-'+id+'" class="jobs-list-data" title="'+id+'" data-role="collapsible" data-collapsed="true" data-mini="true" data-iconpos="right" style="clear: both;">'
+                       + '<h3><span style="width: 80%;">['+id+ '] '+projectName+' - '+os+'</span><span id="jobs-li-status-'+id+'" class="jobs-li-status" style="float: right; font-size: 12px;"><font color="'+font_color+'">'+jobStatus+'</font></span></h3>'
+                       + '<a href=log.html?jobid='+id+' id="jobs-li-link-'+id+'" class="logWindow" data-ajax="false" style="text-decoration: none; color: black">'
+                       + '<h4>' +projectName+ '</h4>'
+                       + '<p class="ui-li-desc">ID : <strong>' +id+ '</strong></p>'
                        + '<p>TYPE : <strong>' +jobType+ '</strong></p>'
                        + '<p>OS : <strong>' +os+ '</strong></p>'
                        + '<p id="jobs-li-time-'+id+'">TIME: <strong>' +startTime+ ' ~ '+endTime+ '</strong></p>'
-                       + '<p id="jobs-li-attr-'+id+'" hidden="hidden">'+jobAttribute+'</p>';
-                       
-                       li = li + '<p id="jobs-li-status-'+id+'" class="ui-li-aside jobs-list-status" title="'+id+'"><strong><font color="'+font_color+'">'+jobStatus+'</strong></p>';
-                       li = li + '<div hidden="hidden" class="jobs-li-hidden ui-screen-hidden">'
-                               + '<p class="jobs-li-hidden-id">'+id+'</p>'
-                               + '<p class="jobs-li-hidden-attr">'+jobAttribute+'</p>'
-                               + '</div>';
-                       li = li + '</a></li>';
+                       + '</a>';       
+               li = li + '<div class="ui-screen-hidden">'
+                       + '<p class="jobs-li-hidden-id">'+id+'</p>'
+                       + '<p class="jobs-li-hidden-attr">'+jobAttribute+'</p>'
+                       + '</div>';
+               li = li + '<div id="jobs-li-'+id+'-sub-job-button-div" class="ui-screen-hidden" style="float: right; position: relative; top: -20px;"><button id="jobs-li-'+id+'-sub-job-button" data-inline="true" data-mini="true" data-icon="minus" data-iconpos="notext" data-corners="true" onClick="clickSubJobs('+id+')"></button></div>';
+               //For Sub job
+               li = li + '<div id="jobs-li-'+id+'-child" style="clear: both; width: 97%; position: relative; left: 30px;">'
+                               + '<div id="jobs-li-'+id+'-sub-job-area"></div></div>';
+               li = li + '</div>';
        }
 
        return li;
@@ -648,9 +721,7 @@ function searchWorkingList() {
                        case "WORKING" :
                        case "REMOTE_WORKING" :
                        case "WAITING" :
-                               if(job_attr != "CHILD") {
-                                       working_job_array.push(job_id);
-                               }
+                               working_job_array.push(job_id);
                                break;
                        default:
                                break;
@@ -693,3 +764,14 @@ function isPolling(idx) {
        }
 }
 
+function clickSubJobs(job_id) {
+       if($("#jobs-li-"+job_id+"-child").hasClass("ui-screen-hidden") == true) {
+               $("#jobs-li-"+job_id+"-child").removeClass("ui-screen-hidden");
+               $("#jobs-li-"+job_id+"-sub-job-button").buttonMarkup({icon:"minus"});
+       }
+       else {
+               $("#jobs-li-"+job_id+"-child").addClass("ui-screen-hidden");
+               $("#jobs-li-"+job_id+"-sub-job-button").buttonMarkup({icon:"plus"});
+       }
+}
+