summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui/templates/layers.html
diff options
context:
space:
mode:
authorAlexandru DAMIAN <alexandru.damian@intel.com>2014-09-29 20:20:33 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-10-30 13:39:50 +0000
commit1b109c7908a87bfc20c058116b6b72cc16155399 (patch)
tree520bec43876febd6e311ef8aa34ef4866db1b7ab /bitbake/lib/toaster/toastergui/templates/layers.html
parent960580cb70ab1c775b49f8a40d41632c080b3cbb (diff)
downloadpoky-1b109c7908a87bfc20c058116b6b72cc16155399.tar.gz
bitbake: toastergui: project edit capabilities in all layers page
This patch definitivates the all layers page, providing interactivity for adding and removing layers inside the project from this page. [YOCTO #6590] (Bitbake rev: e690080f83ad53c5e4a31e8c0fba2cc744eea1eb) Signed-off-by: Alexandru DAMIAN <alexandru.damian@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/toaster/toastergui/templates/layers.html')
-rw-r--r--bitbake/lib/toaster/toastergui/templates/layers.html282
1 files changed, 167 insertions, 115 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/layers.html b/bitbake/lib/toaster/toastergui/templates/layers.html
index b32a7ed2e2..52eed86657 100644
--- a/bitbake/lib/toaster/toastergui/templates/layers.html
+++ b/bitbake/lib/toaster/toastergui/templates/layers.html
@@ -9,43 +9,63 @@
9{% block projectinfomain %} 9{% block projectinfomain %}
10 <div class="page-header"> 10 <div class="page-header">
11 <h1> 11 <h1>
12 All layers 12 {% if request.GET.search and objects.paginator.count > 0 %}
13 <i class="icon-question-sign get-help heading-help" title="This page lists all the layers compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created layers suitable for use on top of OpenEmbedded Core and any layers you have imported"></i> 13 {{objects.paginator.count}} layer{{objects.paginator.count|pluralize}} found
14 {%elif request.GET.search and objects.paginator.count == 0%}
15 No layer found
16 {%else%}
17 All layers
18 {%endif%}
19 <i class="icon-question-sign get-help heading-help" title="This page lists all the layers compatible with " + {{project.release.name}} + " that Toaster knows about."></i>
14 </h1> 20 </h1>
15 </div> 21 </div>
16 <!--div class="alert"> 22
17 <div class="input-append" style="margin-bottom:0px;"> 23 <div id="zone1alerts">
18 <input class="input-xxlarge" type="text" placeholder="Search layers" value="browser" /> 24
19 <a class="add-on btn"> 25 </div>
20 <i class="icon-remove"></i> 26
21 </a> 27
22 <button class="btn" type="button">Search</button>
23 <a class="btn btn-link" href="#">Show all layers</a>
24 </div>
25 </div-->
26 <div id="layer-added" class="alert alert-info lead" style="display:none;"></div> 28 <div id="layer-added" class="alert alert-info lead" style="display:none;"></div>
27 <div id="layer-removed" class="alert alert-info lead" style="display:none;">
28 <button type="button" class="close" data-dismiss="alert">&times;</button>
29 <strong>1</strong> layer deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>
30 </div>
31 29
32 30
33{% include "basetable_top.html" %} 31{% include "basetable_top_layers.html" %}
34 {% for lv in objects %} 32 {% for lv in objects %}
35 <tr class="data"> 33 <tr class="data">
36 <td class="layer"><a href="{% url 'layerdetails' lv.id %}">{{lv.layer.name}}</a></td> 34 <td class="layer"><a href="{% url 'layerdetails' lv.id %}">{{lv.layer.name}}</a></td>
37 <td class="description">{{lv.layer.summary}}</td> 35 <td class="description">{{lv.layer.summary}}</td>
38 <td class="source"><a href="{% url 'layerdetails' lv.pk %}">{{lv.layer_source.name}}</a></td> 36 <td class="source"><a href="{% url 'layerdetails' lv.pk %}">{{lv.layer_source.name}}</a></td>
39 <td class="git-repo"><a href="{% url 'layerdetails' lv.pk %}"><code>{{lv.layer.layer_index_url}}</code></a></td> 37 <td class="git-repo"><a href="{% url 'layerdetails' lv.pk %}"><code>{{lv.layer.vcs_url}}</code></a>
40 <td class="git-subdir" style="display: table-cell;"><a href="{% url 'layerdetails' lv.pk %}"><code>{{lv.dirpath}}</code></a></td> 38 {% if lv.get_vcs_link_url %}
39 <a target="_blank" href="{{ lv.get_vcs_link_url }}"><i class="icon-share get-info"></i></a>
40 {% endif %}
41 </td>
42 <td class="git-subdir" style="display: table-cell;"><a href="{% url 'layerdetails' lv.pk %}"><code>{{lv.dirpath}}</code></a>
43 {% if lv.get_vcs_link_url %}
44 <a target="_blank" href="{{ lv.get_vcs_link_url_dirpath }}"><i class="icon-share get-info"></i></a>
45 {% endif %}
46 </td>
41 <td class="branch">{% if lv.branch %}{{lv.branch}}{% else %}{{lv.up_branch.name}}{% endif %}</td> 47 <td class="branch">{% if lv.branch %}{{lv.branch}}{% else %}{{lv.up_branch.name}}{% endif %}</td>
42 <td class="dependencies">{% for lvs in lv.dependencies.all %}{{lvs.layer.name}}<br/>{%endfor%}</td> 48 <td class="dependencies">
43 <td class="add-layers"> 49 {% with lvds=lv.dependencies.all%}
44 <button id="remove-layer-{{lv.pk}}" class="btn btn-danger btn-block remove-layer" title="1 layer deleted" style="display:none;"> 50 {% if lvds.count %}
51 <a class="btn"
52 title="<a href='{% url "layerdetails" lv.pk %}'>{{lv.layer.name}}</a> dependencies"
53 data-content="<ul class='unstyled'>
54 {% for i in lvds%}
55 <li><a href='{% url "layerdetails" i.depends_on.pk %}'>{{i.depends_on.layer.name}}</a></li>
56 {% endfor %}
57 </ul>">
58 {{lvds.count}}
59 </a>
60 {% endif %}
61 {% endwith %}
62 </td>
63 <td class="add-del-layers" value="{{lv.pk}}">
64 <button id="layer-del-{{lv.pk}}" class="btn btn-danger btn-block remove-layer" style="display:none;" onclick="layerDel({{lv.pk}}, '{{lv.layer.name}}', '{%url 'layerdetails' lv.pk%}')">
45 <i class="icon-trash"></i> 65 <i class="icon-trash"></i>
46 Delete layer 66 Delete layer
47 </button> 67 </button>
48 <button id="add-layer-{{lv.pk}}" class="btn btn-block add-layer" title="1 layer added"> 68 <button id="layer-add-{{lv.pk}}" class="btn btn-block" style="display:none;" onclick="layerAdd({{lv.pk}}, '{{lv.layer.name}}', '{%url 'layerdetails' lv.pk%}')" >
49 <i class="icon-plus"></i> 69 <i class="icon-plus"></i>
50 Add layer 70 Add layer
51 </button> 71 </button>
@@ -57,113 +77,145 @@
57 <!-- Modals --> 77 <!-- Modals -->
58 78
59 <!-- 'Layer dependencies modal' --> 79 <!-- 'Layer dependencies modal' -->
60 <div id="dependencies-message" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true"> 80 <div id="dependencies_modal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
81 <form id="dependencies_modal_form">
61 <div class="modal-header"> 82 <div class="modal-header">
62 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button> 83 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
63 <h3>meta-acer dependencies</h3> 84 <h3><span class="layer-name"></span> dependencies</h3>
64 </div> 85 </div>
65 <div class="modal-body"> 86 <div class="modal-body">
66 <p><strong>meta-acer</strong> depends on some layers that are not added to your project. Select the ones you want to add:</p> 87 <p><strong class="layer-name"></strong> depends on some layers that are not added to your project. Select the ones you want to add:</p>
67 <ul class="unstyled"> 88 <ul class="unstyled" id="dependencies_list">
68 <li>
69 <label class="checkbox">
70 <input type="checkbox" checked="checked">
71 meta-android
72 </label>
73 </li>
74 <li>
75 <label class="checkbox">
76 <input type="checkbox" checked="checked">
77 meta-oe
78 </label>
79 </li>
80 </ul> 89 </ul>
81 </div> 90 </div>
82 <div class="modal-footer"> 91 <div class="modal-footer">
83 <button id="add-layer-dependencies" type="submit" class="btn btn-primary" data-dismiss="modal" >Add layers</button> 92 <button class="btn btn-primary" type="submit">Add layers</button>
84 <button class="btn" data-dismiss="modal">Cancel</button> 93 <button class="btn" type="reset" data-dismiss="modal">Cancel</button>
85 </div> 94 </div>
95 </form>
86 </div> 96 </div>
87 97
88 <script> 98<script>
89 $(document).ready(function() { 99
90 100function _makeXHREditCall(data, onsuccess, onfail) {
91 //show or hide selected columns on load 101 $.ajax( {
92 $("input:checkbox").each(function(){ 102 type: "POST",
93 var selectedType = $(this).val(); 103 url: "{% url 'xhr_projectedit' project.id %}",
94 if($(this).is(":checked")){ 104 data: data,
95 $("."+selectedType).show(); 105 headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
106 success: function (_data) {
107 if (_data.error != "ok") {
108 alert(_data.error);
109 } else {
110 updateButtons(_data.layers.map(function (e) {return e.id}));
111 if (onsuccess != undefined) onsuccess(_data);
96 } 112 }
97 else{ 113 },
98 $("."+selectedType).hide(); 114 error: function (_data) {
115 alert("Call failed");
116 console.log(_data);
117 }
118 });
119}
120
121
122function layerDel(layerId, layerName, layerURL) {
123 _makeXHREditCall({ 'layerDel': layerId }, function () {
124 show_alert("<strong>1</strong> layer deleted from <a href=\"{% url 'project' project.id%}\">{{project.name}}</a>: <a href=\""+layerURL+"\">" + layerName +"</a>");
125 });
126}
127
128function show_alert(text, cls) {
129 $("#zone1alerts").html("<div class=\"alert alert-info\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\">&times;</button>" + text + "</div>");
130}
131
132function show_dependencies_modal(layerId, layerName, layerURL, dependencies) {
133 // update layer name
134 $('.layer-name').text(layerName);
135 var deplistHtml = "";
136 for (var i = 0; i < dependencies.length; i++) {
137 deplistHtml += "<li><label class=\"checkbox\"><input name=\"dependencies\" value=\""
138 deplistHtml += dependencies[i].id;
139 deplistHtml +="\" type=\"checkbox\" checked=\"checked\"/>";
140 deplistHtml += dependencies[i].name;
141 deplistHtml += "</label></li>";
142 }
143 $('#dependencies_list').html(deplistHtml);
144
145 $("#dependencies_modal_form").submit(function (e) {
146 e.preventDefault();
147 var selected = [layerId];
148 $("input[name='dependencies']:checked").map(function () { selected.push(parseInt($(this).val()))});
149
150 _makeXHREditCall({ 'layerAdd': selected.join(",") }, function () {
151 var layer_link_list = "<a href='"+layerURL+"'>"+layerName+"</a>";
152 for (var i = 0; i < selected.length; i++) {
153 for (var j = 0; j < dependencies.length; i++) {
154 if (dependencies[j].id == selected[i]) {
155 layer_link_list+= ", <a href='"+dependencies[j].layerdetailurl+"'>"+dependencies[j].name+"</a>"
156 break;
157 }
158 }
99 } 159 }
100 });
101 160
102 // enable add layer button 161 $('#dependencies_modal').modal('hide');
103 $('#add-layer-with-deps').removeAttr('disabled'); 162 show_alert("<strong>"+selected.length+"</strong> layers added to <a href=\"{% url 'project' project.id%}\">{{project.name}}</a>:" + layer_link_list);
104 163 });
105 //edit columns functionality (show / hide table columns) 164 });
106 $("input:checkbox").change(); 165 $('#dependencies_modal').modal('show');
107 $("input:checkbox").change(function(){ 166}
108 var selectedType = $(this).val(); 167
109 if($(this).is(":checked")){ 168
110 $("."+selectedType).show(); 169function layerAdd(layerId, layerName, layerURL) {
170 $.ajax({
171 url: '{% url "xhr_datatypeahead" %}',
172 data: {'type': 'layerdeps','value':layerId},
173 success: function(_data) {
174 if (_data.error != "ok") {
175 alert(_data.error);
176 } else {
177 if (_data.list.length > 0) {
178 show_dependencies_modal(layerId, layerName, layerURL, _data.list);
111 } 179 }
112 else{ 180 else {
113 $("."+selectedType).hide(); 181 _makeXHREditCall({ 'layerAdd': layerId }, function () {
182 show_alert("<strong>1</strong> layer added to <a href=\"{% url 'project' project.id%}\">{{project.name}}</a>: <a href=\""+layerURL+"\">" + layerName +"</a>");
183 });
114 } 184 }
115 }); 185 }
116 186 }
117 //turn edit columns dropdown into a multi-select menu 187 })
118 $('.dropdown-menu input, .dropdown-menu label').click(function(e) { 188}
119 e.stopPropagation(); 189
120 }); 190function button_set(id, state) {
121 191 if (state == "add")
122 //show tooltip with applied filter 192 {
123 $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true}); 193 $("#layer-add-" + id).show();
124 194 $("#layer-del-" + id).hide();
125 $('#filtered').click(function() { 195 }
126 $(this).tooltip('hide'); 196 else if (state == "del")
127 }); 197 {
128 198 $("#layer-add-" + id).hide();
129 //show layer added tooltip 199 $("#layer-del-" + id).show();
130 $("#remove-layer, #add-layer, #add-layer-with-deps2").tooltip({ trigger: 'manual' }); 200 }
131 201};
132 // add layer without dependencies 202
133 $("#add-layer").click(function(){ 203function updateButtons(projectLayers) {
134 $('#layer-removed').hide(); 204 var displayedLayers = [];
135 $('#layer-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>1</strong> layer added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>').fadeIn(); 205 $(".add-del-layers").map(function () { displayedLayers.push(parseInt($(this).attr('value')))});
136 $('#add-layer').tooltip('show'); 206 for (var i=0; i < displayedLayers.length; i++) {
137 $("#add-layer").hide(); 207 if (projectLayers.indexOf(displayedLayers[i]) > -1) {
138 $(".add-layers .tooltip").delay(2000).fadeOut(function(){ 208 button_set(displayedLayers[i], "del");
139 $("#remove-layer").delay(300).fadeIn(); 209 }
140 }); 210 else {
141 }); 211 button_set(displayedLayers[i], "add");
142 212 }
143 // add layer with dependencies 213 }
144 $(document).on("click", "#add-layer-dependencies", function() { 214}
145 $('#layer-removed').hide(); 215
146 $('#layer-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>3</strong> layers added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-acer</a> and its dependencies <a href="#">meta-android</a> and <a href="#">meta-oe</a>').delay(400).fadeIn(function(){ 216$(document).ready(function (){
147 $('#add-layer-with-deps').tooltip('show'); 217 updateButtons({{projectlayerset}});
148 $("#add-layer-with-deps, #add-layer-with-deps").hide(); 218});
149 $(".add-layers .tooltip").delay(2000).fadeOut(function(){
150 $("#remove-layer-with-deps").delay(300).fadeIn();
151 });
152 });
153 });
154
155 // delete layer
156 $("#remove-layer").click(function(){
157 $('#layer-added').hide();
158 $('#layer-removed').show();
159 $('#remove-layer').tooltip('show');
160 $("#remove-layer").hide();
161 $(".add-layers .tooltip").delay(2000).fadeOut(function(){
162 $("#add-layer").delay(300).fadeIn();
163 });
164 });
165
166 });
167 219
168</script> 220</script>
169 221