mirror of
git://git.yoctoproject.org/layerindex-web.git
synced 2025-07-19 12:49:01 +02:00

Now that we have different BBClass subtypes, it is handy to have a UI indication of the different types. Add "badges" to display "Global" (for 'classes-global' paths) or "Recipe" (for 'classes-recipe' paths). [YOCTO #15238] Signed-off-by: Tim Orling <tim.orling@konsulko.com>
452 lines
21 KiB
HTML
452 lines
21 KiB
HTML
{% extends "base.html" %}
|
|
{% load i18n %}
|
|
{% load static %}
|
|
|
|
{% comment %}
|
|
|
|
layerindex-web - layer detail page template
|
|
|
|
Copyright (C) 2013 Intel Corporation
|
|
Licensed under the MIT license, see COPYING.MIT for details
|
|
|
|
{% endcomment %}
|
|
|
|
|
|
<!--
|
|
{% autoescape on %}
|
|
{% block title_append %} - {{ layeritem.name }}{% endblock %}
|
|
{% endautoescape %}
|
|
-->
|
|
|
|
{% block content %}
|
|
|
|
{% autoescape on %}
|
|
<ul class="breadcrumb">
|
|
<li><a href="{% url 'layer_list' url_branch %}">{{ layerbranch.branch.name }}</a></li>
|
|
<li class="active">{{ layeritem.name }}</li>
|
|
</ul>
|
|
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="page-header">
|
|
<h1>{{ layeritem.name }}
|
|
{% if layerbranch.yp_compatible_version %}
|
|
<a href="{{layerbranch.yp_compatible_version.link_url}}"><img src="{{layerbranch.yp_compatible_version.image_url}}" alt="{{layerbranch.yp_compatible_version.description}}" class="yp-icon" title="{{layerbranch.yp_compatible_version.description}}"></a>
|
|
{% endif %}
|
|
{% if layeritem.status == "N" %}
|
|
<span class="label label-warning">Unpublished</span>
|
|
{% endif %}
|
|
{% if user.is_authenticated %}
|
|
<span class="pull-right">
|
|
{% if user.is_staff %}
|
|
<a href="{% url 'update_layer' url_branch layeritem.name %}" class="btn btn-info">Update layer</a>
|
|
{% endif %}
|
|
{% if perms.layerindex.publish_layer or useredit %}
|
|
<a href="{% url 'edit_layer' url_branch layeritem.name %}" class="btn btn-default">Edit layer</a>
|
|
{% if layeritem.layernote_set.count == 0 %}
|
|
<a href="{% url 'add_layernote' layeritem.name %}" class="btn btn-default">Add note</a>
|
|
{% endif %}
|
|
{% endif %}
|
|
</span>
|
|
{% endif %}
|
|
</h1>
|
|
</div>
|
|
</div> <!-- end of row -->
|
|
</div> <!-- end of container-fluid -->
|
|
|
|
<div class="container-fluid">
|
|
{% if not layerbranch %}
|
|
<div class="row">
|
|
<div class="alert alert-danger">
|
|
This layer does not exist for branch {{ url_branch }}.
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
<div class="row">
|
|
{% for note in layeritem.layernote_set.all %}
|
|
<div class="alert alert-warning">
|
|
{{ note.text|urlize }}
|
|
{% if perms.layerindex.publish_layer or useredit %}
|
|
<br><br>
|
|
<p>
|
|
<a href="{% url 'edit_layernote' layeritem.name note.pk %}" class="btn btn-default">Edit note</a>
|
|
<a href="{% url 'delete_layernote' layeritem.name note.pk %}" class="btn btn-default">Delete note</a>
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
{% endfor %}
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="description col-md-7">
|
|
<p style="white-space: pre-wrap">{{ layeritem.description }}</p>
|
|
<p>
|
|
{% if layeritem.usage_url %}
|
|
<span class="label label-info">
|
|
<a href="{{ layerbranch.get_usage_url }}">Setup information</a>
|
|
</span>
|
|
{% endif %}
|
|
{% if layeritem.mailing_list_url %}
|
|
<span class="label label-info">
|
|
<a href="{{ layeritem.mailing_list_url }}">Mailing list</a>
|
|
</span>
|
|
{% endif %}
|
|
</p>
|
|
|
|
<h3>Git repository</h3>
|
|
|
|
<p><span data-toggle="tooltip" title="Select URL"><i class="glyphicon glyphicon-circle-arrow-right selectallicon" for="vcs_url" id="vcs_url_select" aria-hidden="true"></i></span><span id="vcs_url" class="copyable">{{ layeritem.vcs_url }}</span>
|
|
{% if layeritem.vcs_web_url %}
|
|
<span class="label label-info">
|
|
<a href="{{ layeritem.vcs_web_url }}">web repo</a>
|
|
</span>
|
|
{% endif %}
|
|
</p>
|
|
|
|
{% if layerbranch.actual_branch %}
|
|
<p>
|
|
<span class="muted">(actual branch {{ layerbranch.actual_branch }})</span>
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if layerbranch.vcs_subdir %}
|
|
<h4>Subdirectory</h4>
|
|
<p><span data-toggle="tooltip" title="Select subdirectory"><i class="glyphicon glyphicon-circle-arrow-right selectallicon" for="vcs_subdir" id="vcs_subdir_select" aria-hidden="true"></i></span><span id="vcs_subdir" class="copyable">{{ layerbranch.vcs_subdir }}</span>
|
|
{% if layerbranch.tree_url %}
|
|
<span class="label label-info">
|
|
<a href="{{ layerbranch.tree_url }}">web subdirectory</a>
|
|
</span>
|
|
{% endif %}
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if layerbranch.vcs_last_commit %}
|
|
<p>
|
|
<span class="text-muted"><small>Last commit: {{ layerbranch.vcs_last_commit|timesince }} ago ({{ layerbranch.get_checkout_branch }} branch)</small></span>
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if layerbranch.active_maintainers.count > 0 %}
|
|
<h3>{% if layerbranch.active_maintainers|length == 1 %}Maintainer{% else %}Maintainers{% endif %}</h3>
|
|
|
|
<ul>
|
|
{% for maintainer in layerbranch.active_maintainers %}
|
|
<li>
|
|
{{ maintainer.name }}
|
|
{% if maintainer.responsibility %}
|
|
<span>({{ maintainer.responsibility }})</span>
|
|
{% endif %}
|
|
|
|
<span class="label label-info">
|
|
<a href="mailto:{{ maintainer.email }}">email</a>
|
|
</span>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% endif %}
|
|
|
|
{% if rrs_maintplans %}
|
|
<h3>{{ rrs_maintplans|pluralize:"Maintenance Plan,Maintenance Plans" }}</h3>
|
|
<ul>
|
|
{% for maintplan in rrs_maintplans %}
|
|
<li>
|
|
<a href="{% url 'rrs_maintplan' maintplan.name %}">{{ maintplan.name }}</a>
|
|
</li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% endif %}
|
|
|
|
</div> <!-- end of col-md-7 -->
|
|
|
|
<div class="col-md-4 pull-right description">
|
|
{% if layerbranch.dependencies_set.count > 0 %}
|
|
<div class="well dependency-well">
|
|
{% if layerbranch.get_required.count > 0 %}
|
|
<h3>Dependencies </h3>
|
|
<p>The {{ layeritem.name }} layer depends upon:</p>
|
|
<ul>
|
|
{% for dep in layerbranch.get_required %}
|
|
<li><a href="{% url 'layer_item' url_branch dep.dependency.name %}">{{ dep.dependency.name }}</a></li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% endif %} <!-- end of layerbranch.get_required.count -->
|
|
{% if layerbranch.get_recommends.count > 0 %}
|
|
<h3>Recommends </h3>
|
|
<p>The {{ layeritem.name }} layer recommends:</p>
|
|
<ul>
|
|
{% for rec in layerbranch.get_recommends %}
|
|
<li><a href="{% url 'layer_item' url_branch rec.dependency.name %}">{{ rec.dependency.name }}</a></li>
|
|
{% endfor %}
|
|
</ul>
|
|
{% endif %} <!-- end of layerbranch.get_recommends.count -->
|
|
</div> <!-- end of well -->
|
|
{% endif %} <!-- end of layerbranch.dependencies_set.count -->
|
|
</div> <!-- end of col-md-4 -->
|
|
</div> <!-- end of row -->
|
|
</div> <!-- end of container-fluid -->
|
|
|
|
{% if not layerbranch.vcs_last_commit %}
|
|
<div class="alert alert-info">
|
|
<b>Note:</b> The content of this layer on branch {{ url_branch }} has not yet been indexed. Indexing should take place within a few hours.
|
|
</div>
|
|
{% endif %}
|
|
|
|
<ul class="nav nav-tabs" id="layertabbar">
|
|
{% if layerbranch.recipe_set.count > 0 %}
|
|
<li><a href="#recipes" data-toggle="tab">Recipes</a></li>
|
|
{% endif %}
|
|
{% if machines.count > 0 %}
|
|
<li><a href="#machines" data-toggle="tab">Machines</a></li>
|
|
{% endif %}
|
|
{% if appends.count > 0 %}
|
|
<li><a href="#appends" data-toggle="tab">Appends</a></li>
|
|
{% endif %}
|
|
{% if classes.count > 0 %}
|
|
<li><a href="#classes" data-toggle="tab">Classes</a></li>
|
|
{% endif %}
|
|
{% if distros.count > 0 %}
|
|
<li><a href="#distros" data-toggle="tab">Distros</a></li>
|
|
{% endif %}
|
|
{% if updates.count > 0 %}
|
|
<li><a href="#updates" data-toggle="tab">Updates</a></li>
|
|
{% endif %}
|
|
</ul>
|
|
|
|
<div class="tab-content">
|
|
{% if layerbranch.recipe_set.count > 0 %}
|
|
<div class="tab-pane" id="recipes">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand">{{ layeritem.name }} recipes <span class="text-muted">({{ layerbranch.sorted_recipes.count }})</span></a>
|
|
</div>
|
|
|
|
<div class="navbar-right">
|
|
<a href="{% url 'layer_export_recipes_csv' layerbranch.branch.name layerbranch.layer.name %}" class="btn btn-default navbar-btn"><i class="glyphicon glyphicon-file" aria-hidden="true"></i> Export CSV</a>
|
|
|
|
<form action="" class="navbar-form pull-right" id="filter-form">
|
|
<div class="form-group has-feedback has-clear">
|
|
<input type="text" placeholder="Search recipes" class="form-control" id="recipesearchtext">
|
|
<a class="glyphicon glyphicon-remove-sign form-control-feedback form-control-clear" id="recipesearchclear" style="pointer-events: auto; text-decoration: none;cursor: pointer;"></a>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<table class="table table-bordered recipestable">
|
|
<thead>
|
|
<tr>
|
|
<th>Recipe name</th>
|
|
<th>Version</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for recipe in layerbranch.sorted_recipes %}
|
|
<tr>
|
|
<td><a href="{% url 'recipe' recipe.id %}">{{ recipe.name }}</a>{% if 'image' in recipe.inherits.split %} <i class="glyphicon glyphicon-hdd"></i>{% endif %}{% if recipe.blacklisted %}<span class="label label-inverse" title="{{ recipe.blacklisted }}">blacklisted</span>{% endif %}</td>
|
|
<td>{{ recipe.pv }}</td>
|
|
<td class="col-md-8">{{ recipe.short_desc }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
{% if machines.count > 0 %}
|
|
<div class="tab-pane" id="machines">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand">{{ layeritem.name }} machines <span class="text-muted">({{ machines.count }})</span></a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<table class="table table-bordered">
|
|
<tbody>
|
|
{% for machine in machines %}
|
|
<tr>
|
|
<td><a href="{{ machine.vcs_web_url }}">{{ machine.name }}</a></td>
|
|
<td>{{ machine.description }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
{% if appends.count > 0 %}
|
|
<div class="tab-pane" id="appends">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand">{{ layeritem.name }} bbappends <span class="text-muted">({{ appends.count }})</span></a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<table class="table table-bordered">
|
|
<tbody>
|
|
{% for append in appends %}
|
|
<tr>
|
|
<td><a href="{{ append.vcs_web_url }}">{{ append.filename }}</a></td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
{% if classes.count > 0 %}
|
|
<div class="tab-pane" id="classes">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand">{{ layeritem.name }} classes <span class="text-muted">({{ classes.count }})</span></a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<table class="table table-bordered">
|
|
<tbody>
|
|
{% for class in classes %}
|
|
<tr>
|
|
<td>
|
|
<a href="{{ class.vcs_web_url }}">{{ class.name }}</a>
|
|
<span class="badge badge-info" id="id_bbclass_typ">{{ class.bbclass_type }}</span>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
{% if distros.count > 0 %}
|
|
<div class="tab-pane" id="distros">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand">{{ layeritem.name }} distros <span class="text-muted">({{ distros.count }})</span></a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<table class="table table-bordered">
|
|
<tbody>
|
|
{% for distro in distros %}
|
|
<tr>
|
|
<td><a href="{{ distro.vcs_web_url }}">{{ distro.name }}</a></td>
|
|
<td>{{ distro.description }}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
{% if updates.count > 0 %}
|
|
<div class="tab-pane" id="updates">
|
|
<nav class="navbar navbar-default">
|
|
<div class="container-fluid">
|
|
<div class="navbar-header">
|
|
<a class="navbar-brand">{{ layeritem.name }} updates</a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<table class="table table-bordered">
|
|
<thead>
|
|
<tr>
|
|
<th>Date/time</th>
|
|
<th>Errors</th>
|
|
<th>Warnings</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for update in updates %}
|
|
<tr>
|
|
<td>
|
|
{% if update.log %}
|
|
<a href="{% url 'layerupdate' update.id %}">{{ update.started }}{% if update.update.reload %} (reload){% endif%}</a>
|
|
{% else %}
|
|
<span class="text-muted">{{ update.started }}{% if update.update.reload %} (reload){% endif%}</span>
|
|
{% endif %}
|
|
</td>
|
|
<td>{% if update.errors %}<span class="badge badge-important">{{ update.errors }}</span>{% endif %}</td>
|
|
<td>{% if update.warnings %}<span class="badge badge-warning">{{ update.warnings }}</span>{% endif %}</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
|
|
{% endautoescape %}
|
|
|
|
{% endblock %}
|
|
|
|
|
|
|
|
|
|
{% block scripts %}
|
|
<script>
|
|
// selectText plugin Borrowed from http://jsfiddle.net/edelman/KcX6A/1506/
|
|
jQuery.fn.selectText = function() {
|
|
var doc = document
|
|
, element = this[0]
|
|
, range, selection
|
|
;
|
|
if (doc.body.createTextRange) {
|
|
range = document.body.createTextRange();
|
|
range.moveToElementText(element);
|
|
range.select();
|
|
} else if (window.getSelection) {
|
|
selection = window.getSelection();
|
|
range = document.createRange();
|
|
range.selectNodeContents(element);
|
|
selection.removeAllRanges();
|
|
selection.addRange(range);
|
|
}
|
|
};
|
|
|
|
function clearRecipeSearch() {
|
|
$("#recipesearchtext").val('');
|
|
$(".recipestable > tbody > tr").show();
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
|
|
$(function() {
|
|
$("#recipesearchtext").on("input", function() {
|
|
var value = $(this).val().toLowerCase();
|
|
$(".recipestable > tbody > tr").filter(function() {
|
|
$(this).toggle($(this).text().toLowerCase().indexOf(value) > -1)
|
|
});
|
|
});
|
|
|
|
$("#recipesearchclear").click(function(){
|
|
clearRecipeSearch();
|
|
$("#recipesearchtext").focus();
|
|
});
|
|
|
|
$('.selectallicon').mouseup(function() {
|
|
$('#' + $(this).attr('for')).selectText();
|
|
});
|
|
|
|
$('#layertabbar a:first').tab('show');
|
|
$('#layertabbar a').click(function (e) {
|
|
e.preventDefault();
|
|
$(this).tab('show');
|
|
})
|
|
|
|
$('.glyphicon-hdd').tooltip({title:"Inherits image"});
|
|
$('.label-inverse').tooltip();
|
|
});
|
|
|
|
clearRecipeSearch();
|
|
});
|
|
</script>
|
|
{% endblock %}
|
|
|