summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/toaster/toastergui/templates/targets.html
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/toaster/toastergui/templates/targets.html')
-rw-r--r--bitbake/lib/toaster/toastergui/templates/targets.html362
1 files changed, 228 insertions, 134 deletions
diff --git a/bitbake/lib/toaster/toastergui/templates/targets.html b/bitbake/lib/toaster/toastergui/templates/targets.html
index 3afdf0a5e9..c27292095d 100644
--- a/bitbake/lib/toaster/toastergui/templates/targets.html
+++ b/bitbake/lib/toaster/toastergui/templates/targets.html
@@ -3,61 +3,89 @@
{% load humanize %}
{% block localbreadcrumb %}
-<li>Targets</li>
+<li>All compatible recipes</li>
{% endblock %}
{% block projectinfomain %}
<div class="page-header">
<h1>
- All targets
- <i class="icon-question-sign get-help heading-help" title="This page lists all the targets compatible with Yocto Project 1.7 'Dxxxx' that Toaster knows about. They include community-created targets suitable for use on top of OpenEmbedded Core and any targets you have imported"></i>
+ {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
+ {{objects.paginator.count}} recipe{{objects.paginator.count|pluralize}} found
+ {% elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
+ No recipes found
+ {%else%}
+ All compatible recipes
+ {%endif%}
+ <i class="icon-question-sign get-help heading-help" title="This page lists all the recipes compatible with the release selected for this project, which is {{project.release.description}}"></i>
</h1>
</div>
- <!--div class="alert">
- <div class="input-append" style="margin-bottom:0px;">
- <input class="input-xxlarge" type="text" placeholder="Search targets" value="browser" />
- <a class="add-on btn">
- <i class="icon-remove"></i>
- </a>
- <button class="btn" type="button">Search</button>
- <a class="btn btn-link" href="#">Show all targets</a>
- </div>
- </div-->
- <div id="target-added" class="alert alert-info lead" style="display:none;"></div>
- <div id="target-removed" class="alert alert-info lead" style="display:none;">
- <button type="button" class="close" data-dismiss="alert">&times;</button>
- <strong>1</strong> target deleted from <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>
- </div>
+ <div id="zone1alerts">
+
+ </div>
+
+{% if objects.paginator.count == 0 %}
+ {% if request.GET.filter or request.GET.search %}
+ <div class="row-fluid">
+ <div class="alert">
+ <form class="no-results input-append" id="searchform">
+ <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 %}
+ <button class="btn" type="submit" value="Search">Search</button>
+ <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
+ </form>
+ </div>
+ </div>
+ {% else %}
+ <div class="alert alert-info lead">
+ <p>Toaster has no recipe information. To generate recipe information you can:</p>
+ <ul>
+ <li><a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html#layer-source">Configure a layer source</a></li>
+ <li><a href="{% url 'importlayer' %}">Import a layer</a>, then run a build</li>
+ </ul>
+ </div>
+ {% endif %}
+
+{% else %}
{% include "basetable_top.html" %}
{% for o in objects %}
<tr class="data">
- <td class="target">
- {{o.name}} ({{o.id}}, {{o.up_id}})
- <a target="_blank" href="{{o.get_layersource_view_url}}"><i class="icon-share get-info"></i></a>
- </td>
- <td class="version">{{o.version}}</td>
- <td class="description">{{o.description}}</td>
- <td class="recipe-file">
- <code>{{o.file_path}}</code>
- <a href="{{o.get_vcs_link_url}}" target="_blank"><i class="icon-share get-info"></i></a>
- </td>
- <td class="target-section">{{o.section}}</td>
- <td class="license">{{o.license}}</td>
- <td class="layer"><a href="#">{{o.layer_version.layer.name}}</a></td>
- <td class="source">{{o.layer_source.name}}</td>
- <td class="branch">{{o.layer_version.commit}}</td>
- <td class="build">
- <a id="build-target" href="project-with-targets.html?target=3g-router-image" class="btn btn-block" style="display:none;">
- Build target
- </a>
- <a id="add-layer" href="#" class="btn btn-block nopop" title="1 layer added">
- <i class="icon-plus"></i>
- Add layer
- <i class="icon-question-sign get-help" title="To build this target, you must first add the meta-embeddedgeeks layer to your project"></i>
- </a>
- </td>
+ <td class="target">
+ {{o.name}}
+ <a target="_blank" href="{{o.get_layersource_view_url}}"><i class="icon-share get-info"></i></a>
+ </td>
+ <td class="version">{{o.version}}</td>
+ <td class="description">{% if o.description %}{{o.description}}{% else %}{{o.summary}}{%endif%}</td>
+ <td class="recipe-file">
+ <code>{{o.file_path}}</code>
+ <a href="{{o.vcs_link_url}}" target="_blank"><i class="icon-share get-info"></i></a>
+ </td>
+ <td class="target-section">{{o.section}}</td>
+ <td class="license">{{o.license}}</td>
+ <td class="layer"><a href="{% url 'layerdetails' o.preffered_layerversion.id%}">{{o.preffered_layerversion.layer.name}}</a></td>
+ <td class="branch">
+ {% if o.preffered_layerversion.up_branch %}
+ {{o.preffered_layerversion.up_branch.name}}
+ {% else %}
+ <a class="btn"
+ data-content="<ul class='unstyled'>
+ <li>{{o.layer_version.commit}}</li>
+ </ul>">
+ {{o.layer_version.commit|truncatechars:13}}
+ </a>
+ {% endif %}
+ </td>
+ <td class="add-layer" value="{{o.pk}}" layerversion_id="{{o.preffered_layerversion.pk}}">
+ <div id="layer-tooltip-{{o.pk}}" style="display: none; font-size: 11px; line-height: 1.3;" class="tooltip-inner">layer was modified</div>
+ <a href="{% url 'project' project.id %}#/targetbuild={{o.name}}" id="target-build-{{o.pk}}" class="btn btn-block remove-layer" style="display:none;" >
+ Build recipe
+ </a>
+ <a id="layer-add-{{o.pk}}" class="btn btn-block" style="display:none;" href="javascript:layerAdd({{o.preffered_layerversion.pk}}, '{{o.preffered_layerversion.layer.name}}', '{%url 'layerdetails' o.preffered_layerversion.pk%}', {{o.pk}})" >
+ <i class="icon-plus"></i>
+ Add layer
+ <i title="" class="icon-question-sign get-help" data-original-title="To build this target, you must first add the {{o.preffered_layerversion.layer.name}} layer to your project"></i>
+ </a>
+ </td>
</tr>
{% endfor %}
{% include "basetable_bottom.html" %}
@@ -65,122 +93,188 @@
<!-- Modals -->
<!-- 'Layer dependencies modal' -->
- <div id="dependencies-message" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
+ <div id="dependencies_modal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
+ <form id="dependencies_modal_form">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
- <h3>meta-acer dependencies</h3>
+ <h3><span class="layer-name"></span> dependencies</h3>
</div>
<div class="modal-body">
- <p><strong>meta-acer</strong> depends on some targets that are not added to your project. Select the ones you want to add:</p>
- <ul class="unstyled">
- <li>
- <label class="checkbox">
- <input type="checkbox" checked="checked">
- meta-android
- </label>
- </li>
- <li>
- <label class="checkbox">
- <input type="checkbox" checked="checked">
- meta-oe
- </label>
- </li>
+ <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>
+ <ul class="unstyled" id="dependencies_list">
</ul>
</div>
<div class="modal-footer">
- <button id="add-target-dependencies" type="submit" class="btn btn-primary" data-dismiss="modal" >Add targets</button>
- <button class="btn" data-dismiss="modal">Cancel</button>
+ <button class="btn btn-primary" type="submit">Add layers</button>
+ <button class="btn" type="reset" data-dismiss="modal">Cancel</button>
</div>
+ </form>
</div>
- <script src="assets/js/jquery-1.9.1.min.js" type='text/javascript'></script>
- <script src="assets/js/jquery.tablesorter.min.js" type='text/javascript'></script>
- <script src="assets/js/jquery-ui-1.10.3.custom.min.js"></script>
- <script src="assets/js/bootstrap.min.js" type='text/javascript'></script>
- <script src="assets/js/prettify.js" type='text/javascript'></script>
- <script src="assets/js/jit.js" type='text/javascript'></script>
- <script src="assets/js/main.js" type='text/javascript'></script>
-
- <script>
- $(document).ready(function() {
-
- //show or hide selected columns on load
- $("input:checkbox").each(function(){
- var selectedType = $(this).val();
- if($(this).is(":checked")){
- $("."+selectedType).show();
+{% endif %}
+
+{% if project %}
+<script>
+
+var tooltipUpdateText;
+
+/* ensure csrf cookie exists {% csrf_token %} */
+function _makeXHREditCall(data, onsuccess, onfail) {
+ $.ajax( {
+ type: "POST",
+ url: "{% url 'xhr_projectedit' project.id %}",
+ data: data,
+ headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
+ success: function (_data) {
+ if (_data.error != "ok") {
+ console.warn(_data.error);
+ } else {
+ updateButtons(_data.layers.map(function (e) {return e.id}));
+ if (onsuccess != undefined) onsuccess(_data);
}
- else{
- $("."+selectedType).hide();
+ },
+ error: function (_data) {
+ console.warn("Call failed");
+ console.warn(_data);
+ }
+ });
+}
+
+function show_alert(text, cls) {
+ $("#zone1alerts").html("<div class=\"alert alert-info lead\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\">&times;</button>" + text + "</div>");
+}
+
+
+function show_dependencies_modal(layerId, layerName, layerURL, dependencies) {
+ // update layer name
+ $('.layer-name').text(layerName);
+ var deplistHtml = "";
+ for (var i = 0; i < dependencies.length; i++) {
+ deplistHtml += "<li><label class=\"checkbox\"><input name=\"dependencies\" value=\""
+ deplistHtml += dependencies[i].id;
+ deplistHtml +="\" type=\"checkbox\" checked=\"checked\"/>";
+ deplistHtml += dependencies[i].name;
+ deplistHtml += "</label></li>";
+ }
+ $('#dependencies_list').html(deplistHtml);
+
+ var selected = [layerId];
+ var layer_link_list = undefined;
+
+ $("#dependencies_modal_form").submit(function (e) {
+ e.preventDefault();
+ $("input[name='dependencies']:checked").map(function () { selected.push(parseInt($(this).val()))});
+ layer_link_list = "<a href='"+layerURL+"'>"+layerName+"</a>";
+ if (selected.length > 1) {
+ tooltipUpdateText = "" + selected.length + " layers added";
+ } else {
+ tooltipUpdateText = "1 layer added";
+ }
+
+ for (var i = 0; i < selected.length; i++) {
+ for (var j = 0; j < dependencies.length; j++) {
+ if (dependencies[j].id == selected[i]) {
+ layer_link_list+= ", <a href='"+dependencies[j].layerdetailurl+"'>"+dependencies[j].name+"</a>"
+ break;
+ }
}
+ }
+
+ $('#dependencies_modal').modal('hide');
+
+ {% if project %}
+ _makeXHREditCall({ 'layerAdd': selected.join(",") }, function onXHRSuccess() {
+ show_alert("You have added <strong>"+selected.length+"</strong> layer(s) to <a href=\"{% url 'project' project.id%}\">{{project.name}}</a>: " + layer_link_list);
});
+ {% endif %}
- // enable add target button
- $('#add-target-with-deps').removeAttr('disabled');
+ });
+ $('#dependencies_modal').modal('show');
+}
- //edit columns functionality (show / hide table columns)
- $("input:checkbox").change();
- $("input:checkbox").change(function(){
- var selectedType = $(this).val();
- if($(this).is(":checked")){
- $("."+selectedType).show();
- }
- else{
- $("."+selectedType).hide();
- }
- });
+function updateLayerCountLabels (amount) {
+ /* Update the filter labels */
+ var countLabel = $("#layer_version__projectlayer__project\\:{{project.id}}_count");
+ countLabel.text(Number(countLabel.text())+amount);
- //turn edit columns dropdown into a multi-select menu
- $('.dropdown-menu input, .dropdown-menu label').click(function(e) {
- e.stopPropagation();
- });
+ var countLabelRemaining = $("#layer_version__projectlayer__project\\:NOT{{project.id}}_count");
+ countLabelRemaining.text(Number(countLabelRemaining.text())-amount);
+}
- //show tooltip with applied filter
- $('#filtered').tooltip({container:'table', placement:'bottom', delay:{hide:1500}, html:true});
+var pressedButton = undefined;
- $('#filtered').click(function() {
- $(this).tooltip('hide');
- });
+function layerAdd(layerId, layerName, layerURL, pressedButtonId) {
+ pressedButton = pressedButtonId;
+ $.ajax({
+ url: '{% url "xhr_datatypeahead" %}',
+ data: {'type': 'layerdeps','value':layerId},
+ success: function(_data) {
+ if (_data.error != "ok") {
+ console.warn(_data.error);
+ } else {
+ updateLayerCountLabels(_data.list.length+1);
- //show target added tooltip
- $("#remove-target, #add-target, #add-target-with-deps2").tooltip({ trigger: 'manual' });
-
- // add target without dependencies
- $("#add-target").click(function(){
- $('#target-removed').hide();
- $('#target-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>1</strong> target added to <a href="project-with-targets.html">your project</a>: <a href="#">meta-aarch64</a>').fadeIn();
- $('#add-target').tooltip('show');
- $("#add-target").hide();
- $(".add-targets .tooltip").delay(2000).fadeOut(function(){
- $("#remove-target").delay(300).fadeIn();
- });
- });
+ if (_data.list.length > 0) {
+ show_dependencies_modal(layerId, layerName, layerURL, _data.list);
+ }
+ else {
+ tooltipUpdateText = "1 layer added";
+ _makeXHREditCall({ 'layerAdd': layerId }, function () {
+ show_alert("You have added <strong>1</strong> layer to <a href=\"{% url 'project' project.id%}\">{{project.name}}</a>: <a href=\""+layerURL+"\">" + layerName +"</a>");
+ });
+ }
+ }
+ }
+ })
+}
- // add target with dependencies
- $(document).on("click", "#add-target-dependencies", function() {
- $('#target-removed').hide();
- $('#target-added').html('<button type="button" class="close" data-dismiss="alert">&times;</button><strong>3</strong> targets 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(){
- $('#add-target-with-deps').tooltip('show');
- $("#add-target-with-deps, #add-target-with-deps").hide();
- $(".add-targets .tooltip").delay(2000).fadeOut(function(){
- $("#remove-target-with-deps").delay(300).fadeIn();
- });
- });
- });
+function buttonSet(id, state) {
+ var tohide, toshow;
+ if (state == "add")
+ {
+ toshow = "#layer-add-";
+ tohide = "#target-build-";
+ }
+ else if (state == "build")
+ {
+ tohide = "#layer-add-";
+ toshow = "#target-build-";
+ }
- // delete target
- $("#remove-target").click(function(){
- $('#target-added').hide();
- $('#target-removed').show();
- $('#remove-target').tooltip('show');
- $("#remove-target").hide();
- $(".add-targets .tooltip").delay(2000).fadeOut(function(){
- $("#add-target").delay(300).fadeIn();
+ var previouslyvisible = $(tohide + id).is(":visible");
+ if (previouslyvisible && id == pressedButton) {
+ $(tohide + id).fadeOut( function() {
+ $("#layer-tooltip-" + id).text(tooltipUpdateText);
+ $("#layer-tooltip-" + id).fadeIn().delay(2000).fadeOut(function(){
+ $(toshow + id).delay(300).fadeIn();
});
});
+ } else {
+ $(tohide + id).hide();
+ $("#layer-tooltip-" + id).hide();
+ $(toshow + id).show();
+ }
+};
+
+
+function updateButtons(projectLayers) {
+ var displayedLayers = [];
+ $(".add-layer").map(function () { displayedLayers.push( { "l": parseInt($(this).attr('layerversion_id')), "i": parseInt($(this).attr('value'))})});
+ for (var i=0; i < displayedLayers.length; i++) {
+ if (projectLayers.indexOf(displayedLayers[i].l) > -1) {
+ buttonSet(displayedLayers[i].i, "build");
+ }
+ else {
+ buttonSet(displayedLayers[i].i, "add");
+ }
+ }
+}
- });
+$(document).ready(function (){
+ updateButtons({{projectlayerset}});
+});
</script>
+{%endif%}
{% endblock %}