Bitbucket - Add Additional Issue Filters

Adds 'My Open' issue filter and configurable additional dropdown issue filter categories

Stan na 13-11-2017. Zobacz najnowsza wersja.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

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

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

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.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==UserScript==
// @name         Bitbucket - Add Additional Issue Filters
// @namespace    http://davefive.org/
// @version      1.8
// @description  Adds 'My Open' issue filter and configurable additional dropdown issue filter categories
// @author       davfive
// @match        https://bitbucket.org/*/*/issues*
// @grant        none
// ==/UserScript==
//
// Note that if you want to have this run on one specific repository, then change
// the match's */* to acount/repository. I have per repository ones because I
// use the filter (as you can see below) to create pseudo categories (like I have
// in the full JIRA) that allow me to group my filters nicely.
//
// 1.8 - Too quick on the draw and didn't test first. Forgot & in search appendage
// 1.7 - Changed !resolved for My Open to simply append owner=$(curr_owner) to it
// 1.6 - Added 'Infrastructure' category
// 1.5 - Fix the spelling of Aethetics
// 1.4 - Updated NextRelease to Status Dashboard
// 1.3 - Fix script not showing up on issues page with no search (no trailing ?)
// 1.2 - Fix All Catagories and No Categories searches to be correct
// 1.1 - Abstracted out new_filters dropdown to simplify creation
//     - Added ability to put separators by appending -^ (before) or -v (after) to name
// 1.0 - Initial Release
//     - Added My Open filter
//     - Added Filter dropdowns
//---------------------------------------------------------------------------------------
// User Script stored on Greasy Fork at
//   https://greasyfork.org/en/scripts/35060-bitbucket-add-additional-issue-filters

// Search string ends in: '-^' (above); '-v' (below)
function create_filter(id, name, url, separator) {
    separator = 'none';
    if (/-\^$/.test(name)) {
        separator = 'above';
    } else if (/-v$/.test(name)) {
        separator = 'below';
    }
    if (separator !== 'none') {
        name = name.slice(0, -2);
    }

    lis = '';
    if (separator === 'above') {
        lis += '<li aria-pressed="false"><hr style="margin: 0;"></li>';
    }
    lis += '<li "'+id+'" aria-pressed="false"><a href="'+url+'">'+name+'</a></li>';
    if (separator === 'below') {
        lis +=  '<li aria-pressed="false"><hr style="margin: 0;"></li>';
    }
    return lis;
}

function add_filter(filters, id, name, url) {
    if (id === undefined) {
        id = '';
    } else {
        id = 'id="'+id+'"';
    }
    new_filter = create_filter(id, name, url);
    filters.append(new_filter);
}

function add_filter_dropdown(filters, id, category, new_filters) {
    id='fdd-'+id;
    var dropdown = `
      <div class="aui-buttons">
        <a id="`+id+`" href="#" class="aui-button aui-dropdown2-trigger"
           aria-owns="`+id+`-dropdown" aria-haspopup="true"
           style="background: #fff;"
        >`+category+`</a>
      </li>
      <div id="`+id+`-dropdown" class="aui-dropdown2 aui-style-default"><ul>
    `;
    var counter = 1;
    for (var name in new_filters) {
        var this_id = id+'-'+counter;
        dropdown += create_filter(this_id, name, new_filters[name]);
        counter += 1;
    }
    dropdown += '</ul></div>';
    filters.append(dropdown);

    // Because I set the background to #fff so that the dropdown button
    // background matched the other filter links, , I need to set
    // the text-color to black when the button is clicked, because
    // bitbucket sets the background blue and text white when clicked.
    $('a#'+id).click(function(){
        $(this).css('color', '#000');
        // ARGGGH!!! They use an ::after that I can't get at for their caret and half of it stays white
        // They do some crazy border rotate this for a caret so they don't load a caret img
        // $('a#more'+id+'::after').css('border-top-color', '#000');
    });
}

(function() {
    'use strict';
    var myissues_link = $('li#mine a').attr('href');
    var curr_user = myissues_link.split('?responsible=')[1];

    // Base issue query url https://bitbucket.org/.../issues?
    var search_base = myissues_link.split('?')[0] + '?';

    var filters = $('#issues-list ul.filter-status');

    var open_link = $('li#open a').attr('href');
    add_filter(filters, 'myopen', 'My Open', open_link+'&responsible='+curr_user);

    var show_more = true;
    if (show_more === true) {
        var categories = ['Product Dashboard', 'Status Dashboard', 'About Dashboard', 'Site Aesthetics', 'Notifications', 'Infrastructure' ];
        var search_queries = {};
        search_queries['All Categories-v'] = 'status=%21resolved&title=^%5B';
        for (var i in categories) {
            var cat = categories[i];
            search_queries[cat] = 'status=%21resolved&title=^%5B'+ encodeURI(cat) +'%5D';
        }
        search_queries['No Category-^'] = 'status=%21resolved&title=-^%5B';

        var components = {};
        for (var name in search_queries) { components[name] = search_base + search_queries[name]; }
        add_filter_dropdown(filters, 'comps', 'Components', components);

        var mycomponents = {};
        for (name in search_queries) { mycomponents['My '+name] = search_base + search_queries[name] + '&responsible=' + curr_user; }
        add_filter_dropdown(filters, 'mycomps', 'My Components', mycomponents);
    }
})();