Redmine issues list sprint view

Some changes to make redmine issues list appropriate for sprint appearance: highlight status text in issues list; take short user name; hide menu button in row; show / hide filters

Bu betiği kurabilmeniz için Tampermonkey, Greasemonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Violentmonkey gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

Bu betiği kurabilmeniz için Tampermonkey ya da Userscripts gibi bir kullanıcı betiği eklentisini kurmanız gerekmektedir.

You will need to install an extension such as Tampermonkey to install this script.

Bu komut dosyasını yüklemek için bir kullanıcı komut dosyası yöneticisi uzantısı yüklemeniz gerekecek.

(Zaten bir kullanıcı komut dosyası yöneticim var, kurmama izin verin!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Zateb bir user-style yöneticim var, yükleyeyim!)

// ==UserScript==
// @name            Redmine issues list sprint view
// @description     Some changes to make redmine issues list appropriate for sprint appearance: highlight status text in issues list; take short user name; hide menu button in row; show / hide filters
// @namespace       RM
// @author          znaler
// @version         0.1
// @name:ru         Представления списка задач redmine для спринта
// @description:ru  Скрипт изменяет некоторые элементы оформления списка задач в редмайн, чтобы он лучше подходил для отображения задач спринта: Подсветка текста статуса в списке задач спринта: сокращение имени пользователя; спрятать колонку с кнопкой меню; ссылка Показать / Скрыть фильтры
// @grant           none
// @match           https://*/projects/*/issues*
// @require         http://code.jquery.com/jquery-2.1.3.min.js
// ==/UserScript==

let _ = jQuery.noConflict();


const LANG_LABELS = [
                {
                    "id": "b44819dd-79ee-4415-aede-44c06b0fb50f",
                    "val": [
                        {"lang": "en", "translate": "Filters"},
                        {"lang": "ru", "translate": "Фильтры"}
                    ]
                },{
                    "id": "3b08523d-d420-4f02-a5b2-a5960541add2",
                    "val": [
                        {"lang": "en", "translate": "New"},
                        {"lang": "ru", "translate": "Планируется"}
                    ]
                },{
                    "id": "c85c1135-2ede-47d8-a9d1-f7544f447165",
                    "val": [
                        {"lang": "en", "translate": "Feedback"},
                        {"lang": "ru", "translate": "Обратная связь"}
                    ]
                },{
                    "id": "d331ba73-4065-433d-a5e5-9dfddd686b6d",
                    "val": [
                        {"lang": "en", "translate": "In progress"},
                        {"lang": "ru", "translate": "В работе"}
                    ]
                },{
                    "id": "0e8b4581-348b-477e-b672-e659b8ade46f",
                    "val": [
                        {"lang": "en", "translate": "Resolved"},
                        {"lang": "ru", "translate": "Решена"}
                    ]
                },{
                    "id": "de4822dd-9a7b-4e75-970a-b3fbd6718c97",
                    "val": [
                        {"lang": "en", "translate": "Closed"},
                        {"lang": "ru", "translate": "Выполнена"}
                    ]
                },{
                    "id": "35db18f7-1eef-429f-bcf8-cbfa75bce53b",
                    "val": [
                        {"lang": "en", "translate": "Rejected"},
                        {"lang": "ru", "translate": "Отменена"}
                    ]
                }
            ];

// Detect lang | Определение языка системы
function langDetect() {
    if (_('html').attr("lang") === 'ru') {
        return 'ru';
    } else {
        return 'en';
    }
}

var lng = langDetect();

// Get const label | Получение текста константы в зависимости от языка интерфейса
function getLbl(lang, id) {
    if (LANG_LABELS) {
        let i = LANG_LABELS.length;
        while (i--) {
            if (LANG_LABELS[i].id === id) {
                let j = LANG_LABELS[i].val.length;
                while (j--) {
                    if (LANG_LABELS[i].val[j].lang === lang) {
                        return LANG_LABELS[i].val[j].translate;
                    }
                }
            }
        }
    }
}

// Highlight status text in issues list | Подсветка текста статуса в списке задач
function statusHighlight(i, elem){
  _(elem).css("font-weight", "bold");

  let text = _(elem).text();
  if(text === getLbl(lng, "3b08523d-d420-4f02-a5b2-a5960541add2")) _(elem).css("color", "#e17076");
  if(text === getLbl(lng, "c85c1135-2ede-47d8-a9d1-f7544f447165")) _(elem).css("color", "#eda86c");
  if(text === getLbl(lng, "d331ba73-4065-433d-a5e5-9dfddd686b6d")) _(elem).css("color", "#eda86c");
  if(text === getLbl(lng, "0e8b4581-348b-477e-b672-e659b8ade46f")) _(elem).css("color", "#7bc862");
  if(text === getLbl(lng, "de4822dd-9a7b-4e75-970a-b3fbd6718c97")) _(elem).css("color", "#65aadd");
  if(text === getLbl(lng, "35db18f7-1eef-429f-bcf8-cbfa75bce53b")) _(elem).css("color", "#a695e7");
}

_('.status').each(statusHighlight);


// Take short user name | Сокращение имени пользователя
function takeShortName(i, elem){
  let fullName = _(elem).text()
  let nameParts = _(elem).text().split(" ");
  if (nameParts[1]){
    let shortName = nameParts[1][0] + ". " + nameParts[0];
    _(elem).text(shortName).attr("title", fullName);
  }
}

_('.author a').each(takeShortName);
_('.assigned_to a').each(takeShortName);


// Increase line height | Увеличить высоту строки
_("table td").css("padding-top", "4px").css("padding-bottom", "4px");

// Hide menu button in row | Спрятать колонку с кнопкой меню
_("th.buttons, td.buttons").hide();

// Show / hide filters | Показать / Скрыть фильтры
_(document).ready(function() {
    if ( _('meta[name="description"]').attr("content") === "Redmine") {

        let cls = "hideFilters";

        // Add class to hide elements | Добавление класса для скрытия элементов
        _("#eq-filter-controls").addClass(cls);

        // Add link to change filters appearance | Добавление ссылку для изменения отображения фильтров
        var filtersLink = _("<a>").attr("href", "#")
                                  .attr("id", "hideFilters")
                                  .attr("class", "collapsible")
                                  .css('float', 'left')
                                  .css('padding-right', '10px')
                                  .text(getLbl(lng, "b44819dd-79ee-4415-aede-44c06b0fb50f"));
        _(".contextual").first().append(filtersLink);

        // Link icon change depends on local storage value | Изменить иконку ссылки в зависимости от значения в локальном хранилище
        if (localStorage.hideFiltersAttr === "true") {
            _("." + cls).hide();
            filtersLink.addClass("collapsed");
        }
        // If local storage unavailable or empty set default value | Значение по умолчанию, если локальное хранилище пустое или недоступно
        else {
            localStorage.hideFiltersAttr = false;
        }

        // Hide or show filters by clicking on link | Показываем или скрываем фильтры по нажатию на ссылку
        filtersLink.click(function () {
            if (localStorage.hideFiltersAttr === "false") {
                _("." + cls).hide();
                filtersLink.addClass("collapsed");
                localStorage.hideFiltersAttr = true;
            } else {
                _("." + cls).show();
                filtersLink.removeClass("collapsed");
                localStorage.hideFiltersAttr = false;
            }
        });
    }
})