diff options
| -rw-r--r-- | bitbake/lib/toaster/toastergui/static/js/mrbsection.js | 95 | ||||
| -rw-r--r-- | bitbake/lib/toaster/toastergui/templates/mrb_section.html | 148 |
2 files changed, 149 insertions, 94 deletions
diff --git a/bitbake/lib/toaster/toastergui/static/js/mrbsection.js b/bitbake/lib/toaster/toastergui/static/js/mrbsection.js new file mode 100644 index 0000000000..09117e1daf --- /dev/null +++ b/bitbake/lib/toaster/toastergui/static/js/mrbsection.js | |||
| @@ -0,0 +1,95 @@ | |||
| 1 | |||
| 2 | function mrbSectionInit(ctx){ | ||
| 3 | |||
| 4 | var projectBuilds; | ||
| 5 | |||
| 6 | if (ctx.mrbType === 'project') | ||
| 7 | projectBuilds = true; | ||
| 8 | |||
| 9 | $(".cancel-build-btn").click(function(e){ | ||
| 10 | e.preventDefault(); | ||
| 11 | |||
| 12 | var url = $(this).data('request-url'); | ||
| 13 | var buildReqIds = $(this).data('buildrequest-id'); | ||
| 14 | var banner = $(this).parents(".alert"); | ||
| 15 | |||
| 16 | banner.find(".progress-info").fadeOut().promise().done(function(){ | ||
| 17 | $("#cancelling-msg-" + buildReqIds).show(); | ||
| 18 | console.log("cancel build"); | ||
| 19 | libtoaster.cancelABuild(url, buildReqIds, function(){ | ||
| 20 | if (projectBuilds == false){ | ||
| 21 | /* the all builds page is not 'self updating' like thei | ||
| 22 | * project Builds | ||
| 23 | */ | ||
| 24 | window.location.reload(); | ||
| 25 | } | ||
| 26 | }, null); | ||
| 27 | }); | ||
| 28 | }); | ||
| 29 | |||
| 30 | $(".run-again-btn").click(function(e){ | ||
| 31 | e.preventDefault(); | ||
| 32 | |||
| 33 | var url = $(this).data('request-url'); | ||
| 34 | var target = $(this).data('target'); | ||
| 35 | |||
| 36 | libtoaster.startABuild(url, target, function(){ | ||
| 37 | window.location.reload(); | ||
| 38 | }, null); | ||
| 39 | }); | ||
| 40 | |||
| 41 | |||
| 42 | var progressTimer; | ||
| 43 | |||
| 44 | if (projectBuilds === true){ | ||
| 45 | progressTimer = window.setInterval(function() { | ||
| 46 | libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, | ||
| 47 | function(prjInfo){ | ||
| 48 | /* These two are needed because a build can be 100% and still | ||
| 49 | * in progress due to the fact that the % done is updated at the | ||
| 50 | * start of a task so it can be doing the last task at 100% | ||
| 51 | */ | ||
| 52 | var inProgress = 0; | ||
| 53 | var allPercentDone = 0; | ||
| 54 | if (prjInfo.builds.length === 0) | ||
| 55 | return | ||
| 56 | |||
| 57 | for (var i in prjInfo.builds){ | ||
| 58 | var build = prjInfo.builds[i]; | ||
| 59 | |||
| 60 | if (build.outcome === "In Progress" || | ||
| 61 | $(".progress .bar").length > 0){ | ||
| 62 | /* Update the build progress */ | ||
| 63 | var percentDone; | ||
| 64 | |||
| 65 | if (build.outcome !== "In Progress"){ | ||
| 66 | /* We have to ignore the value when it's Succeeded because it | ||
| 67 | * goes back to 0 | ||
| 68 | */ | ||
| 69 | percentDone = 100; | ||
| 70 | } else { | ||
| 71 | percentDone = build.percentDone; | ||
| 72 | inProgress++; | ||
| 73 | } | ||
| 74 | |||
| 75 | $("#build-pc-done-" + build.id).text(percentDone); | ||
| 76 | $("#build-pc-done-title-" + build.id).attr("title", percentDone); | ||
| 77 | $("#build-pc-done-bar-" + build.id).css("width", | ||
| 78 | String(percentDone) + "%"); | ||
| 79 | |||
| 80 | allPercentDone += percentDone; | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | if (allPercentDone === (100 * prjInfo.builds.length) && !inProgress) | ||
| 85 | window.location.reload(); | ||
| 86 | |||
| 87 | /* Our progress bar is not still showing so shutdown the polling. */ | ||
| 88 | if ($(".progress .bar").length === 0) | ||
| 89 | window.clearInterval(progressTimer); | ||
| 90 | |||
| 91 | }); | ||
| 92 | }, 1500); | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html index 551e341a5d..b5e798d7cc 100644 --- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html +++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html | |||
| @@ -2,6 +2,21 @@ | |||
| 2 | {% load projecttags %} | 2 | {% load projecttags %} |
| 3 | {% load project_url_tag %} | 3 | {% load project_url_tag %} |
| 4 | {% load humanize %} | 4 | {% load humanize %} |
| 5 | <script src="{% static 'js/mrbsection.js' %}"></script> | ||
| 6 | <script> | ||
| 7 | $(document).ready(function () { | ||
| 8 | var ctx = { | ||
| 9 | mrbType : "{{mrb_type}}", | ||
| 10 | } | ||
| 11 | |||
| 12 | try { | ||
| 13 | mrbSectionInit(ctx); | ||
| 14 | } catch (e) { | ||
| 15 | document.write("Sorry, An error has occurred loading this page"); | ||
| 16 | console.warn(e); | ||
| 17 | } | ||
| 18 | }); | ||
| 19 | </script> | ||
| 5 | 20 | ||
| 6 | {%if mru and mru.count > 0%} | 21 | {%if mru and mru.count > 0%} |
| 7 | 22 | ||
| @@ -99,7 +114,7 @@ | |||
| 99 | " title="Builds in this project cannot be started from Toaster: they are started from the command line"> | 114 | " title="Builds in this project cannot be started from Toaster: they are started from the command line"> |
| 100 | </i> | 115 | </i> |
| 101 | {% else %} | 116 | {% else %} |
| 102 | <button class="btn | 117 | <button class="run-again-btn btn |
| 103 | {% if build.outcome == build.SUCCEEDED %} | 118 | {% if build.outcome == build.SUCCEEDED %} |
| 104 | btn-success | 119 | btn-success |
| 105 | {% elif build.outcome == build.FAILED %} | 120 | {% elif build.outcome == build.FAILED %} |
| @@ -108,10 +123,9 @@ | |||
| 108 | btn-info | 123 | btn-info |
| 109 | {%endif%} | 124 | {%endif%} |
| 110 | pull-right" | 125 | pull-right" |
| 111 | onclick='scheduleBuild({% url 'projectbuilds' build.project.id as bpi %}{{bpi|json}}, | 126 | data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" |
| 112 | {{build.project.name|json}}, | 127 | data-target='{{build.target_set.all|get_tasks|json}}'> |
| 113 | {% url 'project' build.project.id as purl %}{{purl|json}}, | 128 | |
| 114 | {{build.target_set.all|get_tasks|json}})'> | ||
| 115 | 129 | ||
| 116 | Rebuild | 130 | Rebuild |
| 117 | </button> | 131 | </button> |
| @@ -119,100 +133,46 @@ | |||
| 119 | </div> | 133 | </div> |
| 120 | {%endif%} | 134 | {%endif%} |
| 121 | {%if build.outcome == build.IN_PROGRESS %} | 135 | {%if build.outcome == build.IN_PROGRESS %} |
| 122 | <div class="span4 offset1"> | 136 | <div class="span4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}"> |
| 123 | <div class="progress" id="build-pc-done-title-{{build.pk}}" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete"> | 137 | <p class="lead">Cancelling the build ...</p> |
| 124 | <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="bar"></div> | ||
| 125 | </div> | ||
| 126 | </div> | ||
| 127 | <div class="lead pull-right"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div> | ||
| 128 | {%endif%} | ||
| 129 | </div> | ||
| 130 | </div> | 138 | </div> |
| 139 | <div class="span4 offset1 progress-info"> | ||
| 140 | <div class="progress" id="build-pc-done-title-{{build.pk}}" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete"> | ||
| 141 | <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="bar"></div> | ||
| 142 | </div> | ||
| 143 | </div> | ||
| 144 | <div class="lead span3 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div> | ||
| 145 | {# No build cancel for command line builds project #} | ||
| 146 | {% if build.project.is_default %} | ||
| 147 | <i class="icon-question-sign get-help get-help-blue pull-right" title="" data-original-title="Builds in this project cannot be cancelled from Toaster: they can only be cancalled from the command line"></i> | ||
| 148 | {% else %} | ||
| 149 | <div class="lead pull-right progress-info"> | ||
| 150 | <button class="cancel-build-btn btn btn-info pull-right" | ||
| 151 | data-buildrequest-id={{build.buildrequest.pk}} | ||
| 152 | data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" > | ||
| 153 | Cancel | ||
| 154 | </button> | ||
| 155 | </div> | ||
| 156 | {% endif %} | ||
| 131 | 157 | ||
| 132 | {% endfor %} | 158 | {%endif%} {# end if in progress #} |
| 133 | </div> | ||
| 134 | |||
| 135 | <script> | ||
| 136 | |||
| 137 | function scheduleBuild(url, projectName, projectUrl, buildlist) { | ||
| 138 | console.log("scheduleBuild"); | ||
| 139 | libtoaster.startABuild(url, null, buildlist.join(" "), function(){ | ||
| 140 | console.log("reloading page"); | ||
| 141 | window.location.reload(); | ||
| 142 | }, null); | ||
| 143 | } | ||
| 144 | |||
| 145 | $(document).ready(function(){ | ||
| 146 | |||
| 147 | $(".cancel-build-btn").click(function (){ | ||
| 148 | var url = $(this).data('request-url'); | ||
| 149 | var buildIds = $(this).data('build-id'); | ||
| 150 | var btn = $(this); | ||
| 151 | |||
| 152 | libtoaster.cancelABuild(url, buildIds, function(){ | ||
| 153 | btn.parents(".alert").fadeOut(); | ||
| 154 | }, null); | ||
| 155 | }); | ||
| 156 | |||
| 157 | {%if mrb_type == 'project' %} | ||
| 158 | var projectBuilds = true; | ||
| 159 | {% else %} | ||
| 160 | var projectBuilds = false; | ||
| 161 | {% endif %} | ||
| 162 | |||
| 163 | var progressTimer; | ||
| 164 | |||
| 165 | if (projectBuilds === true){ | ||
| 166 | progressTimer = window.setInterval(function() { | ||
| 167 | libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, | ||
| 168 | function(prjInfo){ | ||
| 169 | /* These two are needed because a build can be 100% and still | ||
| 170 | * in progress due to the fact that the % done is updated at the | ||
| 171 | * start of a task so it can be doing the last task at 100% | ||
| 172 | */ | ||
| 173 | var inProgress = 0; | ||
| 174 | var allPercentDone = 0; | ||
| 175 | |||
| 176 | for (var i in prjInfo.builds){ | ||
| 177 | var build = prjInfo.builds[i]; | ||
| 178 | |||
| 179 | if (build.outcome === "In Progress" || | ||
| 180 | $(".progress .bar").length > 0){ | ||
| 181 | /* Update the build progress */ | ||
| 182 | var percentDone; | ||
| 183 | |||
| 184 | if (build.outcome !== "In Progress"){ | ||
| 185 | /* We have to ignore the value when it's Succeeded because it | ||
| 186 | * goes back to 0 | ||
| 187 | */ | ||
| 188 | percentDone = 100; | ||
| 189 | } else { | ||
| 190 | percentDone = build.percentDone; | ||
| 191 | inProgress++; | ||
| 192 | } | ||
| 193 | |||
| 194 | $("#build-pc-done-" + build.id).text(percentDone); | ||
| 195 | $("#build-pc-done-title-" + build.id).attr("title", percentDone); | ||
| 196 | $("#build-pc-done-bar-" + build.id).css("width", | ||
| 197 | String(percentDone) + "%"); | ||
| 198 | |||
| 199 | allPercentDone += percentDone; | ||
| 200 | } | ||
| 201 | } | ||
| 202 | |||
| 203 | if (allPercentDone === (100 * prjInfo.builds.length) && !inProgress) | ||
| 204 | window.location.reload(); | ||
| 205 | 159 | ||
| 206 | /* Our progress bar is not still showing so shutdown the polling. */ | 160 | {% if build.outcome == build.CANCELLED %} |
| 207 | if ($(".progress .bar").length === 0) | 161 | <div class="span4"> |
| 208 | window.clearInterval(progressTimer); | 162 | <p class="lead">Build cancelled</p> |
| 163 | </div> | ||
| 164 | <button class="btn btn-info pull-right run-again-btn" | ||
| 165 | data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" | ||
| 166 | data-target='{{build.target_set.all|get_tasks|json}}'> | ||
| 167 | Rebuild | ||
| 209 | 168 | ||
| 210 | }); | 169 | </button> |
| 211 | }, 1500); | 170 | {% endif %} |
| 212 | } | 171 | </div> |
| 213 | }); | 172 | </div> |
| 214 | 173 | ||
| 215 | </script> | 174 | {% endfor %} |
| 175 | </div> | ||
| 216 | 176 | ||
| 217 | {%endif%} | 177 | {%endif%} |
| 218 | 178 | ||
