// ==UserScript== // @name GitLab Total Time // @namespace https://github.com/LibreCodeCoop/gitlab-time-userscript/ // @version 0.1 // @description Add total time to header of lists on GitLab boards // @author Vitor Mattos // @supportURL https://github.com/LibreCodeCoop/gitlab-time-userscript/issues // @license AGPL-3.0-or-later // @match http*://*/*/boards // @match http*://*/*/boards?* // @match http*://*/*/boards/* // @icon https://gitlab.com/assets/gitlab_logo-7ae504fe4f68fdebb3c2034e36621930cd36ea87924c11ff65dbcb8ed50dca58.png // @require https://code.jquery.com/jquery-3.6.0.min.js // @downloadURL none // ==/UserScript== function listTotalTime() { $('header.board-header div.issue-count-badge').each(function() { var container = $(this).children(); var timeElement = container.find('span.list-total-time'); if(timeElement.length === 0) { container.append('') } timeElement = container.find('span.list-total-time') timeElement.attr('time_m', 0) timeElement.attr('time_h', 0) }); $('time:not([datetime]').each(function() { var countElement = $(this).closest('div.board-inner').find('span.list-total-time'); var time = $(this).text() var type = time.slice(-1) time = time.slice(0, -1) countElement.attr('time_' + type, parseInt(countElement.attr('time_' + type)) + parseInt(time)) }) $('span.list-total-time').each(function() { var min = parseInt($(this).attr('time_m')) if (min >= 60) { $(this).attr('time_h', parseInt($(this).attr('time_h')) + min / 60) $(this).attr('time_m', parseInt($(this).attr('time_m')) + min % 60) } var minPad = $(this).attr('time_m') minPad = ('00' + minPad).slice(-2) $(this).html( '' + $(this).attr('time_h') + ':' + minPad ) }); } $(document).ready(function() { setTimeout(function () { $('
').insertAfter($('[data-testid="boards-create-list"]')); $('#refresh-list-time').on("click", function(){ listTotalTime() }) }, 1000) });