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);
}
// 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 %]"
......
<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