mirror of
https://github.com/scrapy/scrapy.git
synced 2025-02-27 19:03:49 +00:00
--HG-- rename : sites/dev.scrapy.org/htdocs/asc.png => sites/static.scrapy.org/asc.png rename : sites/dev.scrapy.org/htdocs/attachment.png => sites/static.scrapy.org/attachment.png rename : sites/dev.scrapy.org/htdocs/changeset.png => sites/static.scrapy.org/changeset.png rename : sites/dev.scrapy.org/htdocs/closedticket.png => sites/static.scrapy.org/closedticket.png rename : sites/dev.scrapy.org/htdocs/collapsed.png => sites/static.scrapy.org/collapsed.png rename : sites/dev.scrapy.org/htdocs/css/about.css => sites/static.scrapy.org/css/about.css rename : sites/dev.scrapy.org/htdocs/css/admin.css => sites/static.scrapy.org/css/admin.css rename : sites/dev.scrapy.org/htdocs/css/browser.css => sites/static.scrapy.org/css/browser.css rename : sites/dev.scrapy.org/htdocs/css/changeset.css => sites/static.scrapy.org/css/changeset.css rename : sites/dev.scrapy.org/htdocs/css/code.css => sites/static.scrapy.org/css/code.css rename : sites/dev.scrapy.org/htdocs/css/diff.css => sites/static.scrapy.org/css/diff.css rename : sites/dev.scrapy.org/htdocs/css/prefs.css => sites/static.scrapy.org/css/prefs.css rename : sites/dev.scrapy.org/htdocs/css/report.css => sites/static.scrapy.org/css/report.css rename : sites/dev.scrapy.org/htdocs/css/roadmap.css => sites/static.scrapy.org/css/roadmap.css rename : sites/dev.scrapy.org/htdocs/css/search.css => sites/static.scrapy.org/css/search.css rename : sites/dev.scrapy.org/htdocs/css/ticket.css => sites/static.scrapy.org/css/ticket.css rename : sites/dev.scrapy.org/htdocs/css/timeline.css => sites/static.scrapy.org/css/timeline.css rename : sites/dev.scrapy.org/htdocs/css/trac-0.11rc2.css.diff => sites/static.scrapy.org/css/trac-0.11rc2.css.diff rename : sites/dev.scrapy.org/htdocs/css/trac.css => sites/static.scrapy.org/css/trac.css rename : sites/dev.scrapy.org/htdocs/css/wiki.css => sites/static.scrapy.org/css/wiki.css rename : sites/dev.scrapy.org/htdocs/desc.png => sites/static.scrapy.org/desc.png rename : sites/dev.scrapy.org/htdocs/dots.gif => sites/static.scrapy.org/dots.gif rename : sites/dev.scrapy.org/htdocs/draft.png => sites/static.scrapy.org/draft.png rename : sites/dev.scrapy.org/htdocs/edit_toolbar.png => sites/static.scrapy.org/edit_toolbar.png rename : sites/dev.scrapy.org/htdocs/editedticket.png => sites/static.scrapy.org/editedticket.png rename : sites/dev.scrapy.org/htdocs/envelope.png => sites/static.scrapy.org/envelope.png rename : sites/dev.scrapy.org/htdocs/expanded.png => sites/static.scrapy.org/expanded.png rename : sites/dev.scrapy.org/htdocs/expander_normal.png => sites/static.scrapy.org/expander_normal.png rename : sites/dev.scrapy.org/htdocs/expander_normal_hover.png => sites/static.scrapy.org/expander_normal_hover.png rename : sites/dev.scrapy.org/htdocs/expander_open.png => sites/static.scrapy.org/expander_open.png rename : sites/dev.scrapy.org/htdocs/expander_open_hover.png => sites/static.scrapy.org/expander_open_hover.png rename : sites/dev.scrapy.org/htdocs/extlink.gif => sites/static.scrapy.org/extlink.gif rename : sites/dev.scrapy.org/htdocs/feed.png => sites/static.scrapy.org/feed.png rename : sites/dev.scrapy.org/htdocs/file.png => sites/static.scrapy.org/file.png rename : sites/dev.scrapy.org/htdocs/folder.png => sites/static.scrapy.org/folder.png rename : sites/dev.scrapy.org/htdocs/guide/basic-workflow.png => sites/static.scrapy.org/guide/basic-workflow.png rename : sites/dev.scrapy.org/htdocs/guide/original-workflow.png => sites/static.scrapy.org/guide/original-workflow.png rename : sites/dev.scrapy.org/htdocs/ics.png => sites/static.scrapy.org/ics.png rename : sites/dev.scrapy.org/htdocs/imggrid.png => sites/static.scrapy.org/imggrid.png rename : sites/dev.scrapy.org/htdocs/js/blame.js => sites/static.scrapy.org/js/blame.js rename : sites/dev.scrapy.org/htdocs/js/diff.js => sites/static.scrapy.org/js/diff.js rename : sites/dev.scrapy.org/htdocs/js/expand_dir.js => sites/static.scrapy.org/js/expand_dir.js rename : sites/dev.scrapy.org/htdocs/js/folding.js => sites/static.scrapy.org/js/folding.js rename : sites/dev.scrapy.org/htdocs/js/ie_pre7_hacks.js => sites/static.scrapy.org/js/ie_pre7_hacks.js rename : sites/dev.scrapy.org/htdocs/js/jquery.js => sites/static.scrapy.org/js/jquery.js rename : sites/dev.scrapy.org/htdocs/js/keyboard_nav.js => sites/static.scrapy.org/js/keyboard_nav.js rename : sites/dev.scrapy.org/htdocs/js/noconflict.js => sites/static.scrapy.org/js/noconflict.js rename : sites/dev.scrapy.org/htdocs/js/query.js => sites/static.scrapy.org/js/query.js rename : sites/dev.scrapy.org/htdocs/js/search.js => sites/static.scrapy.org/js/search.js rename : sites/dev.scrapy.org/htdocs/js/suggest.js => sites/static.scrapy.org/js/suggest.js rename : sites/dev.scrapy.org/htdocs/js/trac.js => sites/static.scrapy.org/js/trac.js rename : sites/dev.scrapy.org/htdocs/js/wikitoolbar.js => sites/static.scrapy.org/js/wikitoolbar.js rename : sites/dev.scrapy.org/htdocs/loading.gif => sites/static.scrapy.org/loading.gif rename : sites/dev.scrapy.org/htdocs/lock-locked.png => sites/static.scrapy.org/lock-locked.png rename : sites/dev.scrapy.org/htdocs/logo.jpg => sites/static.scrapy.org/logo.jpg rename : sites/dev.scrapy.org/htdocs/main-bg.jpg => sites/static.scrapy.org/main-bg.jpg rename : sites/dev.scrapy.org/htdocs/milestone.png => sites/static.scrapy.org/milestone.png rename : sites/dev.scrapy.org/htdocs/newticket.png => sites/static.scrapy.org/newticket.png rename : sites/dev.scrapy.org/htdocs/parent.png => sites/static.scrapy.org/parent.png rename : sites/dev.scrapy.org/htdocs/python.png => sites/static.scrapy.org/python.png rename : sites/dev.scrapy.org/htdocs/topbar_gradient.png => sites/static.scrapy.org/topbar_gradient.png rename : sites/dev.scrapy.org/htdocs/topbar_gradient2.png => sites/static.scrapy.org/topbar_gradient2.png rename : sites/dev.scrapy.org/htdocs/trac.ico => sites/static.scrapy.org/trac.ico rename : sites/dev.scrapy.org/htdocs/trac_banner.png => sites/static.scrapy.org/trac_banner.png rename : sites/dev.scrapy.org/htdocs/trac_logo_mini.png => sites/static.scrapy.org/trac_logo_mini.png rename : sites/dev.scrapy.org/htdocs/vgradient.png => sites/static.scrapy.org/vgradient.png rename : sites/dev.scrapy.org/htdocs/wiki.png => sites/static.scrapy.org/wiki.png extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%4023
117 lines
4.4 KiB
JavaScript
117 lines
4.4 KiB
JavaScript
// Enable expanding/folding folders in TracBrowser
|
|
|
|
(function($){
|
|
var FOLDERID_COUNTER = 0;
|
|
var SUBFOLDER_INDENT = 20;
|
|
|
|
// enableExpandDir adds the capability to folder rows to be expanded and folded
|
|
// It also teach the rows about their ancestors. It expects:
|
|
// - `parent_tr`, the logical parent row (`null` if there's no ancestor)
|
|
// - a `rows` jQuery object matching the newly created entry rows
|
|
// - `qargs`, additional parameters to send to the server when expanding
|
|
|
|
window.enableExpandDir = function(parent_tr, rows, qargs) {
|
|
// the ancestors folder ids are present in the parent_tr class attribute
|
|
var ancestor_folderids = [];
|
|
if (parent_tr)
|
|
ancestor_folderids = $.grep(parent_tr.attr("class").split(" "),
|
|
function(c) { return c.match(/^f\d+$/)});
|
|
rows.each(function () {
|
|
var a = $(this).find("a.dir");
|
|
|
|
if (a.length) { // then the entry is a folder
|
|
// create new folder id
|
|
var folderid = "f" + FOLDERID_COUNTER++;
|
|
this.id = folderid;
|
|
$(this).addClass(folderid);
|
|
|
|
// add the expander icon
|
|
a.wrap('<div></div>');
|
|
var expander = a.before('<span class="expander"> </span>').prev();
|
|
expander.attr("title", "Expand sub-directory in place")
|
|
.click(function() { toggleDir($(this), qargs); });
|
|
}
|
|
|
|
// tie that row to ancestor folders
|
|
if (parent_tr)
|
|
$(this).addClass(ancestor_folderids.join(" "));
|
|
});
|
|
}
|
|
|
|
// handler for click event on the expander icons
|
|
window.toggleDir = function(expander, qargs) {
|
|
var tr = expander.parents("tr");
|
|
var folderid = tr.get(0).id;
|
|
|
|
if ( tr.filter(".expanded").length ) { // then *fold*
|
|
tr.removeClass("expanded").addClass("collapsed");
|
|
tr.siblings("tr."+folderid).hide();
|
|
expander.attr("title", "Re-expand directory");
|
|
return;
|
|
}
|
|
|
|
if ( tr.filter(".collapsed").length ) { // then *expand*
|
|
tr.removeClass("collapsed").addClass("expanded");
|
|
tr.siblings("tr."+folderid).show();
|
|
// Note that the above will show all the already fetched subtree,
|
|
// so we have to fold again the folders which were already collapsed.
|
|
tr.siblings("tr.collapsed").each(function() {
|
|
tr.siblings("tr."+this.id).not(this).hide();
|
|
});
|
|
} else { // then *fetch*
|
|
var td = expander.parents("td");
|
|
var td_class = td.attr("class");
|
|
var a = expander.next("a");
|
|
var depth =
|
|
parseFloat(td.css("padding-left").replace(/^(\d*\.\d*).*$/, "$1")) +
|
|
SUBFOLDER_INDENT;
|
|
|
|
tr.addClass("expanded");
|
|
// insert "Loading ..." row
|
|
tr.after('<tr><td><span class="loading"></span></td></tr>');
|
|
var loading_row = tr.next();
|
|
loading_row.children("td").addClass(td_class)
|
|
.attr("colspan", tr.children("td").length)
|
|
.css("padding-left", depth);
|
|
loading_row.find("span.loading").text("Loading " + a.text() + "...");
|
|
|
|
// XHR for getting the rows corresponding to the folder entries
|
|
$.ajax({
|
|
type: "GET",
|
|
url: a.attr("href"),
|
|
data: qargs,
|
|
dataType: "html",
|
|
success: function(data) {
|
|
// Safari 3.1.1 has some trouble reconstructing HTML snippets
|
|
// bigger than 50k - splitting in rows before building DOM nodes
|
|
var rows = data.replace(/^<!DOCTYPE[^>]+>/, "").split("</tr>");
|
|
if (rows.length) {
|
|
// insert entry rows
|
|
$(rows).each(function() {
|
|
row = $(this+"</tr>");
|
|
row.children("td."+td_class).css("padding-left", depth);
|
|
// make all entry rows collapsible but only subdir rows expandable
|
|
enableExpandDir(tr, row, qargs);
|
|
loading_row.before(row);
|
|
});
|
|
// remove "Loading ..." row
|
|
loading_row.remove();
|
|
} else {
|
|
loading_row.find("span.loading").text("").append("<i>(empty)</i>")
|
|
.removeClass("loading");
|
|
// make the (empty) row collapsible
|
|
enableExpandDir(tr, loading_row, qargs);
|
|
}
|
|
},
|
|
error: function(req, err, exc) {
|
|
loading_row.find("span.loading").text("").append("<i>(error)</i>")
|
|
.removeClass("loading");
|
|
enableExpandDir(tr, loading_row, qargs);
|
|
}
|
|
});
|
|
}
|
|
expander.attr("title", "Fold directory");
|
|
}
|
|
|
|
})(jQuery);
|