Skip to content

Instantly share code, notes, and snippets.

@gigaherz
Last active October 6, 2017 11:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gigaherz/a37eccfb3832b9af0b92f8ebaed74911 to your computer and use it in GitHub Desktop.
Save gigaherz/a37eccfb3832b9af0b92f8ebaed74911 to your computer and use it in GitHub Desktop.
// ==UserScript==
// @name Foldable diffs
// @namespace http://tampermonkey.net/
// @version 0.4
// @description Adds a fold button to file diffs, and folds deleted files by default
// @author gigaherz
// @match https://bitbucket.org/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
var makeFoldButton = function($el) {
var div = $("<div class='aui-buttons'><button class='aui-button aui-button-light'>-</button></div>");
var btn = div.find('button');
var toggleFolding = function(){
var diff=$el.find(".diff-content-container");
diff.toggle();
btn.text(diff.is(':visible') ? "-" : "+");
};
btn.click(toggleFolding);
div.insertBefore($el.find('.diff-actions.secondary > .bb-sbs-patch').prev());
$el.find('.heading').click(toggleFolding).find('button').click(function(){return false;});
if ($el.has('.diff-entry-lozenge.aui-lozenge-error').length > 0)
toggleFolding();
};
var makeFoldable = function() {
$('.diff-container').each(function(el) {
makeFoldButton($(this));
});
};
var observeDomAdd = function(target, callback) {
var children = target.children;
for (var i = 0; i < children.length; i++) {
if (callback(children[i]) === false)
{
return;
}
}
var observer = new WebKitMutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
for(let i = 0; i < (mutation.addedNodes.length || []); i++)
{
if (callback(mutation.addedNodes[i]) === false)
{
break;
}
}
});
});
observer.observe(target, {
childList: true
});
};
var observeTab = function(target, id) {
observeDomAdd(target, function(node) {
if (node.id === id) {
makeFoldable();
return false;
}
});
};
var cs = document.getElementById("changeset-diff");
if (cs) {
makeFoldable();
} else {
var diff = document.getElementById("compare-diff");
if (diff) {
observeDomAdd(diff, function(node) {
if (node.id === "compare-diff-content") {
observeTab(node, 'changeset-diff');
return false;
}
});
} else {
var pr = document.getElementById("pr-tab-content");
if (pr) {
observeTab(pr, 'pullrequest-diff');
}
}
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment