diff options
author | Belen Barros Pena <belen.barros.pena@linux.intel.com> | 2016-04-12 15:56:43 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-06-15 08:35:03 +0100 |
commit | 443f7b39158c891015a791814b9b1fe2324edc41 (patch) | |
tree | 3f570a138594273bc7498225e066b7f9a99bf0c5 /bitbake/lib/toaster/toastergui/templates | |
parent | 79e0eb9e52e9b954aa3b6bc6dee15a75b5eb990c (diff) | |
download | poky-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')
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">×</button> | 70 | <button type="button" class="close" id="hide-alert" data-dismiss="alert">×</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">→</span>'); |
19 | $('#breadcrumb > li').append('<span class="divider">→</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}}})">«</a></li> | 10 | <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">«</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">×</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}}})">«</a></li> | 12 | <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">«</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 | |||
6 | required context: | 6 | required 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">×</button> |
34 | <button type="button" class="close" data-dismiss="alert">×</button> | 34 | <h3> </h3> |
35 | <h3> </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">→</span> | 13 | <a href="{% url 'project' project.id %}">{{project.name}}</a> |
14 | </li> | 14 | <span class="divider">→</span> |
15 | <li><a href="{% url 'projectlayers' project.id %}">Compatible layers</a> | 15 | </li> |
16 | <span class="divider">→</span> | 16 | <li><a href="{% url 'projectlayers' project.id %}">Compatible layers</a> |
17 | </li> | 17 | <span class="divider">→</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">×</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">×</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; | 221 | var 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(); | 224 | function 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">' | 292 | function 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) { | 323 | function 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 | 341 | function 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) { | 359 | function 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 | |||
422 | function 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 | |||
471 | function 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 | |||
487 | function 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 %} */ | ||
493 | function 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 | |||
504 | function setDeleteTooltip(object) { | ||
505 | object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Delete" }); | ||
506 | } | ||
507 | function 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">×</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">→</span> |
11 | <span class="divider">→</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">→</span> |
19 | <span class="divider">→</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}}"> </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}}"> </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> |