NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
'use strict'; // ==UserScript== // @name DartIT tracker-tweaker revo // @updateURL https://openuserjs.org/meta/galago/DartIT_tracker-tweaker_revo.meta.js // @downloadURL https://dl.dropboxusercontent.com/u/11456758/DartUserScript/dart-support.user.js // @description индивидуальные настройки для support.dartit.ru, support.alamics.ru; // @include https://support.dartit.ru/* // @include https://support.alamics.ru/* // @grant unsafeWindow // @author mann // @license MIT // @version 0.0.5.2 // ==/UserScript== console.info('start userscript'); // [1] Оборачиваем скрипт в замыкание, для кроссбраузерности (opera, ie) (function (window, undefined) { // [2] нормализуем window var w; if (typeof unsafeWindow != undefined) { w = unsafeWindow } else { w = window; } //------------------------------------------ //-------------------------------------------- // [3] не запускаем скрипт во фреймах // без этого условия скрипт будет запускаться несколько раз на странице с фреймами if (w.self != w.top) { return; } // [4] дополнительная проверка наряду с @include var location_test = function () { if (/https:\/\/support.dartit.ru/.test(w.location.href) || /https:\/\/support.alamics.ru/.test(w.location.href)) { return true; } return false; }; if (location_test) document.addEventListener("DOMContentLoaded", function () { var redirectLostTask = function () { var td = document.querySelectorAll('td.content'); var content = td[1].innerHTML; if (content.indexOf('Задачи с номером №') > 0 && content.indexOf('не существует') > 0) { var link = document.createElement('A'); link.href = 'https://support.alamics.ru/' + window.location.search; link.textContent = 'Возможно задача перенесена в трекер Алмикс. Перейти?'; td[1].appendChild(link); } }; redirectLostTask(); //добавим новые стили var custom_css = ".onoff-opt{margin: 0 6px 0 10px}"; custom_css += ".none{display: none !important}"; custom_css += ".none.view{display: block !important}"; custom_css += ".ch_addr{margin: 10px 10px 10px 0; vertical-align: top}"; custom_css += ".totop > input {margin: 10px 0 0}"; custom_css += ".label_head{display: block; margin: 0 0 20px}"; custom_css += ".clearfix:before, .clearfix:after { content:''; display:table; clear: both }"; custom_css += ".alist{float: right} .alist p{margin: 0 0 10px; line-height: 1; text-align: right}"; custom_css += ".bar-wrap{padding:8px 15px;background:#2d2d2d}"; custom_css += "#custom-project-list > li{width: 20%; float: left; cursor: pointer}"; custom_css += "#custom-workers-list > li{width: 20%; float: left; cursor: pointer}"; custom_css += "#custom-project-list > li:first-child{display:none}"; custom_css += ".user-list > li{line-height: 1.5}"; custom_css += ".selected{color: green}"; custom_css += "#settings-btn{margin: 0 0 20px 0}"; custom_css += "#settings-box{display: none; margin: 20px 0; padding: 20px 0; outline: 1px solid #414141}"; custom_css += "#settings-box.is-open{display: block}"; custom_css += ".user-title{color:#000;margin:0 0 .6em;font-size:20px;padding:0}"; custom_css += ".regular-link{color:#0054b9}"; custom_css += ".time-list p{margin: 5px 0; display:flex; justify-content:space-between;}"; custom_css += ".time-list > p > span:first-child{padding-right: 1em; cursor: pointer;}"; custom_css += ":root .time-list-total{margin-top: 1em; border-top: 1px solid;}"; custom_css += ".comment-collapsed{max-height: 70px; overflow: hidden;}"; custom_css += ".long-comment{width: 100% !important;position: relative; padding-top: 30px;}"; custom_css += ".btn-collapse{position: absolute; top: 0; right: 0;}"; custom_css += ".btn-collapse-all{position: fixed; top: 10; right: 10;}"; custom_css += ":root .dates-list{width: 150px; display: inline-block; margin: 0 20px 0 0}"; custom_css += ".user-toolbar{margin: 20px 0; padding: 20px 10px; border-top: 1px solid rgba(0,0,0,.7); overflow: hidden; display: flex; flex-wrap: wrap;}"; custom_css += ".user-toolbar__item{padding: 10px 15px; background: rgba(255,255,255,.6); box-shadow: 0 1px 1px rgba(0,0,0,.6)}"; custom_css += ":root .user-toolbar-title{margin: 0 0 1em; padding: 0; color: #000;}"; addcss(custom_css); var action_page = getURLAction(); //объект элементами которого будут функции //реализующие функционал модулей var modules = {}; //сюда добаляются элементы страницы в которые вставляются созданые скриптом блоки //и.или они модифицируются скриптом var obj_page_elems = {}; modules.createInterfaceObjects = function () { var $content_cell = document.querySelector('form[name="theForm"]'); $content_cell.setAttribute('id', 'main-content'); obj_page_elems.content_cell = $content_cell; var $comments_tbl = $content_cell.getElementsByTagName("TABLE")[0]; $comments_tbl.setAttribute('id', 'comments-tbl'); obj_page_elems.comments_tbl = $comments_tbl; obj_page_elems.comments_tbl_rows = $comments_tbl.querySelectorAll('tr'); var input_div = document.querySelector('div.input_box'); //есть на странице задачи if (input_div) { var $user_toolbar = document.createElement('DIV'); $user_toolbar.setAttribute('id', 'user-toolbar'); $user_toolbar.classList.add('user-toolbar'); input_div.appendChild($user_toolbar); obj_page_elems.user_toolbar = $user_toolbar; } }; modules.userSettings = function () { var $content_cell = obj_page_elems.content_cell; //создание блока в котором будут все элементы управления настройками var $user_settings_box = document.createElement('div'); $user_settings_box.setAttribute('id', 'settings-box'); $content_cell.insertBefore($user_settings_box, $content_cell.firstChild); //создание кнопки показать/скрыть пользовательские настройки var $settings_btn = document.createElement('button'); $settings_btn.innerHTML = 'Показать/скрыть пользовательские настройки'; $settings_btn.setAttribute('id', 'settings-btn'); $settings_btn.setAttribute('type', 'button'); $content_cell.insertBefore($settings_btn, $content_cell.firstChild); $settings_btn.addEventListener('click', function () { $user_settings_box.classList.toggle('is-open'); }); //создание кастомного списка проектов //id`s array var params_user_projects = JSON.parse(localStorage.getItem('params_user_projects')); if (params_user_projects === null) { params_user_projects = []; } var createTaskListHTML = function () { var $custom_projects_list = document.createElement('ul'); $custom_projects_list.setAttribute('id', 'custom-project-list'); $custom_projects_list.setAttribute('class', 'user-list clearfix'); obj_page_elems.dart_projects_list = document.getElementById('project_id'); obj_page_elems.dart_projects_list_opts = obj_page_elems.dart_projects_list.options; var $custom_list_title = document.createElement('h2'); $custom_list_title.innerHTML = 'Собственный список проектов'; $custom_list_title.classList.add('user-title'); $custom_projects_list.appendChild($custom_list_title); var $custiom_list_item; Object.keys(obj_page_elems.dart_projects_list_opts).forEach(function (key) { if (obj_page_elems.dart_projects_list_opts[key].value < 0) { return false; } $custiom_list_item = document.createElement('li'); $custiom_list_item.innerHTML = obj_page_elems.dart_projects_list_opts[key].text; $custiom_list_item.setAttribute('data-project-id', obj_page_elems.dart_projects_list_opts[key].value); $custom_projects_list.appendChild($custiom_list_item); $custiom_list_item.addEventListener('click', createIdArrayCustomTaskList); }); $user_settings_box.insertBefore($custom_projects_list, $user_settings_box.firstChild); obj_page_elems.custom_project_list = $custom_projects_list; if (params_user_projects.length) { var node; Object.keys($custom_projects_list.childNodes).forEach(function (key) { node = $custom_projects_list.childNodes[key]; if (params_user_projects.indexOf(node.getAttribute('data-project-id')) >= 0) { node.classList.add('selected'); } }); } }; createTaskListHTML(); function createIdArrayCustomTaskList() { //var params_user_projects = JSON.parse(localStorage.getItem('params_user_projects')); var id = this.getAttribute("data-project-id"); var index; if (params_user_projects.indexOf(id) === -1) { params_user_projects.push(id); this.classList.add('selected'); } else { index = params_user_projects.indexOf(id); params_user_projects.splice(index, 1); this.classList.remove('selected'); } localStorage.setItem('params_user_projects', JSON.stringify(params_user_projects)); elemsModification.modifyProjectList(); console.log(JSON.parse(localStorage.getItem('params_user_projects'))); } //создание кастомного списка исполнителей //id`s array var params_user_workers = JSON.parse(localStorage.getItem('params_user_workers')); if (params_user_workers === null) { params_user_workers = []; } var createWorkersListHTML = function () { var $custom_workers_list = document.createElement('ul'); $custom_workers_list.setAttribute('id', 'custom-workers-list'); $custom_workers_list.setAttribute('class', 'user-list clearfix'); obj_page_elems.dart_workers_list = document.getElementById('internal_worker'); obj_page_elems.dart_workers_list_opts = obj_page_elems.dart_workers_list.options; var $custom_list_title = document.createElement('h2'); $custom_list_title.innerHTML = 'Собственный список исполнителей'; $custom_list_title.classList.add('user-title'); $custom_workers_list.appendChild($custom_list_title); var $custiom_list_item; Object.keys(obj_page_elems.dart_workers_list_opts).forEach(function (key) { if (obj_page_elems.dart_workers_list_opts[key].value <= 0) { return false; } $custiom_list_item = document.createElement('li'); $custiom_list_item.innerHTML = obj_page_elems.dart_workers_list_opts[key].text; $custiom_list_item.setAttribute('data-worker-id', obj_page_elems.dart_workers_list_opts[key].value); $custom_workers_list.appendChild($custiom_list_item); $custiom_list_item.addEventListener('click', createIdArrayCustomWorkersList); }); $user_settings_box.insertBefore($custom_workers_list, $user_settings_box.firstChild); obj_page_elems.custom_workers_list = $custom_workers_list; if (params_user_workers.length) { var node; Object.keys($custom_workers_list.childNodes).forEach(function (key) { node = $custom_workers_list.childNodes[key]; if (params_user_workers.indexOf(node.getAttribute('data-worker-id')) >= 0) { node.classList.add('selected'); } }); } }; createWorkersListHTML(); function createIdArrayCustomWorkersList() { var id = this.getAttribute("data-worker-id"); var index; if (params_user_workers.indexOf(id) === -1) { params_user_workers.push(id); this.classList.add('selected'); } else { index = params_user_workers.indexOf(id); params_user_workers.splice(index, 1); this.classList.remove('selected'); } localStorage.setItem('params_user_workers', JSON.stringify(params_user_workers)); elemsModification.modifyWorkersList(); console.log(JSON.parse(localStorage.getItem('params_user_workers'))); } }; //project list //сравниваем список проектов с сохраненным в настройках //проекты которых нет в настройка скрываем modules.elemsModification = function () { //сравниваем список проектов с сохраненным в настройках //проекты которых нет в настройка скрываем this.modifyProjectList = function () { var params_user_projects = JSON.parse(localStorage.getItem('params_user_projects')); if (params_user_projects === null) { console.info('Нет собственного списка проектов'); return false; } var dart_projects_list = document.getElementById('project_id') || document.getElementById('client_id'); var options = dart_projects_list.options; console.log(options); var list_tag = dart_projects_list.tagName.toLowerCase(); switch (list_tag) { case 'select': modifySelectOptionsList(options, params_user_projects); break; case 'a': var $list = dart_projects_list.nextSibling; var $list_labels = $list.childNodes; var $list_check; Object.keys($list_labels).forEach(function (key) { $list_labels[key].classList.remove('none'); $list_check = $list_labels[key].childNodes[0]; if (params_user_projects.indexOf($list_check.value) === -1) { $list_labels[key].classList.add('none'); } }); $list.style.height = 'auto'; break; } }; //сравниваем список исполнителей с сохраненным в настройках //исполнителей которых нет в настройка скрываем this.modifyWorkersList = function () { var params_user_workers = JSON.parse(localStorage.getItem('params_user_workers')); if (params_user_workers === null) { console.info('Нет собственного списка сотрудников'); params_user_workers = []; } var dart_workers_list = document.getElementById('internal_worker'); //добавлю в объект с элементами DOM obj_page_elems.dart_workers_list = dart_workers_list; var options = dart_workers_list.options; //список всех сотрудников из селекта на странице var list_tag = dart_workers_list.tagName.toLowerCase(); switch (list_tag) { case 'select': //если пользовательский список сотрудников не пуст //и если в задаче участвует сотрудник которого нет в списке оставляю его открытым if(params_user_workers.length){ //получаю список всех участников задачи var task_workers = getAllWorkers(); var task_workers_id = []; //сравнение списков, если работника нет в списке из настроек пользователя - добавляю //сначала нужно получить соответсвие имя сотрудника -> option.value т.е. логин сотрудника на англицком for(var i = 0; i < options.length; i++){ var if_find = findInArray(task_workers, options[i].text); if(if_find > -1){ task_workers_id.push(options[i].value) } } //затем сравнить со списком из настроек //и добавить работника если его нет в списке for(i = 0; i < task_workers_id.length; i++){ if_find = findInArray(params_user_workers, task_workers_id[i]); if(if_find < 0){ params_user_workers.push(task_workers_id[i]); //console.info('В список добавлен '+ task_workers[i]); } } modifySelectOptionsList(options, params_user_workers); } break; case 'a': var $list = dart_workers_list.nextSibling; var $list_labels = $list.childNodes; var $list_check; Object.keys($list_labels).forEach(function (key) { $list_labels[key].classList.remove('none'); $list_check = $list_labels[key].childNodes[0]; if (params_user_workers.indexOf($list_check.value) === -1) { $list_labels[key].classList.add('none'); } }); $list.style.height = 'auto'; break; } }; //в списке исполнителей отмечаю selected работника оставившего последний комментрий в задаче this.setSelectedInWorkersList = function () { var last_row = getAllCommentsRows(); last_row = last_row[last_row.length - 1]; var last_worker = last_row.children[4].textContent; for(var i = 0; i < obj_page_elems.dart_workers_list.options.length; i++){ if(last_worker === obj_page_elems.dart_workers_list.options[i].text){ obj_page_elems.dart_workers_list.options[i].setAttribute('selected',''); } } }; if (document.getElementById('internal_worker')) { this.modifyWorkersList(); this.setSelectedInWorkersList(); } if (document.getElementById('project_id') || document.getElementById('client_id')) { this.modifyProjectList(); } }; //поиск ссылок в тексте комментариев и оборачивание их в <a> //сворачивание длинных комментариев, добавление кнопки Свренуть.развернуть все modules.modyfiComments = function () { function replaceURLWithHTMLLinks(text) { var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; return text.replace(exp, '<a href="$1" class="regular-link">$1</a>'); } var td, div, txt; var rows = obj_page_elems.comments_tbl_rows; var rows_num = rows.length; var rows5end = rows_num - 5; var collapse_btn; obj_page_elems.collapse_btns = []; for (var i = 1; i < rows_num; i++) { td = rows[i].getElementsByTagName('TD')[5]; div = td.getElementsByTagName('DIV')[0]; txt = div.innerHTML; txt = replaceURLWithHTMLLinks(txt); div.innerHTML = ''; div.innerHTML = txt; if (i < rows5end) { if (div.offsetHeight > 200) { div.classList.add('comment-collapsed'); div.classList.add('long-comment'); collapse_btn = document.createElement('BUTTON'); collapse_btn.setAttribute('type', 'button'); collapse_btn.innerHTML = 'Развернуть'; collapse_btn.classList.add('btn-collapse'); collapse_btn.classList.add('is-close'); div.appendChild(collapse_btn); //collapse_btn.addEventListener('click',collapseComment); collapse_btn.addEventListener('click', function () { collapseComment(this) }); obj_page_elems.collapse_btns.push(collapse_btn); } } } if (!!document.querySelector('.comment-collapsed')) { collapse_btn = document.createElement('BUTTON'); collapse_btn.setAttribute('type', 'button'); collapse_btn.innerHTML = 'Развернуть все'; collapse_btn.classList.add('btn-collapse-all'); collapse_btn.classList.add('is-close'); collapse_btn.addEventListener('click', collapseAllComment); obj_page_elems.content_cell.appendChild(collapse_btn); } function collapseComment(el, state) { //el - node || nodeList //state - string || check contains class is-close state = state || el.classList.contains('is-close'); if (Array.isArray(el)) { for (var i = 0; i < el.length; i++) { if (state === 'expand') { setExpand(el[i]); continue; } setCollapse(el[i]); } } else { if (state) { setExpand(el); } else { setCollapse(el); } } function setExpand(el) { el.classList.remove('is-close'); el.innerHTML = ''; el.innerHTML = 'Свернуть'; el.parentNode.classList.remove('comment-collapsed'); } function setCollapse(el) { el.classList.add('is-close'); el.innerHTML = ''; el.innerHTML = 'Развернуть'; el.parentNode.classList.add('comment-collapsed') } } function collapseAllComment() { if (this.classList.contains('is-close')) { this.classList.remove('is-close'); this.innerHTML = ''; this.innerHTML = 'Свернуть все'; collapseComment(obj_page_elems.collapse_btns, 'expand'); } else { this.classList.add('is-close'); this.innerHTML = ''; this.innerHTML = 'Развернуть все'; collapseComment(obj_page_elems.collapse_btns, 'collapse'); } } }; //подсчет общего времени в задаче для каждого исполнителя modules.countWorkerTime = function () { var $input_box = obj_page_elems.user_toolbar; var rows = getAllCommentsRows(); var workers = getAllWorkers(); var dates_collection = []; var date_str; for (var i = 0; i < rows.length; i++) { date_str = rows[i].children[3].textContent; date_str = date_str.split(' '); dates_collection.push(createISODate(date_str[0])); } var dates_arr = eliminateDuplicates(dates_collection); var createDatesList = function (input_box, dates) { function createList(css_id, css_class) { var list = document.createElement('SELECT'); list.setAttribute('id', css_id); list.classList.add(css_class); return list; } var box = document.createElement('DIV'); box.classList.add('user-toolbar__item'); var start_list = createList('date-start-list', 'dates-list'); var end_list = createList('date-end-list', 'dates-list'); var btn = document.createElement('BUTTON'); btn.setAttribute('type', 'button'); btn.textContent = 'Посчитать'; var option, cln_option, listdate; for (var i = 0; i < dates.length; i++) { listdate = dateFormatter(parseInt(dates[i], 10)); option = document.createElement('OPTION'); option.setAttribute('value', dates[i]); option.innerHTML = listdate.toLocaleString('ru'); cln_option = option.cloneNode(true); start_list.appendChild(option); end_list.appendChild(cln_option); } box.appendChild(start_list); box.appendChild(end_list); box.appendChild(btn); var title = document.createElement('H3'); title.textContent = 'За выбранный период'; title.classList.add('user-toolbar-title'); box.insertBefore(title, box.firstChild); input_box.insertBefore(box, input_box.lastChild); return { 'box': box, 'start_list': start_list, 'end_list': end_list, 'btn': btn } }; var timelist = createTimeList(workers, rows); var $timelist = createTimeListView(timelist); $timelist.classList.add('user-toolbar__item'); //добавляем строку с общим временм всех сотрудников //третий параметр true - ставит класс-маркер выбранных работников insertTotalTime($timelist,timelist,true); // добавляем клик по строке для подсчета времени выбранных работников $timelist.addEventListener('click', function (e) { countSelectedWorkersTime(this, e); }); var $title = document.createElement('H3'); $title.textContent = 'Вся задача'; $title.classList.add('user-toolbar-title'); $timelist.insertBefore($title, $timelist.firstChild); $timelist.classList.add('user-toolbar__item'); var date_lists = createDatesList($input_box, dates_arr); // добавляю селекты с датами - подсчет времени за выбранный период findTimeInDatesRange(date_lists, workers, rows); $input_box.insertBefore($timelist, $input_box.lastChild); //http://stackoverflow.com/questions/2558977/ajax-cross-domain-call }; //калькулятор в поле ввода затраченного времени modules.calculateElapsedTime = function () { var timeElapsedField = document.getElementById('spended_time'); // Удаление обработчика нажатия клавиш для поля 'spended_time' timeElapsedField.onkeyup = null; // Добавление события для вычисления затраченного времени для поля 'spended_time' timeElapsedField.addEventListener('change', function () { var cur_value = this.value; try { cur_value = eval(cur_value); } catch (e) { alert("Ошибка вычисления затраченного времени. Используйте числа и знаки «+», «-», «*», «/» и скобки"); cur_value = null; } finally { if ((cur_value !== null) && (!isNaN(cur_value))) { cur_value = Math.round(cur_value); if (cur_value <= 0) { alert("Отрицательное или нулевое значение времени"); cur_value = null; } } this.value = cur_value; minToDays(cur_value); } }); }; //Сохранение комментария в localStorage //на случай внезапного звершения сессии modules.saveNewComment = function () { var $field = document.getElementById('text'); var query = window.location.search.substring(1); var task_id = query.split("=")[2]; //добавлю кнопку для вставки сохраненного текста var btn = document.createElement('BUTTON'); btn.setAttribute('type', 'button'); btn.classList.add('label_head'); btn.innerHTML = 'Вставить сохраненный текст'; btn.classList.add('none'); //по умолчанию скрыта $field.parentNode.insertBefore(btn, $field); //если есть сохраненный текст - показать кнопку showPasteBtn(btn, task_id); //вставить текст по клику btn.addEventListener('click', function (e) { $field.value = localStorage.getItem('task' + task_id); e.preventDefault(); }); //Сохранить текст из поля при наборе или потере фокуса $field.addEventListener('keyup', saveTaskComment); //если есть сохраненный текст - показать кнопку $field.addEventListener('blur', function () { showPasteBtn(btn, task_id); }); function saveTaskComment() { localStorage.setItem('task' + task_id, this.value); } function showPasteBtn(button, id) { if (localStorage.getItem('task' + id) !== '' && localStorage.getItem('task' + id) !== null) { button.classList.remove('none'); } } }; //start modules modules.createInterfaceObjects(); switch (action_page) { case 'new': modules.userSettings(); break; case 'red': case 'user_page': var elemsModification = new modules.elemsModification(); modules.modyfiComments(); modules.countWorkerTime(); modules.saveNewComment(); modules.calculateElapsedTime(); break; default: break; } //---------- //утилиты //---------- //добавить стили в head function addcss(css) { var head = document.getElementsByTagName('head')[0]; var s = document.createElement('style'); s.setAttribute('type', 'text/css'); s.setAttribute('data-name', 'user-script-css'); s.appendChild(document.createTextNode(css)); head.appendChild(s); console.info('add custom css complete'); } //определение страницы по get параметру a, например ?a=user_page function getURLAction() { var query = window.location.search.substring(1); var get_action = query.split("="); get_action = get_action[1].split('&'); return get_action[0]; } //удаление дубликатов function eliminateDuplicates(arr) { var obj = {}; for (var i = 0; i < arr.length; i++) { var str = arr[i]; obj[str] = true; // запомнить строку в виде свойства объекта } return Object.keys(obj); // или собрать ключи перебором для IE8- } //создание даты из строки function createISODate(str) { var date_str = str.split('.'); var day_str = date_str[0]; var month_str = date_str[1]; var year_str = date_str[2]; var date_iso_str = year_str + '-' + month_str + '-' + day_str; date_iso_str = Date.parse(date_iso_str); return date_iso_str; } // получение строки с датой из таблицы с комментарими задачи function getRowDateString(row) { var t = row.children[3].textContent; t = t.split(' '); return createISODate(t[0]); } //форматирование даты function dateFormatter(date) { var formatter = new Intl.DateTimeFormat("ru"); date = new Date(parseInt(date, 10)); date = formatter.format(date); return date; } // получение строки с времнем из таблицы с комментарими задачи function getRowTimeString(row) { var t = row.children[10].textContent; t = t.split('/'); return parseInt(t[0]); } // скрыть/показать опреденные option в select function modifySelectOptionsList(list, params) { Array.from(list).forEach(function (item) { item.removeAttribute('hidden'); if (params.indexOf(item.value) === -1) { item.setAttribute('hidden', ''); } }); } // пересчет минут в дни function minToDays(timeInMinutes, dayInHours) { var dayInHours = dayInHours || 8; var retStr = ""; if ((timeInMinutes !== null) && (!isNaN(timeInMinutes)) && (timeInMinutes > 0)) { dayInHours = dayInHours << 0; if ((dayInHours === undefined) || (dayInHours === null) || (isNaN(dayInHours)) || (dayInHours < 1)) dayInHours = 24; var tD, tH, tM; tD = (timeInMinutes / dayInHours / 60) << 0; retStr += tD > 0 ? tD + " д. " : ""; timeInMinutes -= tD * dayInHours * 60; tH = (timeInMinutes / 60) << 0; retStr += tH > 0 ? tH + " ч. " : ""; timeInMinutes -= tH * 60; tM = timeInMinutes << 0; retStr += tM + " мин." + " (" + dayInHours + "-часовой день)"; } else { retStr += "Что-то со временем не так :("; } return retStr; } // создание объекта со списком сотруднков и времени каждого в задаче function createTimeList(workers, rows) { var ntime, name, tsum; var timelist = {}; for (var s = 0; s < workers.length; s++) { tsum = 0; for (var i = 0; i < rows.length; i++) { ntime = getRowTimeString(rows[i]); name = rows[i].children[4].textContent; if (workers[s] === name) { tsum += ntime; timelist[name] = tsum; } } } return timelist; } // создание html элемента со списком сотруднков и времени каждого в задаче function createTimeListView(data) { var $timelist = document.createElement('DIV'); $timelist.classList.add('time-list'); $timelist.id = 'workers-time'; var list_item; var workertime; var totaltime = 0; for (var k in data) { workertime = data[k]; totaltime += workertime; list_item = document.createElement('p'); list_item.dataset.workertime = workertime; list_item.innerHTML = '<span>'+ k + '</span> <span>' + workertime + '</span>'; $timelist.insertBefore(list_item, $timelist.lastChild); } return $timelist; } // подсчет общего времени всех сотрудников для списка сотрудник-время function insertTotalTime(timelist,data,addmarker) { var totaltime = 0; var total = document.createElement('p'); for (var k in data) { totaltime += data[k]; } if(addmarker){ var list_items = timelist.querySelectorAll('p'); //по умолчанию все работники выбраны, считается общее время по всем //всем добавляем класс selected нужный для фильтрации списка //и чтобы визуально отметить выбранных в списке for(var i = 0; i < list_items.length; i++){ list_items[i].classList.add('selected'); } } total.innerHTML = '<span>Всего:</span> <span id="workers-time-total" data-totaltime="'+totaltime+'">' + totaltime + '</span>'; total.classList.add('time-list-total'); timelist.appendChild(total); return totaltime; } // получить список отмеченных сотрудников - из списка всех сотрудников задачи function getSelectedWorkers() { var selected_workers = document.getElementById('workers-time').querySelectorAll('.selected'); var selected_names = []; for(var i = 0; i < selected_workers.length; i++){ selected_names.push(selected_workers[i].firstElementChild.textContent); } return selected_names; } // получить все строки с каментами в задаче function getAllCommentsRows() { var rows = Array.from(obj_page_elems.comments_tbl_rows); rows = rows.splice(1, rows.length); //исключить первую строку с заголовками столбцов return rows; } // получить список всех сотрудников в задаче function getAllWorkers() { var rows = getAllCommentsRows(); var workers = []; for (var i = 0; i < rows.length; i++) { workers.push(rows[i].children[4].textContent); } return eliminateDuplicates(workers); } function findInArray(arr, val) { return arr.indexOf(val); } //---------------------- //доп. функции модулей //---------------------- //подсчет времени выбранных участников задачи (из списка всех участников) function countSelectedWorkersTime(list, event) { var target = event.target; var $total = document.getElementById('workers-time-total'); var total = parseInt($total.dataset.totaltime); while (target != list) { if (target.tagName == 'P') { recountTotal(target,$total,total); return; } target = target.parentNode; } function recountTotal(elem, total, totaltime) { var elemtime = parseInt(elem.dataset.workertime); //класс excluded нужен для фильтрации списка работников //в выводе времни за период - вывод только по выбранным (selected) работникам if(elem.classList.contains('selected')){ elem.classList.remove('selected'); elem.classList.add('excluded'); totaltime = totaltime - elemtime; }else{ elem.classList.add('selected'); elem.classList.remove('excluded'); totaltime = totaltime + elemtime; } total.innerHTML = totaltime; total.dataset.totaltime = totaltime; } } // подсчет времени за выбранный период function findTimeInDatesRange(lists, workers, rows) { var $start_list = lists.start_list; var $end_list = lists.end_list; var $box = lists.box; var $btn = lists.btn; function findRowsInRange(rows, start, end) { return rows.filter(function (item) { var item_date = getRowDateString(item); if (item_date >= start && item_date <= end) { return item; } }); } // $start_list.addEventListener('change', function(){ // var val = this.value; // // Array.from($end_list.options).forEach(function (item) { // if(item.value <= val){ // item.setAttribute('disabled', true); // item.setAttribute('hidden', true); // } // }); // // }); // // $end_list.addEventListener('change', function(){ // var find_rows = findRowsInRange(rows, $start_list.value, this.value); // createTimeList(workers, find_rows); // }); $btn.addEventListener('click', function () { var find_rows = findRowsInRange(rows, $start_list.value, $end_list.value); var range_timelist = createTimeList(getSelectedWorkers(), find_rows); var $range_timelist = createTimeListView(range_timelist); if ($box.querySelector('#range-timelist')) { $box.removeChild(document.getElementById('range-timelist')); } $range_timelist.setAttribute('id', 'range-timelist'); $box.appendChild($range_timelist); insertTotalTime($range_timelist,range_timelist); }); } }); })(window);