Skip to content

Commit

Permalink
Futon history browsing - applied patch from COUCHDB-186
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@732413 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
jchris committed Jan 7, 2009
1 parent f4d88a0 commit aa48faa
Show file tree
Hide file tree
Showing 5 changed files with 177 additions and 2 deletions.
2 changes: 2 additions & 0 deletions THANKS
Expand Up @@ -12,6 +12,7 @@ Some of these people are:
* Yoan Blanc <yoan.blanc@gmail.com>
* Paul Carey <paul.p.carey@gmail.com>
* Benoit Chesneau <bchesneau@gmail.com>
* Jason Davies <jason@jasondavies.com>
* Paul Joseph Davis <paul.joseph.davis@gmail.com>
* Michael Gottesman <gottesmm@reed.edu>
* Michael Hendricks <michael@ndrix.org>
Expand All @@ -23,5 +24,6 @@ Some of these people are:
* Sam Ruby <rubys@intertwingly.net>
* Dirk Schalge <dirk@epd-me.net>
* Carlos Valiente <superdupont@gmail.com>
* Luke Venediger <lukev@lukev.net>

For a list of authors see the `AUTHORS` file.
3 changes: 3 additions & 0 deletions share/www/browse/database.html
Expand Up @@ -103,6 +103,9 @@
$("#toolbar button.add").click(page.addDocument);
$("#toolbar button.compact").click(page.compactDatabase);
$("#toolbar button.delete").click(page.deleteDatabase);

// Update title
document.title = "Browse Database " + page.db.name;
});
</script>
</head>
Expand Down
3 changes: 3 additions & 0 deletions share/www/browse/document.html
Expand Up @@ -64,6 +64,9 @@
$("#toolbar button.add").click(page.addField);
$("#toolbar button.load").click(page.uploadAttachment);
$("#toolbar button.delete").click(page.deleteDocument);

