layerindex-web/templates/layerindex/editlayer.html
Paul Eggleton f259f0c36f Limit selection of "Base" layer type
If a user doesn't have publish rights and the type of the layer isn't
already "Base" then disallow selecting the Base layer type. Some
submitters are selecting this type for their own layers, but it's pretty
much reserved for openembedded-core and meta-oe (so that they appear at
the top of the layer list).

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
2018-09-06 11:08:43 +12:00

404 lines
17 KiB
HTML

{% extends "base.html" %}
{% load i18n %}
{% comment %}
layerindex-web - layer editing form page template
Copyright (C) 2013 Intel Corporation
Licensed under the MIT license, see COPYING.MIT for details
{% endcomment %}
<!--
{% block title_append %} - edit layer{% endblock %}
-->
{% block topfunctions %}
<!-- Remove submit link/tools drop-down added by base.html, otherwise clicking it may lose changes -->
{% endblock %}
{% block content %}
{% autoescape on %}
<div class="container-fluid">
<div class="row-fluid">
{% block heading %}
<div class="page-header">
<h1>Edit layer</h1>
</div>
{% endblock %}
{% block formtop %}
{% endblock %}
<form id="edit_layer_form" method="post">
{% csrf_token %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
<div class="formfields">
{% for field in form.visible_fields %}
{% if field.name != 'captcha' %}
{% if field.errors %}
<div class="control-group alert alert-error">
{{ field.errors }}
{% else %}
<div class="control-group">
{% endif %}
<div class="control-label">
{{ field.label_tag }}
</div>
<div class="controls">
{% if field.name == 'deps' %}
<div class="scrolling">
<table><tbody>
{% for deplayer in deplistlayers %}
{% if deplayer.id in form.checked_deps %}
<tr>
<td class="checkboxtd"><input type="checkbox" name="deps" value="{{ deplayer.id }}" id="id_deps_{{forloop.counter}}" checked="checked" /></td>
{% if deplayer.status == 'N' %}
<td><label class="muted" for="id_deps_{{forloop.counter}}">{{ deplayer.name }} (unpublished)</label></td>
{% else %}
<td><label for="id_deps_{{forloop.counter}}">{{ deplayer.name }}</label></td>
{% endif %}
</tr>
{% endif %}
{% endfor %}
{% for deplayer in deplistlayers %}
{% if not deplayer.id in form.checked_deps %}
<tr>
<td class="checkboxtd"><input type="checkbox" name="deps" value="{{ deplayer.id }}" id="id_deps_{{forloop.counter}}" /></td>
{% if deplayer.status == 'N' %}
<td><label class="muted" for="id_deps_{{forloop.counter}}">{{ deplayer.name }} (unpublished)</label></td>
{% else %}
<td><label for="id_deps_{{forloop.counter}}">{{ deplayer.name }}</label></td>
{% endif %}
</tr>
{% endif %}
{% endfor %}
</tbody></table>
</div>
{% else %}
{{ field }}
{% endif %}
<span class="help-inline custom-help">
{{ field.help_text }}
</span>
</div>
</div>
{% endif %}
{% if field.name == 'vcs_web_url' %}
<div class="control-label">
Web interface type
</div>
<div class="controls">
<div class="formfield-div">
<select id="idx_vcs_web_type">
<option>(custom)</option>
<option>cgit</option>
<option>gitweb</option>
<option>gitlab</option>
</select>
</div>
<span class="help-inline custom-help">
Type of web interface (helps to auto-determine other URL fields)
</span>
</div>
{% endif %}
{% endfor %}
</div>
<h3 id="maintainers">Maintainers</h3>
{{ maintainerformset.non_form_errors }}
{{ maintainerformset.management_form }}
{% for maintainerform in maintainerformset %}
<div class="maintainerform" id="maintainerform-{{forloop.counter0}}">
<h4>Maintainer {{forloop.counter}}</h4>
<div class="maintainerformfields">
{% for hidden in maintainerform.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in maintainerform.visible_fields %}
{% if field.errors %}
<div class="control-group alert alert-error">
{{ field.errors }}
{% else %}
<div class="control-group">
{% endif %}
<div class="control-label">
{{ field.label_tag }}
</div>
<div class="controls">
{{ field }}
<span class="help-inline custom-help">
{{ field.help_text }}
</span>
</div>
</div>
{% endfor %}
</div>
</div>
{% endfor %}
<p><a href="#" class="btn btn-small" id="addanothermaintainer"><i class="icon-plus"></i>Add maintainer</a><p>
{% if form.captcha %}
<div class="captchafield">
<h3>Verification</h3>
{% if form.captcha.errors %}
<div class="control-group alert alert-error">
{{ form.captcha.errors }}
{% else %}
<div class="control-group">
{% endif %}
<div class="controls">
{{ form.captcha }}
<span class="help-inline custom-help">
{{ form.captcha.help_text }}
</span>
</div>
</div>
</div>
{% endif %}
<div class="submitbuttons">
{% block submitbuttons %}
<input type="submit" value="Save layer" class="btn btn-primary btn-large submitbutton" />
<a href="{{ return_url }}" class="btn btn-large">Cancel</a>
{% endblock %}
</div>
</form>
</div>
</div>
{% endautoescape %}
{% endblock %}
{% block scripts %}
<script>
if (typeof String.prototype.startsWith != 'function') {
String.prototype.startsWith = function (str){
return this.slice(0, str.length) == str;
};
}
function AutoWebFields(repoval) {
// Auto-determine web interface URLs from repo URL
if( repoval[repoval.length-1] == '/' )
repoval = repoval.slice(0, repoval.length-1)
if( repoval.startsWith('git://git.openembedded.org/') ) {
reponame = repoval.replace(/^.*\//, '')
this.vcs_web_url = 'http://cgit.openembedded.org/' + reponame
this.vcs_web_tree_base_url = 'http://cgit.openembedded.org/' + reponame + '/tree/%path%?h=%branch%'
this.vcs_web_file_base_url = 'http://cgit.openembedded.org/' + reponame + '/tree/%path%?h=%branch%'
this.vcs_web_commit_url = 'http://cgit.openembedded.org/' + reponame + '/commit/?id=%hash%'
this.vcs_web_type = 'cgit'
}
else if( repoval.indexOf('git.yoctoproject.org/') > -1 ) {
reponame = repoval.replace(/^.*\//, '')
this.vcs_web_url = 'http://git.yoctoproject.org/cgit/cgit.cgi/' + reponame
this.vcs_web_tree_base_url = 'http://git.yoctoproject.org/cgit/cgit.cgi/' + reponame + '/tree/%path%?h=%branch%'
this.vcs_web_file_base_url = 'http://git.yoctoproject.org/cgit/cgit.cgi/' + reponame + '/tree/%path%?h=%branch%'
this.vcs_web_commit_url = 'http://git.yoctoproject.org/cgit/cgit.cgi/' + reponame + '/commit/?id=%hash%'
this.vcs_web_type = 'cgit'
}
else if( repoval.indexOf('github.com/') > -1 ) {
reponame = repoval.replace(/^.*github.com\//, '')
reponame = reponame.replace(/.git$/, '')
this.vcs_web_url = 'http://github.com/' + reponame
this.vcs_web_tree_base_url = 'http://github.com/' + reponame + '/tree/%branch%/'
this.vcs_web_file_base_url = 'http://github.com/' + reponame + '/blob/%branch%/'
this.vcs_web_commit_url = 'http://github.com/' + reponame + '/commit/%hash%/'
this.vcs_web_type = '(custom)'
}
else if( repoval.indexOf('bitbucket.org/') > -1 ) {
reponame = repoval.replace(/^.*bitbucket.org\//, '')
reponame = reponame.replace(/.git$/, '')
this.vcs_web_url = 'http://bitbucket.org/' + reponame
this.vcs_web_tree_base_url = 'http://bitbucket.org/' + reponame + '/src/%branch%/%path%?at=%branch%'
this.vcs_web_file_base_url = 'http://bitbucket.org/' + reponame + '/src/%branch%/%path%?at=%branch%'
this.vcs_web_commit_url = 'http://bitbucket.org/' + reponame + '/commits/%hash%'
this.vcs_web_type = '(custom)'
}
else {
this.vcs_web_url = ''
this.vcs_web_tree_base_url = ''
this.vcs_web_file_base_url = ''
this.vcs_web_commit_url = ''
this.vcs_web_type = '(custom)'
}
};
auto_web_url_field = function (e) {
// Auto-determine web interface type from URL
vcs_web_url = $('#id_vcs_web_url').val()
if ( vcs_web_url.indexOf('/cgit.cgi/') > -1 || vcs_web_url.indexOf('/cgit/') > -1 ) {
$('#idx_vcs_web_type').val('cgit')
auto_web_type_field(e)
}
else if ( vcs_web_url.indexOf('a=summary') > -1 ) {
$('#idx_vcs_web_type').val('gitweb')
auto_web_type_field(e)
}
}
auto_web_type_field = function (e) {
// Auto-determine web interface tree/file URLs based on type
type = $('#idx_vcs_web_type').val()
if (type == '(custom)') {
readonly = $('#idx_vcs_web_type').prop('disabled')
$('#id_vcs_web_tree_base_url').prop('readonly', readonly)
$('#id_vcs_web_file_base_url').prop('readonly', readonly)
$('#id_vcs_web_commit_url').prop('readonly', readonly)
}
else {
$('#id_vcs_web_tree_base_url').prop('readonly', true)
$('#id_vcs_web_file_base_url').prop('readonly', true)
$('#id_vcs_web_commit_url').prop('readonly', true)
vcs_web_url = $('#id_vcs_web_url').val()
if (vcs_web_url) {
if (vcs_web_url.endsWith('/')) {
vcs_web_url = vcs_web_url.slice(0, -1)
}
if (type == 'cgit') {
$('#id_vcs_web_tree_base_url').val('readonly', true)
$('#id_vcs_web_file_base_url').prop('readonly', true)
$('#id_vcs_web_commit_url').prop('readonly', true)
if (e) {
$('#id_vcs_web_tree_base_url').val(vcs_web_url + '/tree/%path%?h=%branch%')
$('#id_vcs_web_file_base_url').val(vcs_web_url + '/tree/%path%?h=%branch%')
$('#id_vcs_web_commit_url').val(vcs_web_url + '/commit/id=%hash%')
}
}
else if (type == 'gitweb') {
$('#id_vcs_web_tree_base_url').val('readonly', true)
$('#id_vcs_web_file_base_url').prop('readonly', true)
$('#id_vcs_web_commit_url').prop('readonly', true)
if (e) {
spliturl = vcs_web_url.split('?')
if (spliturl.length > 1) {
params = spliturl[1].split(';')
newparams = []
for (i = 0; i < params.length; i++) {
if (!params[i].startsWith('a=')) {
newparams.push(params[i])
}
}
newparamsstr = newparams.join(';')
if( newparamsstr ) {
newparamsstr += ';'
}
vcs_web_url = spliturl[0] + '?' + newparamsstr
}
else {
vcs_web_url = spliturl[0] + '?'
}
$('#id_vcs_web_tree_base_url').val(vcs_web_url + 'a=tree;f=%path%;hb=refs/heads/%branch%')
$('#id_vcs_web_file_base_url').val(vcs_web_url + 'a=blob;f=%path%;hb=refs/heads/%branch%')
$('#id_vcs_web_commit_url').val(vcs_web_url + 'a=commit;h=%hash%')
}
}
else if (type == 'gitlab') {
$('#id_vcs_web_tree_base_url').val('readonly', true)
$('#id_vcs_web_file_base_url').prop('readonly', true)
$('#id_vcs_web_commit_url').prop('readonly', true)
if (e) {
$('#id_vcs_web_tree_base_url').val(vcs_web_url + '/tree/%branch%/%path%')
$('#id_vcs_web_file_base_url').val(vcs_web_url + '/blob/%branch%/%path%')
$('#id_vcs_web_commit_url').val(vcs_web_url + '/commit/%hash%')
}
}
}
}
};
auto_web_fields = function (e) {
repoval = $('#id_vcs_url').val()
awf = new AutoWebFields(repoval)
if (awf.vcs_web_url) {
if (e) {
$('#id_vcs_web_url').val(awf.vcs_web_url)
$('#id_vcs_web_tree_base_url').val(awf.vcs_web_tree_base_url)
$('#id_vcs_web_file_base_url').val(awf.vcs_web_file_base_url)
$('#id_vcs_web_commit_url').val(awf.vcs_web_commit_url)
$('#idx_vcs_web_type').val(awf.vcs_web_type)
}
$('#id_vcs_web_url').prop('readonly', true);
$('#idx_vcs_web_type').prop('disabled', true);
}
else {
$('#id_vcs_web_url').prop('readonly', false);
$('#idx_vcs_web_type').prop('disabled', false);
}
auto_web_type_field(e)
};
split_email = function() {
// Split email name/email address pairs
name_input = $(this)
split_regex = /^"?([^"@$<>]+)"? *<([^<> ]+)>[ -]*(.*)?$/
matches = split_regex.exec(name_input.val())
if( matches ){
name_input.val($.trim(matches[1]))
email_id = name_input.attr('id').replace('-name', '-email')
$('#' + email_id).val($.trim(matches[2]))
resp_id = email_id.replace('-email', '-responsibility')
currval = $('#' + resp_id).val()
// Set the responsibility with the remainder of the value unless the user has entered a value for
// responsibility already
if( currval == window['last_' + resp_id] || currval == "" ) {
newval = $.trim(matches[3])
$('#' + resp_id).val(newval)
window['last_' + resp_id] = newval
}
}
}
expand_maintainer = function() {
for(i=0;i<{{ maintainerformset.total_form_count }};i++) {
maintbox = $('#maintainerform-' + i)
if( maintbox.is(':hidden') ) {
maintbox.slideToggle();
if( i == {{maintainerformset.total_form_count}} - 1 )
$('#addanothermaintainer').hide()
break
}
}
return false;
}
$(document).ready(function() {
$('.maintainerform').hide()
for(i=0;i<{{ maintainerformset.total_form_count }};i++) {
name_input = $('#id_layermaintainer_set-' + i + '-name')
name_input.change(split_email)
resp_id = 'id_layermaintainer_set-' + i + '-responsibility'
window['last_' + resp_id] = ""
if( i==0 || name_input.val() )
$('#maintainerform-' + i).show()
}
$('#addanothermaintainer').click(expand_maintainer)
$('#id_vcs_url').change(auto_web_fields)
$('#id_vcs_web_url').change(auto_web_url_field)
$('#idx_vcs_web_type').change(auto_web_type_field)
auto_web_fields(null)
{% if not allow_base_type %}
$("#id_layer_type option[value='A']").remove();
{% endif %}
firstfield = $("#edit_layer_form input:text, #edit_layer_form textarea").first();
if( ! firstfield.val() )
firstfield.focus()
});
</script>
{% endblock %}