diff options
author | John Christopher Anderson <jchris@apache.org> | 2009-01-07 18:21:23 +0000 |
---|---|---|
committer | John Christopher Anderson <jchris@apache.org> | 2009-01-07 18:21:23 +0000 |
commit | aa48faa19166a1f31d3f2ba6a7c28cc7535b7c6d (patch) | |
tree | fdf7a81cf1c66f7c9d202084936ea9a24e85050b | |
parent | f4d88a0164ac42b3781ebd9d170668ff95f7d9ca (diff) |
Futon history browsing - applied patch from COUCHDB-186
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@732413 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | THANKS | 2 | ||||
-rw-r--r-- | share/www/browse/database.html | 3 | ||||
-rw-r--r-- | share/www/browse/document.html | 3 | ||||
-rw-r--r-- | share/www/index.html | 21 | ||||
-rw-r--r-- | share/www/script/jquery.history.js | 150 |
5 files changed, 177 insertions, 2 deletions
@@ -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> @@ -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. diff --git a/share/www/browse/database.html b/share/www/browse/database.html index 6b12ed7d..a3c08804 100644 --- a/share/www/browse/database.html +++ b/share/www/browse/database.html @@ -103,6 +103,9 @@ specific language governing permissions and limitations under the License. $("#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> diff --git a/share/www/browse/document.html b/share/www/browse/document.html index 09136533..f4f6fff9 100644 --- a/share/www/browse/document.html +++ b/share/www/browse/document.html @@ -64,6 +64,9 @@ specific language governing permissions and limitations under the License. $("#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> diff --git a/share/www/index.html b/share/www/index.html index 37217384..a20754b8 100644 --- a/share/www/index.html +++ b/share/www/index.html @@ -30,7 +30,8 @@ specific language governing permissions and limitations under the License. <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(","); @@ -41,6 +42,17 @@ specific language governing permissions and limitations under the License. "</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; @@ -69,6 +81,11 @@ specific language governing permissions and limitations under the License. }); } $(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); @@ -95,7 +112,7 @@ specific language governing permissions and limitations under the License. </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> diff --git a/share/www/script/jquery.history.js b/share/www/script/jquery.history.js new file mode 100644 index 00000000..14e40824 --- /dev/null +++ b/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); + } + } +}); + + |