// Update the title
document.title = "View Document " + page.docId;
});
</script>
</head>
Expand Down
21 changes: 19 additions & 2 deletions share/www/index.html
Expand Up @@ -30,7 +30,8 @@
<script src="script/jquery.js?1.2.6"></script>
<script src="script/jquery.cookies.js?0.8.0"></script>
<script src="script/jquery.couch.js?0.8.0"></script>
<script>
<script src="script/jquery.history.js?0.8.0"></script>
<script type="text/javascript">
function updateRecentDatabasesList() {
$("#dbs").empty();
var recentDbs = $.cookies.get("recent", "").split(",");
Expand All @@ -41,6 +42,17 @@
"</a></li>");
});
}
var baseURL = location.pathname.match(/.*\//).toString();
function updateIFrame(hash) {
var l = frames['content'].location;
var title = frames['content'].document.title + " - Apache CouchDB: Futon Utility Client";
document.title = title;
var href = baseURL + hash;
// For some reason the onload event fires twice; the 2nd time with URL-decoded l.href
if (hash != '' && decodeURIComponent(l.pathname + l.search) != decodeURIComponent(href)) {
l.href = href;
}
}
function updateNavigation(path, queryString) {
function fixupPath(path) { // hack for IE/Win
return (path.charAt(0) != "/") ? ("/" + path) : path;
Expand Down Expand Up @@ -69,6 +81,11 @@
});
}
$(function() {
$.historyInit(updateIFrame);
$('#content').load(function() {
var l = frames["content"].location;
$.historyLoad(l.pathname.substring(baseURL.length) + l.search);
});
$.couch.info({
success: function(info, status) {
$("#version").text(info.version);
Expand All @@ -95,7 +112,7 @@
</ul>
<div id="footer">Futon on Apache CouchDB <span id="version">?</span></div>
<div id="view">
<iframe name="content" src="browse/index.html" allowtransparency="true">
<iframe name="content" src="browse/index.html" allowtransparency="true" id="content">
</div>
</body>
</html>
150 changes: 150 additions & 0 deletions share/www/script/jquery.history.js
@@ -0,0 +1,150 @@
/*
* jQuery history plugin
*
* Copyright (c) 2006 Taku Sano (Mikage Sawatari)
* Licensed under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
* Modified by Lincoln Cooper to add Safari support and only call the callback once during initialization
* for msie when no initial hash supplied.
*/


jQuery.extend({
historyCurrentHash: undefined,

historyCallback: undefined,

historyInit: function(callback){
jQuery.historyCallback = callback;
var current_hash = location.hash;

jQuery.historyCurrentHash = current_hash;
if(jQuery.browser.msie) {
// To stop the callback firing twice during initilization if no hash present
if (jQuery.historyCurrentHash == '') {
jQuery.historyCurrentHash = '#';
}

// add hidden iframe for IE
$("body").prepend('<iframe id="jQuery_history" style="display: none;"></iframe>');
var ihistory = $("#jQuery_history")[0];
var iframe = ihistory.contentWindow.document;
iframe.open();
iframe.close();
iframe.location.hash = current_hash;
}
else if ($.browser.safari) {
// etablish back/forward stacks
jQuery.historyBackStack = [];
jQuery.historyBackStack.length = history.length;
jQuery.historyForwardStack = [];

jQuery.isFirst = true;
}
jQuery.historyCallback(current_hash.replace(/^#/, ''));
setInterval(jQuery.historyCheck, 100);
},

historyAddHistory: function(hash) {
// This makes the looping function do something
jQuery.historyBackStack.push(hash);

jQuery.historyForwardStack.length = 0; // clear forwardStack (true click occured)
this.isFirst = true;
},

historyCheck: function(){
if(jQuery.browser.msie) {
// On IE, check for location.hash of iframe
var ihistory = $("#jQuery_history")[0];
var iframe = ihistory.contentDocument || ihistory.contentWindow.document;
var current_hash = iframe.location.hash;
if(current_hash != jQuery.historyCurrentHash) {

location.hash = current_hash;
jQuery.historyCurrentHash = current_hash;
jQuery.historyCallback(current_hash.replace(/^#/, ''));

}
} else if ($.browser.safari) {
if (!jQuery.dontCheck) {
var historyDelta = history.length - jQuery.historyBackStack.length;

if (historyDelta) { // back or forward button has been pushed
jQuery.isFirst = false;
if (historyDelta < 0) { // back button has been pushed
// move items to forward stack
for (var i = 0; i < Math.abs(historyDelta); i++) jQuery.historyForwardStack.unshift(jQuery.historyBackStack.pop());
} else { // forward button has been pushed
// move items to back stack
for (var i = 0; i < historyDelta; i++) jQuery.historyBackStack.push(jQuery.historyForwardStack.shift());
}
var cachedHash = jQuery.historyBackStack[jQuery.historyBackStack.length - 1];
if (cachedHash != undefined) {
jQuery.historyCurrentHash = location.hash;
jQuery.historyCallback(cachedHash);
}
} else if (jQuery.historyBackStack[jQuery.historyBackStack.length - 1] == undefined && !jQuery.isFirst) {
// back button has been pushed to beginning and URL already pointed to hash (e.g. a bookmark)
// document.URL doesn't change in Safari
if (document.URL.indexOf('#') >= 0) {
jQuery.historyCallback(document.URL.split('#')[1]);
} else {
var current_hash = location.hash;
jQuery.historyCallback('');
}
jQuery.isFirst = true;
}
}
} else {
// otherwise, check for location.hash
var current_hash = location.hash;
if(current_hash != jQuery.historyCurrentHash) {
jQuery.historyCurrentHash = current_hash;
jQuery.historyCallback(current_hash.replace(/^#/, ''));
}
}
},
historyLoad: function(hash){
var newhash;

if (jQuery.browser.safari) {
newhash = hash;
}
else {
newhash = '#' + hash;
location.hash = newhash;
}
jQuery.historyCurrentHash = newhash;

if(jQuery.browser.msie) {
var ihistory = $("#jQuery_history")[0];
var iframe = ihistory.contentWindow.document;
iframe.open();
iframe.close();
iframe.location.hash = newhash;
jQuery.historyCallback(hash);
}
else if (jQuery.browser.safari) {
jQuery.dontCheck = true;
// Manually keep track of the history values for Safari
this.historyAddHistory(hash);

// Wait a while before allowing checking so that Safari has time to update the "history" object
// correctly (otherwise the check loop would detect a false change in hash).
var fn = function() {jQuery.dontCheck = false;};
window.setTimeout(fn, 200);
jQuery.historyCallback(hash);
// N.B. "location.hash=" must be the last line of code for Safari as execution stops afterwards.
// By explicitly using the "location.hash" command (instead of using a variable set to "location.hash") the
// URL in the browser and the "history" object are both updated correctly.
location.hash = newhash;
}
else {
jQuery.historyCallback(hash);
}
}
});


0 comments on commit aa48faa

Please sign in to comment.