254 lines
12 KiB
Cheetah
254 lines
12 KiB
Cheetah
[%# Edit bug change predicates
|
||
# License: Dual-license GPL 3.0+ or MPL 1.1+
|
||
# Author: Vitaliy Filippov <vitalif@mail.ru>
|
||
#%]
|
||
|
||
[%# FIXME Template is in russian %]
|
||
[%# FIXME And contains a link to CustisWiki %]
|
||
|
||
[% PROCESS global/header.html.tmpl
|
||
title = "Правка предикатов корректности изменений"
|
||
%]
|
||
|
||
[% IF mode == "list" %]
|
||
<style>
|
||
.chkt { width: 70%; border-collapse: collapse; }
|
||
.chkt td, .chkt th { padding: 4px; border: 1px solid gray; }
|
||
</style>
|
||
<h3>Редактирование предикатов корректности</h3>
|
||
<h4><a href="?mode=edit&create=1">Добавить новый предикат.</a></h4>
|
||
[% IF checkers.size %]
|
||
<h4>Список определённых предикатов корректности:</h4>
|
||
<table class="chkt">
|
||
<tr style="background-color: #ccc">
|
||
<th style="width: 10%">Название поиска</th>
|
||
<th>Запрет</th>
|
||
<th>Режим</th>
|
||
<th title="Проверяются ли новые баги?">C</th>
|
||
<th title="Проверяются ли обновления багов?">U</th>
|
||
<th>Действия</th>
|
||
<th>Сообщение</th>
|
||
</tr>
|
||
[% FOR c = checkers %]
|
||
<tr>
|
||
<td><a href="?mode=edit&id=[% c.id %]">[% c.name | html %]</a></td>
|
||
[% IF c.triggers %]
|
||
<td style="background-color: #ddf; text-align: center"
|
||
title="Вообще не запрет, а триггер: при попадании под условия запроса в баг вносятся изменения" />
|
||
Триггер
|
||
</td>
|
||
[% ELSIF c.is_fatal %]
|
||
<td style="background-color: #fdd; text-align: center"
|
||
title="Жёсткий запрет: При нарушении правила изменения блокируются и выдаётся ошибка" />
|
||
Жёсткий
|
||
</td>
|
||
[% ELSE %]
|
||
<td style="background-color: #ffd; text-align: center"
|
||
title="Мягкий запрет: При нарушении правила выдаётся предупреждение, но изменение не блокируется">
|
||
Мягкий
|
||
</td>
|
||
[% END %]
|
||
<td style="background-color: [% c.is_freeze ? '#ddf' : '#fdd' %]; text-align: center" title="[% c.is_freeze
|
||
? 'Заморозка (защита от изменения)'
|
||
: 'Проверка корректности новых значений' %]">
|
||
[%+ IF c.is_freeze %]Заморозка[% ELSE %]Проверка[% END %]
|
||
</td>
|
||
<td style="background-color: [% c.on_create ? '#cfc" title="Проверяются новые баги"' : '#fdd" title="Новые баги не проверяются"' %]>[% c.on_create ? '+' : ' ' %]</td>
|
||
<td style="background-color: [% c.on_update ? '#cfc" title="Проверяются изменения багов"' : '#fdd" title="Изменения багов не проверяются"' %]>[% c.on_update ? '+' : ' ' %]</td>
|
||
<td style="text-align: center; white-space: nowrap">
|
||
<a href="?mode=edit&id=[% c.id %]" title="править"><img src="images/edit.png" width="22" height="22" /></a>
|
||
<a href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=[% c.query.name | url_quote %]
|
||
[% IF c.query.shared_with_group.id %]&sharer_id=[% c.query.user.id %][% END %]" title="выполнить поиск"><img src="images/search.png" width="22" height="22" /></a>
|
||
<a href="query.cgi?[% c.query.query %]&known_name=[% c.query.name | url_quote %]" title="править поиск"><img src="images/editsearch.png" width="22" height="22" /></a>
|
||
<a href="javascript:void(0)" title="удалить" onclick="if(confirm('Действительно удалить эту проверку?')){window.location.href='?save=1&delete=1&id=[% c.id %]';}"><img src="images/delete.png" width="22" height="22" /></a>
|
||
</td>
|
||
<td>[% c.message | html %]</td>
|
||
</tr>
|
||
[% END %]
|
||
</table>
|
||
[% ELSE %]
|
||
<p>Ещё не определено ни одного предиката корректности.</p>
|
||
[% END %]
|
||
[% ELSE %]
|
||
[% IF create %]
|
||
<h3>Добавление нового предиката</h3>
|
||
[% ELSE %]
|
||
<h3>Редактирование предиката [% checker.name | html %]</h3>
|
||
[% END %]
|
||
<form action="?save=1&edit=1" method="POST" onsubmit="return check_trigger()">
|
||
<input type="hidden" name="token" value="[% token | html %]" />
|
||
[% IF create %]
|
||
<input type="hidden" name="create" value="1" />
|
||
[% ELSE %]
|
||
<input type="hidden" name="id" value="[% checker.id %]" />
|
||
[% END %]
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<th>Сохранённый запрос:</th>
|
||
<td><select name="query_id">
|
||
[% FOREACH q = user.queries %]
|
||
[% SET found = 1 IF checker.query_id == q.id %]
|
||
<option value="[% q.id %]" [% " selected='selected'" IF checker.query_id == q.id %] >[% q.name | html %]</option>
|
||
[% END %]
|
||
[% IF checker.query_id AND !found %]
|
||
<option value="[% checker.query_id %]" selected='selected'>([% checker.query.user.login | html %]) [% checker.query.name | html %]</option>
|
||
[% END %]
|
||
</select></td>
|
||
</tr>
|
||
<tr>
|
||
<td colspan="2" style="padding-left: 100px">
|
||
<input type="radio" id="is_checker" name="is_trigger" value="0" onchange="switch_trigger()" [% " checked='checked'" IF !checker.triggers %] />
|
||
<label for="is_checker">Проверка</label>
|
||
<input type="radio" id="is_trigger" name="is_trigger" value="1" onchange="switch_trigger()" [% " checked='checked'" IF checker.triggers %] />
|
||
<label for="is_trigger">Триггер</label>
|
||
</td>
|
||
</tr>
|
||
<tr>
|
||
<th>Описание проверки:</th>
|
||
<td><textarea name="message" rows="8" cols="80">[% checker.message | html %]</textarea></td>
|
||
</tr>
|
||
<tr>
|
||
<th>Момент проверки:</th>
|
||
<td>
|
||
<input type="checkbox" name="on_create" id="on_create" [% " checked='checked'" IF checker.on_create %] onclick="this.blur()" onblur="showhide_allowdeny()" />
|
||
<label for="on_create" id="label_for_on_create">Проверять создание новых багов (требуется «Запрещать изменения всех полей»)</label><br />
|
||
<input type="checkbox" name="on_update" id="on_update" [% " checked='checked'" IF checker.on_update %] onclick="this.blur()" onblur="showhide_allowdeny()" />
|
||
<label for="on_update">Проверять изменения багов</label>
|
||
</td>
|
||
</tr>
|
||
</tbody>
|
||
<tbody id="tbody_checker" [% " style='display: none'" IF checker.triggers %]>
|
||
<tr>
|
||
<th>Параметры:</th>
|
||
<td>
|
||
<input type="checkbox" name="is_freeze" id="is_freeze" [% " checked='checked'" IF checker.is_freeze %] />
|
||
<label for="is_freeze" id="label_for_is_freeze">Заморозка багов (защита от изменений, только для режима обновления)</label><br />
|
||
<input type="checkbox" name="is_fatal" id="is_fatal" [% " checked='checked'" IF checker.is_fatal %] />
|
||
<label for="is_fatal">Жёсткий запрет (если нет, то изменения не блокируются, а только даётся предупреждение)</label><br />
|
||
</td>
|
||
</tr>
|
||
<tr><th style="text-align: left" colspan="2">Разрешить следующим пользователям обходить эту проверку:</th></tr>
|
||
<tr>
|
||
<th>Группа:</th>
|
||
<td>
|
||
<select name="bypass_group_id" id="bypass_group_id">
|
||
<option value="">— (не разрешать)</option>
|
||
[% FOR g = all_groups %]
|
||
<option value="[% g.id %]" [% " selected=\"selected\"" IF checker.bypass_group_id == g.id %]>[% g.name | html %]</option>
|
||
[% END %]
|
||
</select>
|
||
</td>
|
||
</tr>
|
||
<tr><th style="text-align: left" colspan="2">Запреты изменений отдельных полей, действуют только при обновлении багов:</th></tr>
|
||
<tr>
|
||
<th style="background: #FFE0E0">Запрещать:</th>
|
||
<td style="background: #FFE0E0">
|
||
<input type="checkbox" name="deny_all" id="deny_all" onclick="this.blur(); return true;" onblur="showhide_allowdeny()" [% " checked='checked'" IF checker.deny_all %] />
|
||
<label for="deny_all">Запрещать изменения всех полей</label>
|
||
</td>
|
||
</tr>
|
||
<tr id="except_fields_tr" style="background: #FFE0E0">
|
||
<th id="except_fields_title"></th>
|
||
<td id="except_fields">
|
||
<a href="javascript:void(0)" onclick="add_field()">Добавить отдельное поле</a>
|
||
</td>
|
||
</tr>
|
||
<tr><td></td><td>
|
||
<b>Подсказка:</b> в списке есть специальное поле "Backdated worktime", с помощью которого
|
||
можно запретить вводить трудозатраты задним числом. Например, чтобы запретить
|
||
вводить трудозатраты задним числом раньше 2010-09-01, нужно выбрать поле
|
||
"Backdated worktime" и значение "2010-09-01". Пустое значение означает полный
|
||
запрет ввода трудозатрат задним числом. Флажок "Запрещать изменения всех полей"
|
||
должен быть <b>сброшен</b>.
|
||
</td></tr>
|
||
</tbody>
|
||
<tbody id="tbody_trigger" [% " style='display: none'" IF !checker.triggers %]>
|
||
<tr>
|
||
<th>Добавить CC:</th>
|
||
<td><input type="text" id="triggers_add_cc" name="triggers_add_cc" value="[% checker.triggers.add_cc | html %]" /></td>
|
||
</tr>
|
||
<tr>
|
||
<th>Снять флаги (через ,):</th>
|
||
<td><input type="text" id="triggers_clear_flags" name="triggers_clear_flags" value="[% checker.triggers.clear_flags | html %]" /></td>
|
||
</tr>
|
||
</tbody>
|
||
<tbody>
|
||
<tr><td></td><td><input type="submit" value=" Сохранить " /></td></tr>
|
||
</tbody>
|
||
</table>
|
||
</form>
|
||
<div id="one_field_copy" style="display:none">
|
||
поле: <select name="except_field_X" id="except_field_X">
|
||
<option value="">---</option>
|
||
[% FOR f = my_fielddefs %]
|
||
<option value="[% f.name | html %]">[% f.description | html %]</option>
|
||
[% END %]
|
||
</select>
|
||
новое значение: <input type="text" name="except_field_X_value" id="except_field_X_value" value="" /> (пусто=любое)
|
||
</div>
|
||
<script type="text/javascript">
|
||
<!--
|
||
var fieldids = { '':'' [% FOR f = my_fielddefs %],"[% f.name | js %]": [% loop.count %][% END %] };
|
||
var except_field_index = 0;
|
||
function showhide_allowdeny()
|
||
{
|
||
var chk = document.getElementById('deny_all').checked;
|
||
document.getElementById('except_fields_title').innerHTML = chk ? 'Но разрешать:' : '';
|
||
document.getElementById('except_fields_tr').style.backgroundColor = chk ? '#E0FFE0' : '#FFE0E0';
|
||
}
|
||
function add_field(fld, val)
|
||
{
|
||
var d = document.createElement('div');
|
||
d.innerHTML = document.getElementById('one_field_copy').innerHTML.replace(/except_field_X/g, 'except_field_'+except_field_index);
|
||
document.getElementById('except_fields').appendChild(d);
|
||
if (fld && fieldids[fld])
|
||
{
|
||
document.getElementById('except_field_'+except_field_index).selectedIndex = fieldids[fld];
|
||
if (val)
|
||
document.getElementById('except_field_'+except_field_index+'_value').value = val;
|
||
}
|
||
except_field_index++;
|
||
}
|
||
function switch_trigger()
|
||
{
|
||
var f = document.getElementById('is_trigger').checked;
|
||
document.getElementById('tbody_checker').style.display = f ? 'none' : '';
|
||
document.getElementById('tbody_trigger').style.display = f ? '' : 'none';
|
||
}
|
||
function check_trigger()
|
||
{
|
||
var f = document.getElementById('is_trigger').checked;
|
||
var cc = document.getElementById('triggers_add_cc');
|
||
var fl = document.getElementById('triggers_clear_flags');
|
||
if (!f)
|
||
cc.value = fl.value = '';
|
||
else if (!cc.value && !fl.value)
|
||
{
|
||
alert('Задайте действие триггера!');
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
[%# Загружаем текущее состояние дел %]
|
||
showhide_allowdeny();
|
||
[% IF checker.except_fields %]
|
||
[% FOR f = checker.except_fields.keys %]
|
||
[% FOR v = checker.except_fields.$f %]
|
||
add_field("[% f | js %]", "[% v | js %]");
|
||
[% END %]
|
||
[% END %]
|
||
[% ELSE %]
|
||
add_field();
|
||
[% END %]
|
||
//-->
|
||
</script>
|
||
[% END %]
|
||
|
||
<table style="border:5px solid #00A000;border-collapse:collapse;margin-top:1em"><tr>
|
||
<td style="border-right:5px solid #00A000;color:#00A000;background-color:white;padding:5px;font-size:200%">?</td>
|
||
<td style="padding:5px"><a href="http://wiki.office.custis.ru/wiki/Bugzilla:_проверки_изменений_багов">wiki:[[Bugzilla: проверки изменений багов]]</a></td>
|
||
</tr></table>
|
||
|
||
[% PROCESS global/footer.html.tmpl %]
|