summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui/templates
diff options
context:
space:
mode:
authorBelen Barros Pena <belen.barros.pena@linux.intel.com>2016-04-12 15:56:43 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2016-06-15 08:35:03 +0100
commit443f7b39158c891015a791814b9b1fe2324edc41 (patch)
tree3f570a138594273bc7498225e066b7f9a99bf0c5 /bitbake/lib/toaster/toastergui/templates
parent79e0eb9e52e9b954aa3b6bc6dee15a75b5eb990c (diff)
downloadpoky-443f7b39158c891015a791814b9b1fe2324edc41.tar.gz
bitbake: toaster: Migrate project configuration from bootstrap 2 to bootstrap 3
Convert all the HTML templates, JS and CSS in the project parts of toaster to use bootstrap 3. (Bitbake rev: 69527a731eada699d3f604ff8f3ae9410981ba9b) Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com> Signed-off-by: Michael Wood <michael.g.wood@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/toaster/toastergui/templates')
-rw-r--r--bitbake/lib/toaster/toastergui/templates/base.html86
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html45
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basebuildpage.html7
-rw-r--r--bitbake/lib/toaster/toastergui/templates/baseprojectpage.html38
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_bottom.html12
-rw-r--r--bitbake/lib/toaster/toastergui/templates/basetable_top.html8
-rw-r--r--bitbake/lib/toaster/toastergui/templates/bpackage.html18
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builddashboard.html85
-rw-r--r--bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html8
-rw-r--r--bitbake/lib/toaster/toastergui/templates/builds-toastertable.html8
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configuration.html47
-rw-r--r--bitbake/lib/toaster/toastergui/templates/configvars.html123
-rw-r--r--bitbake/lib/toaster/toastergui/templates/customise_btn.html6
-rw-r--r--bitbake/lib/toaster/toastergui/templates/customrecipe.html199
-rw-r--r--bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html6
-rw-r--r--bitbake/lib/toaster/toastergui/templates/detail_search_header.html8
-rw-r--r--bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html2
-rw-r--r--bitbake/lib/toaster/toastergui/templates/dirinfo.html6
-rw-r--r--bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html67
-rw-r--r--bitbake/lib/toaster/toastergui/templates/filtersnippet.html113
-rw-r--r--bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html2
-rw-r--r--bitbake/lib/toaster/toastergui/templates/importlayer.html260
-rw-r--r--bitbake/lib/toaster/toastergui/templates/landing.html23
-rw-r--r--bitbake/lib/toaster/toastergui/templates/landing_not_managed.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layer_btn.html12
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layerdetails.html457
-rw-r--r--bitbake/lib/toaster/toastergui/templates/machine_btn.html10
-rw-r--r--bitbake/lib/toaster/toastergui/templates/mrb_section.html121
-rw-r--r--bitbake/lib/toaster/toastergui/templates/newcustomimage.html15
-rw-r--r--bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html63
-rw-r--r--bitbake/lib/toaster/toastergui/templates/newproject.html51
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_detail_base.html20
-rw-r--r--bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html12
-rw-r--r--bitbake/lib/toaster/toastergui/templates/project.html102
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html67
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projectbuilds.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projectconf.html1969
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projects-toastertable.html58
-rw-r--r--bitbake/lib/toaster/toastergui/templates/projecttopbar.html86
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipe.html13
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipe_btn.html13
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipe_packages.html15
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipedetails.html154
-rw-r--r--bitbake/lib/toaster/toastergui/templates/recipes.html24
-rw-r--r--bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html4
-rw-r--r--bitbake/lib/toaster/toastergui/templates/target.html17
-rw-r--r--bitbake/lib/toaster/toastergui/templates/task.html14
-rw-r--r--bitbake/lib/toaster/toastergui/templates/tasks.html16
-rw-r--r--bitbake/lib/toaster/toastergui/templates/toastertable-filter.html32
-rw-r--r--bitbake/lib/toaster/toastergui/templates/toastertable-simple.html94
-rw-r--r--bitbake/lib/toaster/toastergui/templates/toastertable.html122
-rw-r--r--bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html4
55 files changed, 2456 insertions, 2306 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 2cbc1872e8..73e4cd81c4 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -8,9 +8,8 @@
8 {% block title %} Toaster {% endblock %} 8 {% block title %} Toaster {% endblock %}
9 </title> 9 </title>
10 <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css"/> 10 <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css"/>
11 <link rel="stylesheet" href="{% static 'css/bootstrap-responsive.min.css' %}" type='text/css'/> 11 <!--link rel="stylesheet" href="{% static 'css/bootstrap-theme.css' %}" type="text/css"/-->
12 <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/> 12 <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/>
13 <link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'/>
14 <link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/> 13 <link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/>
15 14
16 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 15 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -60,69 +59,72 @@
60 {% endblock %} 59 {% endblock %}
61 </head> 60 </head>
62 61
63 <body style="height: 100%"> 62 <body>
64 63
65 {% csrf_token %} 64 {% csrf_token %}
66 <div id="loading-notification" class="alert lead text-center" style="display:none"> 65 <div id="loading-notification" class="alert lead text-center" style="display:none">
67 Loading <i class="fa-pulse icon-spinner"></i> 66 Loading <i class="fa-pulse icon-spinner"></i>
68 </div> 67 </div>
69 68
70 <div id="change-notification" class="alert lead alert-info" style="display:none"> 69 <div id="change-notification" class="alert alert-info alert-dismissible change-notification" style="display:none">
71 <button type="button" class="close" id="hide-alert">&times;</button> 70 <button type="button" class="close" id="hide-alert" data-dismiss="alert">&times;</button>
72 <span id="change-notification-msg"></span> 71 <span id="change-notification-msg"></span>
73 </div> 72 </div>
74 73
75 <div class="navbar navbar-fixed-top"> 74 <nav class="navbar navbar-default navbar-fixed-top">
76 <div class="navbar-inner"> 75 <div class="container-fluid">
77 <div class="container-fluid"> 76 <div class="navbar-header">
78 <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a> 77 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#global-nav" aria-expanded="false">
79 <span class="brand"> 78 <span class="sr-only">Toggle navigation</span>
80 <a href="/">Toaster</a> 79 <span class="icon-bar"></span>
80 <span class="icon-bar"></span>
81 <span class="icon-bar"></span>
82 </button>
83 <div class="toaster-navbar-brand">
84 <a href="/">
85 <img class="logo" src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/>
86 </a>
87 <a class="brand" href="/">Toaster</a>
81 {% if DEBUG %} 88 {% if DEBUG %}
82 <i class="icon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Git branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Git revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i> 89 <span class="glyphicon glyphicon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Git branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Git revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i>
83 {% endif %} 90 {% endif %}
84 </span> 91 </div>
85 {% if request.resolver_match.url_name != 'landing' and request.resolver_match.url_name != 'newproject' %} 92 </div>
86 <ul class="nav"> 93 <div class="collapse navbar-collapse" id="global-nav">
87 <li {% if request.resolver_match.url_name == 'all-builds' %} 94 <ul class="nav navbar-nav">
88 class="active" 95 {% if request.resolver_match.url_name != 'landing' and request.resolver_match.url_name != 'newproject' %}
89 {% endif %}> 96 <li {% if request.resolver_match.url_name == 'all-builds' %}
97 class="active"
98 {% endif %}>
90 <a href="{% url 'all-builds' %}"> 99 <a href="{% url 'all-builds' %}">
91 <i class="icon-tasks"></i> 100 <i class="glyphicon glyphicon-tasks"></i>
92 All builds 101 All builds
93 </a> 102 </a>
94 </li> 103 </li>
95 <li {% if request.resolver_match.url_name == 'all-projects' %} 104 <li {% if request.resolver_match.url_name == 'all-projects' %}
96 class="active" 105 class="active"
97 {% endif %}> 106 {% endif %}>
98 <a href="{% url 'all-projects' %}"> 107 <a href="{% url 'all-projects' %}">
99 <i class="icon-folder-open"></i> 108 <i class="icon-folder-open"></i>
100 All projects 109 All projects
101 </a> 110 </a>
102 </li> 111 </li>
103 </ul> 112 {% endif %}
104 {% endif %} 113 <li>
105 <ul class="nav pull-right">
106 <li>
107 <a target="_blank" href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html"> 114 <a target="_blank" href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
108 <i class="icon-book"></i> 115 <i class="glyphicon glyphicon-book"></i>
109 Manual 116 Documentation
110 </a> 117 </a>
111 </li> 118 </li>
112 </ul> 119 </ul>
113 <span class="pull-right divider-vertical"></span> 120 <a class="btn btn-default navbar-btn navbar-right" id="new-project-button" href="{% url 'newproject' %}">New project</a>
114 <div class="btn-group pull-right">
115 <a class="btn" id="new-project-button" href="{% url 'newproject' %}">New project</a>
116 </div> 121 </div>
117 </div>
118 </div> 122 </div>
119 </div> 123 </nav>
120 124
121 <div class="container-fluid top-padded"> 125 <div class="container-fluid">
122 <div class="row-fluid"> 126 {% block pagecontent %}
123 {% block pagecontent %} 127 {% endblock %}
124 {% endblock %}
125 </div>
126 </div> 128 </div>
127 </body> 129 </body>
128</html> 130</html>
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
index a62e0b1cb8..3a4c38347d 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
@@ -3,30 +3,27 @@
3{% load humanize %} 3{% load humanize %}
4{% block pagecontent %} 4{% block pagecontent %}
5 5
6<div class="row-fluid"> 6<div class="row">
7<!-- Breadcrumbs --> 7 <!-- Breadcrumbs -->
8 <div class="section"> 8 <ul class="breadcrumb" id="breadcrumb">
9 <ul class="breadcrumb" id="breadcrumb"> 9 <li><a href="{% project_url build.project %}">{{build.project.name}}</a></li>
10 <li><a href="{% project_url build.project %}">{{build.project.name}}</a></li> 10 {% if not build.project.is_default %}
11 {% if not build.project.is_default %} 11 <li><a href="{% url 'projectbuilds' build.project.id %}">Builds</a></li>
12 <li><a href="{% url 'projectbuilds' build.project.id %}">Builds</a></li> 12 {% endif %}
13 {% endif %} 13 <li><a href="{%url 'builddashboard' build.pk%}">{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+{{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})</a></li>
14 <li><a href="{%url 'builddashboard' build.pk%}">{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+{{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})</a></li> 14 {% block localbreadcrumb %}{% endblock %}
15 {% block localbreadcrumb %}{% endblock %} 15 </ul>
16 </ul> 16 <script>
17 <script> 17$( function () {
18 $( function () { 18 $('#breadcrumb > li').append('<span class="divider">&rarr;</span>');
19 $('#breadcrumb > li').append('<span class="divider">&rarr;</span>'); 19 $('#breadcrumb > li:last').addClass("active");
20 $('#breadcrumb > li:last').addClass("active"); 20 $('#breadcrumb > li:last > span').remove();
21 $('#breadcrumb > li:last > span').remove(); 21 });
22 }); 22 </script>
23 </script>
24 </div> <!--section-->
25
26 <!-- Begin container -->
27 {% block pagedetailinfomain %}{% endblock %}
28 <!-- End container -->
29
30</div> 23</div>
31 24
25<!-- Begin container -->
26{% block pagedetailinfomain %}{% endblock %}
27<!-- End container -->
28
32{% endblock %} 29{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
index 0d8c8820da..76a602bf07 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
@@ -4,6 +4,8 @@
4{% load objects_to_dictionaries_filter %} 4{% load objects_to_dictionaries_filter %}
5{% load humanize %} 5{% load humanize %}
6{% block pagecontent %} 6{% block pagecontent %}
7
8<div class="row">
7 <!-- breadcrumbs --> 9 <!-- breadcrumbs -->
8 <div class="section"> 10 <div class="section">
9 <ul class="breadcrumb" id="breadcrumb"> 11 <ul class="breadcrumb" id="breadcrumb">
@@ -28,10 +30,11 @@
28 }); 30 });
29 </script> 31 </script>
30 </div> 32 </div>
33</div>
31 34
32 <div class="row-fluid"> 35 <div class="row">
33 <!-- begin left sidebar container --> 36 <!-- begin left sidebar container -->
34 <div id="nav" class="span2"> 37 <div id="nav" class="col-md-2">
35 <ul class="nav nav-list well"> 38 <ul class="nav nav-list well">
36 <li 39 <li
37 {% if request.resolver_match.url_name == 'builddashboard' %} 40 {% if request.resolver_match.url_name == 'builddashboard' %}
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 8778305f3f..b3b6f1caf8 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -7,24 +7,24 @@
7 7
8{% block pagecontent %} 8{% block pagecontent %}
9 9
10{% include "projecttopbar.html" %} 10<div class="row">
11<script type="text/javascript"> 11 {% include "projecttopbar.html" %}
12 $(document).ready(function(){ 12 <script type="text/javascript">
13 $("#config-nav .nav li a").each(function(){ 13$(document).ready(function(){
14 if (window.location.pathname === $(this).attr('href')) 14 $("#config-nav .nav li a").each(function(){
15 $(this).parent().addClass('active'); 15 if (window.location.pathname === $(this).attr('href'))
16 else 16 $(this).parent().addClass('active');
17 $(this).parent().removeClass('active'); 17 else
18 }); 18 $(this).parent().removeClass('active');
19 19 });
20 $("#topbar-configuration-tab").addClass("active") 20
21 }); 21 $("#topbar-configuration-tab").addClass("active")
22</script> 22 });
23 23 </script>
24<div class="row-fluid"> 24
25 <!-- only on config pages --> 25 <!-- only on config pages -->
26 <div id="config-nav" class="span2"> 26 <div id="config-nav" class="col-md-2">
27 <ul class="nav nav-list well"> 27 <ul class="nav nav-pills nav-stacked">
28 <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li> 28 <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
29 <li class="nav-header">Compatible metadata</li> 29 <li class="nav-header">Compatible metadata</li>
30 <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li> 30 <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
@@ -36,10 +36,10 @@
36 <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li> 36 <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li>
37 </ul> 37 </ul>
38 </div> 38 </div>
39 <div class="span10"> 39 <div class="col-md-10">
40 {% block projectinfomain %}{% endblock %} 40 {% block projectinfomain %}{% endblock %}
41 </div> 41 </div>
42</div>
43 42
43</div>
44{% endblock %} 44{% endblock %}
45 45
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
index ce023f51af..96f405c433 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
@@ -2,12 +2,10 @@
2 </table> 2 </table>
3 3
4<!-- Show pagination controls --> 4<!-- Show pagination controls -->
5<div class="pagination pagination-centered"> 5<div>
6 <div class="pull-left"> 6 <!--span class="help-inline">Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.</span-->
7 Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.
8 </div>
9 7
10 <ul class="pagination" style="display: block-inline"> 8 <ul class="pagination">
11{%if objects.has_previous %} 9{%if objects.has_previous %}
12 <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li> 10 <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
13{%else%} 11{%else%}
@@ -23,8 +21,8 @@
23{%endif%} 21{%endif%}
24 </ul> 22 </ul>
25 <div class="pull-right"> 23 <div class="pull-right">
26 <span class="help-inline" style="padding-top:5px;">Show rows:</span> 24 <span class="help-inline">Show rows:</span>
27 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize"> 25 <select class="pagesize">
28 {% with "10 25 50 100 150" as list%} 26 {% with "10 25 50 100 150" as list%}
29 {% for i in list.split %} 27 {% for i in list.split %}
30 <option value="{{i}}">{{i}}</option> 28 <option value="{{i}}">{{i}}</option>
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
index 0ddd749046..6731ff2b8d 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_top.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -161,11 +161,13 @@
161<!-- control header --> 161<!-- control header -->
162<div class="navbar"> 162<div class="navbar">
163 <div class="navbar-inner"> 163 <div class="navbar-inner">
164 <form class="navbar-search input-append pull-left span6" id="searchform"> 164 <form class="navbar-search" id="searchform">
165 <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{%endif%} 165 <div class="input-append">
166 <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{%endif%}
166 <input type="hidden" name="orderby" value="{{request.GET.orderby}}"> 167 <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
167 <input type="hidden" name="page" value="1"> 168 <input type="hidden" name="page" value="1">
168 <button class="btn" id="search-button" type="submit" value="Search">Search</button> 169 <button class="btn" id="search-button" type="submit" value="Search">Search</button>
170 </div>
169 </form> 171 </form>
170 <div class="pull-right"> 172 <div class="pull-right">
171{% if tablecols %} 173{% if tablecols %}
@@ -230,7 +232,7 @@
230 {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })">{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%} 232 {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })">{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%}
231 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%} 233 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
232 {%if tc.filter%}<div class="btn-group pull-right"> 234 {%if tc.filter%}<div class="btn-group pull-right">
233 <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-small btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="icon-filter filtered"></i> </a> 235 <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
234 </div>{%endif%} 236 </div>{%endif%}
235 </th>{% endfor %} 237 </th>{% endfor %}
236 </tr> 238 </tr>
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
index 81973cbc6d..575c27b3b5 100644
--- a/bitbake/lib/toaster/toastergui/templates/bpackage.html
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -12,7 +12,7 @@
12{% endblock %} 12{% endblock %}
13 13
14{% block buildinfomain %} 14{% block buildinfomain %}
15<div class="span10"> 15<div class="col-md-10">
16 16
17{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %} 17{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
18 18
@@ -43,14 +43,12 @@
43</div> 43</div>
44 44
45 {% if objects.paginator.count == 0 %} 45 {% if objects.paginator.count == 0 %}
46 <div class="row-fluid"> 46 <div class="alert">
47 <div class="alert"> 47 <form class="no-results input-append" id="searchform">
48 <form class="no-results input-append" id="searchform"> 48 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
49 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} 49 <button class="btn" type="submit" value="Search">Search</button>
50 <button class="btn" type="submit" value="Search">Search</button> 50 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
51 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button> 51 </form>
52 </form>
53 </div>
54 </div> 52 </div>
55 53
56 {% else %} 54 {% else %}
@@ -82,7 +80,7 @@
82 <!-- Layer commit --> 80 <!-- Layer commit -->
83 <td class="recipe__layer_version__layer__commit"> 81 <td class="recipe__layer_version__layer__commit">
84 <a class="btn" 82 <a class="btn"
85 data-content="<ul class='unstyled'> 83 data-content="<ul class='list-unstyled'>
86 <li>{{package.recipe.layer_version.commit}}</li> 84 <li>{{package.recipe.layer_version.commit}}</li>
87 </ul>"> 85 </ul>">
88 {{package.recipe.layer_version.commit|truncatechars:13}} 86 {{package.recipe.layer_version.commit|truncatechars:13}}
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
index a0da71ea4c..5425dfe610 100644
--- a/bitbake/lib/toaster/toastergui/templates/builddashboard.html
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -13,17 +13,15 @@
13 13
14{% block buildinfomain %} 14{% block buildinfomain %}
15<!-- page title --> 15<!-- page title -->
16<div class="row-fluid span10"> 16<div class="col-md-10">
17 <div class="page-header"> 17 <div class="page-header">
18 <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1> 18 <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1>
19 </div> 19 </div>
20</div>
21 20
22<!-- build result bar --> 21<!-- build result bar -->
23<div class="row-fluid span10 pull-right">
24 <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}"> 22 <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
25 <div class="row-fluid lead"> 23 <div class="lead">
26 <span class="pull-left"><strong> 24 <span><strong>
27 {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%} 25 {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}
28 </strong> on 26 </strong> on
29 {{build.completed_on|date:"d/m/y H:i"}} 27 {{build.completed_on|date:"d/m/y H:i"}}
@@ -50,22 +48,21 @@
50{%endif%} 48{%endif%}
51 </div> 49 </div>
52 </div> 50 </div>
53</div>
54 51
55{% if build.errors.count %} 52{% if build.errors.count %}
56<div class="accordion span10 pull-right" id="errors"> 53<div class="panel-group" id="errors">
57 <div class="accordion-group"> 54 <div class="panel panel-default">
58 <div class="accordion-heading"> 55 <div class="panel-heading">
59 <a class="accordion-toggle error toggle-errors"> 56 <a class="panel-title error toggle-errors" href="#">
60 <h2 id="error-toggle"> 57 <h2 id="error-toggle">
61 <i class="icon-minus-sign"></i> 58 <i class="icon-minus-sign"></i>
62 {{build.errors.count}} error{{build.errors.count|pluralize}} 59 {{build.errors.count}} error{{build.errors.count|pluralize}}
63 </h2> 60 </h2>
64 </a> 61 </a>
65 </div> 62 </div>
66 <div class="accordion-body collapse in" id="collapse-errors"> 63 <div class="panel-collapse collapse in" id="collapse-errors">
67 <div class="accordion-inner"> 64 <div class="panel-body">
68 <div class="span10"> 65 <div class="col-md-10">
69 {% for error in build.errors %} 66 {% for error in build.errors %}
70 <div class="alert alert-error" data-error="{{ error.id }}"> 67 <div class="alert alert-error" data-error="{{ error.id }}">
71 <pre>{{error.message}}</pre> 68 <pre>{{error.message}}</pre>
@@ -81,7 +78,6 @@
81{%if build.outcome == build.SUCCEEDED%} 78{%if build.outcome == build.SUCCEEDED%}
82<!-- built images --> 79<!-- built images -->
83{% if hasImages %} 80{% if hasImages %}
84<div class="row-fluid span10 pull-right">
85 <h2>Images</h2> 81 <h2>Images</h2>
86 {% for target in targets %} 82 {% for target in targets %}
87 {% if target.target.is_image %} 83 {% if target.target.is_image %}
@@ -95,20 +91,22 @@
95 <dd>{{target.pkgsz|filtered_filesizeformat}}</dd> 91 <dd>{{target.pkgsz|filtered_filesizeformat}}</dd>
96 {% if target.targetHasNoImages %} 92 {% if target.targetHasNoImages %}
97 </dl> 93 </dl>
98 <div class="row-fluid"> 94 <div class="row">
99 <div class="alert alert-info span7"> 95 <div class="col-md-7">
100 <p> 96 <div class="alert alert-info">
101 <b>This build did not create any image files</b> 97 <p>
102 </p> 98 <strong>This build did not create any image files</strong>
103 <p> 99 </p>
104 This is probably because valid image and license manifest 100 <p>
105 files from a previous build already exist in your 101 This is probably because valid image and license manifest
106 <code>.../poky/build/tmp/deploy</code> 102 files from a previous build already exist in your
107 directory. You can 103 <code>.../poky/build/tmp/deploy</code>
108 also <a href="{% url 'targetpkg' build.pk target.target.pk %}">view the 104 directory. You can
109 license manifest information</a> in Toaster. 105 also <a href="{% url 'targetpkg' build.pk target.target.pk %}">view the
110 </p> 106 license manifest information</a> in Toaster.
107 </p>
111 </div> 108 </div>
109 </div>
112 </div> 110 </div>
113 {% else %} 111 {% else %}
114 <dt> 112 <dt>
@@ -140,7 +138,6 @@
140 </div> 138 </div>
141 {% endif %} 139 {% endif %}
142 {% endfor %} 140 {% endfor %}
143</div>
144{% endif %} 141{% endif %}
145 142
146{%else%} 143{%else%}
@@ -149,7 +146,6 @@
149 146
150<!-- other artifacts --> 147<!-- other artifacts -->
151{% if build.buildartifact_set.all.count > 0 %} 148{% if build.buildartifact_set.all.count > 0 %}
152<div class="row-fluid span10 pull-right">
153<h2>Other artifacts</h2> 149<h2>Other artifacts</h2>
154 150
155 <div class="well dashboard-section"> 151 <div class="well dashboard-section">
@@ -170,20 +166,22 @@
170 </dl> 166 </dl>
171 </div> 167 </div>
172 168
173</div>
174{% endif %} 169{% endif %}
175<!-- build summary --> 170<!-- build summary -->
176<div class="row-fluid span10 pull-right">
177<h2>Build summary</h2> 171<h2>Build summary</h2>
178 <div class="well span4 dashboard-section" style="margin-left:0px;"> 172 <div class="row">
173 <div class="col-md-4 dashboard-section">
174 <div class="well well-transparent">
179 <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4> 175 <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4>
180 <dl> 176 <dl>
181 <dt>Machine</dt><dd>{{build.machine}}</dd> 177 <dt>Machine</dt><dd>{{build.machine}}</dd>
182 <dt>Distro</dt><dd>{{build.distro}}</dd> 178 <dt>Distro</dt><dd>{{build.distro}}</dd>
183 <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%} 179 <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%}
184 </dl> 180 </dl>
181 </div>
185 </div> 182 </div>
186 <div class="well span4 dashboard-section"> 183 <div class="col-md-4 dashboard-section">
184 <div class="well well-transparent">
187 <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4> 185 <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4>
188 <dl> 186 <dl>
189 {% query build.task_build outcome=4 order__gt=0 as exectask%} 187 {% query build.task_build outcome=4 order__gt=0 as exectask%}
@@ -230,30 +228,33 @@
230% 228%
231 </dd> 229 </dd>
232 </dl> 230 </dl>
231 </div>
233 </div> 232 </div>
234 <div class="well span4 dashboard-section"> 233 <div class="col-md-4 dashboard-section">
234 <div class="well well-transparent">
235 <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4> 235 <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4>
236 <dl> 236 <dl>
237 <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd> 237 <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd>
238 <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd> 238 <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd>
239 </dl> 239 </dl>
240 </div> 240 </div>
241 </div>
241</div> 242</div>
242 243
243{% if build.warnings.count %} 244{% if build.warnings.count %}
244<div class="accordion span10 pull-right" id="warnings"> 245<div class="panel-group" id="warnings">
245 <div class="accordion-group"> 246 <div class="panel panel-default">
246 <div class="accordion-heading"> 247 <div class="panel-heading">
247 <a class="accordion-toggle warning toggle-warnings"> 248 <a class="panel-title warning toggle-warnings" href="#">
248 <h2 id="warning-toggle"> 249 <h2 id="warning-toggle">
249 <i class="icon-warning-sign"></i> 250 <i class="icon-warning-sign"></i>
250 {{build.warnings.count}} warning{{build.warnings.count|pluralize}} 251 {{build.warnings.count}} warning{{build.warnings.count|pluralize}}
251 </h2> 252 </h2>
252 </a> 253 </a>
253 </div> 254 </div>
254 <div class="accordion-body collapse" id="collapse-warnings"> 255 <div class="panel-collapse collapse" id="collapse-warnings">
255 <div class="accordion-inner"> 256 <div class="panel-body">
256 <div class="span10"> 257 <div class="col-md-10">
257 {% for warning in logmessages %}{% if warning.level == 1 %} 258 {% for warning in logmessages %}{% if warning.level == 1 %}
258 <div class="alert alert-warning"> 259 <div class="alert alert-warning">
259 <pre>{{warning.message}}</pre> 260 <pre>{{warning.message}}</pre>
@@ -266,6 +267,8 @@
266</div> 267</div>
267{% endif %} 268{% endif %}
268 269
270</div> <!-- end 10 column row -->
271
269<script type="text/javascript"> 272<script type="text/javascript">
270 $(document).ready(function() { 273 $(document).ready(function() {
271 //show warnings section when requested from the previous page 274 //show warnings section when requested from the previous page
diff --git a/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html b/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html
index 70fa1fb9a4..c782074448 100644
--- a/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html
@@ -8,11 +8,11 @@
8{% block projectinfomain %} 8{% block projectinfomain %}
9 <!-- begin content --> 9 <!-- begin content -->
10 10
11 <div class="row-fluid"> 11 <div class="row">
12 12
13 <!-- end left sidebar container --> 13 <!-- end left sidebar container -->
14 <!-- Begin right container --> 14 <!-- Begin right container -->
15 <div class="span10"> 15 <div class="col-md-10">
16 <div class="page-header"> 16 <div class="page-header">
17 <h1> 17 <h1>
18 <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} </span> 18 <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} </span>
@@ -45,7 +45,7 @@
45 </div> 45 </div>
46 <div class="accordion-body collapse in" id="collapse-errors"> 46 <div class="accordion-body collapse in" id="collapse-errors">
47 <div class="accordion-inner"> 47 <div class="accordion-inner">
48 <div class="span10"> 48 <div class="col-md-10">
49 {% for error in buildrequest.brerror_set.all %} 49 {% for error in buildrequest.brerror_set.all %}
50 <div class="alert alert-error"> 50 <div class="alert alert-error">
51 ERROR: <div class="air well"><pre>{{error.errmsg}}</pre></div> 51 ERROR: <div class="air well"><pre>{{error.errmsg}}</pre></div>
@@ -58,7 +58,7 @@
58 </div> 58 </div>
59 </div> 59 </div>
60 </div> 60 </div>
61 </div> <!-- end of row-fluid --> 61 </div> <!-- end of row -->
62 62
63 63
64{%endblock%} 64{%endblock%}
diff --git a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
index bf13a66bd1..0afe0a3115 100644
--- a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
@@ -13,16 +13,20 @@
13 13
14{% block pagecontent %} 14{% block pagecontent %}
15 15
16 <div class="row-fluid"> 16<div class="row">
17 <div class="col-md-12">
17 {% with mru=mru mrb_type=mrb_type %} 18 {% with mru=mru mrb_type=mrb_type %}
18 {% include 'mrb_section.html' %} 19 {% include 'mrb_section.html' %}
19 {% endwith %} 20 {% endwith %}
20 21
21 <h1 class="page-header top-air" data-role="page-title"></h1> 22 <div class="page-header">
23 <h1 class="top-air" data-role="page-title"></h1>
24 </div>
22 25
23 {% url 'builds' as xhr_table_url %} 26 {% url 'builds' as xhr_table_url %}
24 {% include 'toastertable.html' %} 27 {% include 'toastertable.html' %}
25 </div> 28 </div>
29</div>
26 30
27 <script> 31 <script>
28 $(document).ready(function () { 32 $(document).ready(function () {
diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
index 85d6a622a8..83bc5b21e0 100644
--- a/bitbake/lib/toaster/toastergui/templates/configuration.html
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -12,14 +12,14 @@
12 12
13{% block buildinfomain %} 13{% block buildinfomain %}
14<!-- page title --> 14<!-- page title -->
15<div class="row-fluid span10"> 15<div class="col-md-10">
16
16 <div class="page-header"> 17 <div class="page-header">
17 <h1>Configuration</h1> 18 <h1>Configuration</h1>
18 </div> 19 </div>
19</div>
20 20
21<!-- configuration table --> 21<!-- configuration table -->
22<div class="row-fluid pull-right span10" id="navTab"> 22<div id="navTab">
23<ul class="nav nav-pills"> 23<ul class="nav nav-pills">
24 <li class="active"><a href="#">Summary</a></li> 24 <li class="active"><a href="#">Summary</a></li>
25 <li class=""><a href="{% url 'configvars' build.id %}">BitBake variables</a></li> 25 <li class=""><a href="{% url 'configvars' build.id %}">BitBake variables</a></li>
@@ -44,29 +44,32 @@
44 {% endfor %} </ul> </dd> {% endif %} 44 {% endfor %} </ul> </dd> {% endif %}
45 </dl> 45 </dl>
46 <h3>Layers</h3> 46 <h3>Layers</h3>
47 <div class="span9" style="margin-left:0px;"> 47 <div class="row">
48 <table class="table table-bordered table-hover"> 48 <div class="col-md-9">
49 <thead> 49 <table class="table table-bordered table-hover">
50 <tr> 50 <thead>
51 <th>Layer</th> 51 <tr>
52 <th>Layer branch</th> 52 <th>Layer</th>
53 <th>Layer commit</th> 53 <th>Layer branch</th>
54 </tr> 54 <th>Layer commit</th>
55 </thead> 55 </tr>
56 <tbody>{% for lv in build.layer_version_build.all|dictsort:"layer.name" %} 56 </thead>
57 <tr> 57 <tbody>{% for lv in build.layer_version_build.all|dictsort:"layer.name" %}
58 <tr>
58 <td>{{lv.layer.name}}</td> 59 <td>{{lv.layer.name}}</td>
59 <td>{{lv.branch}}</td> 60 <td>{{lv.branch}}</td>
60 <td> <a class="btn" data-content="<ul class='unstyled'> 61 <td> <a class="btn" data-content="<ul class='list-unstyled'>
61 <li>{{lv.commit}}</li> </ul>"> 62 <li>{{lv.commit}}</li> </ul>">
62 {{lv.commit|truncatechars:13}} 63 {{lv.commit|truncatechars:13}}
63 </a></td> 64 </a></td>
64 </tr>{% endfor %} 65 </tr>{% endfor %}
65 </tbody> 66 </tbody>
66 </table> 67 </table>
68 </div>
67 </div> 69 </div>
68 </div> 70 </div>
69 71
70
71</div> 72</div>
73
74</div> <!-- end of 10-column section -->
72{% endblock %} 75{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index e40c225a3a..f100b243ca 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -12,7 +12,7 @@
12 12
13{% block buildinfomain %} 13{% block buildinfomain %}
14<!-- page title --> 14<!-- page title -->
15<div class="row-fluid span10"> 15<div class="col-md-10">
16 <div class="page-header"> 16 <div class="page-header">
17 <h1> 17 <h1>
18 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %} 18 {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
@@ -24,10 +24,9 @@
24 {%endif%} 24 {%endif%}
25 </h1> 25 </h1>
26 </div> 26 </div>
27</div>
28 27
29<!-- configuration table --> 28<!-- configuration table -->
30<div class="row-fluid pull-right span10" id="navTab"> 29<div id="navTab">
31 <ul class="nav nav-pills"> 30 <ul class="nav nav-pills">
32 <li class=""><a href="{% url 'configuration' build.id %}">Summary</a></li> 31 <li class=""><a href="{% url 'configuration' build.id %}">Summary</a></li>
33 <li class="active"><a href="#" >BitBake variables</a></li> 32 <li class="active"><a href="#" >BitBake variables</a></li>
@@ -37,15 +36,13 @@
37 <div id="variables" class="tab-pane"> 36 <div id="variables" class="tab-pane">
38 37
39 {% if objects.paginator.count == 0 %} 38 {% if objects.paginator.count == 0 %}
40 <div class="row-fluid"> 39 <div class="alert">
41 <div class="alert"> 40 <form class="no-results input-append" id="searchform">
42 <form class="no-results input-append" id="searchform"> 41 <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
43 <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} 42 <button class="btn" type="submit" value="Search">Search</button>
44 <button class="btn" type="submit" value="Search">Search</button> 43 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
45 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button> 44 </form>
46 </form> 45 </div>
47 </div>
48 </div>
49 46
50 {% else %} 47 {% else %}
51 {% include "basetable_top.html" %} 48 {% include "basetable_top.html" %}
@@ -65,7 +62,7 @@
65 {% if variable.description %} 62 {% if variable.description %}
66 {{variable.description}} 63 {{variable.description}}
67 <a href="http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-{{variable.variable_name|variable_parent_name}}" target="_blank"> 64 <a href="http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-{{variable.variable_name|variable_parent_name}}" target="_blank">
68 <i class="icon-share get-info"></i></a> 65 <i class="glyphicon glyphicon-share get-info"></i></a>
69 {% endif %} 66 {% endif %}
70 </td> 67 </td>
71 </tr> 68 </tr>
@@ -78,56 +75,62 @@
78<!-- file list popups --> 75<!-- file list popups -->
79{% for variable in objects %} 76{% for variable in objects %}
80 {% if variable.vhistory.count %} 77 {% if variable.vhistory.count %}
81 <div id="variable-{{variable.pk}}" class="modal hide fade" tabindex="-1" role="dialog"> 78 <div id="variable-{{variable.pk}}" class="modal in fade" tabindex="-1" role="dialog">
82 <div class="modal-header"> 79 <div class="modal-dialog">
83 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 80 <div class="modal-content">
84 <h3>History of {{variable.variable_name}}</h3> 81 <div class="modal-header">
85 </div> 82 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
86 <div class="modal-body"> 83 <h3>History of {{variable.variable_name}}</h3>
87 {% if variable.variable_value %} 84 </div>
88 {% if variable.variable_value|length < 570 %} 85 <div class="modal-body">
89 <h4>{{variable.variable_name}} value is:</h4> 86 {% if variable.variable_value %}
90 <p> 87 {% if variable.variable_value|length < 570 %}
91 {{variable.variable_value}} 88 <h4>{{variable.variable_name}} value is:</h4>
92 </p> 89 <p>
93 {% else %} 90 {{variable.variable_value}}
94 <h4>{{variable.variable_name}} value is:</h4> 91 </p>
95 <p> 92 {% else %}
96 <span>{{variable.variable_value|string_slice:':570'}} 93 <h4>{{variable.variable_name}} value is:</h4>
97 <span class="full"> {{variable.variable_value|string_slice:'570:'}} 94 <p>
98 </span> 95 <span>{{variable.variable_value|string_slice:':570'}}
99 <a class="btn btn-mini full-show">...</a> 96 <span class="full"> {{variable.variable_value|string_slice:'570:'}}
100 </span> 97 </span>
101 </p> 98 <a class="btn btn-mini full-show">...</a>
102 <a class="btn btn-mini full-hide">Collapse variable value <i class="icon-caret-up"></i> 99 </span>
103 </a> 100 </p>
104 {% endif %} 101 <a class="btn btn-mini full-hide">Collapse variable value <i class="icon-caret-up"></i>
105 {% else %} 102 </a>
106 <div class="alert alert-info">The value of <strong>{{variable.variable_name}}</strong> is an empty string</div> 103 {% endif %}
107 {% endif %} 104 {% else %}
108 <h4>The value was set in the following configuration files:</h4> 105 <div class="alert alert-info">The value of <strong>{{variable.variable_name}}</strong> is an empty string</div>
109 <table class="table table-bordered table-hover"> 106 {% endif %}
110 <thead> 107 <h4>The value was set in the following configuration files:</h4>
111 <tr> 108 <table class="table table-bordered table-hover">
112 <th>Order</th> 109 <thead>
113 <th>Configuration file</th> 110 <tr>
114 <th>Operation</th> 111 <th>Order</th>
115 <th>Line number</th> 112 <th>Configuration file</th>
116 </tr> 113 <th>Operation</th>
117 </thead> 114 <th>Line number</th>
118 <tbody> 115 </tr>
119 {% for vh in variable.vhistory.all %} 116 </thead>
120 <tr> 117 <tbody>
121 <td>{{forloop.counter}}</td><td>{{vh.file_name}}</td><td>{{vh.operation}}</td><td>{{vh.line_number}}</td> 118 {% for vh in variable.vhistory.all %}
122 </tr> 119 <tr>
123 {%endfor%} 120 <td>{{forloop.counter}}</td><td>{{vh.file_name}}</td><td>{{vh.operation}}</td><td>{{vh.line_number}}</td>
124 </tbody> 121 </tr>
125 </table> 122 {%endfor%}
126 </div> 123 </tbody>
127 </div> 124 </table>
125 </div>
126 </div><!-- /.modal-content -->
127 </div><!-- /.modal-dialog -->
128 </div><!-- /.modal -->
128 {% endif %} 129 {% endif %}
129{% endfor %} 130{% endfor %}
130 131
131</div> <!-- buildinfomain --> 132</div> <!-- buildinfomain -->
132 133
134</div> <!-- end 10-column section -->
135
133{% endblock %} 136{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/customise_btn.html b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
index 2e54a9d905..38c258ac32 100644
--- a/bitbake/lib/toaster/toastergui/templates/customise_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
@@ -1,15 +1,15 @@
1<button class="btn btn-block layer-exists-{{data.layer_version.pk}} customise-btn" data-recipe="{{data.pk}}" 1<button class="btn btn-default btn-block layer-exists-{{data.layer_version.pk}} customise-btn" data-recipe="{{data.pk}}"
2 {% if data.layer_version.pk not in extra.current_layers %} 2 {% if data.layer_version.pk not in extra.current_layers %}
3 style="display:none;" 3 style="display:none;"
4 {% endif %} 4 {% endif %}
5 > 5 >
6 Customise 6 Customise
7</button> 7</button>
8<button class="btn btn-block layer-add-{{data.layer_version.pk}} layerbtn" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add" 8<button class="btn btn-default btn-block layer-add-{{data.layer_version.pk}} layerbtn" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
9 {% if data.layer_version.pk in extra.current_layers %} 9 {% if data.layer_version.pk in extra.current_layers %}
10 style="display:none;" 10 style="display:none;"
11 {% endif %} 11 {% endif %}
12 > 12 >
13 <i class="icon-plus"></i> 13 <i class="glyphicon glyphicon-plus"></i>
14 Add layer 14 Add layer
15</button> 15</button>
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index 4b1ef6617f..d9049614ab 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -5,7 +5,6 @@
5{% block pagecontent %} 5{% block pagecontent %}
6 6
7{% with recipe.get_base_recipe_file as base_recipe_file %} 7{% with recipe.get_base_recipe_file as base_recipe_file %}
8<div class="section">
9 <ul class="breadcrumb"> 8 <ul class="breadcrumb">
10 <li> 9 <li>
11 <a href="{% url 'project' project.id %}">{{project.name}}</a> 10 <a href="{% url 'project' project.id %}">{{project.name}}</a>
@@ -18,7 +17,6 @@
18 {{recipe.name}} ({{recipe.layer_version.layer.name}}) 17 {{recipe.name}} ({{recipe.layer_version.layer.name}})
19 </li> 18 </li>
20 </ul> 19 </ul>
21</div>
22 20
23<script src="{% static 'js/customrecipe.js' %}"></script> 21<script src="{% static 'js/customrecipe.js' %}"></script>
24<script> 22<script>
@@ -42,101 +40,110 @@
42 }); 40 });
43</script> 41</script>
44<!-- package dependencies modal --> 42<!-- package dependencies modal -->
45<div style="display:none" id="package-deps-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false"> 43<div id="package-deps-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
46 <div class="modal-header"> 44 <div class="modal-dialog">
47 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 45 <div class="modal-content">
48 <h3><span class="package-to-add-name"></span> dependencies</h3> 46 <div class="modal-header">
49 </div> 47 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
50 <div class="modal-body"> 48 <h3><span class="package-to-add-name"></span> dependencies</h3>
51 <p>Based on information from a previous build it is likely that adding <strong class="package-to-add-name"></strong> will also add the following packages to your custom image:</p> 49 </div>
52 <ul id="package-add-dep-list"> 50 <div class="modal-body">
53 </ul> 51 <p>Based on information from a previous build it is likely that adding <strong class="package-to-add-name"></strong> will also add the following packages to your custom image:
54 </div> 52 </p>
55 <div class="modal-footer"> 53 <ul id="package-add-dep-list">
56 <p class="help-block text-left">Total package size: <strong id="package-deps-total-size"></strong></p> 54 </ul>
57 <button id="add-package-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Add package</button> 55 </div>
58 <button class="btn" data-dismiss="modal">Cancel</button> 56 <div class="modal-footer">
59 </div> 57 <p class="help-block text-left">Total package size: <strong id="package-deps-total-size"></strong></p>
60</div> 58 <button id="add-package-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Add packages</button>
59 <button class="btn btn-link" data-dismiss="modal">Cancel</button>
60 </div>
61 </div><!-- /.modal-content -->
62 </div><!-- /.modal-dialog -->
63</div><!-- /.modal -->
61<!-- end package dependencies modal --> 64<!-- end package dependencies modal -->
62 65
63<!-- package reverse dependencies modal --> 66<!-- package reverse dependencies modal -->
64<div style="display:none" id="package-reverse-deps-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false"> 67<div style="display:none" id="package-reverse-deps-modal" class="modal fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
65 <div class="modal-header"> 68 <div class="modal-dialog">
66 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 69 <div class="modal-content">
67 <h3><span class="package-to-rm-name"></span> reverse dependencies</h3> 70 <div class="modal-header">
68 </div> 71 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
69 <div class="modal-body"> 72 <h3><span class="package-to-rm-name"></span> reverse dependencies</h3>
70 <p> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> in your image <span class="reverse-deps-depends"></span> on <strong class="package-to-rm-name"></strong>:</p> 73 </div>
71 <ul id="package-reverse-dep-list"> 74 <div class="modal-body">
72 </ul> 75 <p> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> in your image <span class="reverse-deps-depends"></span> on <strong class="package-to-rm-name"></strong>:</p>
73 <p>In order to remove <strong class="package-to-rm-name"></strong>, you must remove <span class="reverse-deps-this"></span> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> as well.</p> 76 <ul id="package-reverse-dep-list">
74 </div> 77 </ul>
75 <div class="modal-footer"> 78 <p>In order to remove <strong class="package-to-rm-name"></strong>, you must remove <span class="reverse-deps-this"></span> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> as well.</p>
76 <p class="help-block text-left">Total package size: <strong id="package-reverse-deps-total-size"></strong></p> 79 </div>
77 <button id="rm-package-reverse-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Remove all <span class="reverse-deps-count-plus1"></button> 80 <div class="modal-footer">
78 <button class="btn" data-dismiss="modal">Cancel</button> 81 <p class="help-block text-left">Total package size: <strong id="package-reverse-deps-total-size"></strong></p>
79 </div> 82 <button id="rm-package-reverse-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Remove all <span class="reverse-deps-count-plus1"></button>
80</div> 83 <button class="btn btn-link" data-dismiss="modal">Cancel</button>
84 </div>
85 </div><!-- /.modal-content -->
86 </div><!-- /.modal-dialog -->
87</div><!-- /.modal -->
81<!-- end package dependencies modal --> 88<!-- end package dependencies modal -->
82 89
83 90<div class="alert alert-success alert-dismissible change-notification" id="image-created-notification" style="display: none">
84<div class="row-fluid span11"> 91 <button type="button" data-dismiss="alert" class="close">&times;</button>
85 <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none"> 92 <p>Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.</p>
86 <button type="button" data-dismiss="alert" class="close">x</button> 93</div>
87 Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed. 94<div class="page-header">
88 </div> 95 <h1>
89 <div class="page-header air"> 96 {{recipe.name}}
90 <h1> 97 <small>({{recipe.layer_version.layer.name}})</small>
91 {{recipe.name}} 98 </h1>
92 <small>({{recipe.layer_version.layer.name}})</small>
93 </h1>
94 </div>
95</div> 99</div>
96 100
97<div class="row-fluid span11"> 101<div class="row">
98 <div class="span8"> 102 <div class="col-md-8">
99 <div class="button-place btn-group" style="width: 100%"> 103 <div class="button-place btn-group" style="width: 100%">
100 <a class="btn btn-large span6 build-custom-image" href="#" style="width: 50%"> 104 <a class="btn btn-default btn-lg build-custom-image" href="#" style="width: 50%">
101 Build {{recipe.name}} 105 Build {{recipe.name}}
102 </a> 106 </a>
103 <a href="{% url 'customrecipedownload' project.id recipe.id %}" class="btn btn-large span6" style="width: 50%" 107 <a href="{% url 'customrecipedownload' project.id recipe.id %}" class="btn btn-default btn-lg" style="width: 50%"
104 {% if not base_recipe_file %} 108 {% if not base_recipe_file %}
105 disabled="disabled" 109 disabled="disabled"
106 {% endif %}> 110 {% endif %}>
107 Download recipe file 111 Download recipe file
108 {% if not base_recipe_file %} 112 {% if not base_recipe_file %}
109 <i class="icon-question-sign get-help" 113 <i class="icon-question-sign get-help"
110 data-original-title="The recipe file doesn't exist yet, so you cannot download it. You need to build your custom image first"></i> 114 data-original-title="The recipe file doesn't exist yet, so you cannot download it. You need to build your custom image first"></i>
111 {% endif %} 115 {% endif %}
112 </a> 116 </a>
113 </div> 117 </div>
114 <div id="no-results-special-{{table_name}}" class="air" style="display:none;"> 118 <div id="no-results-special-{{table_name}}" class="top-air" style="display:none;">
115 <div class="alert"> 119 <div class="alert alert-warning">
116 <h3>No packages found</h3> 120 <h3>No packages found</h3>
117 <p>You might consider <a href={% url 'projectsoftwarerecipes' project.id %}>searching the list of recipes</a> instead. If you find a recipe that matches the name of the package you want:</p> 121 <p>You might consider <a href={% url 'projectsoftwarerecipes' project.id %}>searching the list of recipes</a> instead.</p>
122 <p>If you find a recipe that matches the name of the package you want:</p>
118 <ol> 123 <ol>
119 <li>Add the layer providing the recipe to your project</li> 124 <li>Add the layer providing the recipe to your project</li>
120 <li>Build the recipe</li> 125 <li>Build the recipe</li>
121 <li>Once the build completes, come back to this page and search for the package</li> 126 <li>Once the build completes, come back to this page and search for the package</li>
122 </ol> 127 </ol>
123 <form class="input-append no-results"> 128 <form class="form-inline no-results">
124 <input type="text" class="input-xlarge no-results-search-input" id="no-results-search-input-{{table_name}}" name="search" placeholder="Search {{title|lower}}" /> 129 <div class="form-group">
125 <a href="#" class="add-on btn" id="no-results-remove-search-btn" tabindex="-1"> 130 <div class="btn-group">
126 <i class="icon-remove"></i> 131 <input type="text" class="form-control no-results-search-input" id="no-results-search-input-{{table_name}}" name="search" placeholder="Search {{title|lower}}" />
127 </a> 132 <span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" id="no-results-remove-search-btn" tabindex="-1"></span>
128 <button class="btn search-submit-{{table_name}}">Search</button> 133 </div>
134 </div>
135 <button class="btn btn-default search-submit-{{table_name}}">Search</button>
129 <button class="btn btn-link" id="no-results-show-all-packages">Show all packages</button> 136 <button class="btn btn-link" id="no-results-show-all-packages">Show all packages</button>
130 </form> 137 </form>
131 </div> 138 </div>
132 </div> 139 </div>
133 <div id="results-found-{{table_name}}"> 140 <div id="results-found-{{table_name}}">
134 <div id="packages-table"> 141 <div id="packages-table">
135 {% if recipe.get_all_packages.count == 0 and last_build == None %} 142 {% if recipe.get_all_packages.count == 0 and last_build == None %}
136 <h2> Add | Remove packages </h2> 143 <h2> Add | Remove packages </h2>
137 <div class="alert alert-info air"> 144 <div class="alert alert-info">
138 <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p> 145 <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
139 <button class="btn btn-info btn-large build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button> 146 <button class="btn btn-info btn-lg build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
140 </div> 147 </div>
141 {% else %} 148 {% else %}
142 {# ToasterTable for Adding remove packages #} 149 {# ToasterTable for Adding remove packages #}
@@ -145,27 +152,28 @@
145 {% include "toastertable.html" %} 152 {% include "toastertable.html" %}
146 {% endif %} 153 {% endif %}
147 </div> 154 </div>
148 </div>
149 </div> 155 </div>
150 <div class="span4 well"> 156 </div>
151 <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2> 157 <div class="col-md-4">
158 <div class="well">
159 <h2>About {{recipe.name}}</h2>
152 160
153 <dl> 161 <dl>
154 <dt> 162 <dt>
155 Approx. packages included 163 Approx. packages included
156 <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i> 164 <span class="glyphicon glyphicon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></span>
157 </dt> 165 </dt>
158 <dd id="total-num-packages">{{recipe.get_all_packages.count}}</dd> 166 <dd id="total-num-packages">{{recipe.get_all_packages.count}}</dd>
159 <dt> 167 <dt>
160 Approx. package size 168 Approx. package size
161 <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i> 169 <span class="glyphicon glyphicon-question-sign get-help" title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></span>
162 </dt> 170 </dt>
163 <dd id="total-size-packages">{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd> 171 <dd id="total-size-packages">{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
164 {% if last_build %} 172 {% if last_build %}
165 <dt>Last build</dt> 173 <dt>Last build</dt>
166 <dd> 174 <dd>
167 <i class="icon-ok-sign success"></i> 175 <span class="glyphicon glyphicon-ok-circle"></span>
168 <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a> 176 <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a>
169 </dd> 177 </dd>
170 {% endif %} 178 {% endif %}
171 <dt>Layer</dt> 179 <dt>Layer</dt>
@@ -176,59 +184,60 @@
176 {% with recipe.get_last_successful_built_target as last_build_target %} 184 {% with recipe.get_last_successful_built_target as last_build_target %}
177 <dt>Last build</dt> 185 <dt>Last build</dt>
178 <dd> 186 <dd>
179 <i class="icon-ok-sign success"></i> 187 <span class="glyphicon glyphicon-ok-circle"></span>
180 <a href="{% url 'builddashboard' last_build_target.build.pk %}"> 188 <a href="{% url 'builddashboard' last_build_target.build.pk %}">
181 {{last_build_target.build.completed_on|date:"d/m/y H:i"}}</a> 189 {{last_build_target.build.completed_on|date:"d/m/y H:i"}}</a>
182 </dd> 190 </dd>
183 {% endwith %} 191 {% endwith %}
184 {% endif %} 192 {% endif %}
185 {% if base_recipe_file %} 193 {% if base_recipe_file %}
186 <dt>Recipe file</dt> 194 <dt>Recipe file</dt>
187 <dd> 195 <dd>
188 <code>{{recipe.name}}_{{recipe.version}}.bb</code> 196 <code>{{recipe.name}}_{{recipe.version}}.bb</code>
189 <a href="{% url 'customrecipedownload' project.pk recipe.pk %}"><i class="icon-download-alt" title="Download recipe file"></i></a> 197 <a href="{% url 'customrecipedownload' project.pk recipe.pk %}"><span class="glyphicon glyphicon-download-alt" data-toggle="tooltip" title="Download recipe file"></span></a>
190 </dd> 198 </dd>
191 {% endif %} 199 {% endif %}
192 <dt>Layer</dt> 200 <dt>Layer</dt>
193 <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd> 201 <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
194 {% if recipe.summary %} 202 {% if recipe.summary %}
195 <dt> 203 <dt>
196 Summary 204 Summary
197 </dt> 205 </dt>
198 <dd> 206 <dd>
199 {{recipe.summary}} 207 {{recipe.summary}}
200 </dd> 208 </dd>
201 {% endif %} 209 {% endif %}
202 {% if recipe.description %} 210 {% if recipe.description %}
203 <dt> 211 <dt>
204 Description 212 Description
205 </dt> 213 </dt>
206 <dd> 214 <dd>
207 {{recipe.description}} 215 {{recipe.description}}
208 </dd> 216 </dd>
209 {% endif %} 217 {% endif %}
210 <dt>Version</dt> 218 <dt>Version</dt>
211 <dd> 219 <dd>
212 {{recipe.version}} 220 {{recipe.version}}
213 </dd> 221 </dd>
214 {% if recipe.section %} 222 {% if recipe.section %}
215 <dt>Section</dt> 223 <dt>Section</dt>
216 <dd> 224 <dd>
217 {{recipe.section}} 225 {{recipe.section}}
218 </dd> 226 </dd>
219 {% endif %} 227 {% endif %}
220 <dt>License</dt> 228 <dt>License</dt>
221 <dd> 229 <dd>
222 {{recipe.license}} 230 {{recipe.license}}
223 <i class="icon-question-sign get-help" title="" data-original-title="All custom images have their license set to MIT. This is because the license applies only to the recipe (.bb) file, and not to the image itself. To see which licenses apply to the image you must check the license manifest generated with each build"></i> 231 <span class="glyphicon glyphicon-question-sign get-help" title="All custom images have their license set to MIT. This is because the license applies only to the recipe (.bb) file, and not to the image itself. To see which licenses apply to the image you must check the license manifest generated with each build"></i>
224 </dd> 232 </dd>
225 </dl> 233 </dl>
226 <!-- 234 <!--
227 <i class="icon-trash no-tooltip"></i> 235 <i class="icon-trash no-tooltip"></i>
228 <a href="#" class="error" id="delete">Delete custom image</a> 236 <a href="#" class="error" id="delete">Delete custom image</a>
229 --> 237 -->
230 </div> 238 </div>
231 </div> 239 </div>
240</div>
232 241
233{% endwith %}{# end base_recipe_file #} 242{% endwith %}{# end base_recipe_file #}
234 {% endblock %} 243{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html b/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
index f40c21d99f..211548b1ef 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
@@ -6,8 +6,8 @@
6 6
7{# only paginate if 10 or more rows unfiltered, all pages #} 7{# only paginate if 10 or more rows unfiltered, all pages #}
8{% if object_count >= 10 %} 8{% if object_count >= 10 %}
9<div class="pagination"> 9<div>
10 <ul> 10 <ul class="pagination">
11{%if objects.has_previous %} 11{%if objects.has_previous %}
12 <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li> 12 <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
13{%else%} 13{%else%}
@@ -24,7 +24,7 @@
24 </ul> 24 </ul>
25 25
26 <div class="pull-right"> 26 <div class="pull-right">
27 <span class="help-inline" style="padding-bottom:10px;">Show rows:</span> 27 <span class="help-inline">Show rows:</span>
28 <select class="pagesize"> 28 <select class="pagesize">
29 {% with "10 25 50 100 150" as list%} 29 {% with "10 25 50 100 150" as list%}
30 {% for i in list.split %} 30 {% for i in list.split %}
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
index 7bea3f47f6..996b617b76 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
@@ -18,7 +18,7 @@ $(document).ready(function() {
18 }); 18 });
19}); 19});
20</script> 20</script>
21<div class="row-fluid"> 21
22{% if objects.paginator.count > 10 or request.GET.search %} 22{% if objects.paginator.count > 10 or request.GET.search %}
23 {% if objects.paginator.count == 0 %} 23 {% if objects.paginator.count == 0 %}
24 <div class="alert"> 24 <div class="alert">
@@ -32,8 +32,8 @@ $(document).ready(function() {
32 <input type="hidden" value="name:+" name="orderby"> 32 <input type="hidden" value="name:+" name="orderby">
33 <input type="hidden" value="l" name="page"> 33 <input type="hidden" value="l" name="page">
34 {% if request.GET.search %} 34 {% if request.GET.search %}
35 <a class="add-on btn search-clear"> 35 <a class="input-append-addon btn search-clear">
36 <i class="icon-remove"></i> 36 <i class="glyphicon glyphicon-remove"></i>
37 </a> 37 </a>
38 {% endif %} 38 {% endif %}
39 <button type="submit" class="btn">Search</button> 39 <button type="submit" class="btn">Search</button>
@@ -65,4 +65,4 @@ $(document).ready(function() {
65 </div> 65 </div>
66 {% endif %} 66 {% endif %}
67{% endif %} 67{% endif %}
68</div> {# row-fluid #} 68
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html b/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
index 6ce292e5a2..6589b0a2d3 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
@@ -17,7 +17,7 @@
17 <span class="badge badge-info">{{objects.paginator.count}}</span> 17 <span class="badge badge-info">{{objects.paginator.count}}</span>
18 {% endif %} 18 {% endif %}
19 {%if tc.filter%}<div class="btn-group pull-right"> 19 {%if tc.filter%}<div class="btn-group pull-right">
20 <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-small btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="icon-filter filtered"></i> </a> 20 <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
21 </div>{%endif%} 21 </div>{%endif%}
22 </th>{% endfor %} 22 </th>{% endfor %}
23 </tr> 23 </tr>
diff --git a/bitbake/lib/toaster/toastergui/templates/dirinfo.html b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
index ecb46bf7ab..df06a94359 100644
--- a/bitbake/lib/toaster/toastergui/templates/dirinfo.html
+++ b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
@@ -110,7 +110,7 @@
110 namespan = 3; 110 namespan = 3;
111 } 111 }
112 var colspan = 'colspan="' + namespan + '"'; 112 var colspan = 'colspan="' + namespan + '"';
113 name = '<td ' + colspan + '><i class="icon-file"></i>'; 113 name = '<td ' + colspan + '><i class="glyphicon glyphicon-file"></i>';
114 } 114 }
115 else { 115 else {
116 name = '<td><i class="icon-hand-right"></i>'; 116 name = '<td><i class="icon-hand-right"></i>';
@@ -184,7 +184,7 @@
184 } 184 }
185</script> 185</script>
186 186
187<div class="span10"> 187<div class="col-md-10">
188 188
189 <div class="page-header"> 189 <div class="page-header">
190 <h1> {{target.target}} </h1> 190 <h1> {{target.target}} </h1>
@@ -235,7 +235,7 @@
235 </tbody> 235 </tbody>
236 </table> 236 </table>
237 </div> <!-- directory-structure --> 237 </div> <!-- directory-structure -->
238</div> <!-- span10 --> 238</div> <!-- col-md-10 -->
239 239
240{% endblock buildinfomain %} 240{% endblock buildinfomain %}
241 241
diff --git a/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html b/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html
index 8046c08fb5..baa36c0e1b 100644
--- a/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html
+++ b/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html
@@ -6,32 +6,36 @@ choose which one to edit
6required context: 6required context:
7 build - a Build object 7 build - a Build object
8--> 8-->
9<div class="modal hide fade in" aria-hidden="false" id="edit-custom-image-modal"> 9<div class="modal fade" aria-hidden="false" id="edit-custom-image-modal">
10 <div class="modal-header"> 10 <div class="modal-dialog">
11 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 11 <div class="modal-content">
12 <h3>Which image do you want to edit?</h3> 12 <div class="modal-header">
13 </div> 13 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
14 <h3>Which image do you want to edit?</h3>
15 </div>
14 16
15 <div class="modal-body"> 17 <div class="modal-body">
16 <div class="row-fluid"> 18 {% for recipe in build.get_custom_image_recipes %}
17 {% for recipe in build.get_custom_image_recipes %} 19 <div class="radio">
18 <label class="radio"> 20 <label>
19 {{recipe.name}} 21 <input type="radio" name="select-custom-image"
20 <input type="radio" class="form-control" name="select-custom-image" 22 data-url="{% url 'customrecipe' build.project.id recipe.id %}">
21 data-url="{% url 'customrecipe' build.project.id recipe.id %}"> 23 {{recipe.name}}
22 </label> 24 </label>
23 {% endfor %} 25 </div>
24 </div> 26 {% endfor %}
25 <span class="help-block error" id="invalid-custom-image-help" style="display:none"> 27 <span class="help-block text-danger" id="invalid-custom-image-help" style="display:none">
26 Please select a custom image to edit. 28 Please select a custom image to edit.
27 </span> 29 </span>
28 </div> 30 </div>
29 31
30 <div class="modal-footer"> 32 <div class="modal-footer">
31 <button class="btn btn-primary btn-large" data-url="#" 33 <button class="btn btn-primary btn-lg" data-url="#"
32 data-action="edit-custom-image" disabled> 34 data-action="edit-custom-image" disabled>
33 Edit custom image 35 Edit custom image
34 </button> 36 </button>
37 </div>
38 </div>
35 </div> 39 </div>
36</div> 40</div>
37 41
@@ -46,7 +50,7 @@ $(document).ready(function () {
46 return $('[name="select-custom-image"]:checked'); 50 return $('[name="select-custom-image"]:checked');
47 }; 51 };
48 52
49 radios.change(function () { 53 function enableSubmit() {
50 if (getSelectedRadios().length === 1) { 54 if (getSelectedRadios().length === 1) {
51 editCustomImageButton.removeAttr('disabled'); 55 editCustomImageButton.removeAttr('disabled');
52 error.hide(); 56 error.hide();
@@ -55,6 +59,14 @@ $(document).ready(function () {
55 editCustomImageButton.attr('disabled', 'disabled'); 59 editCustomImageButton.attr('disabled', 'disabled');
56 error.show(); 60 error.show();
57 } 61 }
62 };
63
64 $("#edit-custom-image-modal").on("shown.bs.modal", function() {
65 enableSubmit();
66 });
67
68 radios.change(function () {
69 enableSubmit();
58 }); 70 });
59 71
60 editCustomImageButton.click(function () { 72 editCustomImageButton.click(function () {
@@ -67,5 +79,10 @@ $(document).ready(function () {
67 error.show(); 79 error.show();
68 } 80 }
69 }); 81 });
82
83 // Select the first custom image listed. Radio button groups
84 // should always have an option selected by default
85 $("input:radio:first").attr("checked", "checked");
86
70}); 87});
71</script> 88</script>
diff --git a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
index 1101aa8100..4c2c53e586 100644
--- a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
+++ b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
@@ -1,57 +1,64 @@
1{% load projecttags %} 1{% load projecttags %}
2<!-- '{{f.class}}' filter --> 2<!-- '{{f.class}}' filter -->
3{% with f.class as key %} 3{% with f.class as key %}
4<form id="filter_{{f.class}}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> 4
5 <input type="hidden" name="search" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/> 5<div id="filter_{{f.class}}" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
6 <div class="modal-header"> 6 <div class="modal-dialog">
7 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 7 <div class="modal-content">
8 {% if search_term %} 8 <form>
9 <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3> 9 <input type="hidden" name="search" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
10 {% else %} 10 <div class="modal-header">
11 <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3> 11 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
12 {% endif %} 12 {% if search_term %}
13 </div> 13 <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3>
14 <div class="modal-body"> 14 {% else %}
15 <p>{{f.label}}</p> 15 <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
16 <label class="radio"> 16 {% endif %}
17 <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value="" data-key="{{key}}"> All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} 17 </div>
18 </label> 18 <div class="modal-body">
19 {% for option in f.options %} 19 <p>{{f.label}}</p>
20 {% if option.1 == 'daterange' %} 20 <label class="radio">
21 <div class="form-inline"> 21 <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value="" data-key="{{key}}"> All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%}
22 <label class="radio"> 22 </label>
23 <input type="radio" name="filter" id="filter_value_{{key}}" {%if key == daterange_selected %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}} 23 {% for option in f.options %}
24 {% else %} 24 {% if option.1 == 'daterange' %}
25 {% if 1 %} 25 <div class="form-inline">
26 <label class="radio"> 26 <label class="radio">
27 <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}} 27 <input type="radio" name="filter" id="filter_value_{{key}}" {%if key == daterange_selected %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}}
28 {% comment "do not disable radio selections by count for now" %}{% else %} 28 {% else %}
29 <label class="radio muted"> 29 {% if 1 %}
30 <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}} 30 <label class="radio">
31 {% endcomment %}{% endif %} 31 <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}}
32 {% endif %} 32 {% comment "do not disable radio selections by count for now" %}{% else %}
33 {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %} 33 <label class="radio muted">
34 </label> 34 <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}}
35 {% if option.1 == 'daterange' %} 35 {% endcomment %}{% endif %}
36 <input type="text" id="date_from_{{key}}" name="date_from_{{key}}" disabled class="input-small" /><label class="help-inline">to</label> 36 {% endif %}
37 <input type="text" id="date_to_{{key}}" name="date_to_{{key}}" disabled class="input-small" /> 37 {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %}
38 <label class="help-inline get-help" >(dd/mm/yyyy)</label> 38 </label>
39 </div> 39 {% if option.1 == 'daterange' %}
40 {% endif %} 40 <input type="text" id="date_from_{{key}}" name="date_from_{{key}}" disabled class="input-sm" /><label class="help-inline">to</label>
41 {% endfor %} 41 <input type="text" id="date_to_{{key}}" name="date_to_{{key}}" disabled class="input-sm" />
42 <!-- daterange persistence --> 42 <label class="help-inline get-help" >(dd/mm/yyyy)</label>
43 {% if last_date_from and last_date_to %} 43 </div>
44 <input type="hidden" id="last_date_from_{{key}}" name="last_date_from" value="{{last_date_from}}"/> 44 {% endif %}
45 <input type="hidden" id="last_date_to_{{key}}" name="last_date_to" value="{{last_date_to}}"/> 45 {% endfor %}
46 {% endif %} 46 <!-- daterange persistence -->
47 </div> 47 {% if last_date_from and last_date_to %}
48 <div class="modal-footer"> 48 <input type="hidden" id="last_date_from_{{key}}" name="last_date_from" value="{{last_date_from}}"/>
49 <button type="submit" class="btn btn-primary" data-key="{{key}}">Apply</button> 49 <input type="hidden" id="last_date_to_{{key}}" name="last_date_to" value="{{last_date_to}}"/>
50 {% if request.GET.filter %} 50 {% endif %}
51 {% if request.GET.filter|string_remove_regex:':.*' != f.options.0.1|string_remove_regex:':.*' %} 51 </div>
52 <span class="help-inline pull-left">You can only apply one filter to the table. This filter will override the current filter.</span> 52 <div class="modal-footer">
53 {% endif %} 53 <button type="submit" class="btn btn-primary" data-key="{{key}}">Apply</button>
54 {% endif %} 54 {% if request.GET.filter %}
55 </div> 55 {% if request.GET.filter|string_remove_regex:':.*' != f.options.0.1|string_remove_regex:':.*' %}
56</form> 56 <span class="help-inline pull-left">You can only apply one filter to the table. This filter will override the current filter.</span>
57 {% endif %}
58 {% endif %}
59 </div>
60 </form>
61 </div><!-- /.modal-content -->
62 </div><!-- /.modal-dialog -->
63</div> <!--/.modal -->
57{% endwith %} 64{% endwith %}
diff --git a/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html b/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html
index 33aa8ce0d7..b3eabe1a26 100644
--- a/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html
+++ b/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html
@@ -7,7 +7,7 @@
7 7
8<h2>{{title}} (<span class="table-count-{{table_name}}"></span>) 8<h2>{{title}} (<span class="table-count-{{table_name}}"></span>)
9 {% if project.release %} 9 {% if project.release %}
10 <i class="icon-question-sign get-help heading-help" title="This page lists {{title}} compatible with the release selected for this project, which is {{project.release.description}}"></i> 10 <i class="glyphicon glyphicon-question-sign get-help" title="This page lists {{title|lower}} compatible with the release selected for this project, which is {{project.release.description}}"></i>
11 {% endif %} 11 {% endif %}
12</h2> 12</h2>
13 13
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index 1848f410e6..dd81f2f379 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -5,135 +5,133 @@
5{% block title %} Import layer - {{project.name}} - Toaster {% endblock %} 5{% block title %} Import layer - {{project.name}} - Toaster {% endblock %}
6{% block pagecontent %} 6{% block pagecontent %}
7 7
8{% include "projecttopbar.html" %} 8<div class="row">
9 9 {% include "projecttopbar.html" %}
10 10 {% if project and project.release %}
11 {% if project and project.release %} 11 <script src="{% static 'js/layerDepsModal.js' %}"></script>
12 <script src="{% static 'js/layerDepsModal.js' %}"></script> 12 <script src="{% static 'js/importlayer.js' %}"></script>
13 <script src="{% static 'js/importlayer.js' %}"></script> 13 <script>
14 <script> 14 $(document).ready(function (){
15 $(document).ready(function (){ 15 var ctx = {
16 var ctx = { 16 xhrImportLayerUrl : "{% url 'xhr_importlayer' %}",
17 xhrImportLayerUrl : "{% url 'xhr_importlayer' %}", 17 };
18 }; 18
19 19 try {
20 try { 20 importLayerPageInit(ctx);
21 importLayerPageInit(ctx); 21 } catch (e) {
22 } catch (e) { 22 document.write("Sorry, An error has occurred loading this page");
23 document.write("Sorry, An error has occurred loading this page"); 23 console.warn(e);
24 console.warn(e); 24 }
25 } 25 });
26 }); 26 </script>
27 </script> 27
28 28 <form class="col-md-11">
29 <form class="span11"> 29 <fieldset>
30 <fieldset> 30 <h2>Layer repository information</h2>
31 <legend>Layer repository information</legend> 31 <span class="help-block">The layer you are importing must be compatible with <strong>{{project.release.description}}</strong>, which is the release you are using in this project.</span>
32 <span class="help-block">The layer you are importing must be compatible with <strong>{{project.release.description}}</strong>, which is the release you are using in this project.</span> 32 <div class="alert alert-error" id="import-error" style="display:none">
33 <div class="alert alert-error" id="import-error" style="display:none"> 33 <button type="button" class="close" data-dismiss="alert">&times;</button>
34 <button type="button" class="close" data-dismiss="alert">&times;</button> 34 <h3>&nbsp;</h3>
35 <h3>&nbsp;</h3> 35 <p></p>
36 <p></p> 36 <ul></ul>
37 <ul></ul> 37 </div>
38 </div> 38
39 39 <div class="form-group" id="layer-name-ctrl">
40 <div class="control-group" id="layer-name-ctrl"> 40 <label class="control-label" for="import-layer-name">
41 <label class="control-label air" for="import-layer-name"> 41 Layer name
42 Layer name 42 <span class="glyphicon glyphicon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes"></span>
43 <span class="icon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes"></span> 43 </label>
44 </label> 44 <input class="form-control" id="import-layer-name" type="text" required autofocus data-autocomplete="off" data-provide="typeahead">
45 <div class="controls"> 45 <span class="help-block" style="display: none;" id="invalid-layer-name-hint">A valid layer name can only include letters, numbers and dashes</span>
46 <input id="import-layer-name" type="text" required autofocus data-autocomplete="off" data-provide="typeahead"> 46 <span class="help-inline" style="display: none;" id="duplicated-layer-name-hint"></span>
47 <span class="help-inline" style="display: none;" id="invalid-layer-name-hint">A valid layer name can only include letters, numbers and dashes</span> 47 </div>
48 <span class="help-inline" style="display: none;" id="duplicated-layer-name-hint"></span> 48
49 </div> 49 <div id="duplicate-layer-info" style="display:none">
50 50 <div class="alert alert-warning">
51 </div> 51 <h3>A layer called <a href="" class="dup-layer-link"><span class="dup-layer-name"></span></a> already exists</h3>
52 <div id="duplicate-layer-info" style="display:none"> 52 <p>Layer names must be unqiue. Please use a different layer name.</p>
53 <div class="alert warning"> 53 <dl>
54 <h3>A layer called <a href="" class="dup-layer-link"><span class="dup-layer-name"></span></a> already exists</h3> 54 <dt>
55 <p>Layer names must be unqiue. Please use a different layer name.</p> 55 The <span class="dup-layer-name"></span> repository url is
56 </div> 56 </dt>
57 <dl> 57 <dd>
58 <dt> 58 <span id="dup-layer-vcs-url"></span>
59 The <span class="dup-layer-name"></span> repository url is 59 </dd>
60 </dt> 60 <dt>
61 <dd> 61 The <span class="dup-layer-name"></span> revision is
62 <span id="dup-layer-vcs-url"></span> 62 </dt>
63 </dd> 63 <dd>
64 64 <span id="dup-layer-revision"></span>
65 <dt> 65 </dd>
66 The <span class="dup-layer-name"></span> revision is 66 </dl>
67 </dt> 67 <p><a href="" class="dup-layer-link">View the <span class="dup-layer-name"></span> layer information</a></p>
68 <dd> 68 </div>
69 <span id="dup-layer-revision"></span> 69 </div>
70 </dd> 70
71 </dl> 71 <div class="fields-apart-from-layer-name">
72 72 <div class="form-group">
73 <p><a href="" class="dup-layer-link">View the <span class="dup-layer-name"></span> layer information</a></p> 73 <label for="layer-git-repo-url">
74 74 Git repository URL
75 </div> 75 <span class="glyphicon glyphicon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories." ></span>
76 76 </label>
77 <div class="fields-apart-from-layer-name"> 77
78 <label for="layer-git-repo-url" class="project-form"> 78 <input type="text" id="layer-git-repo-url" class="form-control" required>
79 Git repository URL 79 </div>
80 <span class="icon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories." ></span> 80 <div class="form-group">
81 </label> 81 <label for="layer-subdir">
82 82 Repository subdirectory
83 <input type="text" id="layer-git-repo-url" class="input-xxlarge" required> 83 <span class="text-muted">(optional)</span>
84 <label class="project-form" for="layer-subdir"> 84 <span class="glyphicon glyphicon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span>
85 Repository subdirectory 85 </label>
86 <span class="muted">(optional)</span> 86 <input type="text" class="form-control" id="layer-subdir">
87 <span class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span> 87 </div>
88 </label> 88 <div class="form-group" id="layer-revision-ctrl">
89 <input type="text" id="layer-subdir"> 89 <label for="layer-git-ref">Git revision
90 90 <span class="glyphicon glyphicon-question-sign get-help" title="You can provide a Git branch, a tag or a commit SHA as the revision"></span>
91 <div class="control-group" id="layer-revision-ctrl"> 91 </label>
92 <label class="control-label project-form" for="layer-git-ref">Git revision 92 <input type="text" class="form-control" id="layer-git-ref" required>
93 <span class="icon-question-sign get-help" title="You can provide a Git branch, a tag or a commit SHA as the revision"></span> 93 <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span>
94 </label> 94 </div>
95 <div class="controls"> 95 </div>
96 <input type="text" class="span3" id="layer-git-ref" required> 96
97 <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span> 97 </fieldset>
98 </div> 98
99 </div> 99 <div class="fields-apart-from-layer-name">
100 </div> 100 <fieldset>
101 101 <h2>
102 </fieldset> 102 Layer dependencies
103 103 <small class="text-muted">(optional)</small>
104 <div class="fields-apart-from-layer-name"> 104 <span class="glyphicon glyphicon-question-sign get-help heading-help" title="Other layers this layer depends upon"></span>
105 <fieldset class="air"> 105 </h2>
106 <legend> 106 <ul class="list-unstyled lead" id="layer-deps-list">
107 Layer dependencies 107 </ul>
108 <span class="muted">(optional)</span> 108 <div class="form-inline">
109 <span class="icon-question-sign get-help heading-help" title="Other layers this layer depends upon"></span> 109 <div class="form-group">
110 </legend> 110 <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" placeholder="Type a layer name" id="layer-dependency" class="form-control">
111 <ul class="unstyled configuration-list" id="layer-deps-list"> 111 </div>
112 </ul> 112 <button class="btn btn-default" id="add-layer-dependency-btn">
113 <div class="input-append"> 113 Add layer
114 <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" placeholder="Type a layer name" id="layer-dependency" class="input-xlarge"> 114 </button>
115 <a class="btn" id="add-layer-dependency-btn"> 115 <span class="help-inline">You can only add layers Toaster knows about</span>
116 Add layer 116 </div>
117 </a> 117 </fieldset>
118 </div> 118 <div class="top-air" id="form-actions">
119 <span class="help-inline">You can only add layers Toaster knows about</span> 119 <button class="btn btn-primary btn-lg" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
120 </fieldset> 120 <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer you need to enter a layer name, a Git repository URL and a Git revision (branch, tag or commit)</span>
121 <div class="air" id="form-actions"> 121 </div>
122 <button class="btn btn-primary btn-large" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button> 122 </div>
123 <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer you need to enter a layer name, a Git repository URL and a revision (branch, tag or commit)</span> 123 </form>
124 </div> 124
125 </div> 125 {% else %} {#project and project release#}
126 </form> 126 <div class="page-header">
127 127 <h1>Import layer</h1>
128 {% else %} {#project and project release#} 128 </div>
129 <div class="page-header"> 129 <div class="alert alert-info" id="import-error" >
130 <h1>Import layer</h1> 130 <h3>Unsupported project type</h3>
131 </div> 131 <p>This project does not support importing layers.</p>
132 <div class="alert alert-info" id="import-error" > 132 <ul></ul>
133 <h3>Unsupported project type</h3> 133 </div>
134 <p>This project does not support importing layers.</p> 134
135 <ul></ul> 135 {% endif %}
136 </div> 136</div>
137
138 {% endif %}
139{% endblock %} 137{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/landing.html b/bitbake/lib/toaster/toastergui/templates/landing.html
index a1b5cdce75..498663294f 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing.html
@@ -6,24 +6,22 @@
6 6
7{% block title %} Welcome to Toaster {% endblock %} 7{% block title %} Welcome to Toaster {% endblock %}
8{% block pagecontent %} 8{% block pagecontent %}
9 <div class="container-fluid"> 9 <div class="row">
10 <div class="row-fluid"> 10 <div class="jumbotron well-transparent">
11 <div class="hero-unit span12 well-transparent">
12 <div class="row-fluid">
13 11
14 <div class="span6"> 12 <div class="col-md-6">
15 <h1>This is Toaster</h1> 13 <h1>This is Toaster</h1>
16 14
17 <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p> 15 <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
18 16
19 {% if lvs_nos %} 17 {% if lvs_nos %}
20 <p class="hero-actions"> 18 <p class="top-air">
21 <a class="btn btn-primary btn-large" href="{% url 'newproject' %}"> 19 <a class="btn btn-primary btn-lg" href="{% url 'newproject' %}">
22 To start building, create your first Toaster project 20 To start building, create your first Toaster project
23 </a> 21 </a>
24 </p> 22 </p>
25 {% else %} 23 {% else %}
26 <div class="alert alert-info lead air"> 24 <div class="alert alert-info lead top-air">
27 Toaster has no layer information. Without layer information, you cannot run builds. To generate layer information you can: 25 Toaster has no layer information. Without layer information, you cannot run builds. To generate layer information you can:
28 <ul> 26 <ul>
29 <li> 27 <li>
@@ -36,7 +34,7 @@
36 </div> 34 </div>
37 {% endif %} 35 {% endif %}
38 36
39 <ul class="unstyled"> 37 <ul class="list-unstyled lead">
40 <li> 38 <li>
41 <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html"> 39 <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
42 Read the Toaster manual 40 Read the Toaster manual
@@ -51,12 +49,11 @@
51 </ul> 49 </ul>
52 </div> 50 </div>
53 51
54 <div class="span6"> 52 <div class="col-md-6">
55 <img alt="Yocto Project" class="thumbnail" src="{% static 'img/toaster_bw.png' %}"/> 53 <img alt="Yocto Project Toaster" class="img-thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
56 </div> 54 </div>
57 55
58 </div>
59 </div> 56 </div>
60 </div> 57 </div>
61 </div> 58
62{% endblock %} 59{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html b/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
index 9b37f55305..baa4b72c14 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
@@ -8,8 +8,8 @@
8 8
9{% block pagecontent %} 9{% block pagecontent %}
10 10
11 <div class="container-fluid"> 11 <div class="container">
12 <div class="row-fluid"> 12 <div class="row">
13 <!-- Empty - no build module --> 13 <!-- Empty - no build module -->
14 <div class="page-header top-air"> 14 <div class="page-header top-air">
15 <h1> 15 <h1>
diff --git a/bitbake/lib/toaster/toastergui/templates/layer_btn.html b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
index 10de37d4b2..b2f73eba7a 100644
--- a/bitbake/lib/toaster/toastergui/templates/layer_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
@@ -1,17 +1,17 @@
1<button class="btn btn-danger btn-block layer-exists-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="remove" 1<a class="btn btn-danger btn-block layer-exists-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="remove"
2 {% if data.pk not in extra.current_layers %} 2 {% if data.pk not in extra.current_layers %}
3 style="display:none;" 3 style="display:none;"
4 {% endif %} 4 {% endif %}
5 > 5 >
6 <i class="icon-trash"></i> 6 <span class="glyphicon glyphicon-trash"></span>
7 Remove layer 7 Remove layer
8</button> 8</a>
9<button class="btn btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add" 9<a class="btn btn-default btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add"
10 {% if data.pk in extra.current_layers %} 10 {% if data.pk in extra.current_layers %}
11 style="display:none;" 11 style="display:none;"
12 {% endif %} 12 {% endif %}
13 > 13 >
14 <i class="icon-plus"></i> 14 <span class="glyphicon glyphicon-plus"></span>
15 Add layer 15 Add layer
16</button> 16</a>
17 17
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index 82be3703b6..0f0b2b49e6 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -6,270 +6,275 @@
6{% block title %} {{layerversion.layer.name}} - {{project.name}} - Toaster {% endblock %} 6{% block title %} {{layerversion.layer.name}} - {{project.name}} - Toaster {% endblock %}
7{% block pagecontent %} 7{% block pagecontent %}
8 8
9<div class="section"> 9<div class="row">
10 <ul class="breadcrumb"> 10 <div class="col-md-12">
11 <li> 11 <ul class="breadcrumb">
12 <a href="{% url 'project' project.id %}">{{project.name}}</a> 12 <li>
13 <span class="divider">&rarr;</span> 13 <a href="{% url 'project' project.id %}">{{project.name}}</a>
14 </li> 14 <span class="divider">&rarr;</span>
15 <li><a href="{% url 'projectlayers' project.id %}">Compatible layers</a> 15 </li>
16 <span class="divider">&rarr;</span> 16 <li><a href="{% url 'projectlayers' project.id %}">Compatible layers</a>
17 </li> 17 <span class="divider">&rarr;</span>
18 <li class="active"> 18 </li>
19 {{layerversion.layer.name}} ({{layerversion.get_vcs_reference|truncatechars:13}}) 19 <li class="active">
20 </li> 20 {{layerversion.layer.name}} ({{layerversion.get_vcs_reference|truncatechars:13}})
21 </ul> 21 </li>
22</div> 22 </ul>
23 23
24{# If this is not an imported layer then hide the edit ui #} 24 {# If this is not an imported layer then hide the edit ui #}
25{% if not layerversion.layer_source_id or layerversion.layer_source.sourcetype != layerversion.layer_source.TYPE_IMPORTED %} 25 {% if not layerversion.layer_source_id or layerversion.layer_source.sourcetype != layerversion.layer_source.TYPE_IMPORTED %}
26<style scoped> 26 <style scoped>
27 .icon-pencil { 27 .glyphicon-edit {
28 display:none; 28 display:none;
29 } 29 }
30.delete-current-value{ 30 .delete-current-value{
31 display: none; 31 display: none;
32} 32 }
33 li .icon-trash { 33 li .glyphicon-trash {
34 display:none; 34 display:none;
35 } 35 }
36 .add-deps { 36 .add-deps {
37 display:none; 37 display:none;
38 } 38 }
39</style> 39 </style>
40{% endif %} 40 {% endif %}
41 41
42 <script src="{% static 'js/layerdetails.js' %}"></script>
43 <script>
42 44
43<script src="{% static 'js/layerdetails.js' %}"></script> 45 $(document).ready(function(){
44<script> 46 var ctx = {
47 xhrUpdateLayerUrl : "{% url 'xhr_updatelayer' %}",
48 layerVersion : {
49 name : "{{layerversion.layer.name}}",
50 id : {{layerversion.id}},
51 commit: "{{layerversion.get_vcs_reference}}",
52 {%if layerversion.id in projectlayers %}
53 inCurrentPrj : true,
54 {% else %}
55 inCurrentPrj : false,
56 {% endif %}
57 layerdetailurl : "{% url 'layerdetails' project.id layerversion.id %}",
58 sourceId: {{layerversion.layer_source_id|json}},
59 }
60 };
45 61
46 $(document).ready(function (){ 62 try {
47 var ctx = { 63 layerDetailsPageInit(ctx);
48 xhrUpdateLayerUrl : "{% url 'xhr_updatelayer' %}", 64 } catch (e) {
49 layerVersion : { 65 document.write("Sorry, An error has occurred loading this page");
50 name : "{{layerversion.layer.name}}", 66 console.warn(e);
51 id : {{layerversion.id}},
52 commit: "{{layerversion.get_vcs_reference}}",
53 {%if layerversion.id in projectlayers %}
54 inCurrentPrj : true,
55 {% else %}
56 inCurrentPrj : false,
57 {% endif %}
58 layerdetailurl : "{% url 'layerdetails' project.id layerversion.id %}",
59 sourceId: {{layerversion.layer_source_id|json}},
60 } 67 }
61 }; 68 });
62 69 </script>
63 try {
64 layerDetailsPageInit(ctx);
65 } catch (e) {
66 document.write("Sorry, An error has occurred loading this page");
67 console.warn(e);
68 }
69 });
70</script>
71 70
72<div class="row-fluid span11"> 71 <div class="page-header">
73 <div class="page-header"> 72 <h1>{{layerversion.layer.name}} <small class="commit"
74 <h1>{{layerversion.layer.name}} <small class="commit" 73 {% if layerversion.get_vcs_reference|length > 13 %}
75 {% if layerversion.get_vcs_reference|length > 13 %} 74 data-toggle="tooltip" title="{{layerversion.get_vcs_reference}}"
76 data-toggle="tooltip" title="{{layerversion.get_vcs_reference}}" 75 {% endif %}>({{layerversion.get_vcs_reference|truncatechars:13}})</small>
77 {% endif %}> 76 </h1>
78 ({{layerversion.get_vcs_reference|truncatechars:13}})</small></h1> 77 </div>
79 </div>
80</div>
81 78
82<!-- container for tabs --> 79 <div class="row">
83<div class="row-fluid span7 tabbable"> 80 <!-- container for tabs -->
84 <div class="alert alert-info lead" id="alert-area" style="display:none"> 81 <div class="col-md-8 tabbable">
85 <button type="button" class="close" id="dismiss-alert">&times;</button> 82 <div class="alert alert-info lead" id="alert-area" style="display:none">
86 <span id="alert-msg"></span> 83 <button type="button" class="close" id="dismiss-alert">&times;</button>
87 </div> 84 <span id="alert-msg"></span>
88 <ul class="nav nav-pills"> 85 </div>
89 <li class="active"> 86 <ul class="nav nav-tabs">
90 <a data-toggle="tab" href="#information" id="details-tab">Layer details</a> 87 <li class="active">
91 </li> 88 <a data-toggle="tab" href="#information" id="details-tab">Layer details</a>
92 <li> 89 </li>
93 <a data-toggle="tab" href="#recipes" class="muted" id="targets-tab">Recipes (<span class="table-count-recipestable"></span>)</a> 90 <li>
94 </li> 91 <a data-toggle="tab" href="#recipes" class="text-muted" id="targets-tab">Recipes (<span class="table-count-recipestable"></span>)</a>
95 <li> 92 </li>
96 <a data-toggle="tab" href="#machines" class="muted" id="machines-tab">Machines (<span class="table-count-machinestable"></span>)</a> 93 <li>
97 </li> 94 <a data-toggle="tab" href="#machines" class="text-muted" id="machines-tab">Machines (<span class="table-count-machinestable"></span>)</a>
98 </ul> 95 </li>
99 <div class="tab-content"> 96 </ul>
100 <span class="button-place"> 97 <div class="tab-content">
101 {% if layerversion.id not in projectlayers %} 98 <span class="button-place">
102 <button id="add-remove-layer-btn" data-directive="add" class="btn btn-large btn-block"> 99 {% if layerversion.id not in projectlayers %}
103 <span class="icon-plus"></span> 100 <button id="add-remove-layer-btn" data-directive="add" class="btn btn-default btn-lg btn-block">
104 Add the {{layerversion.layer.name}} layer to your project 101 <span class="glyphicon glyphicon-plus"></span>
105 </button> 102 Add the {{layerversion.layer.name}} layer to your project
106 {% else %} 103 </button>
107 <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-large btn-danger"> 104 {% else %}
108 <span class="icon-trash"></span> 105 <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-default btn-block btn-lg btn-danger">
109 Remove the {{layerversion.layer.name}} layer from your project 106 <span class="glyphicon glyphicon-trash"></span>
110 </button> 107 Remove the {{layerversion.layer.name}} layer from your project
111 {% endif %} 108 </button>
112 </span> 109 {% endif %}
110 </span>
113 111
114 <!-- layer details pane --> 112 <!-- layer details pane -->
115 <div id="information" class="tab-pane active"> 113 <div id="information" class="tab-pane active">
116 <dl class="dl-horizontal"> 114 <dl class="dl-horizontal">
117 <dt class=""> 115 <dt class="">
118 <i class="icon-question-sign get-help" title="Fetch/clone URL of the repository"></i> 116 <span class="glyphicon glyphicon-question-sign get-help" title="Fetch/clone URL of the repository"></span>
119 Repository URL 117 Repository URL
120 </dt> 118 </dt>
121 <dd> 119 <dd>
122 <span class="current-value">{{layerversion.layer.vcs_url}}</span> 120 <span class="current-value">{{layerversion.layer.vcs_url}}</span>
123 {% if layerversion.get_vcs_link_url %} 121 {% if layerversion.get_vcs_link_url %}
124 <a href="{{layerversion.get_vcs_link_url}}/" class="icon-share get-info" target="_blank"></a> 122 <a href="{{layerversion.get_vcs_link_url}}/" class="glyphicon glyphicon-new-window" target="_blank"></a>
125 {% endif %} 123 {% endif %}
126 <form id="change-repo-form" class="control-group" style="display:none"> 124 <form id="change-repo-form" class="form-inline" style="display:none">
127 <div class="input-append"> 125 <div class="form-group">
128 <input type="text" class="input-xlarge" value="{{layerversion.layer.vcs_url}}"> 126 <input type="text" class="form-control" value="{{layerversion.layer.vcs_url}}">
129 <button data-layer-prop="vcs_url" class="btn change-btn" type="button">Save</button> 127 </div>
128 <button data-layer-prop="vcs_url" class="btn btn-default change-btn" type="button">Save</button>
130 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a> 129 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
131 </div> 130 </form>
132 </form> 131 <span class="glyphicon glyphicon-edit"></span>
133 <i class="icon-pencil" ></i> 132 </dd>
134 </dd> 133 <dt>
135 <dt> 134 <span class="glyphicon glyphicon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span>
136 <i class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></i> 135 Repository subdirectory
137 Repository subdirectory 136 </dt>
138 </dt> 137 <dd>
139 <dd> 138 <span class="text-muted" style="display:none">Not set</span>
140 <span class="muted" style="display:none">Not set</span> 139 <span class="current-value">{{layerversion.dirpath}}</span>
141 <span class="current-value">{{layerversion.dirpath}}</span> 140 {% if layerversion.get_vcs_dirpath_link_url %}
142 {% if layerversion.get_vcs_dirpath_link_url %} 141 <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="glyphicon glyphicon-new-window" target="_blank"></a>
143 <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="icon-share get-info" target="_blank"></a> 142 {% endif %}
144 {% endif %} 143 <form id="change-subdir-form" class="form-inline" style="display:none;">
145 <form id="change-subdir-form" style="display:none;"> 144 <div class="form-group">
146 <div class="input-append"> 145 <input type="text" class="form-control" value="{{layerversion.dirpath}}">
147 <input type="text" value="{{layerversion.dirpath}}">
148 <button data-layer-prop="dirpath" class="btn change-btn" type="button">Save</button>
149 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
150 </div> 146 </div>
147 <button data-layer-prop="dirpath" class="btn btn-default change-btn" type="button">Save</button>
148 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
151 </form> 149 </form>
152 <i id="change-subdir" class="icon-pencil"></i> 150 <span id="change-subdir" class="glyphicon glyphicon-edit"></span>
153 <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span> 151 <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
154 </dd> 152 </dd>
155 <dt> 153 <dt>
156 <i class="icon-question-sign get-help" title="The Git branch, tag or commit"></i> 154 <span class="glyphicon glyphicon-question-sign get-help" title="The Git branch, tag or commit"></span>
157 Git revision 155 Git revision
158 </dt> 156 </dt>
159 <dd> 157 <dd>
160 <span class="current-value">{{layerversion.get_vcs_reference}}</span> 158 <span class="current-value">{{layerversion.get_vcs_reference}}</span>
161 <form style="display:none;"> 159 <form style="display:none;" class="form-inline">
162 <div class="input-append"> 160 <div class="form-group">
163 <input type="text" value="{{layerversion.get_vcs_reference}}"> 161 <input type="text" class="form-control" value="{{layerversion.get_vcs_reference}}">
164 <button data-layer-prop="commit" class="btn change-btn" type="button">Save</button> 162 </div>
165 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a> 163 <button data-layer-prop="commit" class="btn btn-default change-btn" type="button">Save</button>
166 </div> 164 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
167 </form> 165 </form>
168 <i class="icon-pencil"></i> 166 <span class="glyphicon glyphicon-edit"></i>
169 </dd> 167 </dd>
170 <dt> 168 <dt>
171 <i class="icon-question-sign get-help" title="Other layers this layer depends upon"></i> 169 <span class="glyphicon glyphicon-question-sign get-help" title="Other layers this layer depends upon"></span>
172 Layer dependencies 170 Layer dependencies
173 </dt> 171 </dt>
174 <dd> 172 <dd>
175 <ul class="unstyled current-value" id="layer-deps-list"> 173 <ul class="list-unstyled current-value" id="layer-deps-list">
176 {% for ld in layerversion.dependencies.all %} 174 {% for ld in layerversion.dependencies.all %}
177 <li data-layer-id="{{ld.depends_on.id}}"> 175 <li data-layer-id="{{ld.depends_on.id}}">
178 <a data-toggle="tooltip" title="{{ld.depends_on.layer.vcs_url}} | {{ld.depends_on.get_vcs_reference}}" href="{% url 'layerdetails' project.id ld.depends_on.id %}">{{ld.depends_on.layer.name}}</a> 176 <a data-toggle="tooltip" title="{{ld.depends_on.layer.vcs_url}} | {{ld.depends_on.get_vcs_reference}}" href="{% url 'layerdetails' project.id ld.depends_on.id %}">{{ld.depends_on.layer.name}}</a>
179 <span class="icon-trash " data-toggle="tooltip" title="Delete"></span> 177 <span class="glyphicon glyphicon-trash " data-toggle="tooltip" title="Delete"></span>
180 </li> 178 </li>
181 {% endfor %} 179 {% endfor %}
182 </ul> 180 </ul>
183 <div class="input-append add-deps"> 181 <form class="form-inline add-deps">
184 <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" placeholder="Type a layer name" id="layer-dep-input"> 182 <div class="form-group">
185 <a class="btn" id="add-layer-dependency-btn" > 183 <input class="form-control" type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" placeholder="Type a layer name" id="layer-dep-input">
186 Add layer 184 </div>
187 </a> 185 <a class="btn btn-default" id="add-layer-dependency-btn" disabled="disabled">
188 </div> 186 Add layer
189 <span class="help-block add-deps">You can only add layers Toaster knows about</span> 187 </a>
190 </dd> 188 <span class="help-block add-deps">You can only add layers Toaster knows about</span>
191 </dl> 189 </form>
190 </dd>
191 </dl>
192 </div>
193 <!-- end layerdetails tab -->
194 <!-- targets tab -->
195 <div id="recipes" class="tab-pane">
196 <!-- Recipe table -->
197 <div id="no-recipes-yet" class="alert alert-info" style="display:none">
198 <p>Toaster does not have recipe information for the <strong> {{layerversion.layer.name}} </strong> layer.</p>
199 <p>Toaster learns about layers when you build them. If this layer provides any recipes, they will be listed here after you build the <strong> {{layerversion.layer.name}} </strong> layer.</p>
192 </div> 200 </div>
193 <!-- end layerdetails tab --> 201 {% url 'layerrecipestable' project.id layerversion.id as xhr_table_url %}
194 <!-- targets tab --> 202 {% with "recipestable" as table_name %}
195 <div id="recipes" class="tab-pane"> 203 {% with "Recipes" as title %}
196 <!-- Recipe table --> 204 {% include 'toastertable-simple.html' %}
197 <div id="no-recipes-yet" class="alert alert-info" style="display:none"> 205 {% endwith %}
198 <p>Toaster does not have recipe information for the <strong> {{layerversion.layer.name}} </strong> layer.</p> 206 {% endwith %}
199 <p>Toaster learns about layers when you build them. If this layer provides any recipes, they will be listed here after you build the <strong> {{layerversion.layer.name}} </strong> layer.</p> 207 </div>
200 </div>
201 208
209 <div id="machines" class="tab-pane">
202 210
203 211 <div id="no-machines-yet" class="alert alert-info" style="display:none">
204 {% url 'layerrecipestable' project.id layerversion.id as xhr_table_url %} 212 <p>Toaster does not have machine information for the <strong> {{layerversion.layer.name}} </strong> layer.</p>
205 {% with "recipestable" as table_name %} 213 <p>Sadly, machine information cannot be obtained from builds, so this page will remain empty.</p>
206 {% with "Recipes" as title %}
207 {% include 'toastertable-simple.html' %}
208 {% endwith %}
209 {% endwith %}
210 </div> 214 </div>
211 215
212 <div id="machines" class="tab-pane">
213
214 <div id="no-machines-yet" class="alert alert-info" style="display:none">
215 <p>Toaster does not have machine information for the <strong> {{layerversion.layer.name}} </strong> layer.</p>
216 <p>Toaster learns about layers when you build them. If this layer provides any machines, they will be listed here after you build the <strong> {{layerversion.layer.name}} </strong> layer.</p>
217 </div>
218 216
217 <!-- Machines table -->
218 {% url 'layermachinestable' project.id layerversion.id as xhr_table_url %}
219 {% with "machinestable" as table_name %}
220 {% with "Machines" as title %}
221 {% include 'toastertable-simple.html' %}
222 {% endwith %}
223 {% endwith %}
224 </div>
225 </div> <!-- end tab content -->
226 </div> <!-- end tabable -->
219 227
220 <!-- Machines table --> 228 <div class="col-md-4"> <!-- info side panel -->
221 {% url 'layermachinestable' project.id layerversion.id as xhr_table_url %} 229 <div class="well">
222 {% with "machinestable" as table_name %}
223 {% with "Machines" as title %}
224 {% include 'toastertable-simple.html' %}
225 {% endwith %}
226 {% endwith %}
227 </div>
228 </div> <!-- end tab content -->
229 </div> <!-- end tabable -->
230
231 <div class="row-fluid span4 well"> <!-- info side panel -->
232 <h2>About {{layerversion.layer.name}}</h2> 230 <h2>About {{layerversion.layer.name}}</h2>
233 <dl class="item-info"> 231 <dl class="item-info">
234 232
235 <dt> 233 <dt>
236 Summary 234 Summary
237 <i class="icon-question-sign get-help" title="One-line description of the layer"></i> 235 <span class="glyphicon glyphicon-question-sign get-help" title="One-line description of the layer"></span>
238 </dt> 236 </dt>
239 <dd> 237 <dd>
240 <span class="muted" style="display:none">Not set</span> 238 <span class="text-muted" style="display:none">Not set</span>
241 <span class="current-value">{{layerversion.layer.summary|default_if_none:''}}</span> 239 <span class="current-value">{{layerversion.layer.summary|default_if_none:''}}</span>
242 <form style="display:none; margin-bottom:20px"> 240 <form style="display:none; margin-bottom:20px; margin-top:5px;">
243 <textarea class="span12" rows="2">{% if layerversion.layer.summary %}{{layerversion.layer.summary}}{% endif %}</textarea> 241 <div class="form-group">
244 <button class="btn change-btn" data-layer-prop="summary" type="button">Save</button> 242 <textarea class="form-control" rows="2">{% if layerversion.layer.summary %}{{layerversion.layer.summary}}{% endif %}</textarea>
245 <a href="#" class="btn btn-link cancel">Cancel</a> 243 </div>
246 </form> 244 <button class="btn btn-default change-btn" data-layer-prop="summary" type="button">Save</button>
247 <i class="icon-pencil"></i> 245 <a href="#" class="btn btn-link cancel">Cancel</a>
248 <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span> 246 </form>
247 <span class="glyphicon glyphicon-edit"></span>
248 <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
249 </dd> 249 </dd>
250 <dt> 250 <dt>
251 Description 251 Description
252 </dt> 252 </dt>
253 <dd> 253 <dd>
254 <span class="muted" style="display:none">Not set</span> 254 <span class="text-muted" style="display:none">Not set</span>
255 <span class="current-value">{{layerversion.layer.description|default_if_none:''}}</span> 255 <span class="current-value">{{layerversion.layer.description|default_if_none:''}}</span>
256 <form style="display:none; margin-bottom:20px"> 256 <form style="display:none; margin-bottom:20px; margin-top:5px;">
257 <textarea class="span12" rows="6">{% if layerversion.layer.description %}{{layerversion.layer.description}}{% endif %}</textarea> 257 <div class="form-group">
258 <button class="btn change-btn" data-layer-prop="description" type="button" >Save</button> 258 <textarea class="form-control" rows="6">{% if layerversion.layer.description %}{{layerversion.layer.description}}{% endif %}</textarea>
259 <a href="#" class="btn btn-link cancel">Cancel</a> 259 </div>
260 </form> 260 <button class="btn btn-default change-btn" data-layer-prop="description" type="button" >Save</button>
261 <i class="icon-pencil"></i> 261 <a href="#" class="btn btn-link cancel">Cancel</a>
262 <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span> 262 </form>
263 <span class="glyphicon glyphicon-edit"></span>
264 <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
263 </dd> 265 </dd>
264 {% if layerversion.layer.up_id %} 266 {% if layerversion.layer.up_id %}
265 <dt>Layer index</dt> 267 <dt>Layer index</dt>
266 <dd> 268 <dd>
267 <a href="http://layers.openembedded.org/layerindex/branch/{{layerversion.up_branch.name}}/layer/{{layerversion.layer.name}}">layer index link</a> 269 <a href="http://layers.openembedded.org/layerindex/branch/{{layerversion.up_branch.name}}/layer/{{layerversion.layer.name}}">layer index link</a>
268
269 </dd>
270 {% endif %}
271 270
272 </dl> 271 </dd>
272 {% endif %}
273 </dl>
274 </div>
273 </div> 275 </div>
276 </div>
277 </div> <!-- close column 12 div -->
278</div> <!-- close top row div -->
274 279
275 {% endblock %} 280{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/machine_btn.html b/bitbake/lib/toaster/toastergui/templates/machine_btn.html
index 7b08f6a9a6..5d93d7aa9d 100644
--- a/bitbake/lib/toaster/toastergui/templates/machine_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/machine_btn.html
@@ -1,16 +1,16 @@
1<a href="{% url 'project' extra.pid %}?setMachine={{data.name}}" class="btn btn-block layer-exists-{{data.layer_version.id}}" 1<a href="{% url 'project' extra.pid %}?setMachine={{data.name}}" class="btn btn-default btn-block layer-exists-{{data.layer_version.id}}"
2 {% if data.layer_version.pk not in extra.current_layers %} 2 {% if data.layer_version.pk not in extra.current_layers %}
3 style="display:none;" 3 style="display:none;"
4 {% endif %} 4 {% endif %}
5> 5>
6 Select machine</a> 6 Select machine</a>
7<button class="btn btn-block layerbtn layer-add-{{data.layer_version.id}}" data-layer='{ "id": {{data.layer_version.id}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.id %}"}' data-directive="add" 7<a class="btn btn-default btn-block layerbtn layer-add-{{data.layer_version.id}}" data-layer='{ "id": {{data.layer_version.id}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.id %}"}' data-directive="add"
8 {% if data.layer_version.pk in extra.current_layers %} 8 {% if data.layer_version.pk in extra.current_layers %}
9 style="display:none;" 9 style="display:none;"
10 {% endif %} 10 {% endif %}
11> 11>
12 <i class="icon-plus"></i> 12 <span class="glyphicon glyphicon-plus"></span>
13 Add layer 13 Add layer
14 <i title="" class="icon-question-sign get-help" data-original-title="To enable this machine, you must first add the {{data.layer_version.layer.name}} layer to your project"></i> 14 <span class="glyphicon glyphicon-question-sign get-help" title="To select this machine, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
15</button> 15</a>
16 16
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 2780ac591e..4b4e3e691b 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -21,15 +21,15 @@
21{%if mru %} 21{%if mru %}
22 22
23 {%if mrb_type == 'project' %} 23 {%if mrb_type == 'project' %}
24 <h2 class="page-header"> 24 <h2>
25 Latest project builds 25 Latest project builds
26 26
27 {% if project.is_default %} 27 {% if project.is_default %}
28 <i class="icon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></i> 28 <span class="glyphicon glyphicon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></span>
29 {% endif %} 29 {% endif %}
30 </h2> 30 </h2>
31 {% else %} 31 {% else %}
32 <div class="page-header top-air"> 32 <div class="page-header">
33 <h1> 33 <h1>
34 Latest builds 34 Latest builds
35 </h1> 35 </h1>
@@ -37,18 +37,20 @@
37 {% endif %} 37 {% endif %}
38 <div id="latest-builds"> 38 <div id="latest-builds">
39 {% for build in mru %} 39 {% for build in mru %}
40 <div data-latest-build-result="{{ build.id }}" class="alert build-result {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}{% if mrb_type != 'project' %} project-name{% endif %}"> 40 <div data-latest-build-result="{{ build.id }}" class="alert build-result {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-danger{%else%}alert-info{%endif%}">
41 {% if mrb_type != 'project' %} 41 {% if mrb_type != 'project' %}
42 <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}"> 42 <div class="row project-name">
43 <a href={% project_url build.project %}> 43 <div class="col-md-12">
44 {{build.project.name}} 44 <small>
45 </a> 45 <a class="alert-link text-uppercase" href={% project_url build.project %}>{{build.project.name}}</a>
46 </span> 46 </small>
47 {% endif %} 47 </div>
48 <div class="row-fluid"> 48 </div>
49 <div class="span3 lead"> 49 {% endif %}
50 <div class="row">
51 <div class="col-md-3">
50 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %} 52 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
51 <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}"> 53 <a href="{%url 'builddashboard' build.pk%}" class="alert-link">
52 {% endif %} 54 {% endif %}
53 {% if build.target_set.all.count > 0 %} 55 {% if build.target_set.all.count > 0 %}
54 <span data-toggle="tooltip" 56 <span data-toggle="tooltip"
@@ -79,7 +81,7 @@
79 {% endif %} 81 {% endif %}
80 </div> 82 </div>
81 {% if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %} 83 {% if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
82 <div class="span2 lead"> 84 <div class="col-md-2">
83 {% if build.completed_on|format_build_date %} 85 {% if build.completed_on|format_build_date %}
84 {{ build.completed_on|date:'d/m/y H:i' }} 86 {{ build.completed_on|date:'d/m/y H:i' }}
85 {% else %} 87 {% else %}
@@ -88,22 +90,23 @@
88 </div> 90 </div>
89 {% endif %} 91 {% endif %}
90 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %} 92 {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
91 <div class="span2 lead"> 93 <div class="col-md-2">
92 {% if build.errors.count %} 94 {% if build.errors.count %}
93 <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors.count}} error{{build.errors.count|pluralize}}</a> 95 <span class="glyphicon glyphicon-minus-sign"></span>
96 <a href="{%url 'builddashboard' build.pk%}#errors" class="alert-link">{{build.errors.count}} error{{build.errors.count|pluralize}}</a>
94 {% endif %} 97 {% endif %}
95 </div> 98 </div>
96 <div class="span2 lead"> 99 <div class="col-md-2">
97 {% if build.warnings.count %} 100 {% if build.warnings.count %}
98 <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a> 101 <span class="glyphicon glyphicon-warning-sign build-warnings"></span>
102 <a href="{%url 'builddashboard' build.pk%}#warnings" class="alert-link build-warnings">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a>
99 {% endif %} 103 {% endif %}
100 </div> 104 </div>
101 <div class="lead "> 105 <div class="col-md-3">
102 <span class="lead"> 106 Build time: <a class="alert-link" href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}
103 Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a> 107 </a>
104 </span>
105 {% if build.project.is_default %} 108 {% if build.project.is_default %}
106 <i class="pull-right icon-question-sign get-help 109 <span class="pull-right glyphicon glyphicon-question-sign get-help
107 {% if build.outcome == build.SUCCEEDED %} 110 {% if build.outcome == build.SUCCEEDED %}
108 get-help-green 111 get-help-green
109 {% elif build.outcome == build.FAILED %} 112 {% elif build.outcome == build.FAILED %}
@@ -112,68 +115,66 @@
112 get-help-blue 115 get-help-blue
113 {% endif %} 116 {% endif %}
114 " title="Builds in this project cannot be started from Toaster: they are started from the command line"> 117 " title="Builds in this project cannot be started from Toaster: they are started from the command line">
115 </i> 118 </span>
116 {% else %} 119 {% else %}
117 <button class="run-again-btn btn 120 <a href="#" class="run-again-btn alert-link
118 {% if build.outcome == build.SUCCEEDED %} 121 {% if build.outcome == build.SUCCEEDED %}
119 btn-success 122 success
120 {% elif build.outcome == build.FAILED %} 123 {% elif build.outcome == build.FAILED %}
121 btn-danger 124 danger
122 {% else %} 125 {% else %}
123 btn-info 126 info
124 {%endif%} 127 {%endif%}
125 pull-right" 128 pull-right"
126 data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" 129 data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
127 data-target='{{build.target_set.all|get_tasks|json}}'> 130 data-target='{{build.target_set.all|get_tasks|json}}'>
128 Rebuild 131 <span class="glyphicon glyphicon-repeat"></span>
129 </button> 132 Rebuild
133 </a>
130 {% endif %} 134 {% endif %}
131 </div> 135 </div>
132 {%endif%} 136 {%endif%}
137
133 {%if build.outcome == build.IN_PROGRESS %} 138 {%if build.outcome == build.IN_PROGRESS %}
134 <div class="span4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}"> 139 <div class="col-md-4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}">
135 <p class="lead">Cancelling the build ...</p> 140 Cancelling the build ...
136 </div> 141 </div>
137 <div class="span4 offset1 progress-info"> 142 <div class="col-md-4 col-md-offset-1 progress-info">
138 <div class="progress" id="build-pc-done-title-{{build.pk}}" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete"> 143 <div class="progress" id="build-pc-done-title-{{build.pk}}">
139 <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="bar"></div> 144 <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="progress-bar"></div>
140 </div> 145 </div>
141 </div> 146 </div>
142 <div class="lead span3 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div> 147 <div class="col-md-4 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete
143 {# No build cancel for command line builds project #} 148 {# No build cancel for command line builds project #}
144 {% if build.project.is_default %} 149 {% if build.project.is_default %}
145 <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 cancelled from the command line"></i> 150 <span class="glyphicon glyphicon-question-sign get-help get-help-blue pull-right" title="Builds in this project cannot be cancelled from Toaster: they can only be cancelled from the command line"></span>
146 {% else %} 151 {% else %}
147 <div class="lead pull-right progress-info"> 152 <a href="#" class="cancel-build-btn pull-right alert-link"
148 <button class="cancel-build-btn btn btn-info pull-right"
149 data-buildrequest-id={{build.buildrequest.pk}} 153 data-buildrequest-id={{build.buildrequest.pk}}
150 data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" > 154 data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" >
155 <span class="glyphicon glyphicon-remove-circle"></span>
151 Cancel 156 Cancel
152 </button> 157 </a>
153 </div> 158 </div>
154 {% endif %} 159 {% endif %}
155 160
156 {%endif%} {# end if in progress #} 161 {%endif%} {# end if in progress #}
157 162
158 {% if build.outcome == build.CANCELLED %} 163 {% if build.outcome == build.CANCELLED %}
159 <div class="span4"> 164 <div class="col-md-6">
160 <p class="lead">Build cancelled</p> 165 Build cancelled
161 </div> 166 </div>
162 167 <div class="col-md-3">
163 {% if build.project.is_default %} 168 <a href="#" class="info pull-right run-again-btn alert-link"
164 <i class="icon-question-sign get-help get-help-blue pull-right" title="" 169 data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
165 data-original-title="Builds in this project cannot be rebuilt from Toaster: they can only be rebuilt from the command line"></i> 170 data-target='{{build.target_set.all|get_tasks|json}}'>
166 {% else %} 171 <span class="glyphicon glyphicon-repeat"></span>
167 <button class="btn btn-info pull-right run-again-btn" 172 Rebuild
168 data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" 173 </a>
169 data-target='{{build.target_set.all|get_tasks|json}}'> 174 </div>
170 Rebuild
171 </button>
172 {% endif %}
173 {% endif %} 175 {% endif %}
174 </div> 176 </div>
175</div> 177</div>
176
177 {% endfor %} 178 {% endfor %}
178 </div> 179 </div>
179 180
diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
index 46aed901f1..980179a406 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
@@ -5,10 +5,17 @@
5{% block pagecontent %} 5{% block pagecontent %}
6 6
7{% include "newcustomimage_modal.html" %} 7{% include "newcustomimage_modal.html" %}
8{% include "projecttopbar.html" %}
9 8
10{% url table_name project.id as xhr_table_url %} 9<div class="row">
11<h2>{{title}} (<span class="table-count-{{table_name}}">0</span>)</h2> 10
12{% include "toastertable.html" %} 11 {% include "projecttopbar.html" %}
12
13 <div class="col-md-12">
14 {% url table_name project.id as xhr_table_url %}
15 <h2>{{title}} (<span class="table-count-{{table_name}}">0</span>)</h2>
16 {% include "toastertable.html" %}
17 </div>
18
19</div>
13 20
14{% endblock %} 21{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
index caeb302352..5caa68392c 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
@@ -12,37 +12,44 @@
12 }); 12 });
13</script> 13</script>
14 14
15<div class="modal hide fade in" id="new-custom-image-modal" aria-hidden="false"> 15<div class="modal fade" id="new-custom-image-modal" aria-hidden="false">
16 <div class="modal-header"> 16 <div class="modal-dialog">
17 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> 17 <div class="modal-content">
18 <h3>New custom image</h3> 18 <div class="modal-header">
19 </div> 19 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
20 <h3>New custom image</h3>
21 </div>
20 22
21 <div class="modal-body"> 23 <div class="modal-body">
22 <!-- 24 <!--
23 this container is visible if there are multiple image recipes which could 25 this container is visible if there are multiple image recipes which could
24 be used as a basis for the new custom image; radio buttons are added to it 26 be used as a basis for the new custom image; radio buttons are added to it
25 via newCustomImageModalSetRecipes() as required 27 via newCustomImageModalSetRecipes() as required
26 --> 28 -->
27 <div data-role="image-selector" style="display:none;"> 29 <div data-role="image-selector" style="display:none;">
28 <h4>Which image do you want to customise?</h4> 30 <h4>Which image do you want to customise?</h4>
29 <div data-role="image-selector-radios"></div> 31 <span class="help-block text-danger" id="invalid-recipe-help" style="display:none"></span>
30 <span class="help-block error" id="invalid-recipe-help" style="display:none"></span> 32 <div data-role="image-selector-radios"></div>
31 <div class="air"></div> 33 <div class="air"></div>
32 </div> 34 </div>
33 35
34 <h4>Name your custom image</h4> 36 <h4>Name your custom image</h4>
35 37
36 <div class="row-fluid"> 38 <div class="row">
37 <span class="help-block span8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p> 39 <div class="col-md-10">
38 </span></div> 40 <p class="help-block">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).
39 <div class="control-group controls"> 41 </p>
40 <input type="text" class="huge" placeholder="Type the custom image name" required> 42 <div class="form-group">
41 <span class="help-block error" id="invalid-name-help" style="display:none"></span> 43 <input type="text" class="form-control input-lg" placeholder="Type the custom image name" required>
42 </div> 44 </div>
43 </div> 45 <span class="help-block text-danger" id="invalid-name-help" style="display:none"></span>
46 </div>
47 </div>
48 </div>
44 49
45 <div class="modal-footer"> 50 <div class="modal-footer">
46 <button id="create-new-custom-image-btn" class="btn btn-primary btn-large" data-original-title="" title="" disabled>Create custom image</button> 51 <button id="create-new-custom-image-btn" class="btn btn-primary btn-lg" data-original-title="" title="" disabled>Create custom image</button>
52 </div>
53 </div>
47 </div> 54 </div>
48</div> 55</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/newproject.html b/bitbake/lib/toaster/toastergui/templates/newproject.html
index 8913057f40..acb614e9d3 100644
--- a/bitbake/lib/toaster/toastergui/templates/newproject.html
+++ b/bitbake/lib/toaster/toastergui/templates/newproject.html
@@ -5,27 +5,21 @@
5{% block title %} Create a new project - Toaster {% endblock %} 5{% block title %} Create a new project - Toaster {% endblock %}
6 6
7{% block pagecontent %} 7{% block pagecontent %}
8<div class="row-fluid"> 8<div class="row">
9 <div class="col-md-12">
9 <div class="page-header"> 10 <div class="page-header">
10 <h1>Create a new project</h1> 11 <h1>Create a new project</h1>
11 </div> 12 </div>
12 <div class="container-fluid">
13 {% if alert %} 13 {% if alert %}
14 <div class="alert alert-error row-fluid" role="alert">{{alert}}</div> 14 <div class="alert alert-danger" role="alert">{{alert}}</div>
15 {% endif %} 15 {% endif %}
16 </div>
17 16
18 <div class="row-fluid">
19 <div class="span6">
20 <form method="POST">{% csrf_token %} 17 <form method="POST">{% csrf_token %}
21 18 <div class="form-group" id="validate-project-name">
22 <fieldset id="validate-project-name"> 19 <label class="control-label">Project name <span class="text-muted">(required)</span></label>
23 <label>Project name <span class="muted">(required)</span></label> 20 <input type="text" class="form-control" required id="new-project-name" name="projectname">
24 <div> 21 </div>
25 <input type="text" class="input-xlarge" required id="new-project-name" name="projectname"> 22 <p class="help-block text-danger" style="display: none;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
26 <p class="help-block error" style="display: none;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
27 </div>
28 </fieldset>
29<!-- 23<!--
30 <fieldset> 24 <fieldset>
31 <label class="project-form">Project type</label> 25 <label class="project-form">Project type</label>
@@ -38,13 +32,13 @@
38 <input type="hidden" name="ptype" value="build" /> 32 <input type="hidden" name="ptype" value="build" />
39 33
40 {% if releases.count > 0 %} 34 {% if releases.count > 0 %}
41 <fieldset class="release"> 35 <div class="release form-group">
42 {% if releases.count > 1 %} 36 {% if releases.count > 1 %}
43 <label class="project-form"> 37 <label class="control-label">
44 Release 38 Release
45 <i class="icon-question-sign get-help" title="The version of the build system you want to use"></i> 39 <span class="glyphicon glyphicon-question-sign get-help" title="The version of the build system you want to use"></span>
46 </label> 40 </label>
47 <select name="projectversion" id="projectversion"> 41 <select name="projectversion" id="projectversion" class="form-control">
48 {% for release in releases %} 42 {% for release in releases %}
49 <option value="{{release.id}}" 43 <option value="{{release.id}}"
50 {%if defaultbranch == release.name %} 44 {%if defaultbranch == release.name %}
@@ -53,25 +47,28 @@
53 >{{release.description}}</option> 47 >{{release.description}}</option>
54 {% endfor %} 48 {% endfor %}
55 </select> 49 </select>
50 <div class="row">
51 <div class="col-md-4">
56 {% for release in releases %} 52 {% for release in releases %}
57 <div class="row-fluid helptext" id="description-{{release.id}}" style="display: none"> 53 <div class="helptext" id="description-{{release.id}}" style="display: none">
58 <span class="help-block span5">{{release.helptext|safe}}</span> 54 <span class="help-block">{{release.helptext|safe}}</span>
59 </div> 55 </div>
60 {% endfor %} 56 {% endfor %}
61 {% else %} 57 {% else %}
62 <input type="hidden" name="projectversion" value="{{releases.0.id}}"/> 58 <input type="hidden" name="projectversion" value="{{releases.0.id}}"/>
63 {% endif %} 59 {% endif %}
60 </div>
61 </div>
64 </fieldset> 62 </fieldset>
65 {% endif %} 63 {% endif %}
66 64 <div class="top-air">
67 <div class="form-actions"> 65 <input type="submit" id="create-project-button" class="btn btn-primary btn-lg" value="Create project"/>
68 <input type="submit" id="create-project-button" class="btn btn-primary btn-large" value="Create project"/>
69 <span class="help-inline" style="vertical-align:middle;">To create a project, you need to enter a project name</span> 66 <span class="help-inline" style="vertical-align:middle;">To create a project, you need to enter a project name</span>
70 </div> 67 </div>
68
71 </form> 69 </form>
72 </div>
73 <!-- 70 <!--
74 <div class="span5 well"> 71 <div class="col-md-5 well">
75 <span class="help-block"> 72 <span class="help-block">
76 <h4>Toaster project types</h4> 73 <h4>Toaster project types</h4>
77 <p>With a <strong>build project</strong> you configure and run your builds from Toaster.</p> 74 <p>With a <strong>build project</strong> you configure and run your builds from Toaster.</p>
@@ -84,7 +81,7 @@
84 <p>If you create a <strong>build project</strong>, you will need to select a <strong>release</strong>, 81 <p>If you create a <strong>build project</strong>, you will need to select a <strong>release</strong>,
85 which is the version of the build system you want to use to run your builds.</p> 82 which is the version of the build system you want to use to run your builds.</p>
86 </div> --> 83 </div> -->
87 </div> 84 </div>
88 </div> 85 </div>
89 86
90 <script type="text/javascript"> 87 <script type="text/javascript">
diff --git a/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
index e6f20c3300..e53eb9dd1c 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
@@ -31,7 +31,7 @@
31 <tr> 31 <tr>
32 <th>Package</th> 32 <th>Package</th>
33 <th>Version</th> 33 <th>Version</th>
34 <th class="sizecol span2">Size</th> 34 <th class="sizecol col-md-2">Size</th>
35 </tr> 35 </tr>
36 </thead> 36 </thead>
37 <tbody> 37 <tbody>
@@ -62,7 +62,7 @@
62 <tr> 62 <tr>
63 <th>Package</th> 63 <th>Package</th>
64 <th>Version</th> 64 <th>Version</th>
65 <th class="sizecol span2">Size</th> 65 <th class="sizecol col-md-2">Size</th>
66 <th> 66 <th>
67 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i> 67 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
68 Relationship type 68 Relationship type
diff --git a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
index 9fa28a8f8a..17562a8845 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
@@ -43,21 +43,25 @@
43{% endblock localbreadcrumb %} 43{% endblock localbreadcrumb %}
44 44
45{% block pagedetailinfomain %} 45{% block pagedetailinfomain %}
46 <div class="row span11"> 46 <div class="row">
47 <div class="col-md-12">
47 <div class="page-header"> 48 <div class="page-header">
48 {% block mainheading %} 49 {% block mainheading %}
49 <h1>{{package.fullpackagespec}}</h1> 50 <h1>{{package.fullpackagespec}}</h1>
50 {% endblock %} 51 {% endblock %}
51 </div> <!-- page-header --> 52 </div> <!-- page-header -->
52 </div> <!-- row span11 page-header --> 53 </div> <!-- col-md-12 page-header -->
54 </div> <!-- end row -->
53 55
54 {% block twocolumns %} 56 {% block twocolumns %}
55 <div class="row span7 tabbable"> 57 <div class="row">
58 <div class="col-md-8 tabbable">
56 {% block tabcontent %} 59 {% block tabcontent %}
57 {% endblock tabcontent %} 60 {% endblock tabcontent %}
58 </div> <!-- row span7 --> 61 </div> <!-- row col-md-8 -->
59 62
60 <div class="row span4 well"> 63 <div class="col-md-4">
64 <div class="well">
61 <h2>Package information</h2> 65 <h2>Package information</h2>
62 66
63 <!-- info presented as definition list --> 67 <!-- info presented as definition list -->
@@ -124,7 +128,7 @@
124 # Removed per team meeting of 1/29/2014 until 128 # Removed per team meeting of 1/29/2014 until
125 # decision on index search algorithm 129 # decision on index search algorithm
126 <a href="http://layers.openembedded.org" target="_blank"> 130 <a href="http://layers.openembedded.org" target="_blank">
127 <i class="icon-share get-info"></i> 131 <i class="glyphicon glyphicon-share get-info"></i>
128 </a> 132 </a>
129 {% endcomment %} 133 {% endcomment %}
130 {% endif %} 134 {% endif %}
@@ -144,6 +148,8 @@
144 <dd class="iscommit">{{package.recipe.layer_version.commit}}</dd> 148 <dd class="iscommit">{{package.recipe.layer_version.commit}}</dd>
145 149
146 </dl> 150 </dl>
147 </div> <!-- row4 well --> 151 <div> <!-- end well -->
152 </div> <!-- end 4-column section -->
148 {% endblock twocolumns %} 153 {% endblock twocolumns %}
154 </div> <!-- end row -->
149{% endblock pagedetailinfomain %} 155{% endblock pagedetailinfomain %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
index 8a0508e703..0672ba345e 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
@@ -20,7 +20,7 @@
20 <tr> 20 <tr>
21 <th>Package</th> 21 <th>Package</th>
22 <th>Version</th> 22 <th>Version</th>
23 <th class='sizecol span2'>Size</th> 23 <th class='sizecol col-md-2'>Size</th>
24 </tr> 24 </tr>
25 </thead> 25 </thead>
26 <tbody> 26 <tbody>
@@ -57,7 +57,7 @@
57 <tr> 57 <tr>
58 <th>Package</th> 58 <th>Package</th>
59 <th>Version</th> 59 <th>Version</th>
60 <th class='sizecol span2'>Size</th> 60 <th class='sizecol col-md-2'>Size</th>
61 <th> 61 <th>
62 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i> 62 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
63 Relationship type 63 Relationship type
diff --git a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
index 0aefc56259..303faecbd4 100644
--- a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
@@ -1,12 +1,12 @@
1{# TODO move to snippets dir #} 1{# TODO move to snippets dir #}
2{% if data.is_locale_package %} 2{% if data.is_locale_package %}
3<p class="text-center"> 3<p class="text-center">
4 <span class="muted">Locale package</span> 4 <span class="text-muted">Locale package</span>
5 <i class="icon-question-sign get-help hover-help" title="" 5 <span class="glyphicon glyphicon-question-sign get-help hover-help"
6 data-original-title="This package is included in your image 6 title="This package is included in your image
7 based on the locale specified in the IMAGE_LINGUAS variable" 7 based on the locale specified in the IMAGE_LINGUAS variable"
8 style="visibility: hidden;"> 8 style="visibility: hidden;">
9 </i> 9 </span>
10</p> 10</p>
11 11
12{% else %} 12{% else %}
@@ -21,12 +21,12 @@
21 <i class="icon-trash no-tooltip"></i> 21 <i class="icon-trash no-tooltip"></i>
22 Remove package 22 Remove package
23 </button> 23 </button>
24 <button class="btn btn-block add-rm-package-btn" data-directive="add" data-id="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" data-name="{{data.name}}" style=" 24 <button class="btn btn-default btn-block add-rm-package-btn" data-directive="add" data-id="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" data-name="{{data.name}}" style="
25 {% if data.pk in extra.current_packages %} 25 {% if data.pk in extra.current_packages %}
26 display:none 26 display:none
27 {% endif %} 27 {% endif %}
28 "> 28 ">
29 <i class="icon-plus"></i> 29 <i class="glyphicon glyphicon-plus"></i>
30 Add package 30 Add package
31 </button> 31 </button>
32</div> 32</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index 125676881f..ff9eab7361 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -24,44 +24,49 @@
24 }); 24 });
25</script> 25</script>
26 26
27{% comment %}
27<!-- Comment out the ability to change the project release, until we decide what to do this functionality --> 28<!-- Comment out the ability to change the project release, until we decide what to do this functionality -->
29<div id="change-release-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="change-release-modal" aria-hidden="false">
30 <div class="modal-dialog">
31 <div class="modal-content">
28 32
29<!--div id="change-release-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="change-release-modal" aria-hidden="false"> 33 <div class="modal-header">
30 <div class="modal-header"> 34 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
31 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 35 <h3>Changing Yocto Project release to <span class="proposed-release-change-name"></span></h3>
32 <h3>Changing Yocto Project release to <span class="proposed-release-change-name"></span></h3> 36 </div>
33 </div> 37 <div class="modal-body">
34 <div class="modal-body"> 38 <p>The following added layers do not exist for <span class="proposed-release-change-name"></span>: </p>
35 <p>The following added layers do not exist for <span class="proposed-release-change-name"></span>: </p> 39 <ul id="layers-to-remove-list">
36 <ul id="layers-to-remove-list"> 40 </ul>
37 </ul> 41 <p>If you change the Yocto Project release to <span class="proposed-release-change-name"></span>, the above layers will be deleted from your added layers.</p>
38 <p>If you change the Yocto Project release to <span class="proposed-release-change-name"></span>, the above layers will be deleted from your added layers.</p> 42 </div>
39 </div> 43 <div class="modal-footer">
40 <div class="modal-footer"> 44 <button id="change-release-and-rm-layers" data-dismiss="modal" type="submit" class="btn btn-primary">Change release and delete layers</button>
41 <button id="change-release-and-rm-layers" data-dismiss="modal" type="submit" class="btn btn-primary">Change release and delete layers</button> 45 <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
42 <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button> 46 </div>
43 </div> 47 </div><!-- /.modal-content -->
44</div--> 48 </div><!-- /.modal-dialog -->
45 49</div><!-- /.modal -->
50{% endcomment %}
46 51
47<div class="row-fluid" id="project-page" style="display:none"> 52<div class="row" id="project-page" style="display:none">
48 <div class="span6"> 53 <div class="col-md-6">
49 <div class="well well-transparent" id="machine-section"> 54 <div class="well well-transparent" id="machine-section">
50 <h3>Machine</h3> 55 <h3>Machine</h3>
51 56
52 <p class="lead"><span id="project-machine-name"></span> <i title="" data-original-title="" id="change-machine-toggle" class="icon-pencil"></i></p> 57 <p class="lead"><span id="project-machine-name"></span> <span class="glyphicon glyphicon-edit" id="change-machine-toggle"></span></p>
53 58
54 <form id="select-machine-form" style="display:none;"> 59 <form id="select-machine-form" style="display:none;" class="form-inline">
55 <div class="alert alert-info"> 60 <div class="alert alert-info">
56 <strong>Machine changes have a big impact on build outcome.</strong> You cannot really compare the builds for the new machine with the previous ones. 61 <strong>Machine changes have a big impact on build outcome.</strong> You cannot really compare the builds for the new machine with the previous ones.
57 </div> 62 </div>
58 63
59 <div class="input-append"> 64 <div class="form-group">
60 <input id="machine-change-input" autocomplete="off" value="" data-provide="typeahead" data-minlength="1" data-autocomplete="off" type="text"> 65 <input class="form-control" id="machine-change-input" autocomplete="off" value="" data-provide="typeahead" data-minlength="1" data-autocomplete="off" type="text">
61 <button id="machine-change-btn" class="btn" type="button">Save</button> <a href="#" id="cancel-machine-change" class="btn btn-link">Cancel</a>
62 </div> 66 </div>
63 67 <button id="machine-change-btn" class="btn btn-default" type="button">Save</button>
64 <p><a href="{% url 'projectmachines' project.id %}" class="link">View compatible machines</a></p> 68 <a href="#" id="cancel-machine-change" class="btn btn-link">Cancel</a>
69 <p class="form-link"><a href="{% url 'projectmachines' project.id %}">View compatible machines</a></p>
65 </form> 70 </form>
66 </div> 71 </div>
67 72
@@ -69,11 +74,11 @@
69 <h3>Most built recipes</h3> 74 <h3>Most built recipes</h3>
70 75
71 <div class="alert alert-info" style="display:none" id="no-most-built"> 76 <div class="alert alert-info" style="display:none" id="no-most-built">
72 <span class="lead">You haven't built any recipes yet</span> 77 <h4>You haven't built any recipes yet</h4>
73 <p style="margin-top: 10px;"><a href="{% url 'projectimagerecipes' project.id %}">Choose a recipe to build</a></p> 78 <p class="form-link"><a href="{% url 'projectimagerecipes' project.id %}">Choose a recipe to build</a></p>
74 </div> 79 </div>
75 80
76 <ul class="unstyled configuration-list" id="freq-build-list"> 81 <ul class="list-unstyled lead" id="freq-build-list">
77 </ul> 82 </ul>
78 <button class="btn btn-primary" id="freq-build-btn" disabled="disabled">Build selected recipes</button> 83 <button class="btn btn-primary" id="freq-build-btn" disabled="disabled">Build selected recipes</button>
79 </div> 84 </div>
@@ -97,44 +102,37 @@
97 </div> 102 </div>
98 </div> 103 </div>
99 104
100 <div class="span6"> 105 <div class="col-md-6">
101 <div class="well well-transparent" id="layer-container"> 106 <div class="well well-transparent" id="layer-container">
102 <h3>Layers <span class="muted counter">(<span id="project-layers-count"></span>)</span> 107 <h3>Layers <span class="counter">(<span id="project-layers-count"></span>)</span>
103 <i data-original-title="OpenEmbedded organises metadata into modules called 'layers'. Layers allow you to isolate different types of customizations from each other. <a href='http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers' target='_blank'>More on layers</a>" class="icon-question-sign get-help heading-help" title=""></i> 108 <span title="OpenEmbedded organises recipes and machines into thematic groups called <strong>layers</strong>. Click on a layer name to see the recipes and machines it includes." class="glyphicon glyphicon-question-sign get-help"></span>
104 </h3> 109 </h3>
105 110
106 <div class="alert lead" id="no-layers-in-project" style="display:none"> 111 <div class="alert alert-warning" id="no-layers-in-project" style="display:none">
107 You need to add some layers. For that you can: 112 <h4>This project has no layers</h4>
113 In order to build this project you need to add some layers first. For that you can:
108 <ul> 114 <ul>
109 <li><a href="{% url 'projectlayers' project.id %}">View all layers compatible with this project</a></li> 115 <li><a href="{% url 'projectlayers' project.id %}">Choose from the layers compatible with this project</a></li>
110 <li><a href="{% url 'importlayer' project.id %}">Import a layer</a></li> 116 <li><a href="{% url 'importlayer' project.id %}">Import a layer</a></li>
111 <li><a href="http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers" target="_blank">Read about layers in the documentation</a></li> 117 <li><a href="http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers" target="_blank">Read about layers in the documentation</a></li>
118 <li>Or type a layer name below</li>
112 </ul> 119 </ul>
113 <p>Or type a layer name below.</p>
114 </div> 120 </div>
115 121
116 <form style="margin-top:20px"> 122 <form class="form-inline">
117 <!--div class="control-group error"--> 123 <div class="form-group">
118 124 <input id="layer-add-input" class="form-control" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
119 <div class="input-append">
120 <input id="layer-add-input" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
121 <button id="add-layer-btn" class="btn" disabled>Add</button>
122 </div>
123
124 <div id="import-alert" class="alert alert-info" style="display:none;">
125 Toaster does not know about this layer. Please <a href="#">import it</a>
126 </div> 125 </div>
127 126 <button id="add-layer-btn" class="btn btn-default" disabled>Add layer</button>
128 <p> 127 <p class="form-link">
129 <a href="{% url 'projectlayers' project.id %}" id="view-compatible-layers">View compatible layers</a> 128 <a href="{% url 'projectlayers' project.id %}" id="view-compatible-layers">View compatible layers</a>
130 <i data-original-title="View all the layers you can build with the release selected for this project, which is Yocto Project master" class="icon-question-sign get-help" title=""></i> 129 <span class="text-muted">|</span>
131 | <a href="{% url 'importlayer' project.id %}">Import layer</a> 130 <a href="{% url 'importlayer' project.id %}">Import layer</a>
132 </p> 131 </p>
133 </form> 132 </form>
134 133
135 <ul class="unstyled configuration-list" id="layers-in-project-list"> 134 <ul class="list-unstyled lead" id="layers-in-project-list">
136 </ul> 135 </ul>
137 </div>
138 </div> 136 </div>
139</div> 137</div>
140{% endblock %} 138{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index 6d7e10bac5..1fe76a7a24 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -3,54 +3,63 @@
3{% load static %} 3{% load static %}
4 4
5{% block extraheadcontent %} 5{% block extraheadcontent %}
6 <link rel="stylesheet" href="{% static 'css/jquery-ui.min.css' %}" type='text/css'> 6<link rel="stylesheet" href="{% static 'css/jquery-ui.min.css' %}" type='text/css'>
7 <link rel="stylesheet" href="{% static 'css/jquery-ui.structure.min.css' %}" type='text/css'> 7<link rel="stylesheet" href="{% static 'css/jquery-ui.structure.min.css' %}" type='text/css'>
8 <link rel="stylesheet" href="{% static 'css/jquery-ui.theme.min.css' %}" type='text/css'> 8<link rel="stylesheet" href="{% static 'css/jquery-ui.theme.min.css' %}" type='text/css'>
9 <script src="{% static 'js/jquery-ui.min.js' %}"> 9<script src="{% static 'js/jquery-ui.min.js' %}">
10 </script> 10</script>
11{% endblock %} 11{% endblock %}
12 12
13{% block title %} {{title}} - {{project.name}} - Toaster {% endblock %} 13{% block title %} {{title}} - {{project.name}} - Toaster {% endblock %}
14 14
15{% block pagecontent %} 15{% block pagecontent %}
16<div class="row">
16 17
17 {% include "projecttopbar.html" %} 18 {% include "projecttopbar.html" %}
18 19
19 <div class="row-fluid"> 20 <div class="col-md-12">
20 {% with mru=mru mrb_type=mrb_type %} 21 {% with mru=mru mrb_type=mrb_type %}
21 {% include 'mrb_section.html' %} 22 {% include 'mrb_section.html' %}
22 {% endwith %} 23 {% endwith %}
23 24
24 <h2 class="page-header top-air" data-role="page-title"></h2> 25 <h2 class="top-air" data-role="page-title"></h2>
25 26
27 {% if not build_in_progress_none_completed %}
26 {% url 'projectbuilds' project.id as xhr_table_url %} 28 {% url 'projectbuilds' project.id as xhr_table_url %}
27 {% include 'toastertable.html' %} 29 {% include 'toastertable.html' %}
30 {% endif %}
28 </div> 31 </div>
29 32
30 <script> 33 <script>
31 $(document).ready(function () { 34 $(document).ready(function () {
32 // title 35 // title
33 var tableElt = $("#{{table_name}}"); 36 var tableElt = $("#{{table_name}}");
34 var titleElt = $("[data-role='page-title']"); 37 var titleElt = $("[data-role='page-title']");
35 38
36 tableElt.on("table-done", function (e, total, tableParams) { 39 tableElt.on("table-done", function (e, total, tableParams) {
37 var title = "All project builds"; 40 var title = "All project builds";
38 41
39 if (tableParams.search || tableParams.filter) { 42 if (tableParams.search || tableParams.filter) {
40 if (total === 0) { 43 if (total === 0) {
41 title = "No project builds found"; 44 title = "No project builds found";
42 } 45 }
43 else if (total > 0) { 46 else if (total > 0) {
44 title = total + " project build" + (total > 1 ? 's' : '') + " found"; 47 title = total + " project build" + (total > 1 ? 's' : '') + " found";
45 } 48 }
46 } 49 }
47 50
48 titleElt.text(title); 51 if (total === 0) {
49 }); 52 titleElt.hide();
53 } else {
54 titleElt.show();
55 titleElt.text(title);
56 }
57 });
50 58
51 // highlight builds tab 59 // highlight builds tab
52 $("#topbar-builds-tab").addClass("active") 60 $("#topbar-builds-tab").addClass("active")
53 }); 61 });
54 </script> 62 </script>
55 63
64</div>
56{% endblock %} 65{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
index 3402fc4fe1..50697a159b 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
@@ -39,10 +39,10 @@
39 39
40 {% if objects.paginator.count == 0 %} 40 {% if objects.paginator.count == 0 %}
41 {% if request.GET.filter or request.GET.search %} 41 {% if request.GET.filter or request.GET.search %}
42 <div class="row-fluid"> 42 <div class="row">
43 <div class="alert"> 43 <div class="alert">
44 <form class="no-results input-append" id="searchform"> 44 <form class="no-results input-append" id="searchform">
45 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} 45 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
46 <button class="btn" type="submit" value="Search">Search</button> 46 <button class="btn" type="submit" value="Search">Search</button>
47 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button> 47 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button>
48 </form> 48 </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index dd7d30c58a..bfa386d8fa 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -6,975 +6,1008 @@
6{% block projectinfomain %} 6{% block projectinfomain %}
7 7
8<h2>Bitbake variables</h2> 8<h2>Bitbake variables</h2>
9 9<div>
10 <div style="padding-left:19px;"> 10 <dl>
11 11 {% if distro_defined %}
12 <dl class="dl-vertical"> 12 <dt>
13 {% if distro_defined %} 13 <span class="js-config-var-name js-config-var-managed-name">DISTRO</span>
14 <dt> 14 <span class="glyphicon glyphicon-question-sign get-help" title="The short name of the distribution. If the variable is blank, meta/conf/distro/defaultsetup.conf will be used"></span>
15 <span class="js-config-var-name js-config-var-managed-name">DISTRO</span> 15 </dt>
16 <i class="icon-question-sign get-help" title="The short name of the distribution. If the variable is blank, meta/conf/distro/defaultsetup.conf will be used. <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-DISTRO' target='_blank'>Read more in the manual</a>"></i> 16 <dd class="variable-list">
17 </dt> 17 <span class="lead" id="distro">{{distro}}</span>
18 <dd class="lead"> 18 <span class="glyphicon glyphicon-edit" id="change-distro-icon"></span>
19 <span id="distro">{{distro}}</span> 19 <form id="change-distro-form" class="form-inline" style="display:none;">
20 <i class="icon-pencil" id="change-distro-icon"></i> 20 <div id="edit-distro-name-div" class="form-group">
21 <form id="change-distro-form" style="display:none;"> 21 <input type="text" class="form-control" id="new-distro" value="{{distro}}">
22 <div class="input-append"> 22 </div>
23 <span id="edit-distro-name-div" class="control-group"> 23 <button id="apply-change-distro" class="btn btn-default" type="button">Save</button>
24 <input type="text" id="new-distro" value="{{distro}}"> 24 <button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button>
25 <button id="apply-change-distro" class="btn" type="button">Save</button> 25 <span class="help-block" id="distro-error-message"></span>
26 <button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button> 26 </form>
27 </span> 27 </dd>
28 <span class="help-block error" id="distro-error-message"></span> 28 {% endif %}
29 </div> 29
30 </form> 30 {% if dl_dir_defined %}
31 </dd> 31 <dt>
32 {% endif %} 32 <span class="js-config-var-name js-config-var-managed-name">DL_DIR</span>
33 33 <span class="glyphicon glyphicon-question-sign get-help" title="Absolute path to the directory used to store downloads required for your builds. By default, Toaster projects share the same downloads directory"></span>
34 {% if dl_dir_defined %} 34 </dt>
35 <dt> 35 <dd class="variable-list">
36 <span class="js-config-var-name js-config-var-managed-name">DL_DIR</span> 36 <span id="dl_dir" class="lead {% if not dl_dir %} text-muted {% endif %}">{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span>
37 <i class="icon-question-sign get-help" title="Absolute path to the directory used to store downloads required for your builds. By default, Toaster projects share the same downloads directory.<br /><a href='http://www.yoctoproject.org/docs/2.1/ref-manual/ref-manual.html#var-DL_DIR' target='_blank'>Read more in the manual</a>"></i> 37 <span class="glyphicon glyphicon-edit" id="change-dl_dir-icon"></span>
38 </dt> 38 <form id="change-dl_dir-form" class="form-inline" style="display:none;">
39 <dd class="lead"> 39 <div class="form-group" id="validate-dl_dir">
40 <span id="dl_dir"{% if dl_dir %}{%else%} class="muted"{%endif%}>{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span> 40 <input type="text" class="form-control" id="new-dl_dir" placeholder="Type an absolute path">
41 <i class="icon-pencil" id="change-dl_dir-icon"></i> 41 </div>
42 <form id="change-dl_dir-form" style="display:none;"> 42 <button id="apply-change-dl_dir" class="btn btn-default" type="button">Save</button>
43 <div class="row-fluid"> 43 <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button>
44 <span class="help-block span4">To set DL_DIR type the absolute path of the download folder.</span> 44 <p class="help-block" id="hintError-dl_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></p>
45 </div> 45 </form>
46 <div class="input-append" id="validate-dl_dir"> 46 </dd>
47 <input type="text" class="input-xlarge" id="new-dl_dir" placeholder="Type absolute path of the DL_DIR folder"> 47 {% endif %}
48 <button id="apply-change-dl_dir" class="btn" type="button">Save</button> 48
49 <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button> 49 {% if fstypes_defined %}
50 </br><span class="help-block error" id="hintError-dl_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></span> 50 <dt>
51 </div> 51 <span class="js-config-var-name js-config-var-managed-name">IMAGE_FSTYPES</span>
52 </form> 52 <span class="glyphicon glyphicon-question-sign get-help" title="Formats of root file system images that you want to create"></span>
53 </dd> 53 </dt>
54 {% endif %} 54 <dd class="variable-list">
55 55 <span class="lead" id="image_fstypes">{{fstypes}}</span>
56 {% if fstypes_defined %} 56 <span class="glyphicon glyphicon-edit" id="change-image_fstypes-icon"></span>
57 <dt> 57 <form id="change-image_fstypes-form" style="display:none;">
58 <span class="js-config-var-name js-config-var-managed-name">IMAGE_FSTYPES</span> 58 <label>Type the image types you want to build:</label>
59 <i class="icon-question-sign get-help" title="Formats of root file system images that you want to have created <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_FSTYPES' target='_blank'>Read more in the manual</a>"></i> 59 <div class="form-group form-inline" id="validate-image_fstypes">
60 </dt> 60 <input type="text" class="form-control "id="new-imagefs_types">
61 <dd class="lead"> 61 <button id="apply-change-image_fstypes" type="button" class="btn btn-default">Save</button>
62 <span id="image_fstypes">{{fstypes}}</span> 62 <button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button>
63 <i class="icon-pencil" id="change-image_fstypes-icon"></i> 63 </div>
64 <form id="change-image_fstypes-form" style="display:none;"> 64 <p class="help-block text-danger" style="display:none;" id="hintError-image-fs_type">A valid image type cannot include underscores</p>
65 <label>Type the image types you want to build:</label> 65 <label>Or choose from known image types:</label>
66 <div class="input-append" id="validate-image_fstypes"> 66 <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="form-control">
67 <input type="text" class="input-xlarge" id="new-imagefs_types"> 67 <div id="all-image_fstypes" class="scrolling"></div>
68 <button id="apply-change-image_fstypes" type="button" class="btn">Save</button> 68 </form>
69 <button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button> 69 </dd>
70 </div> 70 {% endif %}
71 <p class="help-block error" style="display:none;margin-top:10px;" id="hintError-image-fs_type">A valid image type cannot include underscores</p> 71
72 <label>Or choose from known image types:</label> 72 {% if image_install_append_defined %}
73 <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="span4"> 73 <dt>
74 <div id="all-image_fstypes" class="scrolling"> 74 <span class="js-config-var-name js-config-var-managed-name">IMAGE_INSTALL_append</span>
75 </div> 75 <span class="glyphicon glyphicon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in all of them"></span>
76 </form> 76 </dt>
77 </dd> 77 <dd class="variable-list">
78 {% endif %} 78 <span id="image_install" class="lead {% if not image_install_append %} text-muted {%endif%}">{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
79 79 <span class="glyphicon glyphicon-edit" id="change-image_install-icon"></span>
80 {% if image_install_append_defined %} 80 <span class="glyphicon glyphicon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></span>
81 <dt> 81 <form id="change-image_install-form" class="form-inline" style="display:none;">
82 <span class="js-config-var-name js-config-var-managed-name">IMAGE_INSTALL_append</span> 82 <div class="row">
83 <i class="icon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in <strong>all of them</strong> <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_INSTALL' target='_blank'>Read more in the manual</a>"></i> 83 <div class="col-md-4">
84 </dt> 84 <span class="help-block">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
85 <dd class="lead">
86 <span id="image_install"{% if image_install_append %}{%else%} class="muted"{%endif%}>{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
87 <i class="icon-pencil" id="change-image_install-icon"></i>
88 <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
89 <form id="change-image_install-form" style="display:none;">
90 <div class="row-fluid">
91 <span class="help-block span4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
92 </div>
93 <div class="input-append">
94 <input type="text" class="input-xlarge" id="new-image_install" placeholder="Type one or more package names">
95 <button id="apply-change-image_install" class="btn" type="button">Save</button>
96 <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>
97 </div>
98 </form>
99 </dd>
100 {% endif %}
101
102 {% if package_classes_defined %}
103 <dt>
104 <span class="js-config-var-name js-config-var-managed-name">PACKAGE_CLASSES</span>
105 <i class="icon-question-sign get-help" title="Specifies the package manager to use when packaging data <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PACKAGE_CLASSES' target='_blank'>Read more in the manual</a>"></i>
106 </dt>
107 <dd class="lead">
108 <span id="package_classes">{{package_classes}}</span>
109 <i id="change-package_classes-icon" class="icon-pencil"></i>
110 <form id="change-package_classes-form" style="display:none;">
111 <label>
112 Root file system package format
113 <i class="icon-question-sign get-help" title="The package format used to generate the root file system. Options are <code>dev</code>, <code>ipk</code> and <code>rpm</code>"></i>
114 </label>
115 <select id="package_classes-select">
116 <option>package_deb</option>
117 <option>package_ipk</option>
118 <option>package_rpm</option>
119 </select>
120 <label>
121 Additional package formats
122 <i class="icon-question-sign get-help" title="Extra package formats to build"></i>
123 </label>
124 <label class="checkbox" id="package_class_1">
125 <input type="checkbox" id="package_class_1_input"> package_deb
126 </label>
127 <label class="checkbox" id="package_class_2">
128 <input type="checkbox" id="package_class_2_input"> package_ipk
129 </label>
130 <div style="padding-top:10px;">
131 <button id="apply-change-package_classes" type="button" class="btn">Save</button>
132 <button id="cancel-change-package_classes" type="button" class="btn btn-link">Cancel</button>
133 </div>
134 </form>
135 </dd>
136 {% endif %}
137
138 {% if sstate_dir_defined %}
139 <dt>
140 <span class="js-config-var-name js-config-var-managed-name">SSTATE_DIR</span>
141 <i class="icon-question-sign get-help" title="Absolute path to the directory used to store shared state cache files. These files are reused across the builds, which makes the builds faster. By default, Toaster projects share the same cache directory.<br /><a href='http://www.yoctoproject.org/docs/2.1/ref-manual/ref-manual.html#var-SSTATE_DIR' target='_blank'>Read more in the manual</a>"></i>
142 </dt>
143 <dd class="lead">
144 <span id="sstate_dir"{% if sstate_dir %}{%else%} class="muted"{%endif%}>{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span>
145 <i class="icon-pencil" id="change-sstate_dir-icon"></i>
146 <form id="change-sstate_dir-form" style="display:none;">
147 <div class="row-fluid">
148 <span class="help-block span4">To set SSTATE_DIR type the absolute path of the download folder.</span>
149 </div>
150 <div class="input-append" id="validate-sstate_dir">
151 <input type="text" class="input-xlarge" id="new-sstate_dir" placeholder="Type absolute path of the SSTATE_DIR folder">
152 <span class="error">A valid directory name required</span>
153 <button id="apply-change-sstate_dir" class="btn" type="button">Save</button>
154 <button id="cancel-change-sstate_dir" type="button" class="btn btn-link">Cancel</button>
155 </br><p class="help-block error" id="hintError-sstate_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></span>
156 </div>
157 </form>
158 </dd>
159 {% endif %}
160 </dl>
161
162 <!-- <ul class="unstyled configuration-list" id="configvar-list"> -->
163 <dl id="configvar-list">
164 <!-- the added configuration variables are inserted here -->
165 </dl>
166
167 <!-- pass the fstypes list, black list, and externally managed variables here -->
168 {% for fstype in vars_fstypes %}
169 <input type="hidden" class="js-checkbox-fstypes-list" value="{{fstype}}">
170 {% endfor %}
171 {% for b in vars_blacklist %}
172 <input type="hidden" class="js-config-blacklist-name" value="{{b}}">
173 {% endfor %}
174 {% for b in vars_managed %}
175 <input type="hidden" class="js-config-managed-name" value="{{b}}">
176 {% endfor %}
177
178 <div class="row-fluid">
179 <form id="variable-form">
180 <fieldset style="padding-left:0px;">
181 <legend>Add variable</legend>
182 <div class="span3" style="margin-left:0px;">
183 <span id="add-configvar-name-div" class="control-group">
184 <label>
185 Variable
186 <i title="" class="icon-question-sign get-help"
187 data-original-title="Variable names are case sensitive,
188 cannot have spaces, and can only include letters, numbers, underscores
189 and dashes"></i>
190 </label>
191 <input type="text" placeholder="Type variable name" id="variable">
192 <span class="help-block error" id="new-variable-error-message"></span>
193 </span>
194 <label>Value</label>
195 <input id="value" type="text" placeholder="Type variable value"><p>
196 <div>
197 <button id="add-configvar-button" class="btn save" type="button" disabled>Add variable</button>
198 </div>
199 </div>
200 <div class="span5 help-block">
201 <h5>Some variables are reserved from Toaster</h5>
202 <p>Toaster cannot set any variables that impact 1) the configuration of the build servers,
203 or 2) where artifacts produced by the build are stored. Such variables include: </p>
204 <p>
205 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_DISKMON_DIRS" target="_blank">BB_DISKMON_DIRS</a></code>
206 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_NUMBER_THREADS" target="_blank">BB_NUMBER_THREADS</a></code>
207 <code>CVS_PROXY_HOST</code>
208 <code>CVS_PROXY_PORT</code>
209 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PARALLEL_MAKE" target="_blank">PARALLEL_MAKE</a></code>
210 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SSTATE_MIRRORS" target="_blank">SSTATE_MIRRORS</a></code>
211 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-TMPDIR" target="_blank">TMPDIR</a></code></p>
212 <p>Plus the following standard shell environment variables:</p>
213 <p><code>http_proxy</code> <code>ftp_proxy</code> <code>https_proxy</code> <code>all_proxy</code></p>
214 </div>
215 </fieldset>
216 </form>
217 </div> 85 </div>
218 86 </div>
219 </div> 87 <div class="form-group">
220 88 <input type="text" class="form-control" id="new-image_install" placeholder="Type one or more package names">
221 <script> 89 </div>
222 90 <button id="apply-change-image_install" class="btn btn-default" type="button">Save</button>
223 // global variables 91 <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>
224 var do_reload=false; 92 </form>
225 93 </dd>
226 // validate new variable name 94 {% endif %}
227 function validate_new_variable() { 95
228 var variable = $("input#variable").val(); 96 {% if package_classes_defined %}
229 var value = $("input#value").val(); 97 <dt>
230 98 <span class="js-config-var-name js-config-var-managed-name">PACKAGE_CLASSES</span>
231 // presumed innocence 99 <span class="glyphicon glyphicon-question-sign get-help" title="Specifies the package manager to use when packaging data"></span>
232 $('#new-variable-error-message').text(""); 100 </dt>
233 var error_msg = ""; 101 <dd class="variable-list">
234 102 <span class="lead" id="package_classes">{{package_classes}}</span>
235 var existing_configvars = document.getElementsByClassName('js-config-var-name'); 103 <span id="change-package_classes-icon" class="glyphicon glyphicon-edit"></span>
236 for (var i = 0, length = existing_configvars.length; i < length; i++) { 104 <form id="change-package_classes-form" style="display:none;">
237 if (existing_configvars[i].innerHTML.toUpperCase() == variable.toUpperCase()) { 105 <div class="form-group">
238 error_msg = "This variable is already set in this page, edit its value instead"; 106 <label class="control-label">
239 } 107 Root file system package format
240 } 108 <span class="glyphicon glyphicon-question-sign get-help" title="The package format used to generate the root file system. Options are <code>deb</code>, <code>ipk</code> and <code>rpm</code>"></i>
241 109 </label>
242 var blacklist_configvars = document.getElementsByClassName('js-config-blacklist-name'); 110 <select id="package_classes-select" class="form-control">
243 for (var i = 0, length = blacklist_configvars.length; i < length; i++) { 111 <option>package_deb</option>
244 if (blacklist_configvars[i].value.toUpperCase() == variable.toUpperCase()) { 112 <option>package_ipk</option>
245 error_msg = "You cannot edit this variable in Toaster because it is set by the build servers"; 113 <option>package_rpm</option>
246 } 114 </select>
247 } 115 </div>
248 116 <div class="form-group">
249 var managed_configvars = document.getElementsByClassName('js-config-managed-name'); 117 <label class="control-label">
250 for (var i = 0, length = managed_configvars.length; i < length; i++) { 118 Additional package formats
251 if (managed_configvars[i].value.toUpperCase() == variable.toUpperCase()) { 119 <span class="glyphicon glyphicon-question-sign get-help" title="Extra package formats to build"></span>
252 error_msg = "You cannot set this variable here. Please set it in the <a href=\"{% url 'project' project.id %}\">project main page</a>"; 120 </label>
253 } 121 <div class="checkbox">
254 } 122 <label id="package_class_1">
255 123 <input type="checkbox" id="package_class_1_input"> package_deb
256 var bad_chars = /[^a-zA-Z0-9\-_]/.test(variable); 124 </label>
257 var has_spaces = (0 <= variable.indexOf(" ")); 125 </div>
258 var only_spaces = (0 < variable.length) && (0 == variable.trim().length); 126 <div class="checkbox">
259 127 <label id="package_class_2">
260 if (only_spaces) { 128 <input type="checkbox" id="package_class_2_input"> package_ipk
261 error_msg = "A valid variable name cannot include spaces"; 129 </label>
262 } else if (bad_chars && has_spaces) { 130 </div>
263 error_msg = "A valid variable name can only include letters, numbers, underscores, dashes, and cannot include spaces"; 131 </div>
264 } else if (bad_chars) { 132 <button id="apply-change-package_classes" type="button" class="btn btn-default">Save</button>
265 error_msg = "A valid variable name can only include letters, numbers, underscores, and dashes"; 133 <button id="cancel-change-package_classes" type="button" class="btn btn-link">Cancel</button>
266 } 134 </form>
267 135 </dd>
268 if ("" != error_msg) { 136 {% endif %}
269 $('#new-variable-error-message').html(error_msg); 137
270 $(".save").attr("disabled","disabled"); 138 {% if sstate_dir_defined %}
271 139 <dt>
272 // add one (and only one) error class append 140 <span class="js-config-var-name js-config-var-managed-name">SSTATE_DIR</span>
273 var d = document.getElementById("add-configvar-name-div"); 141 <span class="glyphicon glyphicon-question-sign get-help" title="Absolute path to the directory used to store shared state cache files. These files are reused across the builds, which makes the builds faster. By default, Toaster projects share the same cache directory"></span>
274 d.className = d.className.replace(" error",""); 142 </dt>
275 d.className = d.className + " error"; 143 <dd class="variable-list">
276 144 <span id="sstate_dir" class="lead {% if not sstate_dir %} text-muted {% endif %}">{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span>
277 return false; 145 <span class="glyphicon glyphicon-edit" id="change-sstate_dir-icon"></span>
278 } else if (0 == variable.length) { 146 <form class="form-inline" id="change-sstate_dir-form" style="display:none;">
279 $(".save").attr("disabled","disabled"); 147 <div class="form-group" id="validate-sstate_dir">
280 return false; 148 <input type="text" class="form-control" id="new-sstate_dir" placeholder="Type an absolute path">
281 } 149 </div>
282 150 <button id="apply-change-sstate_dir" class="btn btn-default" type="button">Save</button>
283 var d = document.getElementById("add-configvar-name-div"); 151 <button id="cancel-change-sstate_dir" type="button" class="btn btn-link">Cancel</button>
284 d.className = d.className.replace(" error",""); 152 <p class="help-block" id="hintError-sstate_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></p>
285 153 </form>
286 // now set the "Save" enablement if 'value' also passes 154 </dd>
287 if (value.trim().length > 0) { 155 {% endif %}
288 $(".save").removeAttr("disabled"); 156 </dl>
289 } else { 157
290 $(".save").attr("disabled","disabled"); 158 <!-- <ul class="list-unstyled configuration-list" id="configvar-list"> -->
291 } 159 <dl id="configvar-list">
292 160 <!-- the added configuration variables are inserted here -->
293 return true; 161 </dl>
294 } 162
295 163 <!-- pass the fstypes list, black list, and externally managed variables here -->
296 // validate distro name 164 {% for fstype in vars_fstypes %}
297 function validate_distro_name() { 165 <input type="hidden" class="js-checkbox-fstypes-list" value="{{fstype}}">
298 var value = $("input#new-distro").val(); 166 {% endfor %}
299 167 {% for b in vars_blacklist %}
300 // presumed innocence 168 <input type="hidden" class="js-config-blacklist-name" value="{{b}}">
301 $('#distro-error-message').text(""); 169 {% endfor %}
302 var error_msg = ""; 170 {% for b in vars_managed %}
303 171 <input type="hidden" class="js-config-managed-name" value="{{b}}">
304 var has_spaces = (0 <= value.indexOf(" ")); 172 {% endfor %}
305 173
306 if (has_spaces) { 174 <form id="variable-form">
307 error_msg = "A valid distro name cannot include spaces"; 175 <fieldset>
308 } else if (0 == value.length) { 176 <legend>Add variable</legend>
309 error_msg = " "; 177 <div class="row">
310 } 178 <div class="col-md-3">
311 179 <div id="add-configvar-name-div" class="form-group">
312 if ("" != error_msg) { 180 <label class="control-label">
313 $('#distro-error-message').text(error_msg); 181 Variable
314 $("#apply-change-distro").attr("disabled","disabled"); 182 <span class="glyphicon glyphicon-question-sign get-help"
315 183 title="Variable names are case sensitive,
316 // add one (and only one) error class append 184 cannot have spaces, and can only include letters, numbers, underscores
317 var d = document.getElementById("edit-distro-name-div"); 185 and dashes"></span>
318 d.className = d.className.replace(" error",""); 186 </label>
319 d.className = d.className + " error"; 187 <input type="text" class="form-control" placeholder="Type the variable name" id="variable">
320 188 </div>
321 return false; 189 <p class="help-block" id="new-variable-error-message"></p>
322 } 190 <div class="form-group">
323 191 <label clas="control-label">Value</label>
324 var d = document.getElementById("edit-distro-name-div"); 192 <input id="value" type="text" class="form-control" placeholder="Type the variable value">
325 d.className = d.className.replace(" error",""); 193 </div>
326 $("#apply-change-distro").removeAttr("disabled"); 194 <button id="add-configvar-button" class="btn btn-default save" type="button" disabled>Add variable</button>
327 return true; 195 </div>
328 } 196 <div class="col-md-5 help-block">
329 197 <h5>Some variables cannot be set from Toaster</h5>
330 // Preset or reset the Package Class checkbox labels 198 <p>Toaster cannot set any variables that impact 1) the configuration of the build servers,
331 function updatePackageClassCheckboxes() { 199 or 2) where artifacts produced by the build are stored. Such variables include: </p>
332 $('#package_class_1, #package_class_2').hide(); 200 <p>
333 if ($('select').val() == 'package_deb') { 201 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_DISKMON_DIRS" target="_blank">BB_DISKMON_DIRS</a></code>
334 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_ipk'); 202 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_NUMBER_THREADS" target="_blank">BB_NUMBER_THREADS</a></code>
335 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm'); 203 <code>CVS_PROXY_HOST</code>
336 } 204 <code>CVS_PROXY_PORT</code>
337 if ($('select').val() == 'package_ipk') { 205 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PARALLEL_MAKE" target="_blank">PARALLEL_MAKE</a></code>
338 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb'); 206 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SSTATE_MIRRORS" target="_blank">SSTATE_MIRRORS</a></code>
339 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm'); 207 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-TMPDIR" target="_blank">TMPDIR</a></code></p>
340 } 208 <p>Plus the following standard shell environment variables:</p>
341 if ($('select').val() == 'package_rpm') { 209 <p><code>http_proxy</code> <code>ftp_proxy</code> <code>https_proxy</code> <code>all_proxy</code></p>
342 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb'); 210 </div>
343 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_ipk'); 211 </div>
344 } 212 </fieldset>
345 $('#package_class_1, #package_class_2').fadeIn(1500); 213 </form>
346 } 214</div>
347 215
348 // Re-assert handlers when the page is served and/or refreshed via Ajax 216</div>
349 function setEventHandlersForDynamicElements() { 217
350 218<script>
351 // change variable value 219
352 $('.js-icon-pencil-config_var').click(function (evt) { 220// global variables
353 var pk = evt.target.attributes["x-data"].value; 221var do_reload=false;
354 var current_val = $("span#config_var_value_"+pk).text(); 222
355 $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).hide(); 223// validate new variable name
356 $("#change-config_var-form_"+pk).slideDown(); 224function validate_new_variable() {
357 $("input#new-config_var_"+pk).val(current_val); 225 var variable = $("input#variable").val();
358 }); 226 var value = $("input#value").val();
359 227
360 $('.js-cancel-change-config_var').click(function (evt) { 228 // presumed innocence
361 var pk = evt.target.attributes["x-data"].value; 229 $('#new-variable-error-message').text("");
362 $("#change-config_var-form_"+pk).slideUp(function() { 230 var error_msg = "";
363 $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).show(); 231
364 }); 232 var existing_configvars = document.getElementsByClassName('js-config-var-name');
365 }); 233 for (var i = 0, length = existing_configvars.length; i < length; i++) {
366 234 if (existing_configvars[i].innerHTML.toUpperCase() == variable.toUpperCase()) {
367 $(".js-new-config_var").on('input', function(){ 235 error_msg = "This variable is already set in this page. Edit its value instead";
368 if ($(this).val().length == 0) { 236 }
369 $(".js-apply-change-config_var").attr("disabled","disabled"); 237 }
370 } 238
371 else { 239 var blacklist_configvars = document.getElementsByClassName('js-config-blacklist-name');
372 $(".js-apply-change-config_var").removeAttr("disabled"); 240 for (var i = 0, length = blacklist_configvars.length; i < length; i++) {
373 } 241 if (blacklist_configvars[i].value.toUpperCase() == variable.toUpperCase()) {
374 }); 242 error_msg = "You cannot edit this variable in Toaster because it is set by the build servers";
375 243 }
376 $('.js-apply-change-config_var').click(function (evt) { 244 }
377 var xdata = evt.target.attributes["x-data"].value.split(":"); 245
378 var pk = xdata[0]; 246 var managed_configvars = document.getElementsByClassName('js-config-managed-name');
379 var variable = xdata[1]; 247 for (var i = 0, length = managed_configvars.length; i < length; i++) {
380 var val = $('#new-config_var_'+pk).val(); 248 if (managed_configvars[i].value.toUpperCase() == variable.toUpperCase()) {
381 postEditAjaxRequest({"configvarChange" : variable+':'+val}); 249 error_msg = "You cannot set this variable here. Please set it in the <a href=\"{% url 'project' project.id %}\">project main page</a>";
382 $('#config_var_value_'+pk).parent().removeClass('muted'); 250 }
383 $("#change-config_var-form_"+pk).slideUp(function() { 251 }
384 $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).show(); 252
385 }); 253 var bad_chars = /[^a-zA-Z0-9\-_]/.test(variable);
386 }); 254 var has_spaces = (0 <= variable.indexOf(" "));
387 255 var only_spaces = (0 < variable.length) && (0 == variable.trim().length);
388 // delete variable 256
389 $(".js-icon-trash-config_var").click(function (evt) { 257 if (only_spaces) {
390 var xdata = evt.target.attributes["x-data"].value.split(":"); 258 error_msg = "A valid variable name cannot include spaces";
391 var pk = xdata[0]; 259 } else if (bad_chars && has_spaces) {
392 260 error_msg = "A valid variable name can only include letters, numbers, underscores, dashes, and cannot include spaces";
393 // hide the dangling trash tooltip 261 } else if (bad_chars) {
394 $('#config_var_trash_'+pk).hide(); 262 error_msg = "A valid variable name can only include letters, numbers, underscores, and dashes";
395 263 }
396 // fade out the variable+value div, then refresh the variable list 264
397 $('#config_var_entry_'+pk).parent().parent().fadeOut(1000, function(){ 265 if ("" != error_msg) {
398 postEditAjaxRequest({"configvarDel": evt.target.attributes["x-data"].value}); 266 $('#new-variable-error-message').html(error_msg);
399 }); 267 $(".save").attr("disabled","disabled");
400 268
401 }); 269 // add one (and only one) error class append
402 270 $("#add-configvar-name-div").addClass("has-error");
403 } 271 $("#new-variable-error-message").addClass("text-danger");
404 272
405 function onEditPageUpdate(data) { 273 return false;
406 // update targets 274 } else if (0 == variable.length) {
407 var i; var orightml = ""; 275 $(".save").attr("disabled","disabled");
408 276 return false;
409 var configvars_sorted = data.configvars.sort(function(a, b){return a[0] > b[0]}); 277 }
410 278
411 var managed_configvars = document.getElementsByClassName('js-config-var-managed-name'); 279 $("#add-configvar-name-div").removeClass("has-error");
412 280
413 for (i = 0; i < configvars_sorted.length; i++) { 281 // now set the "Save" enablement if 'value' also passes
414 // skip if the variable name has a special context (not user defined) 282 if (value.trim().length > 0) {
415 var var_context=undefined; 283 $(".save").removeAttr("disabled");
416 for (var j = 0, length = managed_configvars.length; j < length; j++) { 284 } else {
417 if ((managed_configvars[j].innerHTML == configvars_sorted[i][0]) || 285 $(".save").attr("disabled","disabled");
418 (managed_configvars[j].value == configvars_sorted[i][0]) ) { 286 }
419 var_context='m'; 287
420 } 288 return true;
421 } 289}
422 if (var_context == undefined) { 290
423 orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="icon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>' 291// validate distro name
424 orightml += '<dd class="lead">' 292function validate_distro_name() {
425 orightml += ' <span id="config_var_value_'+configvars_sorted[i][2]+'"></span>' 293 var value = $("input#new-distro").val();
426 orightml += ' <i class="icon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>' 294
427 orightml += ' <form id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">' 295 // presumed innocence
428 orightml += ' <div class="input-append">' 296 $('#distro-error-message').text("");
429 orightml += ' <input type="text" class="input-xlarge js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value="">' 297 var error_msg = "";
430 orightml += ' <button class="btn js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>' 298
431 orightml += ' <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>' 299 var has_spaces = (0 <= value.indexOf(" "));
432 orightml += ' </div>' 300
433 orightml += ' </form>' 301 if (has_spaces) {
434 orightml += '</dd> </div>' 302 error_msg = "A valid distro name cannot include spaces";
435 } 303 } else if (0 == value.length) {
436 } 304 error_msg = " ";
437 305 }
438 // update configvars list HTML framework 306
439 $("dl#configvar-list").html(orightml); 307 if ("" != error_msg) {
440 308 $('#distro-error-message').text(error_msg);
441 // insert the name/value pairs safely as non-HTML 309 $("#apply-change-distro").attr("disabled","disabled");
442 for (i = 0; i < configvars_sorted.length; i++) { 310
443 $('#config_var_entry_'+configvars_sorted[i][2]).text(configvars_sorted[i][0]); 311 // add one (and only one) error class append
444 $('#config_var_value_'+configvars_sorted[i][2]).text(configvars_sorted[i][1]); 312 $("#change-distro-form").addClass("has-error");
445 } 313
446 314 return false;
447 // Add the tooltips 315 }
448 $(".js-icon-trash-config_var").each( function(){ setDeleteTooltip($(this)); }); 316
449 $(".js-icon-pencil-config_var").each(function(){ setChangeTooltip($(this)); }); 317 $("#change-distro-form").removeClass("has-error");
450 318 $("#apply-change-distro").removeAttr("disabled");
451 // re-assert these event handlers 319 return true;
452 setEventHandlersForDynamicElements(); 320}
453 } 321
454 322// Test to insure at least one FS Type is checked
455 function onEditAjaxSuccess(data, textstatus) { 323function enableFsTypesSave() {
456 // console.log("XHR returned:", data, "(" + textstatus + ")"); 324 var any_checked = 0;
457 if (data.error != "ok") { 325 $(".fs-checkbox-fstypes:checked").each(function(){
458 alert("error on request:\n" + data.error); 326 any_checked = 1;
459 return; 327 });
460 } 328 if ( 0 == any_checked ) {
461 329 $("#apply-change-image_fstypes").attr("disabled","disabled");
462 // delayed page reload? 330 $('.scrolling').addClass('has-error');
463 if (do_reload) { 331 $('#fstypes-error-message').show();
464 do_reload=false; 332 }
465 location.reload(true); 333 else {
466 } else { 334 $("#apply-change-image_fstypes").removeAttr("disabled");
467 onEditPageUpdate(data); 335 $('.scrolling').removeClass('has-error');
468 } 336 $('#fstypes-error-message').hide();
469 } 337 }
470 338}
471 function onEditAjaxError(jqXHR, textstatus, error) { 339
472 alert("XHR errored:\n" + error + "\n(" + textstatus + ")"); 340// Preset or reset the Package Class checkbox labels
473 // re-assert the event handlers 341function updatePackageClassCheckboxes() {
474 } 342 $('#package_class_1, #package_class_2').hide();
475 343 if ($('select').val() == 'package_deb') {
476 /* ensure cookie exists {% csrf_token %} */ 344 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_ipk');
477 function postEditAjaxRequest(reqdata) { 345 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm');
478 var ajax = $.ajax({ 346 }
479 type:"POST", 347 if ($('select').val() == 'package_ipk') {
480 data: $.param(reqdata), 348 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb');
481 url:"{% url 'xhr_configvaredit' project.id%}", 349 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm');
482 headers: { 'X-CSRFToken': $.cookie("csrftoken")}, 350 }
483 success: onEditAjaxSuccess, 351 if ($('select').val() == 'package_rpm') {
484 error: onEditAjaxError, 352 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb');
485 }) 353 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_ipk');
486 } 354 }
487 355 $('#package_class_1, #package_class_2').fadeIn(1500);
488 function setDeleteTooltip(object) { 356}
489 object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Delete" }); 357
490 } 358// Re-assert handlers when the page is served and/or refreshed via Ajax
491 function setChangeTooltip(object) { 359function setEventHandlersForDynamicElements() {
492 object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" }); 360
361 // change variable value
362 $('.js-icon-pencil-config_var').click(function (evt) {
363 var pk = $(this).attr("x-data");
364 var current_val = $("#config_var_value_"+pk).text();
365 $("#config_var_value_"+pk).hide();
366 $("#config_var_trash_"+pk).hide();
367 $(".js-icon-pencil-config_var[x-data="+pk+"]").hide();
368 $("#change-config_var-form_"+pk).slideDown();
369 $("#new-config_var_"+pk).val(current_val);
370 if ( $("#new-config_var_"+pk).val().length ) {
371 $("#apply-change-config_var_"+pk).removeAttr("disabled");
372 }
373 else {
374 $("#apply-change-config_var_"+pk).attr("disabled");
375 }
376 });
377
378 $('.js-cancel-change-config_var').click(function (evt) {
379 var pk = evt.target.attributes["x-data"].value;
380 $("#change-config_var-form_"+pk).slideUp(function() {
381 $("#config_var_trash_"+pk).show();
382 $('#config_var_value_'+pk).show();
383 $(".js-icon-pencil-config_var[x-data="+pk+"]").show();
384 });
385 });
386
387 $(".js-new-config_var").on('input', function(){
388 if ($(this).val().length == 0) {
389 $(this).parent("div").next(".btn-default").attr("disabled","disabled");
390 }
391 else {
392 $(this).parent("div").next(".btn-default").removeAttr("disabled");
393 }
394 });
395
396 $('.js-apply-change-config_var').click(function (evt) {
397 var xdata = evt.target.attributes["x-data"].value.split(":");
398 var pk = xdata[0];
399 var variable = xdata[1];
400 var val = $('#new-config_var_'+pk).val();
401 postEditAjaxRequest({"configvarChange" : variable+':'+val});
402 $("#change-config_var-form_"+pk).slideUp();
403 $("#config_var_trash_"+pk).fadeIn();
404 $('#config_var_value_'+pk).fadeIn();
405 $(".js-icon-pencil-config_var[x-data="+pk+"]").fadeIn();
406 });
407
408 // delete variable
409 $(".js-icon-trash-config_var").click(function (evt) {
410 var pk = $(this).attr("x-data");
411
412 // fade out the variable+value div, then refresh the variable list
413 $(this).fadeOut();
414 $(this).tooltip("hide");
415 $("config_var_entry_"+pk).fadeOut();
416 $('#config_var_value_'+pk).parent("dd").fadeOut();
417 postEditAjaxRequest({"configvarDel": evt.target.attributes["x-data"].value});
418 });
419
420}
421
422function onEditPageUpdate(data) {
423 // update targets
424 var i; var orightml = "";
425
426 var configvars_sorted = data.configvars.sort(function(a, b){return a[0] > b[0]});
427
428 var managed_configvars = document.getElementsByClassName('js-config-var-managed-name');
429
430 for (i = 0; i < configvars_sorted.length; i++) {
431 // skip if the variable name has a special context (not user defined)
432 var var_context=undefined;
433 for (var j = 0, length = managed_configvars.length; j < length; j++) {
434 if ((managed_configvars[j].innerHTML == configvars_sorted[i][0]) ||
435 (managed_configvars[j].value == configvars_sorted[i][0]) ) {
436 var_context='m';
437 }
438 }
439 if (var_context == undefined) {
440 orightml += '<dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><span class="glyphicon glyphicon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></span> </dt>'
441 orightml += '<dd class="variable-list">'
442 orightml += ' <span class="lead" id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
443 orightml += ' <span class="glyphicon glyphicon-edit js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></span>'
444 orightml += ' <form class="form-inline" id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
445 orightml += ' <div class="form-group">'
446 orightml += ' <input type="text" class="form-control js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value=""></div>'
447 orightml += ' <button id="apply-change-config_var_'+configvars_sorted[i][2]+'" class="btn btn-default js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>'
448 orightml += ' <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>'
449 orightml += ' </form>'
450 orightml += '</dd>'
451 }
452 }
453
454 // update configvars list HTML framework
455 $("dl#configvar-list").html(orightml);
456
457 // insert the name/value pairs safely as non-HTML
458 for (i = 0; i < configvars_sorted.length; i++) {
459 $('#config_var_entry_'+configvars_sorted[i][2]).text(configvars_sorted[i][0]);
460 $('#config_var_value_'+configvars_sorted[i][2]).text(configvars_sorted[i][1]);
461 }
462
463 // Add the tooltips
464 $(".js-icon-trash-config_var").each( function(){ setDeleteTooltip($(this)); });
465 $(".js-icon-pencil-config_var").each(function(){ setChangeTooltip($(this)); });
466
467 // re-assert these event handlers
468 setEventHandlersForDynamicElements();
469}
470
471function onEditAjaxSuccess(data, textstatus) {
472 console.log("XHR returned:", data, "(" + textstatus + ")");
473 if (data.error != "ok") {
474 alert("error on request:\n" + data.error);
475 return;
476 }
477
478 // delayed page reload?
479 if (do_reload) {
480 do_reload=false;
481 location.reload(true);
482 } else {
483 onEditPageUpdate(data);
484 }
485}
486
487function onEditAjaxError(jqXHR, textstatus, error) {
488 alert("XHR errored:\n" + error + "\n(" + textstatus + ")");
489 // re-assert the event handlers
490}
491
492/* ensure cookie exists {% csrf_token %} */
493function postEditAjaxRequest(reqdata) {
494 var ajax = $.ajax({
495 type:"POST",
496 data: $.param(reqdata),
497 url:"{% url 'xhr_configvaredit' project.id%}",
498 headers: { 'X-CSRFToken': $.cookie("csrftoken")},
499 success: onEditAjaxSuccess,
500 error: onEditAjaxError,
501 })
502}
503
504function setDeleteTooltip(object) {
505 object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Delete" });
506}
507function setChangeTooltip(object) {
508 object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
509}
510
511$(document).ready(function() {
512
513 //
514 // Register handlers for static elements
515 //
516
517 {% if distro_defined %}
518 // change distro variable
519 $('#change-distro-icon').click(function() {
520 $('#change-distro-icon, #distro').hide();
521 $("#change-distro-form").slideDown();
522 $("#new-distro").val( $('#distro').text() );
523 $("#apply-change-distro").removeAttr("disabled");
524 });
525
526 $('#cancel-change-distro').click(function(){
527 $("#change-distro-form").slideUp(function() {
528 $('#distro, #change-distro-icon').show();
529
530 // reset any dangling error state
531 $('#distro-error-message').text("");
532 $("#change-distro-form").removeClass("has-error");
533 });
534 });
535
536 // validate new distro name
537 $("input#new-distro").on('input', function (evt) {
538 validate_distro_name();
539 });
540
541 $('#apply-change-distro').click(function(){
542 //$('#repo').parent().removeClass('highlight-go');
543 var name = $('#new-distro').val();
544 postEditAjaxRequest({"configvarChange" : 'DISTRO:'+name});
545 $('#distro').text(name);
546 $("#change-distro-form").slideUp(function () {
547 $('#distro, #change-distro-icon').show();
548 });
549 });
550 {% endif %}
551
552 {% if dl_dir_defined %}
553
554 // change DL_DIR variable
555 $('#change-dl_dir-icon').click(function() {
556 $('#hintError-dl_dir').hide();
557 $('#change-dl_dir-form').removeClass('has-error');
558 // preset the edit value
559 var current_val = $("#dl_dir").text().trim();
560 if (current_val == "Not set") {
561 current_val="";
562 $("#apply-change-dl_dir").attr("disabled","disabled");
563 }
564 $("input#new-dl_dir").val(current_val);
565 // enable / disable the save button based on the input value
566 if ( current_val.length ) {
567 $("#apply-change-dl_dir").removeAttr("disabled");
568 }
569 else {
570 $("#apply-change-dl_dir").attr("disabled","disabled");
571 }
572
573 $('#change-dl_dir-icon, #dl_dir').hide();
574 $("#change-dl_dir-form").slideDown();
575 });
576
577 $('#cancel-change-dl_dir').click(function(){
578 $("#change-dl_dir-form").slideUp(function() {
579 $('#dl_dir, #change-dl_dir-icon').show();
580 });
581 });
582
583 $("#new-dl_dir").on('input', function(){
584 if ($(this).val().trim().length == 0) {
585 $("#apply-change-dl_dir").attr("disabled","disabled");
586 }
587 else {
588 var input = $(this);
589 var re = /^\/([^ <>\\|":\.%\?\*]+)$/;
590 var invalidDir = re.test(input.val());
591 console.log(invalidDir);
592 if ( invalidDir ) {
593 $('#change-dl_dir-form').removeClass('has-error');
594 $("#apply-change-dl_dir").removeAttr("disabled");
595 $('#hintError-dl_dir').hide();
596 } else {
597 $('#change-dl_dir-form').addClass('has-error');
598 $("#apply-change-dl_dir").attr("disabled","disabled");
599 $('#hintError-dl_dir').show();
600 }
601 }
602 });
603
604 $('#apply-change-dl_dir').click(function(){
605 var value = $('#new-dl_dir').val().trim();
606 postEditAjaxRequest({"configvarChange" : 'DL_DIR:'+value});
607 $('#dl_dir').text(value);
608 $('#dl_dir').removeClass('muted');
609 $("#change-dl_dir-form").slideUp(function () {
610 $('#dl_dir, #change-dl_dir-icon').show();
611 });
612 });
613
614 {% endif %}
615
616 {% if fstypes_defined %}
617 // change IMAGE_FSTYPES variable
618
619 // get value of fstypes and add to the textbox
620 $("#new-imagefs_types").val("{{fstypes}}");
621
622 // If value of new-imagefs_types is empty disable save button
623 $("#new-imagefs_types").on("input", function() {
624 $(this).val($(this).val().replace(/\s+/g,' '));
625 if ($(this).val().length === 0) {
626 //$('#apply-change-image_fstypes').prop('disabled', true);
627 $('#apply-change-image_fstypes').attr("disabled", "disabled");
628 } else {
629 //$('#apply-change-image_fstypes').prop('disabled', false);
630 $('#apply-change-image_fstypes').removeAttr("disabled");
631 }
632
633 /*If user types imagefs do the action on checkboxes.
634 Lets say if an imagefstype typed by user and the same
635 imagefs is unchecked in the checkbox, then checkbox needs
636 to get checked. Similarly when user deletes imagefs from
637 textbox the checkbox which is checked gets unchecked.
638 */
639 $('#all-image_fstypes input').each(function(){
640 var imagefs_userval = $('#new-imagefs_types').val();
641 if( imagefs_userval.indexOf($(this).val()) > -1) {
642 $(this).prop('checked', true);
643 } else {
644 $(this).prop('checked', false);
645 }
646 });
647
648 // Validate underscore in image fs types
649 if ($(this).val().indexOf('_') > -1) {
650 $('#validate-image_fstypes').addClass('has-error');
651 $('#hintError-image-fs_type').show();
652 $("#apply-change-image_fstypes").prop("disabled", true);
653 } else {
654 $('#validate-image_fstypes').removeClass('has-error');
655 $('#hintError-image-fs_type').hide();
656 }
657 });
658
659 $('#change-image_fstypes-icon').click(function() {
660 $('#change-image_fstypes-icon, #image_fstypes').hide();
661 $("#change-image_fstypes-form").slideDown();
662 // avoid false substring matches by including space separators
663 var html = "";
664 var fstypes = " " + document.getElementById("image_fstypes").innerHTML + " ";
665 var fstypes_list = document.getElementsByClassName('js-checkbox-fstypes-list');
666 // Add the checked boxes first
667 if (" " != fstypes) {
668 for (var i = 0, length = fstypes_list.length; i < length; i++) {
669 if (0 <= fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
670 html += '<div class="checkbox"><label><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'" checked="checked">'+fstypes_list[i].value+'</label></div>';
493 } 671 }
494 672 }
495 $(document).ready(function() { 673 }
496 674 // Add the un-checked boxes second
497 // 675 for (var i = 0, length = fstypes_list.length; i < length; i++) {
498 // Register handlers for static elements 676 if (0 > fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
499 // 677 html += '<div class="checkbox"><label><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label></div>';
500 678 }
501 {% if distro_defined %} 679 }
502 // change distro variable 680 // Add the 'no search matches' line last
503 $('#change-distro-icon').click(function() { 681 html += '<label id="no-match-fstypes" class="text-muted">No image types found</label>\n';
504 $('#change-distro-icon, #distro').hide(); 682 // Display the list
505 $("#change-distro-form").slideDown(); 683 document.getElementById("all-image_fstypes").innerHTML = html;
506 $("#new-distro").val( $('#distro').text() ); 684 $('#no-match-fstypes').hide();
507 }); 685
508 686 // clear the previous filter values and warning messages
509 $('#cancel-change-distro').click(function(){ 687 $("input#filter-image_fstypes").val("");
510 $("#change-distro-form").slideUp(function() { 688 });
511 $('#distro, #change-distro-icon').show(); 689
512 690 // When checkbox is checked/unchecked kindly update the text
513 // reset any dangling error state 691 $(document).on("change", "#all-image_fstypes :checkbox", function() {
514 $('#distro-error-message').text(""); 692 var imagefs = $(this);
515 var d = document.getElementById("edit-distro-name-div"); 693 var imagefs_obj = $('#new-imagefs_types');
516 d.className = d.className.replace(" error",""); 694 var imagefs_userval = imagefs_obj.val();
517 }); 695 if ($(this).is(':checked')) {
518 }); 696 if (imagefs_userval.indexOf($(imagefs).val()) === -1) {
519 697 imagefs_obj.val(imagefs_userval + " " + $(imagefs).val());
520 // validate new distro name 698 }
521 $("input#new-distro").on('input', function (evt) { 699 } else {
522 validate_distro_name(); 700 if (imagefs_userval.indexOf($(imagefs).val()) > -1) {
523 }); 701 imagefs_obj.val(imagefs_userval.replace($(imagefs).val(), '').trim());
524 702 }
525 $('#apply-change-distro').click(function(){ 703 }
526 //$('#repo').parent().removeClass('highlight-go'); 704 if ($('#new-imagefs_types').val().length === 0) {
527 var name = $('#new-distro').val(); 705 $("#apply-change-image_fstypes").prop("disabled", true);
528 postEditAjaxRequest({"configvarChange" : 'DISTRO:'+name}); 706 } else {
529 $('#distro').text(name); 707 $("#apply-change-image_fstypes").prop("disabled", false);
530 $("#change-distro-form").slideUp(function () { 708 }
531 $('#distro, #change-distro-icon').show(); 709 });
532 }); 710
533 }); 711 $('#cancel-change-image_fstypes').click(function(){
534 {% endif %} 712 $("#new-imagefs_types").val("{{fstypes}}");
535 713 $("#change-image_fstypes-form").slideUp(function() {
536 {% if dl_dir_defined %} 714 $('#image_fstypes, #change-image_fstypes-icon').show();
537 715 });
538 // change DL_DIR variable 716 });
539 $('#change-dl_dir-icon').click(function() { 717
540 $('#hintError-dl_dir').hide(); 718 $('#filter-image_fstypes').on('input', function(){
541 // preset the edit value 719 var valThis = $(this).val().toLowerCase();
542 var current_val = $("span#dl_dir").text().trim(); 720 var matchCount=0;
543 if (current_val == "Not set") { 721 $('#all-image_fstypes label').each(function(){
544 current_val=""; 722 var text = $(this).text().toLowerCase();
545 $("#apply-change-dl_dir").attr("disabled","disabled"); 723 var match = text.indexOf(valThis);
546 } 724 if (match >= 0) {
547 $("input#new-dl_dir").val(current_val); 725 $(this).show();
548 726 matchCount += 1;
549 $('#change-dl_dir-icon, #dl_dir').hide(); 727 }
550 $("#change-dl_dir-form").slideDown(); 728 else {
551 }); 729 $(this).hide();
552 730 }
553 $('#cancel-change-dl_dir').click(function(){ 731 });
554 $("#change-dl_dir-form").slideUp(function() { 732 if (matchCount === 0) {
555 $('#dl_dir, #change-dl_dir-icon').show(); 733 $('#no-match-fstypes').show();
556 }); 734 } else {
557 }); 735 $('#no-match-fstypes').hide();
558 736 }
559 $("#new-dl_dir").on('input', function(){ 737 });
560 if ($(this).val().trim().length == 0) { 738
561 $("#apply-change-dl_dir").attr("disabled","disabled"); 739 $('#apply-change-image_fstypes').click(function(){
562 } 740 var fstypes = $('#new-imagefs_types').val();
563 else { 741
564 var input = $(this); 742 postEditAjaxRequest({"configvarChange" : 'IMAGE_FSTYPES:'+fstypes});
565 var re = /^\/([^ <>\\|":\.%\?\*]+)$/; 743 $('#image_fstypes').text(fstypes);
566 var invalidDir = re.test(input.val()); 744 $('#image_fstypes').parent().removeClass('muted');
567 console.log(invalidDir); 745
568 if ( invalidDir ) { 746 $("#change-image_fstypes-form").slideUp(function() {
569 $('#validate-dl_dir').removeClass('control-group error'); 747 $('#image_fstypes, #change-image_fstypes-icon').show();
570 $("#apply-change-dl_dir").removeAttr("disabled"); 748 });
571 $('#hintError-dl_dir').hide(); 749 });
572 } else { 750 {% endif %}
573 $('#validate-dl_dir').addClass('control-group error'); 751
574 $("#apply-change-dl_dir").attr("disabled","disabled"); 752
575 $('#hintError-dl_dir').show(); 753 {% if image_install_append_defined %}
576 } 754
577 } 755 // init IMAGE_INSTALL_append trash icon
578 }); 756 setDeleteTooltip($('#delete-image_install-icon'));
579 757
580 $('#apply-change-dl_dir').click(function(){ 758 // change IMAGE_INSTALL_append variable
581 var value = $('#new-dl_dir').val().trim(); 759 $('#change-image_install-icon').click(function() {
582 postEditAjaxRequest({"configvarChange" : 'DL_DIR:'+value}); 760 // preset the edit value
583 $('#dl_dir').text(value); 761 var current_val = $("span#image_install").text().trim();
584 $('#dl_dir').removeClass('muted'); 762 if (current_val == "Not set") {
585 $("#change-dl_dir-form").slideUp(function () { 763 current_val="";
586 $('#dl_dir, #change-dl_dir-icon').show(); 764 $("#apply-change-image_install").attr("disabled","disabled");
587 }); 765 } else {
588 }); 766 // insure these non-empty values have single space prefix
589 767 current_val=" " + current_val;
590 {% endif %} 768 $("#apply-change-image_install").removeAttr("disabled");
591 769 }
592 {% if fstypes_defined %} 770 $("input#new-image_install").val(current_val);
593 // change IMAGE_FSTYPES variable 771
594 772 $('#change-image_install-icon, #delete-image_install-icon, #image_install').hide();
595 // get value of fstypes and add to the textbox 773 $("#change-image_install-form").slideDown();
596 $("#new-imagefs_types").val("{{fstypes}}"); 774 });
597 775
598 // If value of new-imagefs_types is empty disable save button 776 $('#cancel-change-image_install').click(function(){
599 $("#new-imagefs_types").on("input", function() { 777 $("#change-image_install-form").slideUp(function() {
600 $(this).val($(this).val().replace(/\s+/g,' ')); 778 $('#image_install, #change-image_install-icon').show();
601 if ($(this).val().length === 0) { 779 if ($("span#image_install").text() != "Not set") {
602 //$('#apply-change-image_fstypes').prop('disabled', true); 780 $('#delete-image_install-icon').show();
603 $('#apply-change-image_fstypes').attr("disabled", "disabled"); 781 setDeleteTooltip($('#delete-image_install-icon'));
604 } else { 782 }
605 //$('#apply-change-image_fstypes').prop('disabled', false); 783 });
606 $('#apply-change-image_fstypes').removeAttr("disabled"); 784 });
607 } 785
608 786 $("#new-image_install").on('input', function(){
609 /*If user types imagefs do the action on checkboxes. 787 if ($(this).val().trim().length == 0) {
610 Lets say if an imagefstype typed by user and the same 788 $("#apply-change-image_install").attr("disabled","disabled");
611 imagefs is unchecked in the checkbox, then checkbox needs 789 }
612 to get checked. Similarly when user deletes imagefs from 790 else {
613 textbox the checkbox which is checked gets unchecked. 791 $("#apply-change-image_install").removeAttr("disabled");
614 */ 792 }
615 $('#all-image_fstypes input').each(function(){ 793 });
616 var imagefs_userval = $('#new-imagefs_types').val(); 794
617 if( imagefs_userval.indexOf($(this).val()) > -1) { 795 $('#apply-change-image_install').click(function(){
618 $(this).prop('checked', true); 796 // insure these non-empty values have single space prefix
619 } else { 797 var value = " " + $('#new-image_install').val().trim();
620 $(this).prop('checked', false); 798 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+value});
621 } 799 $('#image_install').text(value);
622 }); 800 $('#image_install').removeClass('text-muted');
623 801 $("#change-image_install-form").slideUp(function () {
624 // Validate underscore in image fs types 802 $('#image_install, #change-image_install-icon').show();
625 if ($(this).val().indexOf('_') > -1) { 803 if (value.length > -1) {
626 $('#validate-image_fstypes').addClass('control-group error'); 804 $('#delete-image_install-icon').show();
627 $('#hintError-image-fs_type').show(); 805 setDeleteTooltip($('#delete-image_install-icon'));
628 $("#apply-change-image_fstypes").prop("disabled", true); 806 }
629 } else { 807 });
630 $('#validate-image_fstypes').removeClass('control-group error'); 808 });
631 $('#hintError-image-fs_type').hide(); 809
632 } 810 // delete IMAGE_INSTALL_append variable value
633 }); 811 $('#delete-image_install-icon').click(function(){
634 812 $(this).tooltip('hide');
635 $('#change-image_fstypes-icon').click(function() { 813 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+''});
636 $('#change-image_fstypes-icon, #image_fstypes').hide(); 814 $('#image_install').parent().fadeOut(1000, function(){
637 $("#change-image_fstypes-form").slideDown(); 815 $('#image_install').addClass('text-muted');
638 // avoid false substring matches by including space separators 816 $('#image_install').text('Not set');
639 var html = ""; 817 $('#delete-image_install-icon').hide();
640 var fstypes = " " + document.getElementById("image_fstypes").innerHTML + " "; 818 $('#image_install').parent().fadeIn(1000);
641 var fstypes_list = document.getElementsByClassName('js-checkbox-fstypes-list'); 819 });
642 // Add the checked boxes first 820 });
643 if (" " != fstypes) { 821 {% endif %}
644 for (var i = 0, length = fstypes_list.length; i < length; i++) { 822
645 if (0 <= fstypes.indexOf(" "+fstypes_list[i].value+" ")) { 823
646 html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'" checked="checked">'+fstypes_list[i].value+'</label>\n'; 824 {% if package_classes_defined %}
647 } 825 // change PACKAGE_CLASSES variable
648 } 826 $('#change-package_classes-icon').click(function() {
649 } 827 $('#change-package_classes-icon, #package_classes').hide();
650 // Add the un-checked boxes second 828 $("#change-package_classes-form").slideDown();
651 for (var i = 0, length = fstypes_list.length; i < length; i++) { 829
652 if (0 > fstypes.indexOf(" "+fstypes_list[i].value+" ")) { 830 // initialize the pulldown and checkboxes
653 html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label>\n'; 831 var value = $("#package_classes").text();
654 } 832 if ( value.indexOf("package_deb") == 0 ) {
655 } 833 $("#package_classes-select").prop('selectedIndex', 0);
656 // Add the 'no search matches' line last 834 updatePackageClassCheckboxes();
657 html += '<label id="no-match-fstypes">No image types found</label>\n'; 835 if ( value.indexOf("_ipk") > 0 ) {
658 // Display the list 836 $("#package_class_1_input").attr("checked",true);
659 document.getElementById("all-image_fstypes").innerHTML = html; 837 }
660 $('#no-match-fstypes').hide(); 838 if ( value.indexOf("_rpm") > 0 ) {
661 839 $("#package_class_2_input").attr("checked",true);
662 // clear the previous filter values and warning messages 840 }
663 $("input#filter-image_fstypes").val(""); 841 }
664 }); 842
665 843 if ( value.indexOf("package_ipk") == 0 ) {
666 // When checkbox is checked/unchecked kindly update the text 844 $("#package_classes-select").prop('selectedIndex', 1);
667 $(document).on("change", "#all-image_fstypes :checkbox", function() { 845 updatePackageClassCheckboxes();
668 var imagefs = $(this); 846 if ( value.indexOf("_deb") > 0 ) {
669 var imagefs_obj = $('#new-imagefs_types'); 847 $("#package_class_1_input").attr("checked",true);
670 var imagefs_userval = imagefs_obj.val(); 848 }
671 if ($(this).is(':checked')) { 849 if ( value.indexOf("_rpm") > 0 ) {
672 if (imagefs_userval.indexOf($(imagefs).val()) === -1) { 850 $("#package_class_2_input").attr("checked",true);
673 imagefs_obj.val(imagefs_userval + " " + $(imagefs).val()); 851 }
674 } 852 }
675 } else { 853
676 if (imagefs_userval.indexOf($(imagefs).val()) > -1) { 854 if ( value.indexOf("package_rpm") == 0 ) {
677 imagefs_obj.val(imagefs_userval.replace($(imagefs).val(), '').trim()); 855 $("#package_classes-select").prop('selectedIndex', 2);
678 } 856 updatePackageClassCheckboxes();
679 } 857 if ( value.indexOf("_deb") > 0 ) {
680 if ($('#new-imagefs_types').val().length === 0) { 858 $("#package_class_1_input").attr("checked",true);
681 $("#apply-change-image_fstypes").prop("disabled", true); 859 }
682 } else { 860 if ( value.indexOf("_ipk") > 0 ) {
683 $("#apply-change-image_fstypes").prop("disabled", false); 861 $("#package_class_2_input").attr("checked",true);
684 } 862 }
685 }); 863 }
686 864 });
687 $('#cancel-change-image_fstypes').click(function(){ 865
688 $("#new-imagefs_types").val("{{fstypes}}"); 866 $('#cancel-change-package_classes').click(function(){
689 $("#change-image_fstypes-form").slideUp(function() { 867 $("#change-package_classes-form").slideUp(function() {
690 $('#image_fstypes, #change-image_fstypes-icon').show(); 868 $('#package_classes, #change-package_classes-icon').show();
691 }); 869 });
692 }); 870 });
693 871
694 $('#filter-image_fstypes').on('input', function(){ 872 $('select').change(function() {
695 var valThis = $(this).val().toLowerCase(); 873 updatePackageClassCheckboxes();
696 var matchCount=0; 874 });
697 $('#all-image_fstypes label').each(function(){ 875
698 var text = $(this).text().toLowerCase(); 876 $('#apply-change-package_classes').click(function(){
699 var match = text.indexOf(valThis); 877 var e = document.getElementById("package_classes-select");
700 if (match >= 0) { 878 var val = e.options[e.selectedIndex].text;
701 $(this).show(); 879
702 matchCount += 1; 880 pc1_checked = document.getElementById("package_class_1_input").checked;
703 } 881 pc2_checked = document.getElementById("package_class_2_input").checked;
704 else { 882 if (val == "package_deb") {
705 $(this).hide(); 883 if (pc1_checked) val = val + " package_ipk";
706 } 884 if (pc2_checked) val = val + " package_rpm";
707 }); 885 }
708 if (matchCount === 0) { 886 if (val == "package_ipk") {
709 $('#no-match-fstypes').show(); 887 if (pc1_checked) val = val + " package_deb";
710 } else { 888 if (pc2_checked) val = val + " package_rpm";
711 $('#no-match-fstypes').hide(); 889 }
712 } 890 if (val == "package_rpm") {
713 }); 891 if (pc1_checked) val = val + " package_deb";
714 892 if (pc2_checked) val = val + " package_ipk";
715 $('#apply-change-image_fstypes').click(function(){ 893 }
716 var fstypes = $('#new-imagefs_types').val(); 894
717 895 $('#package_classes').text(val);
718 postEditAjaxRequest({"configvarChange" : 'IMAGE_FSTYPES:'+fstypes}); 896 //$('#package_classes').parent().removeClass('muted');
719 $('#image_fstypes').text(fstypes); 897 postEditAjaxRequest({"configvarChange" : 'PACKAGE_CLASSES:'+val});
720 $('#image_fstypes').parent().removeClass('muted'); 898 $("#change-package_classes-form").slideUp(function() {
721 899 $('#package_classes, #change-package_classes-icon').show();
722 $("#change-image_fstypes-form").slideUp(function() { 900 });
723 $('#image_fstypes, #change-image_fstypes-icon').show(); 901 });
724 }); 902 {% endif %}
725 }); 903
726 {% endif %} 904 {% if sstate_dir_defined %}
727 905
728 906 // change SSTATE_DIR variable
729 {% if image_install_append_defined %} 907 $('#change-sstate_dir-icon').click(function() {
730 908 $('#hintError-sstate_dir').hide();
731 // init IMAGE_INSTALL_append trash icon 909 // preset the edit value
732 setDeleteTooltip($('#delete-image_install-icon')); 910 var current_val = $("span#sstate_dir").text().trim();
733 911 if (current_val == "Not set") {
734 // change IMAGE_INSTALL_append variable 912 current_val="";
735 $('#change-image_install-icon').click(function() { 913 $("#apply-change-sstate_dir").attr("disabled","disabled");
736 // preset the edit value 914 }
737 var current_val = $("span#image_install").text().trim(); 915 $("input#new-sstate_dir").val(current_val);
738 if (current_val == "Not set") { 916
739 current_val=""; 917 // enable / disable the save button based on the input value
740 $("#apply-change-image_install").attr("disabled","disabled"); 918 if ( current_val.length ) {
741 } else { 919 $("#apply-change-sstate_dir").removeAttr("disabled");
742 // insure these non-empty values have single space prefix 920 }
743 current_val=" " + current_val; 921 else {
744 } 922 $("#apply-change-sstate_dir").attr("disabled","disabled");
745 $("input#new-image_install").val(current_val); 923 }
746 924
747 $('#change-image_install-icon, #delete-image_install-icon, #image_install').hide(); 925 $('#change-sstate_dir-icon, #sstate_dir').hide();
748 $("#change-image_install-form").slideDown(); 926 $("#change-sstate_dir-form").slideDown();
749 }); 927 });
750 928
751 $('#cancel-change-image_install').click(function(){ 929 $('#cancel-change-sstate_dir').click(function(){
752 $("#change-image_install-form").slideUp(function() { 930 $("#change-sstate_dir-form").slideUp(function() {
753 $('#image_install, #change-image_install-icon').show(); 931 $('#sstate_dir, #change-sstate_dir-icon').show();
754 if ($("span#image_install").text() != "Not set") { 932 });
755 $('#delete-image_install-icon').show(); 933 });
756 setDeleteTooltip($('#delete-image_install-icon')); 934
757 } 935 $("#new-sstate_dir").on('input', function(){
758 }); 936 if ($(this).val().trim().length == 0) {
759 }); 937 $("#apply-change-sstate_dir").attr("disabled","disabled");
760 938 }
761 $("#new-image_install").on('input', function(){ 939 else {
762 if ($(this).val().trim().length == 0) { 940 var input = $(this);
763 $("#apply-change-image_install").attr("disabled","disabled"); 941 var re = /^\/([^ <>\\|":\.%\?\*]+)$/;
764 } 942 var invalidDir = re.test(input.val());
765 else { 943 console.log(invalidDir);
766 $("#apply-change-image_install").removeAttr("disabled"); 944 if ( invalidDir ) {
767 } 945 $('#change-sstate_dir-form').removeClass('has-error');
768 }); 946 $("#apply-change-sstate_dir").removeAttr("disabled");
769 947 $('#hintError-sstate_dir').hide();
770 $('#apply-change-image_install').click(function(){ 948 } else {
771 // insure these non-empty values have single space prefix 949 $('#change-sstate_dir-form').addClass('has-error');
772 var value = " " + $('#new-image_install').val().trim(); 950 $("#apply-change-sstate_dir").attr("disabled","disabled");
773 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+value}); 951 $('#hintError-sstate_dir').show();
774 $('#image_install').text(value); 952 }
775 $('#image_install').removeClass('muted'); 953 }
776 $("#change-image_install-form").slideUp(function () { 954 });
777 $('#image_install, #change-image_install-icon').show(); 955
778 if (value.length > -1) { 956 $('#apply-change-sstate_dir').click(function(){
779 $('#delete-image_install-icon').show(); 957 var value = $('#new-sstate_dir').val().trim();
780 setDeleteTooltip($('#delete-image_install-icon')); 958 postEditAjaxRequest({"configvarChange" : 'SSTATE_DIR:'+value});
781 } 959 $('#sstate_dir').text(value);
782 }); 960 $('#sstate_dir').removeClass('text-muted');
783 }); 961 $("#change-sstate_dir-form").slideUp(function () {
784 962 $('#sstate_dir, #change-sstate_dir-icon').show();
785 // delete IMAGE_INSTALL_append variable value 963 });
786 $('#delete-image_install-icon').click(function(){ 964 });
787 $(this).tooltip('hide'); 965
788 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+''}); 966 {% endif %}
789 $('#image_install').parent().fadeOut(1000, function(){ 967
790 $('#image_install').addClass('muted'); 968 // add new variable
791 $('#image_install').text('Not set'); 969 $("button#add-configvar-button").click( function (evt) {
792 $('#delete-image_install-icon').hide(); 970 var variable = $("input#variable").val();
793 $('#image_install').parent().fadeIn(1000); 971 var value = $("input#value").val();
794 }); 972
795 }); 973 postEditAjaxRequest({"configvarAdd" : variable+':'+value});
796 {% endif %} 974
797 975 // clear the previous values
798 976 $("input#variable").val("");
799 {% if package_classes_defined %} 977 $("input#value").val("");
800 // change PACKAGE_CLASSES variable 978 // Disable add button
801 $('#change-package_classes-icon').click(function() { 979 $(".save").attr("disabled","disabled");
802 $('#change-package_classes-icon, #package_classes').hide(); 980
803 $("#change-package_classes-form").slideDown(); 981 // Reload page if admin-removed core managed value is manually added back in
804 982 if (0 <= " DISTRO DL_DIR IMAGE_FSTYPES IMAGE_INSTALL_append PACKAGE_CLASSES SSTATE_DIR ".indexOf( " "+variable+" " )) {
805 // initialize the pulldown and checkboxes 983 // delayed reload to avoid race condition with postEditAjaxRequest
806 var value = $("#package_classes").text(); 984 do_reload=true;
807 if ( value.indexOf("package_deb") == 0 ) { 985 }
808 $("#package_classes-select").prop('selectedIndex', 0); 986 });
809 updatePackageClassCheckboxes(); 987
810 if ( value.indexOf("_ipk") > 0 ) { 988 // validate new variable name and value
811 $("#package_class_1_input").attr("checked",true); 989 $("#variable, #value").on('input', function() {
812 } 990 validate_new_variable();
813 if ( value.indexOf("_rpm") > 0 ) { 991 });
814 $("#package_class_2_input").attr("checked",true); 992
815 } 993 //
816 } 994 // draw and register the dynamic configuration variables and handlers
817 995 //
818 if ( value.indexOf("package_ipk") == 0 ) { 996
819 $("#package_classes-select").prop('selectedIndex', 1); 997 var data = {
820 updatePackageClassCheckboxes(); 998 configvars : []
821 if ( value.indexOf("_deb") > 0 ) { 999 };
822 $("#package_class_1_input").attr("checked",true); 1000 {% for c in configvars %}
823 } 1001 data.configvars.push([ "{{c.name}}","{{c.value}}","{{c.pk}}" ]);
824 if ( value.indexOf("_rpm") > 0 ) { 1002 {% if '' != vars_context|get_dict_value:c.name %}
825 $("#package_class_2_input").attr("checked",true); 1003 data.vars_context[ "{{c.name}}" ] = "{{vars_context|get_dict_value:c.name }}";
826 } 1004 {% endif %}
827 } 1005 {% endfor %}
828 1006
829 if ( value.indexOf("package_rpm") == 0 ) { 1007 // draw these elements and assert their event handlers
830 $("#package_classes-select").prop('selectedIndex', 2); 1008 onEditPageUpdate(data);
831 updatePackageClassCheckboxes(); 1009});
832 if ( value.indexOf("_deb") > 0 ) { 1010
833 $("#package_class_1_input").attr("checked",true); 1011</script>
834 }
835 if ( value.indexOf("_ipk") > 0 ) {
836 $("#package_class_2_input").attr("checked",true);
837 }
838 }
839 });
840
841 $('#cancel-change-package_classes').click(function(){
842 $("#change-package_classes-form").slideUp(function() {
843 $('#package_classes, #change-package_classes-icon').show();
844 });
845 });
846
847 $('select').change(function() {
848 updatePackageClassCheckboxes();
849 });
850
851 $('#apply-change-package_classes').click(function(){
852 var e = document.getElementById("package_classes-select");
853 var val = e.options[e.selectedIndex].text;
854
855 pc1_checked = document.getElementById("package_class_1_input").checked;
856 pc2_checked = document.getElementById("package_class_2_input").checked;
857 if (val == "package_deb") {
858 if (pc1_checked) val = val + " package_ipk";
859 if (pc2_checked) val = val + " package_rpm";
860 }
861 if (val == "package_ipk") {
862 if (pc1_checked) val = val + " package_deb";
863 if (pc2_checked) val = val + " package_rpm";
864 }
865 if (val == "package_rpm") {
866 if (pc1_checked) val = val + " package_deb";
867 if (pc2_checked) val = val + " package_ipk";
868 }
869
870 $('#package_classes').text(val);
871 //$('#package_classes').parent().removeClass('muted');
872 postEditAjaxRequest({"configvarChange" : 'PACKAGE_CLASSES:'+val});
873 $("#change-package_classes-form").slideUp(function() {
874 $('#package_classes, #change-package_classes-icon').show();
875 });
876 });
877 {% endif %}
878
879 {% if sstate_dir_defined %}
880
881 // change SSTATE_DIR variable
882 $('#change-sstate_dir-icon').click(function() {
883 $('#hintError-sstate_dir').hide();
884 // preset the edit value
885 var current_val = $("span#sstate_dir").text().trim();
886 if (current_val == "Not set") {
887 current_val="";
888 $("#apply-change-sstate_dir").attr("disabled","disabled");
889 }
890 $("input#new-sstate_dir").val(current_val);
891
892 $('#change-sstate_dir-icon, #sstate_dir').hide();
893 $("#change-sstate_dir-form").slideDown();
894 });
895
896 $('#cancel-change-sstate_dir').click(function(){
897 $("#change-sstate_dir-form").slideUp(function() {
898 $('#sstate_dir, #change-sstate_dir-icon').show();
899 });
900 });
901
902 $("#new-sstate_dir").on('input', function(){
903 if ($(this).val().trim().length == 0) {
904 $("#apply-change-sstate_dir").attr("disabled","disabled");
905 }
906 else {
907 var input = $(this);
908 var re = /^\/([^ <>\\|":\.%\?\*]+)$/;
909 var invalidDir = re.test(input.val());
910 console.log(invalidDir);
911 if ( invalidDir ) {
912 $('#validate-sstate_dir').removeClass('control-group error');
913 $("#apply-change-sstate_dir").removeAttr("disabled");
914 $('#hintError-sstate_dir').hide();
915 } else {
916 $('#validate-sstate_dir').addClass('control-group error');
917 $("#apply-change-sstate_dir").attr("disabled","disabled");
918 $('#hintError-sstate_dir').show();
919 }
920 }
921 });
922
923 $('#apply-change-sstate_dir').click(function(){
924 var value = $('#new-sstate_dir').val().trim();
925 postEditAjaxRequest({"configvarChange" : 'SSTATE_DIR:'+value});
926 $('#sstate_dir').text(value);
927 $('#sstate_dir').removeClass('muted');
928 $("#change-sstate_dir-form").slideUp(function () {
929 $('#sstate_dir, #change-sstate_dir-icon').show();
930 });
931 });
932
933 {% endif %}
934
935 // add new variable
936 $("button#add-configvar-button").click( function (evt) {
937 var variable = $("input#variable").val();
938 var value = $("input#value").val();
939
940 postEditAjaxRequest({"configvarAdd" : variable+':'+value});
941
942 // clear the previous values
943 $("input#variable").val("");
944 $("input#value").val("");
945 // Disable add button
946 $(".save").attr("disabled","disabled");
947
948 // Reload page if admin-removed core managed value is manually added back in
949 if (0 <= " DISTRO DL_DIR IMAGE_FSTYPES IMAGE_INSTALL_append PACKAGE_CLASSES SSTATE_DIR ".indexOf( " "+variable+" " )) {
950 // delayed reload to avoid race condition with postEditAjaxRequest
951 do_reload=true;
952 }
953 });
954
955 // validate new variable name and value
956 $("#variable, #value").on('input', function() {
957 validate_new_variable();
958 });
959
960 //
961 // draw and register the dynamic configuration variables and handlers
962 //
963
964 var data = {
965 configvars : []
966 };
967 {% for c in configvars %}
968 data.configvars.push([ "{{c.name}}","{{c.value}}","{{c.pk}}" ]);
969 {% if '' != vars_context|get_dict_value:c.name %}
970 data.vars_context[ "{{c.name}}" ] = "{{vars_context|get_dict_value:c.name }}";
971 {% endif %}
972 {% endfor %}
973
974 // draw these elements and assert their event handlers
975 onEditPageUpdate(data);
976 });
977
978 </script>
979 1012
980{% endblock %} 1013{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
index 5814f32d06..d8020a97f2 100644
--- a/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
@@ -4,33 +4,39 @@
4 4
5{% block pagecontent %} 5{% block pagecontent %}
6 6
7 <div class="page-header top-air"> 7<div class="row">
8 <h1 data-role="page-title"></h1> 8 <div class="col-md-12">
9 </div> 9
10 10 <div class="page-header">
11 {% url 'projects' as xhr_table_url %} 11 <h1 data-role="page-title"></h1>
12 {% include 'toastertable.html' %} 12 </div>
13 13
14 <script> 14 {% url 'projects' as xhr_table_url %}
15 $(document).ready(function () { 15 {% include 'toastertable.html' %}
16 var tableElt = $("#{{table_name}}"); 16
17 var titleElt = $("[data-role='page-title']"); 17 <script>
18 18$(document).ready(function () {
19 tableElt.on("table-done", function (e, total, tableParams) { 19 var tableElt = $("#{{table_name}}");
20 var title = "All projects"; 20 var titleElt = $("[data-role='page-title']");
21 21
22 if (tableParams.search || tableParams.filter) { 22 tableElt.on("table-done", function (e, total, tableParams) {
23 if (total === 0) { 23 var title = "All projects";
24 title = "No projects found"; 24
25 } 25 if (tableParams.search || tableParams.filter) {
26 else if (total > 0) { 26 if (total === 0) {
27 title = total + " project" + (total > 1 ? 's' : '') + " found"; 27 title = "No projects found";
28 } 28 }
29 } 29 else if (total > 0) {
30 30 title = total + " project" + (total > 1 ? 's' : '') + " found";
31 titleElt.text(title); 31 }
32 }
33
34 titleElt.text(title);
32 }); 35 });
33 }); 36 });
34 </script> 37 </script>
38
39 </div>
40</div>
35 41
36{% endblock %} 42{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index e878caba8b..2734af0c95 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -16,64 +16,64 @@
16 }); 16 });
17</script> 17</script>
18 18
19<div class="alert alert-success lead" id="project-created-notification" style="margin-top:15px; display:none"> 19<div class="col-md-12">
20 <button type="button" class="close" data-dismiss="alert">×</button> 20 <div class="alert alert-success alert-dismissible change-notification" id="project-created-notification" style="display:none">
21 Your project <strong>{{project.name}}</strong> has been created. You can now <a href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build. 21 <button type="button" class="close" data-dismiss="alert">&times;</button>
22</div> 22 <p>Your project <strong>{{project.name}}</strong> has been created. You can now <a class="alert-link" href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a class="alert-link" href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build.</p>
23 23 </div>
24<!-- project name --> 24 <!-- project name -->
25<div class="page-header"> 25 <div class="page-header">
26 <h1 id="project-name-container"> 26 <h1 id="project-name-container">
27 <span id="project-name">{{project.name}}</span> 27 <span id="project-name">{{project.name}}</span>
28 28
29 <i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i> 29 <span class="glyphicon glyphicon-edit" id="project-change-form-toggle"></i>
30 30
31 {% if project.is_default %} 31 {% if project.is_default %}
32 <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i> 32 <span class="glyphicon glyphicon-question-sign get-help" title="This project shows information about the builds you start from the command line while Toaster is running"></span>
33 {% endif %} 33 {% endif %}
34 </h1> 34 </h1>
35 <form id="project-name-change-form" style="margin-bottom: 0px; display: none;"> 35 <form id="project-name-change-form" class="form-inline" style="display: none;">
36 <div class="input-append" id="validate-project-name"> 36 <div class="form-group">
37 <input class="huge input-xxlarge" type="text" id="project-name-change-input" autocomplete="off" value="{{project.name}}"> 37 <input class="form-control input-lg" type="text" id="project-name-change-input" autocomplete="off" value="{{project.name}}">
38 <button id="project-name-change-btn" class="btn btn-large" type="button">Save</button> 38 </div>
39 <a href="#" id="project-name-change-cancel" class="btn btn-large btn-link">Cancel</a> 39 <button id="project-name-change-btn" class="btn btn-default btn-lg" type="button">Save</button>
40 </div> 40 <a href="#" id="project-name-change-cancel" class="btn btn-lg btn-link">Cancel</a>
41 <p class="help-block error" style="display: none;margin-top: 10px;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p> 41 </form>
42 </form> 42 </div>
43</div>
44 43
45{% if not project.is_default %} 44 {% if not project.is_default %}
46 <div id="project-topbar"> 45 <div id="project-topbar">
47 <ul class="nav nav-pills"> 46 <ul class="nav nav-tabs">
48 <li id="topbar-configuration-tab"> 47 <li id="topbar-configuration-tab">
49 <a href="{% url 'project' project.id %}"> 48 <a href="{% url 'project' project.id %}">
50 Configuration 49 Configuration
51 </a> 50 </a>
52 </li> 51 </li>
53 <li> 52 <li>
54 <a href="{% url 'projectbuilds' project.id %}"> 53 <a href="{% url 'projectbuilds' project.id %}">
55 Builds ({{project.get_number_of_builds}}) 54 Builds ({{project.get_number_of_builds}})
56 </a> 55 </a>
57 </li> 56 </li>
58 <li> 57 <li>
59 <a href="{% url 'importlayer' project.id %}"> 58 <a href="{% url 'importlayer' project.id %}">
60 Import layer 59 Import layer
61 </a> 60 </a>
62 </li> 61 </li>
63 <li> 62 <li>
64 <a href="{% url 'newcustomimage' project.id %}"> 63 <a href="{% url 'newcustomimage' project.id %}">
65 New custom image 64 New custom image
66 </a> 65 </a>
67 </li> 66 </li>
68 <li class="pull-right"> 67 <li class="pull-right">
69 <form class="form-inline" style="margin-bottom:0px;"> 68 <form class="form-inline">
70 <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i> 69 <div class="form-group">
71 <div class="input-append"> 70 <span class="glyphicon glyphicon-question-sign get-help" data-placement="left" title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></span>
72 <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled> 71 <input id="build-input" type="text" class="form-control input-lg" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
73 <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
74 </div> 72 </div>
73 <button id="build-button" class="btn btn-primary btn-lg" data-project-id="{{project.id}}" disabled>Build</button>
75 </form> 74 </form>
76 </li> 75 </li>
77 </ul> 76 </ul>
78 </div> 77 </div>
79{% endif %} 78 {% endif %}
79</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
index 1d6d64e3c7..2aaff6b6bc 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -12,13 +12,16 @@
12 12
13<!-- Begin container --> 13<!-- Begin container -->
14 14
15<div class="row span11"> 15<div class="row">
16 <div class="col-md-12">
16 <div class="page-header"> 17 <div class="page-header">
17 <h1>{{object.name}}_{{object.version}}</h1> 18 <h1>{{object.name}}_{{object.version}}</h1>
18 </div> 19 </div>
20 </div>
19</div> 21</div>
20 22
21<div class="row span7 tabbable"> 23<div class="row">
24 <div class="col-md-8 tabbable">
22 <ul class="nav nav-pills"> 25 <ul class="nav nav-pills">
23 <li class="{{tab_states.1}}"> 26 <li class="{{tab_states.1}}">
24 <a href="#information" data-toggle="tab"> 27 <a href="#information" data-toggle="tab">
@@ -231,7 +234,8 @@
231 </div> 234 </div>
232</div> 235</div>
233 236
234<div class="row span4 well"> 237<div class="col-md-4">
238 <div class="well">
235 <h2>About {{object.name}}</h2> 239 <h2>About {{object.name}}</h2>
236 <dl class="item-info"> 240 <dl class="item-info">
237 {% if object.summary %} 241 {% if object.summary %}
@@ -262,6 +266,9 @@
262 <dd>{{object.license}}</dd> 266 <dd>{{object.license}}</dd>
263 {% endif %} 267 {% endif %}
264 </dl> 268 </dl>
269 </div>
265</div> 270</div>
266 271
272</div> <!-- end row -->
273
267{% endblock %} 274{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
index baab06eb52..e3729643a5 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
@@ -1,16 +1,17 @@
1<button data-recipe-name="{{data.name}}" class="btn btn-block layer-exists-{{data.layer_version.pk}} build-recipe-btn" style="margin-top: 5px; 1<a data-recipe-name="{{data.name}}" class="btn btn-default btn-block layer-exists-{{data.layer_version.pk}} build-recipe-btn" style="margin-top: 5px;
2 {% if data.layer_version.pk not in extra.current_layers %} 2 {% if data.layer_version.pk not in extra.current_layers %}
3 display:none; 3 display:none;
4 {% endif %}" 4 {% endif %}"
5 > 5 >
6 Build recipe 6 Build recipe
7</button> 7</a>
8<button class="btn btn-block layerbtn layer-add-{{data.layer_version.pk}}" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add" 8<a class="btn btn-default btn-block layerbtn layer-add-{{data.layer_version.pk}}" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
9 {% if data.layer_version.pk in extra.current_layers %} 9 {% if data.layer_version.pk in extra.current_layers %}
10 style="display:none;" 10 style="display:none;"
11 {% endif %} 11 {% endif %}
12> 12>
13 <i class="icon-plus"></i> 13 <span class="glyphicon glyphicon-plus"></span>
14 Add layer 14 Add layer
15 <i title="" class="icon-question-sign get-help" data-original-title="To build this target, you must first add the {{data.layer_version.layer.name}} layer to your project"></i> 15 <span class="glyphicon glyphicon-question-sign get-help" title="To build this
16</button> 16 recipe you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
17</a>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_packages.html b/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
index d25847bc0d..2c2efd8c17 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
@@ -11,13 +11,16 @@
11 11
12<!-- Begin container --> 12<!-- Begin container -->
13 13
14<div class="row-fluid span11"> 14<div class="row">
15 <div class="col-md-12">
15 <div class="page-header"> 16 <div class="page-header">
16 <h1>{{recipe.name}}_{{recipe.version}}</h1> 17 <h1>{{recipe.name}}_{{recipe.version}}</h1>
17 </div> 18 </div>
19 </div>
18</div> 20</div>
19 21
20<div class="row-fluid span7 tabbable"> 22<div class="row">
23 <div class="col-md-8 tabbable">
21 <ul class="nav nav-pills"> 24 <ul class="nav nav-pills">
22 <li> 25 <li>
23 <a href="{% url "recipe" build.pk recipe.id "1" %}"> 26 <a href="{% url "recipe" build.pk recipe.id "1" %}">
@@ -86,9 +89,10 @@
86 {% endif %} 89 {% endif %}
87 </div> {# tab-pane #} 90 </div> {# tab-pane #}
88 </div> {# tab-content #} 91 </div> {# tab-content #}
89</div> {# span7 #} 92</div> {# col-md-8 #}
90 93
91<div class="row span4 well"> 94<div class="col-md-4">
95 <div class="well">
92 <h2>About {{recipe.name}}</h2> 96 <h2>About {{recipe.name}}</h2>
93 <dl class="item-info"> 97 <dl class="item-info">
94 {% if recipe.summary %} 98 {% if recipe.summary %}
@@ -119,5 +123,8 @@
119 <dd>{{recipe.license}}</dd> 123 <dd>{{recipe.license}}</dd>
120 {% endif %} 124 {% endif %}
121 </dl> 125 </dl>
126 </div>
122</div> 127</div>
128
129</div> <!-- end row -->
123{% endblock pagedetailinfomain %} 130{% endblock pagedetailinfomain %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipedetails.html b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
index 23aa171ce6..19b18ffcda 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipedetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
@@ -4,25 +4,23 @@
4{% load static %} 4{% load static %}
5{% block pagecontent %} 5{% block pagecontent %}
6 6
7<div class="section"> 7<ul class="breadcrumb">
8 <ul class="breadcrumb"> 8 <li>
9 <li> 9 <a href="{% url 'project' project.id %}">{{project.name}}</a>
10 <a href="{% url 'project' project.id %}">{{project.name}}</a> 10 <span class="divider">&rarr;</span>
11 <span class="divider">&rarr;</span> 11 </li>
12 </li> 12 <li>
13 <li> 13 {% if recipe.is_image %}
14 {% if recipe.is_image %} 14 <a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a>
15 <a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a> 15 {% else %}
16 {% else %} 16 <a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a>
17 <a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a> 17 {% endif %}
18 {% endif %} 18 <span class="divider">&rarr;</span>
19 <span class="divider">&rarr;</span> 19 </li>
20 </li> 20 <li class="active">
21 <li class="active"> 21 {{recipe.name}} ({{recipe.layer_version.layer.name}})
22 {{recipe.name}} ({{recipe.layer_version.layer.name}}) 22 </li>
23 </li> 23</ul>
24 </ul>
25</div>
26 24
27<script src="{% static 'js/recipedetails.js' %}"></script> 25<script src="{% static 'js/recipedetails.js' %}"></script>
28<script> 26<script>
@@ -51,42 +49,40 @@
51 49
52{% include 'newcustomimage_modal.html' %} 50{% include 'newcustomimage_modal.html' %}
53 51
54<div class="row-fluid span11"> 52<div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
55 <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none"> 53 <button type="button" data-dismiss="alert" class="close">x</button>
56 <button type="button" data-dismiss="alert" class="close">x</button> 54 Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
57 Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed. 55</div>
58 </div> 56<div class="page-header">
59 <div class="page-header air"> 57 <h1>
60 <h1> 58 {{recipe.name}}
61 {{recipe.name}} 59 <small>({{recipe.layer_version.layer.name}})</small>
62 <small>({{recipe.layer_version.layer.name}})</small> 60 </h1>
63 </h1>
64 </div>
65</div> 61</div>
66 62
67<div class="row-fluid span11"> 63<div class="row">
68 <div class="span8"> 64 <div class="col-md-8">
69 <div class="button-place btn-group" id="customise-build-btns" 65 <div class="button-place btn-group" id="customise-build-btns"
70 style="width: 100%; 66 style="width: 100%;
71 {% if not in_project %} 67 {% if not in_project %}
72 display:none; 68 display:none;
73 {% endif %}"> 69 {% endif %}">
74 <button class="btn btn-large span6 build-recipe-btn" style="width: 50%"> 70 <button class="btn btn-default btn-lg build-recipe-btn" style="width: 50%">
75 Build {{recipe.name}} 71 Build {{recipe.name}}
76 </button> 72 </button>
77 {% if recipe.is_image %} 73 {% if recipe.is_image %}
78 <button class="btn btn-large span6 customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%"> 74 <button class="btn btn-default btn-lg customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
79 Customise {{recipe.name}} 75 Customise {{recipe.name}}
80 </button> 76 </button>
81 {% endif %} 77 {% endif %}
82 </div> 78 </div>
83 <div class="button-place"> 79 <div class="button-place">
84 <button class="btn btn-block btn-large" id="add-layer-btn" 80 <button class="btn btn-default btn-block btn-lg" id="add-layer-btn"
85 style="width:100%; 81 style="width:100%;
86 {% if in_project %} 82 {% if in_project %}
87 display:none; 83 display:none;
88 {% endif %}"> 84 {% endif %}">
89 <i class="icon-plus"></i> 85 <i class="glyphicon glyphicon-plus"></i>
90 Add the {{recipe.layer_version.layer.name}} layer to your project to build or customise this image recipe 86 Add the {{recipe.layer_version.layer.name}} layer to your project to build or customise this image recipe
91 </button> 87 </button>
92 </div> 88 </div>
@@ -106,7 +102,7 @@
106 style="display:none" 102 style="display:none"
107 {% endif %} > 103 {% endif %} >
108 <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p> 104 <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
109 <button class="btn btn-info btn-large build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button> 105 <button class="btn btn-info btn-lg build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
110 </div> 106 </div>
111 107
112 <div class="alert alert-info air" id="packages-alert" 108 <div class="alert alert-info air" id="packages-alert"
@@ -119,58 +115,60 @@
119 </div> 115 </div>
120 </div> 116 </div>
121 </div> 117 </div>
122 <div class="span4 well"> 118 <div class="col-md-4">
123 <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2> 119 <div class="well">
124 <dl> 120 <h2>About {{recipe.name}}</h2>
125 <dt> 121 <dl>
122 <dt>
126 Approx. packages included 123 Approx. packages included
127 <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i> 124 <span class="glyphicon glyphicon-question-sign get-help" title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></span>
128 </dt> 125 </dt>
129 <dd class="no-packages">{{packages.count}}</dd> 126 <dd class="no-packages">{{packages.count}}</dd>
130 <dt> 127 <dt>
131 Approx. package size 128 Approx. package size
132 <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i> 129 <span class="glyphicon glyphicon-question-sign get-help" title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></span>
133 </dt> 130 </dt>
134 <dd>{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd> 131 <dd>{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
135 {% if last_build %} 132 {% if last_build %}
136 <dt>Last build</dt> 133 <dt>Last build</dt>
137 <dd> 134 <dd>
138 <i class="icon-ok-sign success"></i> 135 <span class="glyphicon glyphicon-ok-circle"></span>
139 <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a> 136 <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a>
140 </dd> 137 </dd>
141 {% endif %} 138 {% endif %}
142 <dt>Recipe file</dt> 139 <dt>Recipe file</dt>
143 <dd> 140 <dd>
144 <code>{{recipe.file_path|cut_path_prefix:recipe.layer_version.local_path}}</code> 141 <code>{{recipe.file_path|cut_path_prefix:recipe.layer_version.local_path}}</code>
145 <a href="{{recipe.get_vcs_recipe_file_link_url}}"><i class="icon-share" title="" data-original-title="View recipe file"></i></a> 142 <a href="{{recipe.get_vcs_recipe_file_link_url}}"><span class="glyphicon glyphicon-new-window" title="View recipe file" data-toggle="tooltip"></span></a>
146 </dd> 143 </dd>
147 <dt>Layer</dt> 144 <dt>Layer</dt>
148 <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd> 145 <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
149 <dt> 146 <dt>
150 Summary 147 Summary
151 </dt> 148 </dt>
152 <dd> 149 <dd>
153 {{recipe.summary}} 150 {{recipe.summary}}
154 </dd> 151 </dd>
155 <dt> 152 <dt>
156 Description 153 Description
157 </dt> 154 </dt>
158 <dd> 155 <dd>
159 {{recipe.description}} 156 {{recipe.description}}
160 </dd> 157 </dd>
161 <dt>Version</dt> 158 <dt>Version</dt>
162 <dd> 159 <dd>
163 {{recipe.version}} 160 {{recipe.version}}
164 </dd> 161 </dd>
165 <dt>Section</dt> 162 <dt>Section</dt>
166 <dd> 163 <dd>
167 {{recipe.section}} 164 {{recipe.section}}
168 </dd> 165 </dd>
169 <dt>License</dt> 166 <dt>License</dt>
170 <dd> 167 <dd>
171 {{recipe.license}} 168 {{recipe.license}}
172 </dd> 169 </dd>
173 </dl> 170 </dl>
171 </div>
174 </div> 172 </div>
175</div> 173</div>
176 174
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
index d144893461..fe06f8b205 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipes.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -12,7 +12,7 @@
12{% endblock %} 12{% endblock %}
13 13
14{% block buildinfomain %} 14{% block buildinfomain %}
15<div class="span10"> 15<div class="col-md-10">
16<div class="page-header"> 16<div class="page-header">
17<h1> 17<h1>
18 {% if request.GET.search and objects.paginator.count > 0 %} 18 {% if request.GET.search and objects.paginator.count > 0 %}
@@ -26,15 +26,13 @@
26</div> 26</div>
27 27
28{% if objects.paginator.count == 0 %} 28{% if objects.paginator.count == 0 %}
29 <div class="row-fluid"> 29<div class="alert">
30 <div class="alert"> 30 <form class="no-results input-append" id="searchform">
31 <form class="no-results input-append" id="searchform"> 31 <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
32 <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} 32 <button class="btn" type="submit" value="Search">Search</button>
33 <button class="btn" type="submit" value="Search">Search</button> 33 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
34 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button> 34 </form>
35 </form> 35</div>
36 </div>
37 </div>
38 36
39{% else %} 37{% else %}
40{% include "basetable_top.html" %} 38{% include "basetable_top.html" %}
@@ -55,7 +53,7 @@
55 {% if count %} 53 {% if count %}
56 <a class="btn" 54 <a class="btn"
57 title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies" 55 title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies"
58 data-content="<ul class='unstyled'> 56 data-content="<ul class='list-unstyled'>
59 {% for i in deps|dictsort:"depends_on.name"%} 57 {% for i in deps|dictsort:"depends_on.name"%}
60 <li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li> 58 <li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
61 {% endfor %} 59 {% endfor %}
@@ -73,7 +71,7 @@
73 {% if count %} 71 {% if count %}
74 <a class="btn" 72 <a class="btn"
75 title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies" 73 title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies"
76 data-content="<ul class='unstyled'> 74 data-content="<ul class='list-unstyled'>
77 {% for i in revs|dictsort:"recipe.name" %} 75 {% for i in revs|dictsort:"recipe.name" %}
78 <li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li> 76 <li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li>
79 {% endfor %} 77 {% endfor %}
@@ -97,7 +95,7 @@
97 <!-- Layer commit --> 95 <!-- Layer commit -->
98 <td class="layer_version__layer__commit"> 96 <td class="layer_version__layer__commit">
99 <a class="btn" 97 <a class="btn"
100 data-content="<ul class='unstyled'> 98 data-content="<ul class='list-unstyled'>
101 <li>{{recipe.layer_version.commit}}</li> 99 <li>{{recipe.layer_version.commit}}</li>
102 </ul>"> 100 </ul>">
103 {{recipe.layer_version.commit|truncatechars:13}} 101 {{recipe.layer_version.commit|truncatechars:13}}
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
index a3fcdb09ed..0a24e9217e 100644
--- a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
@@ -2,11 +2,11 @@
2{% with data.package_dependencies_source.all_depends.count as dep_count %} 2{% with data.package_dependencies_source.all_depends.count as dep_count %}
3{% load projecttags %} 3{% load projecttags %}
4{% if dep_count %} 4{% if dep_count %}
5 <a data-content="<ul class='unstyled'> 5 <a data-content="<ul class='list-unstyled'>
6 {% for dep in data.package_dependencies_source.all_depends %} 6 {% for dep in data.package_dependencies_source.all_depends %}
7 <li>{{dep.depends_on.name}} {% if dep.depends_on.size > 0 %}({{dep.depends_on.size|filtered_filesizeformat}}){% endif %}</li> 7 <li>{{dep.depends_on.name}} {% if dep.depends_on.size > 0 %}({{dep.depends_on.size|filtered_filesizeformat}}){% endif %}</li>
8 {% endfor %} 8 {% endfor %}
9 </ul>" title="" class="btn" data-original-title=" 9 </ul>" class="btn btn-default" title="
10 <strong>{{data.name}}</strong> dependencies - <strong>{{data.package_dependencies_source.get_total_source_deps_size.depends_on__size__sum|filtered_filesizeformat}}</strong>"> 10 <strong>{{data.name}}</strong> dependencies - <strong>{{data.package_dependencies_source.get_total_source_deps_size.depends_on__size__sum|filtered_filesizeformat}}</strong>">
11 {{dep_count}} 11 {{dep_count}}
12</a> 12</a>
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
index 453a9d0137..d470712121 100644
--- a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
@@ -2,11 +2,11 @@
2{% with data.package_dependencies_target.all_depends.count as dep_count %} 2{% with data.package_dependencies_target.all_depends.count as dep_count %}
3{% load projecttags %} 3{% load projecttags %}
4{% if dep_count %} 4{% if dep_count %}
5 <a data-content="<ul class='unstyled'> 5 <a data-content="<ul class='list-unstyled'>
6 {% for dep in data.package_dependencies_target.all_depends|dictsort:'package.name' %} 6 {% for dep in data.package_dependencies_target.all_depends|dictsort:'package.name' %}
7 <li>{{dep.package.name}} {% if dep.package.size > 0 %}({{dep.package.size|filtered_filesizeformat}}){% endif %}</li> 7 <li>{{dep.package.name}} {% if dep.package.size > 0 %}({{dep.package.size|filtered_filesizeformat}}){% endif %}</li>
8 {% endfor %} 8 {% endfor %}
9 </ul>" title="" class="btn" data-original-title=" 9 </ul>" class="btn btn-default" title="
10 <strong>{{data.name}}</strong> reverse dependencies - <strong>{{data.package_dependencies_target.get_total_revdeps_size.package_id__size__sum|filtered_filesizeformat}}</strong>"> 10 <strong>{{data.name}}</strong> reverse dependencies - <strong>{{data.package_dependencies_target.get_total_revdeps_size.package_id__size__sum|filtered_filesizeformat}}</strong>">
11 {{dep_count}} 11 {{dep_count}}
12</a> 12</a>
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
index 4c33eaa848..9f31239d8e 100644
--- a/bitbake/lib/toaster/toastergui/templates/target.html
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -18,7 +18,8 @@
18 18
19{% block buildinfomain %} 19{% block buildinfomain %}
20 20
21<div class="row-fluid span10"> 21<div class="col-md-10">
22
22 <div class="page-header"> 23 <div class="page-header">
23 <h1> 24 <h1>
24 {% if request.GET.search and objects.paginator.count > 0 %} 25 {% if request.GET.search and objects.paginator.count > 0 %}
@@ -30,9 +31,9 @@
30 {% endif %} 31 {% endif %}
31 </h1> 32 </h1>
32 </div> 33 </div>
33</div>
34 34
35<div class="row-fluid pull-right span10" id="navTab"> 35
36<div id="navTab">
36 <ul class="nav nav-pills"> 37 <ul class="nav nav-pills">
37 <li class="active"> 38 <li class="active">
38 <a href="#target"> 39 <a href="#target">
@@ -51,15 +52,13 @@
51 <div id="image-packages" class="tab-pane"> 52 <div id="image-packages" class="tab-pane">
52 53
53 {% if objects.paginator.count == 0 %} 54 {% if objects.paginator.count == 0 %}
54 <div class="row-fluid">
55 <div class="alert"> 55 <div class="alert">
56 <form class="no-results input-append" id="searchform"> 56 <form class="no-results input-append" id="searchform">
57 <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} 57 <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
58 <button class="btn" type="submit" value="Search">Search</button> 58 <button class="btn" type="submit" value="Search">Search</button>
59 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button> 59 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
60 </form> 60 </form>
61 </div> 61 </div>
62 </div>
63 62
64 63
65 {% else %} 64 {% else %}
@@ -97,7 +96,7 @@
97 {% if deps_count > 0 %} 96 {% if deps_count > 0 %}
98 <a class="btn" 97 <a class="btn"
99 title="<a href='{% url "package_included_dependencies" build.id target.id package.id %}'>{{package.name}}</a> dependencies" 98 title="<a href='{% url "package_included_dependencies" build.id target.id package.id %}'>{{package.name}}</a> dependencies"
100 data-content="<ul class='unstyled'> 99 data-content="<ul class='list-unstyled'>
101 {% for i in deps|dictsort:'depends_on.name' %} 100 {% for i in deps|dictsort:'depends_on.name' %}
102 <li><a href='{% url "package_included_detail" build.pk target.id i.depends_on.pk %}'>{{i.depends_on.name}}</a></li> 101 <li><a href='{% url "package_included_detail" build.pk target.id i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
103 {% endfor %} 102 {% endfor %}
@@ -114,7 +113,7 @@
114 {% if rdeps_count > 0 %} 113 {% if rdeps_count > 0 %}
115 <a class="btn" 114 <a class="btn"
116 title="<a href='{% url "package_included_reverse_dependencies" build.id target.id package.id %}'>{{package.name}}</a> reverse dependencies" 115 title="<a href='{% url "package_included_reverse_dependencies" build.id target.id package.id %}'>{{package.name}}</a> reverse dependencies"
117 data-content="<ul class='unstyled'> 116 data-content="<ul class='list-unstyled'>
118 {% for i in rdeps|dictsort:'package.name' %} 117 {% for i in rdeps|dictsort:'package.name' %}
119 <li><a href='{% url "package_included_detail" build.id target.id i.package.id %}'>{{i.package.name}}</a></li> 118 <li><a href='{% url "package_included_detail" build.id target.id i.package.id %}'>{{i.package.name}}</a></li>
120 {% endfor %} 119 {% endfor %}
@@ -147,7 +146,7 @@
147 </td> 146 </td>
148 <td class="layer_commit"> 147 <td class="layer_commit">
149 <a class="btn" 148 <a class="btn"
150 data-content="<ul class='unstyled'> 149 data-content="<ul class='list-unstyled'>
151 <li>{{package.recipe.layer_version.commit}}</li> 150 <li>{{package.recipe.layer_version.commit}}</li>
152 </ul>"> 151 </ul>">
153 {{package.recipe.layer_version.commit|truncatechars:13}} 152 {{package.recipe.layer_version.commit|truncatechars:13}}
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
index 5768262432..8773351fab 100644
--- a/bitbake/lib/toaster/toastergui/templates/task.html
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -11,7 +11,8 @@
11 11
12{% block pagedetailinfomain %} 12{% block pagedetailinfomain %}
13 13
14<div class="row span11"> 14<div class="row">
15 <div class="col-md-12">
15 <div class="page-header"> 16 <div class="page-header">
16 <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1> 17 <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1>
17 </div> 18 </div>
@@ -24,16 +25,16 @@
24{%if task.task_executed %} 25{%if task.task_executed %}
25 {# executed tasks outcome #} 26 {# executed tasks outcome #}
26 {% if task.logfile %} 27 {% if task.logfile %}
27 <a class="btn btn-large" href="{% url 'build_artifact' build.id "tasklogfile" task.pk %}" style="margin:15px;">Download task log</a> 28 <a class="btn btn-lg" href="{% url 'build_artifact' build.id "tasklogfile" task.pk %}" style="margin:15px;">Download task log</a>
28 {% endif %} 29 {% endif %}
29 {# show stack trace for failed task #} 30 {# show stack trace for failed task #}
30 {% if task.outcome == task.OUTCOME_FAILED and log_head %} 31 {% if task.outcome == task.OUTCOME_FAILED and log_head %}
31 <h3>Python stack trace</h3> 32 <h3>Python stack trace</h3>
32 <div> 33 <div>
33 <pre style="min-height:160px;"> 34 <pre style="min-height:160px;">
34 <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-mini">...</a> 35 <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-xs">...</a>
35 <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;"> 36 <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;">
36 <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-mini collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre> 37 <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-xs collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre>
37 </div> 38 </div>
38 {% endif %} 39 {% endif %}
39{% else %} 40{% else %}
@@ -122,7 +123,7 @@
122 {%elif task.outcome == task.OUTCOME_CACHED%} 123 {%elif task.outcome == task.OUTCOME_CACHED%}
123 {% for t in task.get_related_setscene %} 124 {% for t in task.get_related_setscene %}
124 {% if forloop.last %} 125 {% if forloop.last %}
125 <a class="btn btn-large" href="{% url 'build_artifact' build.id "tasklogfile" t.pk %}" style="margin:15px;">Download task log</a> 126 <a class="btn btn-lg" href="{% url 'build_artifact' build.id "tasklogfile" t.pk %}" style="margin:15px;">Download task log</a>
126 {% endif %} 127 {% endif %}
127 {% endfor %} 128 {% endfor %}
128 129
@@ -153,8 +154,8 @@
153 <dd> 154 <dd>
154 {{task.sstate_checksum}} 155 {{task.sstate_checksum}}
155 </dd> 156 </dd>
156</dl>
157 {% if task.sstate_result != task.SSTATE_NA %} 157 {% if task.sstate_result != task.SSTATE_NA %}
158 </dl>
158 <div class="alert alert-info">Attempting to restore output from sstate cache 159 <div class="alert alert-info">Attempting to restore output from sstate cache
159 <i class="icon-question-sign get-help get-help-blue" title="The build system is searching for the task output in your <code>sstate-cache</code> directory and mirrors. If the build system finds the task output, it will reuse it instead of building it from scratch by running the real task. Reusing the task output makes the build faster"></i> 160 <i class="icon-question-sign get-help get-help-blue" title="The build system is searching for the task output in your <code>sstate-cache</code> directory and mirrors. If the build system finds the task output, it will reuse it instead of building it from scratch by running the real task. Reusing the task output makes the build faster"></i>
160 </div> 161 </div>
@@ -273,5 +274,6 @@
273 </dl> 274 </dl>
274 275
275</div> 276</div>
277
276{% endblock %} 278{% endblock %}
277 279
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
index 84bc10386d..b3b7621e60 100644
--- a/bitbake/lib/toaster/toastergui/templates/tasks.html
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -39,7 +39,7 @@
39{% endblock %} 39{% endblock %}
40 40
41{% block buildinfomain %} 41{% block buildinfomain %}
42<div class="span10"> 42<div class="col-md-10">
43{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %} 43{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
44 <!-- Empty - no data in database --> 44 <!-- Empty - no data in database -->
45 <div class="page-header"> 45 <div class="page-header">
@@ -64,14 +64,12 @@
64 </div> 64 </div>
65 65
66 {% if objects.paginator.count == 0 %} 66 {% if objects.paginator.count == 0 %}
67 <div class="row-fluid"> 67 <div class="alert">
68 <div class="alert"> 68 <form class="no-results input-append" id="searchform">
69 <form class="no-results input-append" id="searchform"> 69 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
70 <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %} 70 <button class="btn" type="submit" value="Search">Search</button>
71 <button class="btn" type="submit" value="Search">Search</button> 71 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
72 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button> 72 </form>
73 </form>
74 </div>
75 </div> 73 </div>
76 74
77 75
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html b/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html
index 4d28793bf6..25eef52a3d 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html
@@ -1,20 +1,24 @@
1<!-- filter modal --> 1<!-- filter modal -->
2<div id="filter-modal-{{table_name}}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="false"> 2<div id="filter-modal-{{table_name}}" class="modal fade" tabindex="-1" role="dialog" aria-hidden="false">
3 <form id="filter-modal-form-{{table_name}}" style="margin-bottom: 0px"> 3 <div class="modal-dialog">
4 <div class="modal-header"> 4 <div class="modal-content">
5 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 5 <div class="modal-header">
6 <h3 id="filter-modal-title-{{table_name}}">&nbsp;</h3> 6 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
7 </div> 7 <h3 id="filter-modal-title-{{table_name}}">&nbsp;</h3>
8 <div class="modal-body"> 8 </div>
9 <p>Show:</p> 9 <div class="modal-body">
10 <span id="filter-actions-{{table_name}}"></span> 10 <form id="filter-modal-form-{{table_name}}" style="margin-bottom: 0px">
11 </div> 11 <p>Show:</p>
12 <div class="modal-footer"> 12 <span id="filter-actions-{{table_name}}"></span>
13 <button class="btn btn-primary" type="submit" data-role="filter-apply"> 13 </div>
14 <div class="modal-footer">
15 <button class="btn btn-primary" type="submit" data-role="filter-apply">
14 Apply 16 Apply
15 </button> 17 </button>
18 </div>
19 </form>
16 </div> 20 </div>
17 </form> 21 </div>
18</div> 22</div>
19<button id="clear-filter-btn-{{table_name}}" style="display:none"></button> 23<button id="clear-filter-btn-{{table_name}}" style="display:none"></button>
20<!-- end filter modal --> 24<!-- end filter modal -->
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
index 212318bc53..56cd2ce375 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
@@ -26,37 +26,38 @@
26 26
27{% include 'toastertable-filter.html' %} 27{% include 'toastertable-filter.html' %}
28 28
29<div class="row-fluid" id="no-results-{{table_name}}" style="display:none"> 29<div id="no-results-{{table_name}}" style="display:none">
30 <div class="alert"> 30 <div class="alert alert-warning">
31 <form class="no-results input-append"> 31 <form class="no-results form-inline">
32 <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/> 32 <div class="form-group">
33 <a href="#" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1"> 33 <div class="btn-group">
34 <i class="icon-remove"></i> 34 <input class="form-control" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
35 </a> 35 <span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1"></span>
36 <button class="btn search-submit-{{table_name}}" >Search</button> 36 </div>
37 <button class="btn btn-link remove-search-btn-{{table_name}}">Show {{title|lower}} 37 </div>
38 </button> 38 <button class="btn btn-default search-submit-{{table_name}}">Search</button>
39 <button class="btn btn-link remove-search-btn-{{table_name}}">Show all {{title|lower}}</button>
39 </form> 40 </form>
40 </div> 41 </div>
41</div> 42</div>
42<div id="table-container-{{table_name}}" style="visibility: hidden"> 43<div id="table-container-{{table_name}}" style="visibility: hidden">
43 <!-- control header --> 44 <!-- control header -->
44 <div class="row-fluid" id="table-chrome-{{table_name}}"> 45 <div id="table-chrome-{{table_name}}">
45 <div class="navbar-search input-append pull-left"> 46 <div class="container-fluid detail-page-contols">
46 47 <form class="navbar-form navbar-left">
47 <input class="input-xlarge" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/> 48 <div class="form-group">
48 <a href="#" style="display:none" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1"> 49 <div class="btn-group">
49 <i class="icon-remove"></i> 50 <input class="form-control" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
50 </a> 51 <span href="#" style="display:none" class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1"></span>
51 <button class="btn" id="search-submit-{{table_name}}" >Search</button> 52 </div>
52 </div> 53 </div>
53 54 <button class="btn btn-default" id="search-submit-{{table_name}}" >Search</button>
54 <div class="pull-right"> 55 </form>
55 56
56 <div style="display:inline"> 57 <form class="navbar-form navbar-right">
57 <span class="divider-vertical"></span> 58 <div class="form-group">
58 <span class="help-inline" style="padding-top:5px;">Show rows:</span> 59 <label>Show rows:</label>
59 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}"> 60 <select class="form-control pagesize-{{table_name}}">
60 {% with "10 25 50 100 150" as list%} 61 {% with "10 25 50 100 150" as list%}
61 {% for i in list.split %} 62 {% for i in list.split %}
62 <option value="{{i}}">{{i}}</option> 63 <option value="{{i}}">{{i}}</option>
@@ -64,31 +65,36 @@
64 {% endwith %} 65 {% endwith %}
65 </select> 66 </select>
66 </div> 67 </div>
67 </div> 68 </form>
69 </div>
68 </div> 70 </div>
69 71
70 <!-- The actual table --> 72 <!-- The actual table -->
71 <table class="table table-bordered table-hover tablesorter" id="{{table_name}}"> 73 <div class="table-responsive">
72 <thead> 74 <table class="table table-bordered table-hover" id="{{table_name}}">
73 <tr><th></th></tr> 75 <thead>
74 </thead> 76 <tr><th></th></tr>
75 <tbody></tbody> 77 </thead>
76 </table> 78 <tbody></tbody>
79 </table>
80 </div>
77 81
78 <!-- Pagination controls --> 82 <!-- Pagination controls -->
79 <div class="pagination pagination-centered" id="pagination-{{table_name}}"> 83 <div id="pagination-{{table_name}}">
80 <ul class="pagination" style="display: block-inline"> 84 <ul class="pagination">
81 </ul> 85 </ul>
82 86
83 <div class="pull-right"> 87 <form class="navbar-form navbar-right">
84 <span class="help-inline" style="padding-top:5px;">Show rows:</span> 88 <div class="form-group">
85 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}"> 89 <label>Show rows:</label>
86 {% with "10 25 50 100 150" as list%} 90 <select class="form-control pagesize-{{table_name}}">
87 {% for i in list.split %} 91 {% with "10 25 50 100 150" as list%}
88 <option value="{{i}}">{{i}}</option> 92 {% for i in list.split %}
89 {% endfor %} 93 <option value="{{i}}">{{i}}</option>
90 {% endwith %} 94 {% endfor %}
91 </select> 95 {% endwith %}
92 </div> 96 </select>
97 </div>
98 </form>
93 </div> 99 </div>
94</div> 100</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 21c3d36c72..d85d01f157 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -25,14 +25,20 @@
25 25
26{% include 'toastertable-filter.html' %} 26{% include 'toastertable-filter.html' %}
27 27
28<div class="row-fluid" id="no-results-{{table_name}}" style="display:none"> 28<div class="row-fluid" id="empty-state-{{table_name}}" style="display:none">
29 <div class="alert"> 29 <div class="alert alert-info">{{empty_state}}</div>
30 <form class="no-results input-append"> 30</div>
31 <input class="input-xxlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/> 31
32 <a href="#" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1"> 32<div id="no-results-{{table_name}}" style="display:none">
33 <i class="icon-remove"></i> 33 <div class="alert alert-warning">
34 </a> 34 <form class="form-inline">
35 <button class="btn search-submit-{{table_name}}"> 35 <div class="form-group">
36 <div class="btn-group">
37 <input class="form-control" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
38 <span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1"></a>
39 </div>
40 </div>
41 <button class="btn btn-default search-submit-{{table_name}}">
36 Search 42 Search
37 </button> 43 </button>
38 <button class="btn btn-link show-all-{{table_name}} remove-search-btn-{{table_name}}"> 44 <button class="btn btn-link show-all-{{table_name}} remove-search-btn-{{table_name}}">
@@ -44,62 +50,76 @@
44 50
45<div id="table-container-{{table_name}}" style="visibility: hidden"> 51<div id="table-container-{{table_name}}" style="visibility: hidden">
46 <!-- control header --> 52 <!-- control header -->
47 <div class="navbar" id="table-chrome-{{table_name}}"> 53 <div class="navbar navbar-default" id="table-chrome-{{table_name}}">
48 <div class="navbar-inner"> 54 <div class="container-fluid">
49 <div class="navbar-search input-append pull-left span6"> 55 <div class="navbar-header">
50 56 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#table-chrome-collapse-{{table_name}}" aria-expanded="false">
51 <input id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/> 57 <span class="sr-only">Toggle navigation</span>
52 <a href="#" style="display:none" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1"> 58 <span class="icon-bar"></span>
53 <i class="icon-remove"></i> 59 <span class="icon-bar"></span>
54 </a> 60 <span class="icon-bar"></span>
55 <button class="btn" id="search-submit-{{table_name}}" >Search</button> 61 </button>
56 </div> 62 </div>
57 63 <div class="collapse navbar-collapse" id="table-chrome-collapse-{{table_name}}">
58 <div class="pull-right"> 64 <form class="navbar-form navbar-left">
59 <div class="btn-group"> 65 <div class="form-group">
60 <button id="edit-columns-button" class="btn dropdown-toggle" data-toggle="dropdown">Edit columns 66 <div class="btn-group">
67 <input id="search-input-{{table_name}}" class="form-control" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>
68 <span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1" style="display:none;">
69 </div>
70 </div>
71 <button class="btn btn-default" id="search-submit-{{table_name}}" >Search</button>
72 </form>
73 <form class="navbar-form navbar-right">
74 <div clas="form-group">
75 <label>Show rows:</label>
76 <select class="form-control pagesize-{{table_name}}">
77 {% with "10 25 50 100 150" as list%}
78 {% for i in list.split %}
79 <option value="{{i}}">{{i}}</option>
80 {% endfor %}
81 {% endwith %}
82 </select>
83 </div>
84 </form>
85 <div class="btn-group navbar-right">
86 <button id="edit-columns-button" class="btn btn-default navbar-btn dropdown-toggle" data-toggle="dropdown">Edit columns
61 <span class="caret"></span> 87 <span class="caret"></span>
62 </button> 88 </button>
63 <ul class="dropdown-menu editcol"> 89 <ul class="dropdown-menu editcol">
64 </ul> 90 </ul>
65 </div> 91 </div>
66 <div style="display:inline">
67 <span class="divider-vertical"></span>
68 <span class="help-inline" style="padding-top:5px;">Show rows:</span>
69 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}">
70 {% with "10 25 50 100 150" as list%}
71 {% for i in list.split %}
72 <option value="{{i}}">{{i}}</option>
73 {% endfor %}
74 {% endwith %}
75 </select>
76 </div>
77 </div> 92 </div>
78 </div> 93 </div>
79 </div> 94 </div>
80 95
81 <!-- The actual table --> 96 <!-- The actual table -->
82 <table class="table table-bordered table-hover tablesorter" id="{{table_name}}"> 97 <div class="table-responsive">
83 <thead> 98 <table class="table table-bordered table-hover" id="{{table_name}}">
84 <tr><th></th></tr> 99 <thead>
85 </thead> 100 <tr><th></th></tr>
86 <tbody></tbody> 101 </thead>
87 </table> 102 <tbody></tbody>
103 </table>
104 </div>
88 105
89 <!-- Pagination controls --> 106 <!-- Pagination controls -->
90 <div class="pagination pagination-centered" id="pagination-{{table_name}}"> 107 <div id="pagination-{{table_name}}">
91 <ul class="pagination" style="display: block-inline"> 108 <ul class="pagination">
92 </ul> 109 </ul>
93 110
94 <div class="pull-right"> 111 <form class="navbar-form navbar-right">
95 <span class="help-inline" style="padding-top:5px;">Show rows:</span> 112 <div class="form-group">
96 <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}"> 113 <label>Show rows:</label>
97 {% with "10 25 50 100 150" as list%} 114 <select class="form-control pagesize-{{table_name}}">
98 {% for i in list.split %} 115 {% with "10 25 50 100 150" as list%}
99 <option value="{{i}}">{{i}}</option> 116 {% for i in list.split %}
100 {% endfor %} 117 <option value="{{i}}">{{i}}</option>
101 {% endwith %} 118 {% endfor %}
102 </select> 119 {% endwith %}
103 </div> 120 </select>
121 </div>
122 </form>
104 </div> 123 </div>
105</div> 124
125</div> <!--end table container -->
diff --git a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
index 2d3d02c2e1..331a4845ab 100644
--- a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
+++ b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
@@ -6,8 +6,8 @@
6{% block title %} Build artifact does not exist - Toaster {% endblock %} 6{% block title %} Build artifact does not exist - Toaster {% endblock %}
7 7
8{% block pagecontent %} 8{% block pagecontent %}
9 <div class="row-fluid air"> 9 <div class="row air">
10 <div class="alert alert-info span8 lead"> 10 <div class="alert alert-info col-md-8 lead">
11 <p>The build artifact you are trying to download does not exist.</p> 11 <p>The build artifact you are trying to download does not exist.</p>
12 <p><a href="javascript:window.history.back()">Back to previous page</a></p> 12 <p><a href="javascript:window.history.back()">Back to previous page</a></p>
13 </div> 13 </div>