Author: jchris
Date: Wed Jan  7 10:21:23 2009
New Revision: 732413

URL: http://svn.apache.org/viewvc?rev=732413&view=rev
Log:
Futon history browsing - applied patch from COUCHDB-186

Added:
    couchdb/trunk/share/www/script/jquery.history.js   (with props)
Modified:
    couchdb/trunk/THANKS
    couchdb/trunk/share/www/browse/database.html
    couchdb/trunk/share/www/browse/document.html
    couchdb/trunk/share/www/index.html

Modified: couchdb/trunk/THANKS
URL: 
http://svn.apache.org/viewvc/couchdb/trunk/THANKS?rev=732413&r1=732412&r2=732413&view=diff
==============================================================================
--- couchdb/trunk/THANKS (original)
+++ couchdb/trunk/THANKS Wed Jan  7 10:21:23 2009
@@ -12,6 +12,7 @@
  * Yoan Blanc <yoan.bl...@gmail.com>
  * Paul Carey <paul.p.ca...@gmail.com>
  * Benoit Chesneau <bchesn...@gmail.com>
+ * Jason Davies <ja...@jasondavies.com>
  * Paul Joseph Davis <paul.joseph.da...@gmail.com>
  * Michael Gottesman <gotte...@reed.edu>
  * Michael Hendricks <mich...@ndrix.org>
@@ -23,5 +24,6 @@
  * Sam Ruby <ru...@intertwingly.net>
  * Dirk Schalge <d...@epd-me.net>
  * Carlos Valiente <superdup...@gmail.com>
+ * Luke Venediger <lu...@lukev.net>
 
 For a list of authors see the `AUTHORS` file.

Modified: couchdb/trunk/share/www/browse/database.html
URL: 
http://svn.apache.org/viewvc/couchdb/trunk/share/www/browse/database.html?rev=732413&r1=732412&r2=732413&view=diff
==============================================================================
--- couchdb/trunk/share/www/browse/database.html [utf-8] (original)
+++ couchdb/trunk/share/www/browse/database.html [utf-8] Wed Jan  7 10:21:23 
2009
@@ -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>

Modified: couchdb/trunk/share/www/browse/document.html
URL: 
http://svn.apache.org/viewvc/couchdb/trunk/share/www/browse/document.html?rev=732413&r1=732412&r2=732413&view=diff
==============================================================================
--- couchdb/trunk/share/www/browse/document.html [utf-8] (original)
+++ couchdb/trunk/share/www/browse/document.html [utf-8] Wed Jan  7 10:21:23 
2009
@@ -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>

Modified: couchdb/trunk/share/www/index.html
URL: 
http://svn.apache.org/viewvc/couchdb/trunk/share/www/index.html?rev=732413&r1=732412&r2=732413&view=diff
==============================================================================
--- couchdb/trunk/share/www/index.html [utf-8] (original)
+++ couchdb/trunk/share/www/index.html [utf-8] Wed Jan  7 10:21:23 2009
@@ -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(",");
@@ -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;
@@ -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);
@@ -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>

Added: couchdb/trunk/share/www/script/jquery.history.js
URL: 
http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/jquery.history.js?rev=732413&view=auto
==============================================================================
--- couchdb/trunk/share/www/script/jquery.history.js (added)
+++ couchdb/trunk/share/www/script/jquery.history.js Wed Jan  7 10:21:23 2009
@@ -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);
+               }
+       }
+});
+
+

Propchange: couchdb/trunk/share/www/script/jquery.history.js
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to