Update timer, window for time saving, add productive_time to edit.html.tpl

parent d3661ce0
//Номер баги
var bugId = getIdFromUrl() || getBugIdFromField();
// Если id нет, то мы имеем дело с новой багой
if(!bugId) {
// Присвоим текущее время, чтобы при создании следующей баги значения не сохранились
bugId = 'c'+(new Date().getTime());
}
var protocol = window.location.protocol;
//Изменение баги
var changed_remain = 0;
//Создание баги
var etersoft_create = 0;
// Объект таймера, создается при инициализации
// Подробнее про таймер см. timer_common.js
var timer;
// Интервал обновления таймера в мс, на точность не влияет
var UPDATE_INTERVAL = 1000;
function initTimer(){
// Показываем время только сотрудникам Etersoft
if(!isetersoft()) return;
document.getElementById("timerblock").style.display = 'block';
timer = new Timer('bug:'+protocol+bugId, updateTimer);
timer.setAutoUpdate(UPDATE_INTERVAL);
// Вешаем обработчик на сабмит формы
document.querySelector('#changeform, form#Create').addEventListener('submit', function (event) {
// Не сабмитим форму
event.preventDefault();
mysubmit();
});
}
// this при вызове - объект таймера
function updateTimer(){
setPauseDisplay(this.isPaused());
document.querySelector('#timespent').value = this.getFormattedString();
}
//Установка в поле отработанного времени в минутах
function setWorkTime(manualTime) {
var minutes = Math.ceil(timer.getElapsedSeconds()/60);
document.querySelector("#realworktime").value = manualTime ? manualTime : minutes;
}
function setPauseDisplay(pause){
document.querySelector("#timespent").style.color = pause ? "gray" : "black";
document.querySelector("#timer_pause").style.visibility = pause ? "hidden" : "visible";
document.querySelector("#timer_play").style.visibility = pause ? "visible" : "hidden";
}
/////////////////////////////////////////////////////
function showDiv(){
document.querySelector("#timeQuestionDiv").style.display = "block";
document.querySelector("#realworktime").focus();
}
function closeDiv() {
document.querySelector("#timeQuestionDiv").style.display = "none";
}
/* Получение номера баги из поля */
function getBugIdFromField() {
var field = document.querySelector("#changeform input[name=id]");
if (field) {
return parseInt(field.value);
}
return false;
}
////////////////////////////////////////////
//Является ли пользователь сотрудником Etersoft
function isetersoft() {
var email = document.getElementById('useremail').className;
if (!email)
return false;
var domain = email.split("@")[1];
return (domain === "etersoft.ru");
}
//Является ли пользователь ответственным
function isworker() {
var useremail = document.getElementById('useremail');
var assigntoemail = document.getElementById('assigntoemail');
var email = useremail.className;
var assignemail = assigntoemail.className;
return (email == assignemail);
}
function update_remain() {
if (changed_remain == 1) {
var remaining_time = document.querySelector("#changeform #remaining_time").value;
var realworktime = document.querySelector("#timeQuestionDiv #realworktime").value;
var rrt = Math.round((remaining_time - Math.round(realworktime*10/60)/10)*10)/10;
if (rrt < 0) {
rrt = 0;
}
document.querySelector("#timeQuestionDiv #realremaintime").value = rrt;
}
if (document.querySelector("#timeQuestionDiv #realremaintime").value == 0 && isworker()) {
document.getElementById('message_warning').className = "div_show";
} else {
document.getElementById('message_warning').className = "div_hide";
}
}
function premysubmit(realworktime) {
if (realworktime != -1) {
document.querySelector("#timeQuestionDiv #realworktime").value = realworktime;
}
var wt = Math.round(document.querySelector("#timeQuestionDiv #realworktime").value*100/60)/100;
if (etersoft_create == 1) {
// Запрет ставить более 1 часа отработанного времени при создании баги
if ( wt > 1) {
alert('Не допускается указывать время на создание баги более 1 часа. Нужно отделять создание и решение.');
return false;
}
document.querySelector("#Create #work_time").value = wt;
mysubmitnew();
timer.clear();
return;
}
var comment = document.querySelector("#comment");
// Запрет ставить более 8 часов отработанного времени
if ( wt > 8) {
alert('Вы указали отработанное время более 8 часов. Нужно обязательно разбивать комментирование своей работы за день на отдельные части.');
return false;
}
// Предупреждение
if ( wt > 3) {
// FIXME: тут нет возможности отмены
alert('Вы указали отработанное время более 3 часов. Правильным следованием рабочему процессу было бы выполнение работы по частям, о каждой из которых будет написано отдельно.');
//comment.value = comment.value + '\n\nДа, я подтверждаю, что намеренно наплевал на предупреждение о том, что для нормального рабочего процесса необходимо вести более короткие записи в багзилле.';
//return false;
}
if ( wt > 2) {
if (comment.value.length < (wt * 60)) {
alert('Недопустимо коротко комментировать длительные работы. Мы ожидаем не менее 60 символов на каждый указанный час.');
return false;
}
}
if (comment.value.length < 9) {
alert('Комментарий слишком короткий.');
return false;
}
if (changed_remain == 1) {
document.querySelector("#changeform #work_time").value = wt;
document.querySelector("#changeform #remaining_time").value = document.querySelector("#timeQuestionDiv #realremaintime").value;
}
timer.clear();
mysubmit();
}
function mysubmit() {
if (document.querySelector("#Create")) {
etersoft_create = 1;
}
if (document.querySelector("#changeform")) {
changed_remain = 1;
}
if (changed_remain == 1 && (!isetersoft() || document.querySelector("#changeform #work_time").value > 0 || document.querySelector("#changeform #comment").value.length == 0)) {
document.changeform.submit();
} else {
showDiv();
setWorkTime();
update_remain();
if (changed_remain == 1 && isworker()) {
document.querySelector("#timeQuestionDiv #id_remain_time").className = "div_show";
document.querySelector("#timeQuestionDiv #message").className = "div_show";
}
}
}
function mysubmitnew() {
if (!isetersoft()) {
document.Create.submit();
return;
}
if (document.querySelector("#Create #work_time").value > 0) {
timer.clear();
document.Create.submit();
return;
}
etersoft_create = 1;
showDiv();
setWorkTime();
}
//////////////////////////////////////////////////////////////
if (typeof (window.addEventListener) != 'undefined') {
//gecko, safari, konqueror and standard
window.addEventListener('load', initTimer, false);
} else if (typeof document.addEventListener != 'undefined') {
//opera 7
document.addEventListener('load', initTimer, false);
} else if(typeof window.attachEvent != 'undefined') {
//win/ie
window.attachEvent('onload', initTimer);
}
//Номер баги
var bugId = getIdFromUrl() || getBugIdFromField();
// Если id нет, то мы имеем дело с новой багой
if (!bugId) {
// Присвоим текущее время, чтобы при создании следующей баги значения не сохранились
bugId = "c" + new Date().getTime();
}
var protocol = window.location.protocol;
//Изменение баги
var changed_remain = 0;
//Создание баги
var etersoft_create = 0;
// Объект таймера, создается при инициализации
// Подробнее про таймер см. timer_common.js
var timer;
// Интервал обновления таймера в мс, на точность не влияет
var UPDATE_INTERVAL = 1000;
function initTimer() {
// Показываем время только сотрудникам Etersoft
if (!isetersoft()) return;
document.getElementById("timerblock").style.display = "block";
timer = new Timer("bug:" + protocol + bugId, updateTimer);
timer.setAutoUpdate(UPDATE_INTERVAL);
}
// this при вызове - объект таймера
function updateTimer() {
setPauseDisplay(this.isPaused());
document.querySelector("#timespent").value = this.getFormattedString();
}
//Установка в поле отработанного времени в минутах
function setWorkTime(manualTime) {
var minutes = Math.ceil(timer.getElapsedSeconds() / 60);
document.querySelector("#realworktime").value = manualTime
? manualTime
: minutes;
}
function setPauseDisplay(pause) {
document.querySelector("#timespent").style.color = pause ? "gray" : "black";
document.querySelector("#timer_pause").style.visibility = pause
? "hidden"
: "visible";
document.querySelector("#timer_play").style.visibility = pause
? "visible"
: "hidden";
}
/////////////////////////////////////////////////////
function showDiv() {
document.querySelector("#timeQuestionDiv").style.display = "block";
document.querySelector("#realworktime").focus();
}
function closeDiv() {
document.querySelector("#timeQuestionDiv").style.display = "none";
}
/* Получение номера баги из поля */
function getBugIdFromField() {
var field = document.querySelector("#changeform input[name=id]");
if (field) {
return parseInt(field.value);
}
return false;
}
////////////////////////////////////////////
//Является ли пользователь сотрудником Etersoft
function isetersoft() {
var email = document.getElementById("useremail").className;
if (!email) return false;
var domain = email.split("@")[1];
return domain === "etersoft.ru";
}
//Является ли пользователь ответственным
function isworker() {
var useremail = document.getElementById("useremail");
var assigntoemail = document.getElementById("assigntoemail");
var email = useremail.className;
var assignemail = assigntoemail.className;
return email == assignemail;
}
window.addEventListener('load', function () {
function getTimespentValue() {
let timespent = document.querySelector("#timespent").value;
let timespentValue = timespent.split(":");
// let's calc how many time is spent in minutes
let hours = parseInt(timespentValue[0]) * 60;
let minutes = parseInt(timespentValue[1]);
let seconds = Math.round(parseInt(timespentValue[2]) / 60);
timespentValue = hours + minutes + seconds;
return timespentValue;
}
// add listener for comment commit
let commitBtn = document.querySelector("#commit");
commitBtn.addEventListener("click", function(event) {
// cancel form submiting
event.preventDefault();
let timespentValue = getTimespentValue();
document.querySelector("#timeQuestionDiv").style.display = "block";
// write work time in input value
document.querySelector("#realworktime").value = timespentValue;
document.querySelector("#saveTime").dataset['time'] = timespentValue;
});
document.querySelector("#realworktime").addEventListener("change", function() {
document.querySelector("#saveTime").dataset["time"] = document.querySelector("#realworktime").value;
});
// add listener for time commit
let workTimeBtns = document.querySelectorAll(".workTime__button");
Array.from(workTimeBtns).map(btn => {
btn.addEventListener("click", function(event) {
// cancel form submiting
event.preventDefault();
// let's calc time for #work_time input
let workTime = parseInt(btn.dataset["time"]);
let workTimeValue = Math.ceil(workTime / 60 * 100) / 100;
document.querySelector("#work_time").value = workTimeValue;
// now we ready for submiting all forms
let mainCommitBtn = document.querySelector("#commit_top");
// check comment before submit
let comment = document.querySelector("#comment").value;
if (comment.length !== 0) {
if (comment.length < 9) {
alert("Слишком короткий комментарий");
}
else if (workTimeValue > 3) {
alert("Вы указали отработанное время более 3 часов. Правильным следованием рабочему процессу было бы выполнение работы по частям, о каждой из которых будет написано отдельно.");
}
else if (workTimeValue > 2 && comment.length < workTimeValue * 60) {
alert("Недопустимо коротко комментировать длительные работы. Мы ожидаем не менее 60 символов на каждый указанный час.");
}
else if (workTimeValue > 8) {
alert("Вы указали отработанное время более 8 часов. Нужно обязательно разбивать комментирование своей работы за день на отдельные части.");
}
else {
mainCommitBtn.click();
timer.clear();
}
} else {
alert("Поле комментария не может быть пустым!");
}
});
});
});
//////////////////////////////////////////////////////////////
if (typeof window.addEventListener != "undefined") {
//gecko, safari, konqueror and standard
window.addEventListener("load", initTimer, false);
} else if (typeof document.addEventListener != "undefined") {
//opera 7
document.addEventListener("load", initTimer, false);
} else if (typeof window.attachEvent != "undefined") {
//win/ie
window.attachEvent("onload", initTimer);
}
//Номер баги
var bugId = getIdFromUrl() || getBugIdFromField();
// Если id нет, то мы имеем дело с новой багой
if (!bugId) {
// Присвоим текущее время, чтобы при создании следующей баги значения не сохранились
bugId = "c" + new Date().getTime();
}
var protocol = window.location.protocol;
//Изменение баги
var changed_remain = 0;
//Создание баги
var etersoft_create = 0;
// Объект таймера, создается при инициализации
// Подробнее про таймер см. timer_common.js
var timer;
// Интервал обновления таймера в мс, на точность не влияет
var UPDATE_INTERVAL = 1000;
function initTimer() {
// Показываем время только сотрудникам Etersoft
if (!isetersoft()) return;
document.getElementById("timerblock").style.display = "block";
timer = new Timer("bug:" + protocol + bugId, updateTimer);
timer.setAutoUpdate(UPDATE_INTERVAL);
}
// this при вызове - объект таймера
function updateTimer() {
setPauseDisplay(this.isPaused());
document.querySelector("#timespent").value = this.getFormattedString();
}
//Установка в поле отработанного времени в минутах
function setWorkTime(manualTime) {
var minutes = Math.ceil(timer.getElapsedSeconds() / 60);
document.querySelector("#realworktime").value = manualTime
? manualTime
: minutes;
}
function setPauseDisplay(pause) {
document.querySelector("#timespent").style.color = pause ? "gray" : "black";
document.querySelector("#timer_pause").style.visibility = pause
? "hidden"
: "visible";
document.querySelector("#timer_play").style.visibility = pause
? "visible"
: "hidden";
}
/////////////////////////////////////////////////////
function showDiv() {
document.querySelector("#timeQuestionDiv").style.display = "block";
document.querySelector("#realworktime").focus();
}
function closeDiv() {
document.querySelector("#timeQuestionDiv").style.display = "none";
}
/* Получение номера баги из поля */
function getBugIdFromField() {
var field = document.querySelector("#changeform input[name=id]");
if (field) {
return parseInt(field.value);
}
return false;
}
////////////////////////////////////////////
//Является ли пользователь сотрудником Etersoft
function isetersoft() {
var email = document.getElementById("useremail").className;
if (!email) return false;
var domain = email.split("@")[1];
return domain === "etersoft.ru";
}
//Является ли пользователь ответственным
function isworker() {
var useremail = document.getElementById("useremail");
var assigntoemail = document.getElementById("assigntoemail");
var email = useremail.className;
var assignemail = assigntoemail.className;
return email == assignemail;
}
window.addEventListener('load', function () {
function getTimespentValue() {
let timespent = document.querySelector("#timespent").value;
let timespentValue = timespent.split(":");
// let's calc how many time is spent in minutes
let hours = parseInt(timespentValue[0]) * 60;
let minutes = parseInt(timespentValue[1]);
let seconds = Math.round(parseInt(timespentValue[2]) / 60);
timespentValue = hours + minutes + seconds;
return timespentValue;
}
// add listener for comment commit
let commitBtn = document.querySelector("#commit");
commitBtn.addEventListener("click", function(event) {
// cancel form submiting
event.preventDefault();
let timespentValue = getTimespentValue();
document.querySelector("#timeQuestionDiv").style.display = "block";
// write work time in input value
document.querySelector("#realworktime").value = timespentValue;
document.querySelector("#saveTime").dataset['time'] = document.querySelector("#realworktime").value !== timespentValue ? document.querySelector("#realworktime").value : timespentValue;
console.log(document.querySelector("#saveTime").dataset['time']);
});
// add listener for time commit
let workTimeBtns = document.querySelectorAll(".workTime__button");
Array.from(workTimeBtns).map(btn => {
btn.addEventListener("click", function(event) {
// cancel form submiting
event.preventDefault();
// let's calc time for #work_time input
let workTime = parseInt(btn.dataset["time"]);
let workTimeValue = Math.ceil(workTime / 60 * 100) / 100;
document.querySelector("#work_time").value = workTimeValue;
// now we ready for submiting all forms
let mainCommitBtn = document.querySelector("#commit_top");
// check comment before submit
let comment = document.querySelector("#comment").value;
if (comment.length !== 0) {
if (comment.length < 9) {
alert("Слишком короткий комментарий");
}
else if (workTimeValue > 3) {
alert("Вы указали отработанное время более 3 часов. Правильным следованием рабочему процессу было бы выполнение работы по частям, о каждой из которых будет написано отдельно.");
}
else if (workTimeValue > 2 && comment.length < workTimeValue * 60) {
alert("Недопустимо коротко комментировать длительные работы. Мы ожидаем не менее 60 символов на каждый указанный час.");
}
else if (workTimeValue > 8) {
alert("Вы указали отработанное время более 8 часов. Нужно обязательно разбивать комментирование своей работы за день на отдельные части.");
}
else {
mainCommitBtn.click();
timer.clear();
}
} else {
alert("Поле комментария не может быть пустым!");
}
});
});
});
//////////////////////////////////////////////////////////////
if (typeof window.addEventListener != "undefined") {
//gecko, safari, konqueror and standard
window.addEventListener("load", initTimer, false);
} else if (typeof document.addEventListener != "undefined") {
//opera 7
document.addEventListener("load", initTimer, false);
} else if (typeof window.attachEvent != "undefined") {
//win/ie
window.attachEvent("onload", initTimer);
}
/* Блок таймера */
#timerblock {
display: none;
color: #000000;
background-color: #ADD8E6;
border: 1px dashed #565656;
border-radius: 0.5em/0.5em;
position: absolute;
right: 8px;
top: 77px;
z-index: 2;
padding: 5px;
font-family: sans-serif;
font-size: 14px;
text-align: center;
width:108px;
}
#timerblock #timer_pause {
position:absolute;
top:8px;
left:102px;
cursor:pointer;
}
#timerblock #timer_play {
position:absolute;
top:8px;
left:102px;
cursor:pointer;
visibility:hidden;
}
#timerblock #timer_stop {
position:absolute;
top:8px;
left:7px;
cursor:pointer;
}
#timerblock #timespent {
border: none;
text-align: center;
font-weight: bold;
background: transparent;
margin-left:6px;
}
/* Блок сохранения времени */
#timeQuestionDiv {
position: fixed;
top: 100px;
left: 25%;
width: 50%;
display: none;
padding: 10px;
border: 1px solid;
background: #DDDDDD;
text-align: center;
font-size: 12px;
z-index: 10;
}
#timeQuestionDiv a {
cursor: pointer;
}
#timeQuestionDiv .div_show {
display: block;
}
#timeQuestionDiv .div_hide {
display: none;
}
/* Блок таймера */
#timerblock {
display: none;
color: #000000;
background-color: #ADD8E6;
border: 1px dashed #565656;
border-radius: 0.5em/0.5em;
position: absolute;
right: 8px;
top: 77px;
z-index: 2;
padding: 5px;
font-family: sans-serif;
font-size: 14px;
text-align: center;
width:108px;
}
#timerblock #timer_pause {
position:absolute;
top:8px;
left:102px;
cursor:pointer;
}
#timerblock #timer_play {
position:absolute;
top:8px;
left:102px;
cursor:pointer;
visibility:hidden;
}
#timerblock #timer_stop {
position:absolute;
top:8px;
left:7px;
cursor:pointer;
}
#timerblock #timespent {
border: none;
text-align: center;
font-weight: bold;
background: transparent;
margin-left:6px;
}
/* Блок сохранения времени */
/*#timeQuestionDiv {
position: fixed;
top: 100px;
left: 25%;
width: 50%;
display: none;
padding: 10px;
border: 1px solid;
background: #DDDDDD;
text-align: center;
font-size: 12px;
z-index: 10;
}
#timeQuestionDiv a {
cursor: pointer;
}
#timeQuestionDiv .div_show {
display: block;
}
#timeQuestionDiv .div_hide {
display: none;
}*/
#timeQuestionDiv {
display: none;
z-index: 10;
position: fixed;
top: 100px;
width: 50%;
left: 25%;
}
.container {
max-width: 400px;
width: 100%;
margin: 0 auto;
position: relative;
}
.workTime input[type="text"],
.workTime input[type="email"],
.workTime input[type="tel"],
.workTime input[type="url"],
.workTime textarea,
.workTime button[type="submit"] {
font: 400 12px/16px "Roboto", Helvetica, Arial, sans-serif;
}
.workTime {
background: #F9F9F9;
padding: 25px;
margin: 150px 0;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
}
.workTime h3 {
display: block;
font-size: 34px;
font-weight: 300;
margin-bottom: 10px;
}
.workTime h4 {
margin: 5px 0 15px;
display: block;
font-size: 13px;
font-weight: 400;
color: rgb(255, 64, 64);
}
fieldset {
border: medium none !important;
margin: 0 0 10px;
min-width: 100%;
padding: 0;
width: 100%;
}
.workTime input[type="text"],
.workTime input[type="email"],
.workTime input[type="tel"],
.workTime input[type="url"],
.workTime textarea {
width: 100%;
border: 1px solid #ccc;
background: #FFF;
margin: 0 0 5px;
padding: 10px;
}
.workTime input[type="text"]:hover,
.workTime input[type="email"]:hover,
.workTime input[type="tel"]:hover,
.workTime input[type="url"]:hover,
.workTime textarea:hover {
-webkit-transition: border-color 0.3s ease-in-out;
-moz-transition: border-color 0.3s ease-in-out;
transition: border-color 0.3s ease-in-out;
border: 1px solid #aaa;
}
.workTime textarea {
height: 100px;
max-width: 100%;
resize: none;
}
.workTime button[type="submit"], .workTime__button {
cursor: pointer;
width: 100%;
border: none;
background: rgb(255, 212, 92);
margin: 0 0 5px;
padding: 10px;
font-size: 15px;
}
.workTime__button{
margin-left: 5px;
}
.workTime button[type="submit"]:hover, .workTime__button:hover {
background: rgb(255, 189, 8);
-webkit-transition: background 0.3s ease-in-out;
-moz-transition: background 0.3s ease-in-out;
transition: background-color 0.3s ease-in-out;
}
.workTime button[type="submit"]:active {
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);
}
.copyright {
text-align: center;
}
.workTime input:focus,
.workTime textarea:focus {
outline: 0;
border: 1px solid #aaa;
}
.workTimeInner{
display: flex;
}
.close {
position: absolute;
right: 10px;
top: 10px;
width: 25px;
height: 25px;
opacity: 0.4; */
}
.close:hover {
opacity: 1;
}
.close:before, .close:after {
position: absolute;
left: 15px;
content: ' ';
height: 25px;
width: 2px;
background-color: #000;
}
.close:before {
transform: rotate(45deg);
}
.close:after {
transform: rotate(-45deg);
}
::-webkit-input-placeholder {
color: #888;
}
:-moz-placeholder {
color: #888;
}
::-moz-placeholder {
color: #888;
}
:-ms-input-placeholder {
color: #888;
}
......@@ -1063,6 +1063,9 @@
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.work_time, editable = 1
%]
<th>
Продуктивное время:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.remaining_time, editable = 1
%]
......@@ -1094,6 +1097,11 @@
onchange="adjustRemainingTime();">
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.productive_time %]
<input name="productive_time" id="productive_time"
value="0" size="3" maxlength="6">
</td>
<td>
<input name="remaining_time" id="remaining_time"
value="[% PROCESS formattimeunit
time_unit=bug.remaining_time %]"
......
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS bug/time.html.tmpl %]
[% PROCESS etersoft/timersplash.html.tmpl %]
[% IF Param('comment_taggers_group') %]
[% IF user.can_tag_comments %]
<div id="bz_ctag_div" class="bz_default_hidden">
<a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideInput()">x</a>
<div>
<input id="bz_ctag_add" size="10" placeholder="add tag"
maxlength="[% constants.MAX_COMMENT_TAG_LENGTH FILTER html %]">
<span id="bz_ctag_autocomp"></span>
</div>
&nbsp;
</div>
<div id="bz_ctag_error" class="bz_default_hidden">
<a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideError()">x</a>
<span id="bz_ctag_error_msg"></span>
</div>
[% END %]
[% IF user.id %]
<script type="text/javascript">
YAHOO.bugzilla.commentTagging.init([% user.can_tag_comments ? 'true' : 'false' %]);
YAHOO.bugzilla.commentTagging.min_len = [% constants.MIN_COMMENT_TAG_LENGTH FILTER js %];
YAHOO.bugzilla.commentTagging.max_len = [% constants.MAX_COMMENT_TAG_LENGTH FILTER js %];
YAHOO.bugzilla.commentTagging.label = 'Comment Tags:';
YAHOO.bugzilla.commentTagging.min_len_error =
'Comment tags must be at least
[%~ " " _ constants.MIN_COMMENT_TAG_LENGTH FILTER js %] characters.';
YAHOO.bugzilla.commentTagging.max_len_error =
'Comment tags cannot be longer than
[%~ " " _ constants.MAX_COMMENT_TAG_LENGTH FILTER js %] characters.';
</script>
[% END %]
[% END %]
<script type="text/javascript">
<!--
[% IF user.is_timetracker %]
var bz_remaining_time = [% bug.remaining_time %];
[% END %]
[% IF user.id %]
/* Index all classifications so we can keep track of the classification
* for the selected product, which could control field visibility.
*/
var all_classifications = new Array([% bug.choices.product.size %]);
[%- FOREACH product = bug.choices.product %]
all_classifications['[% product.name FILTER js %]'] = '
[%- product.classification.name FILTER js %]';
[%- END %]
[% END %]
//-->
</script>
<form name="changeform" id="changeform" method="post" action="process_bug.cgi">
<input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
<input type="hidden" name="id" value="[% bug.bug_id %]">
<input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
[% PROCESS section_title %]
<table class="edit_form">
<tr>
[%# 1st Column %]
<td id="bz_show_bug_column_1" class="bz_show_bug_column">
<table>
[%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
[% PROCESS section_status %]
[% PROCESS section_spacer %]
[% PROCESS section_aliases %]
[% PROCESS section_spacer %]
[% PROCESS section_details1 %]
[% PROCESS section_spacer %]
[%# *** severity, priority, version, milestone, and deadline *** %]
[% PROCESS section_details2 %]
[%# *** assigned to and qa contact *** %]
[% PROCESS section_people %]
[% PROCESS section_spacer %]
[% PROCESS section_url_keyword_whiteboard %]
[% PROCESS section_spacer %]
[%# *** Dependencies and duplicates *** %]
[% PROCESS section_duplicates %]
[% PROCESS section_dependson_blocks %]
</table>
</td>
<td>
<div class="bz_column_spacer">&nbsp;</div>
</td>
[%# 2nd Column %]
<td id="bz_show_bug_column_2" class="bz_show_bug_column">
<table>
[%# *** Reported and modified dates *** %]
[% PROCESS section_dates %]
[% PROCESS section_cclist %]
[% PROCESS section_bug_ignored %]
[% PROCESS section_spacer %]
[% PROCESS section_see_also %]
[% PROCESS section_customfields %]
[% PROCESS section_spacer %]
[% Hook.process("after_custom_fields") %]
[% PROCESS section_flags %]
</table>
</td>
</tr>
<tr>
<td colspan="3">
<hr id="bz_top_half_spacer">
</td>
</tr>
</table>
<table id="bz_big_form_parts">
<tr>
<td>
[% IF user.is_timetracker %]
[% PROCESS section_timetracking %]
[% END %]
[%# *** Attachments *** %]
[% PROCESS attachment/list.html.tmpl
attachments = bug.attachments
bugid = bug.bug_id
num_attachment_flag_types = bug.num_attachment_flag_types
show_attachment_flags = bug.show_attachment_flags
%]
[% IF user.settings.comment_box_position.value == 'before_comments' %]
[% PROCESS comment_box %]
[% END %]
</td>
<td>
[% PROCESS section_restrict_visibility %]
</td>
</tr></table>
[%# *** Additional Comments *** %]
<div id="comments">
[% PROCESS bug/comments.html.tmpl
comments = bug.comments
mode = user.id ? "edit" : "show"
%]
</div>
[% IF user.settings.comment_box_position.value == 'after_comments' %]
<hr>
[% PROCESS comment_box %]
[% END %]
</form>
[%############################################################################%]
[%# Block for the Title (alias and short desc) #%]
[%############################################################################%]
[% BLOCK section_title %]
[%# That's the main table, which contains all editable fields. %]
<div class="bz_short_desc_container edit_form">
[% PROCESS commit_button id="_top"%]
<a href="show_bug.cgi?id=[% bug.bug_id %]">
[%-# %]<b>[% terms.Bug %]&nbsp;[% bug.bug_id FILTER html %]</b>
[%-# %]</a> <span id="summary_container" class="bz_default_hidden">
[% IF bug.alias.size > 0 %]
(<span id="alias_nonedit_display">[% bug.alias.join(', ') FILTER html %]</span>)
[% END %]
- <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
[% can_edit_short_desc = bug.check_can_change_field('short_desc', 0, 1) %]
[% IF can_edit_short_desc %]
<small>(<a href="#" id="summary_edit_action">edit</a>)</small>
[% END %]
</span>
<!-- Etersoft -->
&nbsp;&nbsp;<a title="Создать копию текущей [% terms.bug_gen %] по основным параметрам"
href="enter_bug.cgi?product=[% bug.product %]&component=[% bug.component %]&blocked=[% bug_blocked_string %]&assigned_to=[% bug.assigned_to.email %]&cc=[% bug_cc_string %]&qa_contact=[% bug.qa_contact.email %]">Создать подобную</a>
<!-- Etersoft END -->
<div id="summary_input">
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.short_desc
editable = can_edit_short_desc
accesskey = "s"
tag_name = 'span'
%]
[% PROCESS input inputname => "short_desc" size => "80"
maxlength => 255 spellcheck => "true" no_td => 1 %]
</div>
</div>
<script type="text/javascript">
hideEditableField('summary_container',
'summary_input',
'summary_edit_action',
'short_desc',
'[% bug.short_desc FILTER js %]' );
</script>
[% END %]
[%############################################################################%]
[%# Block for the first table in the "Details" section #%]
[%############################################################################%]
[% BLOCK section_details1 %]
[%#############%]
[%# PRODUCT #%]
[%#############%]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product, value = bug.product
override_legal_values = bug.choices.product
desc_url = "describecomponents.cgi"
editable = bug.check_can_change_field('product', 0, 1)
%]
</tr>
[%# Classification is here so that it can be used in value controllers
# and visibility controllers. It comes after product because
# it uses some javascript that depends on the existence of the
# product field.
#%]
<tr class="bz_default_hidden">
[% INCLUDE bug/field.html.tmpl
bug = bug field = bug_fields.classification
override_legal_values = bug.choices.classification
value = bug.classification
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
[%###############%]
[%# Component #%]
[%###############%]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.component, value = bug.component
override_legal_values = bug.choices.component
desc_url = "describecomponents.cgi?product=$bug.product"
editable = bug.check_can_change_field('component', 0, 1)
%]
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.version
editable = bug.check_can_change_field('version', 0, 1) %]
[% PROCESS select selname => "version" %]
</tr>
[%############%]
[%# PLATFORM #%]
[%############%]
<tr>
[% can_edit_rep_platform = bug.check_can_change_field('rep_platform', 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.rep_platform,
editable = can_edit_rep_platform,
accesskey = "h" %]
<td class="field_value">
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.rep_platform,
no_tds = 1, value = bug.rep_platform
editable = can_edit_rep_platform %]
[%+ INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.op_sys,
no_tds = 1, value = bug.op_sys
editable = bug.check_can_change_field('op_sys', 0, 1) %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for the status section #%]
[%############################################################################%]
[% BLOCK section_status %]
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#bug_status">Состояние</a>:
</th>
<td id="bz_field_status">
<span id="static_bug_status">
[% display_value("bug_status", bug.bug_status) FILTER html %]
[% IF bug.resolution %]
[%+ display_value("resolution", bug.resolution) FILTER html %]
[% IF bug.dup_id %]
of [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
[% END %]
[% END %]
[% IF bug.user.canedit || bug.user.isreporter %]
(<a href="#add_comment"
onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">изменить</a>)
[% END %]
</span>
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for the second table in the "Details" section #%]
[%############################################################################%]
[% BLOCK section_details2 %]
[%###############################################################%]
[%# Importance (priority and severity) #%]
[%###############################################################%]
<tr>
<th class="field_label">
[% can_edit_priority = bug.check_can_change_field('priority', 0, 1) %]
<label [% IF can_edit_priority %]for="priority"[% END %] accesskey="i">
<a href="page.cgi?id=fields.html#importance"><u>В</u>ажность</a></label>:
</th>
<td>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.priority,
no_tds = 1, value = bug.priority
editable = can_edit_priority %]
[%+ INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.bug_severity,
no_tds = 1, value = bug.bug_severity
editable = bug.check_can_change_field('bug_severity', 0, 1) %]
[% Hook.process('after_importance', 'bug/edit.html.tmpl') %]
</td>
</tr>
[% IF Param("usetargetmilestone") && bug.target_milestone %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.target_milestone
editable = bug.check_can_change_field('target_milestone', 0, 1)
%]
[% PROCESS select selname = "target_milestone" %]
</tr>
[% END %]
[% IF Param("timetrackinggroup") && bug.deadline %]
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#deadline">Срок</a>:
</th>
<td>[% bug.deadline FILTER html %]</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for the table in the "People" section #%]
[%############################################################################%]
[% BLOCK section_people %]
<tr>
[% can_edit_assigned_to = bug.check_can_change_field("assigned_to", 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.assigned_to
editable = can_edit_assigned_to
%]
<td>
[% IF can_edit_assigned_to %]
<div id="bz_assignee_edit_container" class="bz_default_hidden">
<span>
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
(<a href="#" id="bz_assignee_edit_action">изменить</a>)
[% IF bug.assigned_to.id != user.id %]
(<a title="Взять исполнение на себя"
href="#" id="bz_assignee_take_action">взять на себя</a>)
[% END %]
</span>
</div>
<div id="bz_assignee_input">
[% INCLUDE global/userselect.html.tmpl
id => "assigned_to"
name => "assigned_to"
value => bug.assigned_to.login
classes => ["bz_userfield"]
size => 30
%]
<br>
<input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
<label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
</div>
<script type="text/javascript">
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
'bz_assignee_edit_action',
'assigned_to',
'[% bug.assigned_to.login FILTER js %]' );
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
'bz_assignee_take_action',
'assigned_to',
'[% bug.assigned_to.login FILTER js %]',
'[% user.login FILTER js %]' );
initDefaultCheckbox('assignee');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
[% END %]
</td>
</tr>
[% IF Param('useqacontact') %]
<tr>
[% can_edit_qa_contact = bug.check_can_change_field("qa_contact", 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.qa_contact
editable = can_edit_qa_contact
accesskey = "q"
%]
<td>
[% IF can_edit_qa_contact %]
<div id="bz_qa_contact_edit_container" class="bz_default_hidden">
<span>
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
(<a href="#" id="bz_qa_contact_edit_action">изменить</a>)
[% IF bug.qa_contact.id != user.id %]
(<a title="Взять приемку на себя"
href="#" id="bz_qa_contact_take_action">взять на себя</a>)
[% END %]
</span>
</div>
<div id="bz_qa_contact_input">
[% INCLUDE global/userselect.html.tmpl
id => "qa_contact"
name => "qa_contact"
value => bug.qa_contact.login
size => 30
classes => ["bz_userfield"]
emptyok => 1
%]
<br>
<input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
<label for="set_default_qa_contact" id="set_default_qa_contact_label">Вернуть ответственному за приемку по умолчанию</label>
</div>
<script type="text/javascript">
hideEditableField('bz_qa_contact_edit_container',
'bz_qa_contact_input',
'bz_qa_contact_edit_action',
'qa_contact',
'[% bug.qa_contact.login FILTER js %]');
hideEditableField('bz_qa_contact_edit_container',
'bz_qa_contact_input',
'bz_qa_contact_take_action',
'qa_contact',
'[% bug.qa_contact.login FILTER js %]',
'[% user.login FILTER js %]');
initDefaultCheckbox('qa_contact');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
[% END %]
</td>
</tr>
[% END %]
<script type="text/javascript">
assignToDefaultOnChange(['product', 'component'],
'[% bug.component_obj.default_assignee.login FILTER js %]',
'[% bug.component_obj.default_qa_contact.login FILTER js %]');
</script>
[% END %]
[%############################################################################%]
[%# Block for URL Keyword and Whiteboard #%]
[%############################################################################%]
[% BLOCK section_url_keyword_whiteboard %]
<tr>
[% can_edit_bug_file_loc = bug.check_can_change_field("bug_file_loc", 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.bug_file_loc
editable = can_edit_bug_file_loc
accesskey = "u"
%]
<td>
[% IF can_edit_bug_file_loc %]
<span id="bz_url_edit_container" class="bz_default_hidden">
[% IF is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]">
[% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
[% ELSE %]
[% bug.bug_file_loc FILTER html %]
[% END %]
(<a href="#" id="bz_url_edit_action">изменить</a>)</span>
[% END %]
<span id="bz_url_input_area">
[% url_output = INCLUDE input no_td = 1 inputname = "bug_file_loc" size = 40 %]
[% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1)
AND is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]"
rel="noreferrer">[% url_output FILTER none %]</a>
[% ELSE %]
[% url_output FILTER none %]
[% END %]
</span>
[% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
<script type="text/javascript">
hideEditableField('bz_url_edit_container',
'bz_url_input_area',
'bz_url_edit_action',
'bug_file_loc',
"[% bug.bug_file_loc FILTER js %]");
</script>
[% END %]
</td>
</tr>
[% IF Param('usestatuswhiteboard') %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.status_whiteboard
editable = bug.check_can_change_field("status_whiteboard", 0, 1)
accesskey = "w"
%]
[% INCLUDE input inputname = "status_whiteboard" size = 40 %]
</tr>
[% END %]
[% IF use_keywords %]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.keywords, value = bug.keywords
editable = bug.check_can_change_field("keywords", 0, 1),
desc_url = "describekeywords.cgi", possible_values = all_keywords
%]
</tr>
[% END %]
[% IF user.id %]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.tag, value = bug.tags.join(", "),
editable = 1, possible_values = user.tags.keys
%]
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Duplicates #%]
[%############################################################################%]
[% BLOCK section_duplicates %]
[% RETURN UNLESS bug.duplicates.size %]
<tr>
<th class="field_label">
<label>Duplicates ([% bug.duplicates.size %])</label>:
</th>
<td class="field_value">
<span id="duplicates">
[% FOREACH dupe = bug.duplicates %]
[% INCLUDE bug/link.html.tmpl bug = dupe, link_text = dupe.id, use_alias = 1 %][% " " %]
[% END %]
</span>
(<a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]">
[%-%]показать как список [% terms.bug %]</a>)
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for Depends On / Blocks #%]
[%############################################################################%]
[% BLOCK section_dependson_blocks %]
<tr>
[% INCLUDE dependencies
field = bug_fields.dependson deps = bug.depends_on_obj %]
</tr>
<tr>
[% INCLUDE dependencies
field = bug_fields.blocked deps = bug.blocks_obj %]
</tr>
[% IF bug.dependson.size || bug.blocked.size %]
<tr>
<th>&nbsp;</th>
<td id="show_dependency_tree_or_graph">
Показать <a href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">дерево</a>
[% IF Param('webdotbase') %]
/&nbsp;<a href="showdependencygraph.cgi?id=[% bug.bug_id %]">диаграмму</a>
[% END %] зависимостей
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Restricting Visibility #%]
[%############################################################################%]
[% BLOCK section_restrict_visibility %]
[% RETURN UNLESS bug.groups.size %]
<div class="bz_group_visibility_section">
[% inallgroups = 1 %]
[% inagroup = 0 %]
[% emitted_description = 0 %]
[% FOREACH group = bug.groups %]
[% SET inallgroups = 0 IF NOT group.ingroup %]
[% SET inagroup = 1 IF group.ison %]
[% NEXT IF group.mandatory %]
[% IF NOT emitted_description %]
[% emitted_description = 1 %]
<div id="bz_restrict_group_visibility_help">
<b>Только пользователи, входящие
[%+ IF Param('or_groups') %]
хотя бы в одну из выбранных групп,
[% ELSE %]
во все выбранные группы,
[% END %]
могут просматривать эту [% terms.bug_acc %]:</b>
<p class="instructions">
Если не выбрана ни одна группа, то [% terms.bug %] доступна всем пользователям.
</p>
</div>
[% END %]
[% IF group.ingroup %]
<input type="hidden" name="defined_groups"
value="[% group.name FILTER html %]">
[% END %]
<input type="checkbox" value="[% group.name FILTER html %]"
name="groups" id="group_[% group.bit %]"
[% ' checked="checked"' IF group.ison %]
[% ' disabled="disabled"' IF NOT group.ingroup %]>
<label for="group_[% group.bit %]">
[%- group.description FILTER html_light %]</label>
<br>
[% END %]
[% IF emitted_description %]
[% IF NOT inallgroups %]
<p class="instructions">Только члены группы могут управлять видимостью
[% terms.abug %] для этой группы.</p>
[% END %]
[% END %]
[% IF inagroup %]
<div id="bz_enable_role_visibility_help">
<b>Пользователям выбранных ролей [% terms.bug %] видима всегда:</b>
</div>
<div id="bz_enable_role_visibility">
<div>
[% user_can_edit_accessible =
bug.check_can_change_field("reporter_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_reporter_accessible" value="1">
[% END %]
<input type="checkbox" value="1"
name="reporter_accessible" id="reporter_accessible"
[% " checked" IF bug.reporter_accessible %]
[% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
<label for="reporter_accessible">Инициатор</label>
</div>
<div>
[% user_can_edit_accessible =
bug.check_can_change_field("cclist_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_cclist_accessible" value="1">
[% END %]
<input type="checkbox" value="1"
name="cclist_accessible" id="cclist_accessible"
[% " checked" IF bug.cclist_accessible %]
[% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
<label for="cclist_accessible">Подписчики</label>
</div>
<p class="instructions">
Исполнитель
[% IF (Param('useqacontact')) %]
и ответственный за приемку
[% END %]
всегда имеют доступ к [% terms.abug %]. Данная настройка действует
если видимость [% terms.bug %] ограничена некоторой группой.
</p>
</div>
[% END %]
</div> [%# bz_group_visibility_section %]
[% END %]
[%############################################################################%]
[%# Block for Dates #%]
[%############################################################################%]
[% BLOCK section_dates %]
<tr>
<th class="field_label">
Зарегистрирована:
</th>
<td>
[% bug.creation_ts FILTER time("%Y-%m-%d %H:%M %Z") %] пользователем [% INCLUDE global/user.html.tmpl who = bug.reporter %]
</td>
</tr>
<tr>
<th class="field_label">
Изменена:
</th>
<td>
[% bug.delta_ts FILTER time("%Y-%m-%d %H:%M %Z") %]
(<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]История изменений</a>)
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for CC LIST #%]
[%############################################################################%]
[% BLOCK section_cclist %]
<tr>
<th class="field_label">
<label [% IF user.id %]for="newcc"[% END %] accesskey="a">
Подписчики::
</label>
</th>
<td>
[% IF user.id %]
[% IF NOT bug.cc.contains(user.login) %]
<input type="checkbox" id="addselfcc" name="addselfcc"
[% " checked=\"checked\""
IF user.settings.state_addselfcc.value == 'always'
|| (!bug.user.has_any_role
&& user.settings.state_addselfcc.value == 'cc_unless_role') %]>
<label for="addselfcc">Добавить себя</label>
<br>
[% END %]
[% END %]
[% bug.cc.size FILTER html %]
[% IF bug.cc.size == 1 %]
пользователь
[% ELSE %]
пользователей
[% END %]
[% IF user.id %]
[% IF bug.cc.contains( user.email ) %]
(включая себя)
[% END %]
[% END %]
[% IF user.id || bug.cc.size %]
<span id="cc_edit_area_showhide_container" class="bz_default_hidden">
(<a href="#" id="cc_edit_area_showhide">[% IF user.id %]изменить[% ELSE %]показать[% END %]</a>)
</span>
[% END %]
<div id="cc_edit_area">
<br>
[% IF user.id %]
<div>
<div><label for="cc"><b>Подписать</b></label></div>
[% INCLUDE global/userselect.html.tmpl
id => "newcc"
name => "newcc"
value => ""
size => 30
classes => ["bz_userfield"]
multiple => 5
%]
</div>
[% END %]
[% IF bug.cc.size %]
<select id="cc" multiple="multiple" size="5" [% 'name="cc"' IF bug.user.canedit %]>
[% FOREACH c = bug.cc %]
<option value="[% c FILTER email FILTER html %]">
[% c FILTER email FILTER html %]</option>
[% END %]
</select>
[% IF user.id && !bug.user.canedit %]
<input type="hidden" name="cc" value="[% user.login FILTER email FILTER html %]">
[% END %]
[% IF user.id AND (bug.user.canedit OR bug.cc.contains(user.login)) %]
<br>
<input type="checkbox" id="removecc" name="removecc">
<label for="removecc">
[% IF bug.user.canedit %]
Отменить подписку выбранных пользователей
[% ELSE %]
Отменить мою подписку
[% END %]
</label>
<br>
[% END %]
[% END %]
</div>
[% IF user.id || bug.cc.size %]
<script type="text/javascript">
hideEditableField( 'cc_edit_area_showhide_container',
'cc_edit_area',
'cc_edit_area_showhide',
'',
'');
</script>
[% END %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for Bug Ignored #%]
[%############################################################################%]
[% BLOCK section_bug_ignored %]
[% IF user.id %]
<tr>
<th class="field_label">
<label for="bug_ignored" title="Ignore all email for this [% terms.bug %]">
Игнорировать [% terms.bug_acc %]:
</label>
</th>
<td>
<input type="hidden" name="defined_bug_ignored" value="1">
<span title="Вы по прежнему будете получать уведомления о запросах согласования по этой ошибке.">
<input type="checkbox" name="bug_ignored" id="bug_ignored" value="1"
[% ' checked="checked"' IF user.is_bug_ignored(bug.id) %]>
(не присылать мне уведомления по этой [% terms.bug_dat %])
</span>
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for See Also #%]
[%############################################################################%]
[% BLOCK section_see_also %]
[% IF Param('use_see_also') || bug.see_also.size %]
<tr>
[% INCLUDE bug/field.html.tmpl
field = bug_fields.see_also
value = bug.see_also
editable = bug.check_can_change_field('see_also', 0, 1)
%]
</tr>
[% END %]
[% END %]
[% BLOCK section_aliases %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.alias %]
<td>
[% IF bug.alias.size %]
[% bug.alias.join(', ') FILTER html %]
[% ELSE %]
None
[% END %]
[% IF bug.check_can_change_field('alias', 0, 1) %]
<span id="alias_edit_area_showhide_container" class="bz_default_hidden">
(<a href="#" id="alias_edit_area_showhide">edit</a>)
</span>
<br>
<div id="alias_edit_area">
<div>
<label for="newalias" class="field_label">Add</label>
<br>
<input name="newalias" id="newalias" size="20">
</div>
[% IF bug.alias.size %]
<select id="alias" name="alias" multiple="multiple" size="5">
[% FOREACH a = bug.alias %]
<option value="[% a FILTER html %]">[% a FILTER html %]</option>
[% END %]
</select>
<br>
<input type="checkbox" id="removealias" name="removealias">
<label for="removealias">Remove selected aliases</label>
[% END %]
</div>
<script type="text/javascript">
hideEditableField( 'alias_edit_area_showhide_container',
'alias_edit_area',
'alias_edit_area_showhide',
'',
'');
</script>
[% END %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for FLAGS #%]
[%############################################################################%]
[% BLOCK section_flags %]
[%# *** Flags *** %]
[% show_bug_flags = 0 %]
[% bug_flags_set = 0 %]
[% show_more_flags = 0 %]
[% FOREACH type = bug.flag_types %]
[% IF type.flags.size || (user.id && type.is_active && user.can_request_flag(type)) %]
[% show_bug_flags = 1 %]
[% END %]
[% IF user.id && type.is_active && (!type.flags.size || type.is_multiplicable) %]
[% show_more_flags = 1 %]
[% END %]
[% IF type.flags.size %]
[% bug_flags_set = 1 %]
[% END %]
[% LAST IF show_bug_flags && show_more_flags && bug_flags_set %]
[% END %]
[% IF show_bug_flags %]
<tr>
<th class="field_label">
<label>Согласования:</label>
</th>
<td>
[% IF bug.flag_types.size %]
[% PROCESS "flag/list.html.tmpl" flag_no_header = 1
flag_types = bug.flag_types
any_flags_requesteeble = bug.any_flags_requesteeble %]
[% END %]
[% IF show_more_flags %]
<span id="bz_flags_more_container" class="bz_default_hidden">
[% IF !bug_flags_set %]<em>Ещё не установлены</em>[% END %]
(<a href="#" id="bz_flags_more_action">[% IF !bug_flags_set %]послать на[% ELSE %]добавить[% END %] согласование</a>)
</span>
<script type="text/javascript">
YAHOO.util.Dom.removeClass('bz_flags_more_container', 'bz_default_hidden');
var table = YAHOO.util.Dom.get("flags");
var rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody', table);
for (var i = 0; i < rows.length; i++) {
YAHOO.util.Dom.addClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.addListener('bz_flags_more_action', 'click', function (e) {
YAHOO.util.Dom.addClass('bz_flags_more_container', 'bz_default_hidden');
for (var i = 0; i < rows.length; i++) {
YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.preventDefault(e);
});
</script>
[% END %]
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Custom Fields #%]
[%############################################################################%]
[% BLOCK section_customfields %]
[%# *** Custom Fields *** %]
[% USE Bugzilla %]
[% FOREACH field = Bugzilla.active_custom_fields %]
<tr>
[%# Use PROCESS instead of INCLUDE, because extra_field_item is defined
# in the template and must be returned back. INCLUDE cannot do that. %]
[% PROCESS bug/field.html.tmpl value = bug.${field.name}
editable = bug.check_can_change_field(field.name, 0, 1) %]
</tr>
[% IF extra_field_item %]
<tr>
<th class="field_label">[% extra_field_item.header FILTER none %]</th>
<td>[% extra_field_item.data FILTER none %]</td>
</tr>
[% END %]
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Section Spacer #%]
[%############################################################################%]
[% BLOCK section_spacer %]
<tr>
<td colspan="2" class="bz_section_spacer"></td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for dependencies #%]
[%############################################################################%]
[% BLOCK dependencies %]
[% INCLUDE "bug/field-label.html.tmpl" %]
<td>
<span id="[% field.name FILTER html %]_input_area">
[% IF bug.check_can_change_field(field.name, 0, 1) %]
<input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" class="text_input"
value="[% bug.${field.name}.join(', ') FILTER html %]">
[% END %]
</span>
[% FOREACH dep_bug = deps %]
[% INCLUDE bug/link.html.tmpl bug = dep_bug, link_text = dep_bug.id, use_alias = 1 %][% " " %]
[% END %]
[% IF bug.check_can_change_field(field.name, 0, 1) %]
<span id="[% field.name FILTER html %]_edit_container"
class="edit_me bz_default_hidden">
(<a href="#" id="[% field.name FILTER html %]_edit_action">изменить</a>)
</span>
<script type="text/javascript">
hideEditableField('[% field.name FILTER js %]_edit_container',
'[% field.name FILTER js %]_input_area',
'[% field.name FILTER js %]_edit_action',
'[% field.name FILTER js %]',
'[% bug.${field.name}.join(', ') FILTER js %]');
</script>
[% END %]
</td>
[% END %]
[%############################################################################%]
[%# Block for Time Tracking Group #%]
[%############################################################################%]
[% BLOCK section_timetracking %]
<table class="bz_time_tracking_table">
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.estimated_time, editable = 1
%]
<th>
Текущая оценка:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.work_time, editable = 1
%]
<th>
Продуктивное время:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.remaining_time, editable = 1
%]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.percentage_complete
%]
<th>
Отклонение:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.deadline, editable = 1
%]
</tr>
<tr>
<td>
<input name="estimated_time" id="estimated_time"
value="[% PROCESS formattimeunit
time_unit=bug.estimated_time %]"
size="6" maxlength="6">
</td>
<td>
[% PROCESS formattimeunit
time_unit=(bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.actual_time %] +
<input name="work_time" id="work_time"
value="0" size="3" maxlength="6"
onchange="adjustRemainingTime();">
</td>
<td>
<input name="productive_time" id="productive_time"
value="0" size="3" maxlength="6">
</td>
<td>
<input name="remaining_time" id="remaining_time"
value="[% PROCESS formattimeunit
time_unit=bug.remaining_time %]"
size="6" maxlength="6" onchange="updateRemainingTime();">
</td>
<td>
[% PROCESS calculatepercentage act=bug.actual_time
rem=bug.remaining_time %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% INCLUDE bug/field.html.tmpl
field = bug_fields.deadline, value = bug.deadline, no_tds = 1
editable = bug.check_can_change_field('deadline', 0, 1) %]
</td>
</tr>
<tr>
<td colspan="7" class="bz_summarize_time">
<a href="summarize_time.cgi?id=[% bug.bug_id %]&amp;do_depends=1">
Анализ трудозатрат (с учетом зависимостей [% terms.bugs_gen %],
блокирующих эту [% terms.bug_acc %])</a>
</td>
</tr>
</table>
[% END %]
[%############################################################################%]
[%# Block for the Additional Comments box #%]
[%############################################################################%]
[% BLOCK comment_box %]
<div id="add_comment" class="bz_section_additional_comments">
[% IF user.id %]
<label for="comment" accesskey="c"><b>Дополнительные
<u>К</u>омментарии</b></label>:
[% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
<input type="checkbox" name="comment_is_private" value="1"
id="newcommentprivacy"
onClick="updateCommentTagControl(this, 'comment')">
<label for="newcommentprivacy">
Сделать комментарий конфиденциальным (только для членов группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
[% END %]
<!-- This table keeps the submit button aligned with the box. -->
<table><tr><td>
[% IF bug.check_can_change_field('longdesc', 0, 1) %]
[% INCLUDE bug/comment.html.tmpl
minrows = 10
maxrows = 25
cols = constants.COMMENT_COLS
%]
[% IF user.is_insider %]
<script>
updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
</script>
[% END %]
[% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
[% ELSE %]
Вам не разрешено добавлять дополнительные комментарии в эту [% terms.bug %].
[% END %]
<br>
[% PROCESS commit_button id=""%]
[% Hook.process("after_comment_commit_button", 'bug/edit.html.tmpl') %]
<table id="bug_status_bottom" class="status">
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#bug_status">Состояние</a>:
</th>
<td>
[% PROCESS bug/knob.html.tmpl %]
</td>
</tr>
</table>
</td></tr></table>
[%# For logged-out users %]
[% ELSE %]
<table>
<tr>
<td>
<fieldset>
<legend>Внимание</legend>
Вы должны
<a href="show_bug.cgi?id=
[%- bug.bug_id %]&amp;GoAheadAndLogIn=1">войти в систему</a>
для добавления комментариев и внесения изменений в эту [% terms.bug %].
</fieldset>
</td>
</tr>
</table>
[% END %]
</div>
[% END %]
[%############################################################################%]
[%# Block for SELECT fields #%]
[%############################################################################%]
[% BLOCK select %]
<td>
[% IF bug.check_can_change_field(selname, 0, 1)
AND bug.choices.${selname}.size > 1 %]
<input type="hidden" id="[% selname %]_dirty">
<select id="[% selname %]" name="[% selname %]">
[% FOREACH x = bug.choices.${selname} %]
<option value="[% x.name FILTER html %]"
[% " selected" IF x.name == bug.${selname} %]>
[%- x.name FILTER html %]
</option>
[% END %]
</select>
[% ELSE %]
[% bug.${selname} FILTER html %]
[% END %]
</td>
[% END %]
[%############################################################################%]
[%# Block for INPUT fields #%]
[%############################################################################%]
[% BLOCK input %]
[% IF no_td != 1 %]
<td[% " colspan=\"$colspan\"" IF colspan %]>
[% END %]
[% val = value ? value : bug.$inputname %]
[% IF bug.check_can_change_field(inputname, 0, 1) %]
<input id="[% inputname %]" name="[% inputname %]" class="text_input"
value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
[% " maxlength=\"$maxlength\"" IF maxlength %]
[% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
[% ELSE %]
[% IF size && val.length > size %]
<span title="[% val FILTER html %]">
[% val FILTER truncate(size) FILTER html %]
</span>
[% ELSE %]
[% val FILTER html %]
[% END %]
[% END %]
[% IF no_td != 1 %]
</td>
[% END %]
[% no_td = 0 %]
[% maxlength = 0 %]
[% colspan = 0 %]
[% size = 0 %]
[% value = undef %]
[% spellcheck = undef %]
[% END %]
[% BLOCK commit_button %]
[% IF user.id %]
<div class="knob-buttons">
<input type="submit" value="Сохранить"
id="commit[% id FILTER css_class_quote %]">
</div>
[% END %]
[% END %]
<link rel="stylesheet" type="text/css" href="js/etersoft/timersplash.css" />
<div style="display: none;" id="useremail" class="[% user.email FILTER html %]"></div>
<div style="display: none;" id="assigntoemail" class="[% bug.assigned_to.email FILTER html %]"></div>
<!-- Таймер -->
<div id="timerblock" title="Время на странице">
<img src="js/etersoft/control_pause.gif" id="timer_pause" onclick="timer.togglePause()" title="Пауза" />
<img src="js/etersoft/control_right.gif" id="timer_play" onclick="timer.togglePause()" title="Продолжить" />
<img src="js/etersoft/control_stop.gif" id="timer_stop" onclick="if (confirm('Вы точно хотите сбросить таймер?')) {timer.reset();}" title="Сбросить таймер" />
<input type="text" size="10" title="Время на странице" id='timespent' name="timespent" value="" readonly="readonly">
</div>
<!-- Сохранение времени -->
<div id="timeQuestionDiv">
<strong>Укажите отработанное время</strong>
<div name="worktimediv">
<nobr>Отработанное время (в минутах):
<input type="text" id='realworktime' name="realworktime" onchange='update_remain();' onkeydown="javascript:if(13==event.keyCode){premysubmit(-1); return false;}; if(27==event.keyCode){getElementById('timeQuestionDiv').style.display = 'none'; return false;}" />
<a onclick="premysubmit(-1);">Сохранить</a></p>
</nobr>
<div id='id_remain_time' class='div_hide'>Оставшееся время (в часах):
<input type="text" id="realremaintime" name="realremaintime" onchange='changed_remain = 1; update_remain();' onkeydown="javascript:if(13==event.keyCode){return false;}" />
</div>
<div id='message' class='div_hide'>
<p>Отслеживайте корректность оставшегося времени.</p>
</div>
<div id='message_warning' class='div_hide' color='red'>
<p>Внимание! Оставшееся время равно 0.<br>Если задача ещё не решена, то укажите необходимое для её решения время.</p>
</div>
</div>
<div>
<p><a onclick="premysubmit(-1);">Сохранить значение из поля</a></p>
<p><a onclick="premysubmit(5);">Сохранить 5 минут</a></p>
<p><a onclick="premysubmit(15);">Сохранить 15 минут</a></p>
<p><a onclick="premysubmit(30);">Сохранить 30 минут</a></p>
<p><a onclick="closeDiv();">Закрыть</a></p>
</div>
</div>
<script language="javascript" type="text/javascript" src="js/etersoft/timer_common.js?25_10_2017"></script>
<script language="javascript" type="text/javascript" src="js/etersoft/timer.js?22_11_2017"></script>
<link rel="stylesheet" type="text/css" href="js/etersoft/timersplash.css" />
<div style="display: none;" id="useremail" class="[% user.email FILTER html %]"></div>
<div style="display: none;" id="assigntoemail" class="[% bug.assigned_to.email FILTER html %]"></div>
<!-- Таймер -->
<div id="timerblock" title="Время на странице">
<img src="js/etersoft/control_pause.gif" id="timer_pause" onclick="timer.togglePause()" title="Пауза" />
<img src="js/etersoft/control_right.gif" id="timer_play" onclick="timer.togglePause()" title="Продолжить" />
<img src="js/etersoft/control_stop.gif" id="timer_stop" onclick="if (confirm('Вы точно хотите сбросить таймер?')) {timer.reset();}" title="Сбросить таймер" />
<input type="text" size="10" title="Время на странице" id='timespent' name="timespent" value="" readonly="readonly">
</div>
<!-- Сохранение времени -->
<div id="timeQuestionDiv">
<div class="container">
<div class="workTime">
<h3>Укажите отработанное время</h3>
<h4>Отслеживайте корректность оставшегося времени.</h4>
<fieldset>
Отработанное время:
<div class="workTimeInner">
<input class="workTime__input" id="realworktime" name="realworktime" placeholder="в минутах" title="Время в минутах" type="text" tabindex="1" required autofocus>
<button class="workTime__button" data-time="1">1</button>
<button class="workTime__button" data-time="5">5</button>
<button class="workTime__button" data-time="15">15</button>
<button class="workTime__button" data-time="30">30</button>
</div>
</fieldset>
<fieldset>
Продуктивное время:
<input id="ProductTime" placeholder="в минутах" title="Время в минутах" type="text" tabindex="2">
</fieldset>
<fieldset>
<button class="workTime__button" id="saveTime">Сохранить</button>
</fieldset>
<a onclick="closeDiv();" class="close"></a>
</div>
</div>
</div>
<script language="javascript" type="text/javascript" src="js/etersoft/timer_common.js?25_10_2017"></script>
<script language="javascript" type="text/javascript" src="js/etersoft/timer.js?22_11_2017"></script>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment