Fix on enter keyup event form submitting. Update BZ_ROOT_DIR

parent f5887e7c
...@@ -35,7 +35,7 @@ use warnings; ...@@ -35,7 +35,7 @@ use warnings;
# # # #
####################################################################### #######################################################################
use constant BZ_ROOT_DIR => '/usr/share/bugzilla/lib'; use constant BZ_ROOT_DIR => '/var/www/bugs.etersoft.ru';
use constant BZ_LIB_DIR => BZ_ROOT_DIR . '/lib'; use constant BZ_LIB_DIR => BZ_ROOT_DIR . '/lib';
####################################################################### #######################################################################
......
//Номер баги //Номер баги
var bugId = getIdFromUrl() || getBugIdFromField(); var bugId = getIdFromUrl() || getBugIdFromField();
// Если id нет, то мы имеем дело с новой багой // Если id нет, то мы имеем дело с новой багой
if (!bugId) { if (!bugId) {
// Присвоим текущее время, чтобы при создании следующей баги значения не сохранились // Присвоим текущее время, чтобы при создании следующей баги значения не сохранились
bugId = "c" + new Date().getTime(); bugId = "c" + new Date().getTime();
} }
var protocol = window.location.protocol; var protocol = window.location.protocol;
//Изменение баги //Изменение баги
var changed_remain = 0; var changed_remain = 0;
//Создание баги //Создание баги
var etersoft_create = window.location.href.search("enter") !== -1 ? 1 : 0; var etersoft_create = window.location.href.search("enter") !== -1 ? 1 : 0;
// Объект таймера, создается при инициализации // Объект таймера, создается при инициализации
// Подробнее про таймер см. timer_common.js // Подробнее про таймер см. timer_common.js
var timer; var timer;
// Интервал обновления таймера в мс, на точность не влияет // Интервал обновления таймера в мс, на точность не влияет
var UPDATE_INTERVAL = 1000; var UPDATE_INTERVAL = 1000;
function initTimer() { function initTimer() {
// Показываем время только сотрудникам Etersoft // Показываем время только сотрудникам Etersoft
if (!isetersoft()) return; if (!isetersoft()) return;
document.getElementById("timerblock").style.display = "block"; document.getElementById("timerblock").style.display = "block";
timer = new Timer("bug:" + protocol + bugId, updateTimer); timer = new Timer("bug:" + protocol + bugId, updateTimer);
timer.setAutoUpdate(UPDATE_INTERVAL); timer.setAutoUpdate(UPDATE_INTERVAL);
} }
// this при вызове - объект таймера // this при вызове - объект таймера
function updateTimer() { function updateTimer() {
setPauseDisplay(this.isPaused()); setPauseDisplay(this.isPaused());
document.querySelector("#timespent").value = this.getFormattedString(); document.querySelector("#timespent").value = this.getFormattedString();
} }
//Установка в поле отработанного времени в минутах //Установка в поле отработанного времени в минутах
function setWorkTime(manualTime) { function setWorkTime(manualTime) {
var minutes = Math.ceil(timer.getElapsedSeconds() / 60); var minutes = Math.ceil(timer.getElapsedSeconds() / 60);
document.querySelector("#realworktime").value = manualTime document.querySelector("#realworktime").value = manualTime
? manualTime ? manualTime
: minutes; : minutes;
} }
function setPauseDisplay(pause) { function setPauseDisplay(pause) {
document.querySelector("#timespent").style.color = pause ? "gray" : "black"; document.querySelector("#timespent").style.color = pause ? "gray" : "black";
document.querySelector("#timer_pause").style.visibility = pause document.querySelector("#timer_pause").style.visibility = pause
? "hidden" ? "hidden"
: "visible"; : "visible";
document.querySelector("#timer_play").style.visibility = pause document.querySelector("#timer_play").style.visibility = pause
? "visible" ? "visible"
: "hidden"; : "hidden";
} }
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
function showDiv() { function showDiv() {
document.querySelector("#timeQuestionDiv").style.display = "block"; document.querySelector("#timeQuestionDiv").style.display = "block";
document.querySelector("#realworktime").focus(); document.querySelector("#realworktime").focus();
} }
function closeDiv() { function closeDiv() {
document.querySelector("#timeQuestionDiv").style.display = "none"; document.querySelector("#timeQuestionDiv").style.display = "none";
} }
/* Получение номера баги из поля */ /* Получение номера баги из поля */
function getBugIdFromField() { function getBugIdFromField() {
var field = document.querySelector("#changeform input[name=id]"); var field = document.querySelector("#changeform input[name=id]");
if (field) { if (field) {
return parseInt(field.value); return parseInt(field.value);
} }
return false; return false;
} }
//////////////////////////////////////////// ////////////////////////////////////////////
//Является ли пользователь сотрудником Etersoft //Является ли пользователь сотрудником Etersoft
function isetersoft() { function isetersoft() {
var email = document.getElementById("useremail").className; var email = document.getElementById("useremail").className;
if (!email) return false; if (!email) return false;
var domain = email.split("@")[1]; var domain = email.split("@")[1];
return domain === "etersoft.ru"; return domain === "etersoft.ru";
} }
//Является ли пользователь ответственным //Является ли пользователь ответственным
function isworker() { function isworker() {
var useremail = document.getElementById("useremail"); var useremail = document.getElementById("useremail");
var assigntoemail = document.getElementById("assigntoemail"); var assigntoemail = document.getElementById("assigntoemail");
var email = useremail.className; var email = useremail.className;
var assignemail = assigntoemail.className; var assignemail = assigntoemail.className;
return email == assignemail; return email == assignemail;
} }
window.addEventListener("load", function() { window.addEventListener("load", function() {
function getTimespentValue() { function getTimespentValue() {
let timespent = document.querySelector("#timespent").value; let timespent = document.querySelector("#timespent").value;
let timespentValue = timespent.split(":"); let timespentValue = timespent.split(":");
// let's calc how many time is spent in minutes // let's calc how many time is spent in minutes
let hours = parseInt(timespentValue[0]) * 60; let hours = parseInt(timespentValue[0]) * 60;
let minutes = parseInt(timespentValue[1]); let minutes = parseInt(timespentValue[1]);
let seconds = Math.round(parseInt(timespentValue[2]) / 60); let seconds = Math.round(parseInt(timespentValue[2]) / 60);
timespentValue = hours + minutes + seconds; timespentValue = hours + minutes + seconds;
return timespentValue; return timespentValue;
} }
// add listener for comment commit // add listener for comment commit
let openButton = document.querySelector("#commit"); let openButton = document.querySelector("#commit");
let closeButton = document.querySelectorAll("#timeQuestionDiv .close"); let closeButton = document.querySelectorAll("#timeQuestionDiv .close");
let dialog = document.querySelector("#timeQuestionDiv"); let dialog = document.querySelector("#timeQuestionDiv");
openButton.addEventListener("click", function(event) { openButton.addEventListener("click", function(event) {
// cancel form submiting // cancel form submiting
event.preventDefault(); event.preventDefault();
let timespentValue = getTimespentValue(); let timespentValue = getTimespentValue();
dialog.style.display = "block"; dialog.style.display = "block";
focusManager.capture(dialog); focusManager.capture(dialog);
// write work time in input value // write work time in input value
document.querySelector("#realworktime").value = document.querySelector("#realworktime").value =
localStorage.time === undefined ? timespentValue : localStorage.time; localStorage.time === undefined ? timespentValue : localStorage.time;
document.querySelector("#saveTime").dataset["time"] = timespentValue; document.querySelector("#saveTime").dataset["time"] = timespentValue;
}); });
let openButtonTop = document.getElementById("commit_top"); let openButtonTop = document.getElementById("commit_top");
if (openButtonTop) { if (openButtonTop) {
openButtonTop.addEventListener("click", function(event) { openButtonTop.addEventListener("click", function(event) {
// cancel form submiting // cancel form submiting
event.preventDefault(); event.preventDefault();
let timespentValue = getTimespentValue(); let timespentValue = getTimespentValue();
dialog.style.display = "block"; dialog.style.display = "block";
focusManager.capture(dialog); focusManager.capture(dialog);
// write work time in input value // write work time in input value
document.querySelector("#realworktime").value = document.querySelector("#realworktime").value =
localStorage.time === undefined ? timespentValue : localStorage.time; localStorage.time === undefined ? timespentValue : localStorage.time;
document.querySelector("#saveTime").dataset["time"] = timespentValue; document.querySelector("#saveTime").dataset["time"] = timespentValue;
}); });
} }
document document
.querySelector("#realworktime") .querySelector("#realworktime")
.addEventListener("change", function() { .addEventListener("change", function() {
document.querySelector("#saveTime").dataset["time"] = this.value; document.querySelector("#saveTime").dataset["time"] = this.value;
localStorage.time = this.value; localStorage.time = this.value;
console.log( console.log(
"time changed:", "time changed:",
document.querySelector("#saveTime").dataset["time"] document.querySelector("#saveTime").dataset["time"]
); );
}); });
document.querySelector("#realworktime").addEventListener("paste", function() { document.querySelector("#realworktime").addEventListener("paste", function() {
document.querySelector("#saveTime").dataset["time"] = this.value; document.querySelector("#saveTime").dataset["time"] = this.value;
localStorage.time = this.value; localStorage.time = this.value;
console.log( console.log(
"time changed:", "time changed:",
document.querySelector("#saveTime").dataset["time"] document.querySelector("#saveTime").dataset["time"]
); );
}); });
// add listener for time commit // add listener for enter key down to work time input
let btn = document.querySelector("#saveTime"); document.querySelector("#realworktime").addEventListener("keyup", (event) => {
if (event.key === "Enter") {
btn.addEventListener("click", function(event) { document.querySelector("#realworktime").blur();
// cancel form submiting document.querySelector("#ProductTime").focus();
event.preventDefault(); }
});
// let's calc time for #work_time input
let workTime = parseInt(document.querySelector("#realworktime").value); // add listener for enter key down to productive time input
workTime = document.querySelector("#ProductTime").addEventListener("keyup", () => {
workTime === parseInt(btn.dataset["time"]) if (event.key === "Enter") {
? parseInt(btn.dataset["time"]) document.querySelector("#saveTime").click();
: workTime; }
workTime = workTime > 0 ? workTime : 0; });
let workTimeValue = Math.ceil((workTime / 60) * 100) / 100;
let productiveTime = parseInt(document.querySelector("#ProductTime").value); // add listener for time commit
productiveTime = productiveTime > 0 ? productiveTime : workTime; let btn = document.querySelector("#saveTime");
let productiveTimeValue = Math.ceil((productiveTime / 60) * 100) / 100;
document.querySelector("#work_time").value = workTimeValue; btn.addEventListener("click", function(event) {
document.querySelector("#productive_time").value = productiveTimeValue; // cancel form submiting
event.preventDefault();
// now we ready for submiting all forms
let mainCommitBtn = document.querySelector("#commit_top"); // let's calc time for #work_time input
let workTime = parseInt(document.querySelector("#realworktime").value);
// check comment before submit workTime =
let comment = document.querySelector("#comment").value; workTime === parseInt(btn.dataset["time"])
? parseInt(btn.dataset["time"])
if (comment.length !== 0) { : workTime;
if (comment.length < 9) { workTime = workTime > 0 ? workTime : 0;
alert("Слишком короткий комментарий"); let workTimeValue = Math.ceil((workTime / 60) * 100) / 100;
} else if (productiveTimeValue > 8 || workTimeValue > 8) { let productiveTime = parseInt(document.querySelector("#ProductTime").value);
alert( productiveTime = productiveTime > 0 ? productiveTime : workTime;
"Недопустимо указывать отработанное/продуктивное время более восьми часов. Правильным следованием рабочему процессу было бы выполнение работы по частям, о каждой из которых будет написано отдельно."
); let productiveTimeValue = Math.ceil((productiveTime / 60) * 100) / 100;
} else if ( document.querySelector("#work_time").value = workTimeValue;
productiveTimeValue > 2 && document.querySelector("#productive_time").value = productiveTimeValue;
comment.length < productiveTimeValue * 60
) { // now we ready for submiting all forms
alert( let mainCommitBtn = document.querySelector("#commit_top");
"Недопустимо коротко комментировать длительные работы. Мы ожидаем не менее 60 символов на каждый указанный час."
); // check comment before submit
} else if (productiveTimeValue > workTimeValue) { let comment = document.querySelector("#comment").value;
alert("Продуктивное время не может быть больше отработанного!");
} else { if (comment.length !== 0) {
let bugForm = etersoft_create === 1 ? "#Create" : "#changeform"; if (comment.length < 9) {
document.querySelector(bugForm).submit(); alert("Слишком короткий комментарий");
timer.clear(); } else if (productiveTimeValue > 8 || workTimeValue > 8) {
localStorage.removeItem("time"); alert(
} "Недопустимо указывать отработанное/продуктивное время более восьми часов. Правильным следованием рабочему процессу было бы выполнение работы по частям, о каждой из которых будет написано отдельно."
} else if (!comment.length && workTimeValue === 0 && productiveTimeValue === 0) { );
let bugForm = etersoft_create === 1 ? "#Create" : "#changeform"; } else if (
document.querySelector(bugForm).submit(); productiveTimeValue > 2 &&
timer.clear(); comment.length < productiveTimeValue * 60
localStorage.removeItem("time"); ) {
} else { alert(
alert("Поле комментария не может быть пустым!"); "Недопустимо коротко комментировать длительные работы. Мы ожидаем не менее 60 символов на каждый указанный час."
} );
}); } else if (productiveTimeValue > workTimeValue) {
}); alert("Продуктивное время не может быть больше отработанного!");
} else {
// let's validate! let bugForm = etersoft_create === 1 ? "#Create" : "#changeform";
function validate(evt) { document.querySelector(bugForm).submit();
let theEvent = evt || window.event; timer.clear();
let key = theEvent.keyCode || theEvent.which; localStorage.removeItem("time");
key = String.fromCharCode(key); }
let regex = /[0-9\s]/; } else if (!comment.length && workTimeValue === 0 && productiveTimeValue === 0) {
if (!regex.test(key)) { let bugForm = etersoft_create === 1 ? "#Create" : "#changeform";
theEvent.returnValue = false; document.querySelector(bugForm).submit();
if (theEvent.preventDefault) theEvent.preventDefault(); timer.clear();
} localStorage.removeItem("time");
} } else {
alert("Поле комментария не может быть пустым!");
document.querySelector("#realworktime").onkeypress = function() { }
validate(event); });
}; });
document.querySelector("#realworktime").onpaste = function() { // let's validate!
validate(event); function validate(evt) {
}; let theEvent = evt || window.event;
let key = theEvent.keyCode || theEvent.which;
document.querySelector("#ProductTime").onkeypress = function() { key = String.fromCharCode(key);
validate(event); let regex = /[0-9\s]/;
}; if (!regex.test(key)) {
theEvent.returnValue = false;
document.querySelector("#ProductTime").onpaste = function() { if (theEvent.preventDefault) theEvent.preventDefault();
validate(event); }
}; }
////////////////////////////////////////////////////////////// document.querySelector("#realworktime").onkeypress = function() {
validate(event);
if (typeof window.addEventListener != "undefined") { };
//gecko, safari, konqueror and standard
window.addEventListener("load", initTimer, false); document.querySelector("#realworktime").onpaste = function() {
} else if (typeof document.addEventListener != "undefined") { validate(event);
//opera 7 };
document.addEventListener("load", initTimer, false);
} else if (typeof window.attachEvent != "undefined") { document.querySelector("#ProductTime").onkeypress = function() {
//win/ie validate(event);
window.attachEvent("onload", initTimer); };
}
document.querySelector("#ProductTime").onpaste = function() {
validate(event);
};
//////////////////////////////////////////////////////////////
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);
}
...@@ -46,4 +46,4 @@ ...@@ -46,4 +46,4 @@
<script language="javascript" type="text/javascript" src="js/etersoft/focusManager.js"></script> <script language="javascript" type="text/javascript" src="js/etersoft/focusManager.js"></script>
<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_common.js?25_10_2017"></script>
<script language="javascript" type="text/javascript" src="js/etersoft/timer.js?11_09_2020__"></script> <script language="javascript" type="text/javascript" src="js/etersoft/timer.js?07_10_2020"></script>
...@@ -46,4 +46,4 @@ ...@@ -46,4 +46,4 @@
<script language="javascript" type="text/javascript" src="js/etersoft/focusManager.js"></script> <script language="javascript" type="text/javascript" src="js/etersoft/focusManager.js"></script>
<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_common.js?25_10_2017"></script>
<script language="javascript" type="text/javascript" src="js/etersoft/timer.js?11_09_2020__"></script> <script language="javascript" type="text/javascript" src="js/etersoft/timer.js?07_10_2020"></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